Arduino環境でDCモータとモータドライバを使う

it

Raspberry Pi Pico とモータドライバを使って小型のDCモータを制御します。
速度と回転方向を制御します。
モータドライバTB6612FNG(md08a)と、2種類のDRV8833を評価します。

記事の目的と内容

本記事では、Arduino環境でRaspberryPi Picoを使いDCモータドライバと、DCモータを使うための内容を記載します。
モータドライバの価格には差がありそれぞれを使ったときの特性を考察します。
・DCモータドライバ md08aを使った配線とスケッチ
・DRV8833(R)を使った配線とスケッチ
・DRV8833(B)を使った配線とスケッチ

スケッチでは回転方向と回転速度を制御します。

本記事ではDRV8833を2種類使用します。
明確な製品名の違いが見つからないため、赤い基板をRedから(R)、黒い基板をBlackから(B)と表記します。

関連記事

DCモータドライバ md08a

主な製品情報(md08a)

1個または2個のDCモータを個別に制御ができます。
PWM制御によりモータの回転数を制御できます。
モータの回転方向を設定できます。

出力1A
モータ電源電圧4.5 ~ 13.5V
ロジック電源電圧2.7 ~ 5.5V
PWM制御最大 100kHz

Switch sienceで購入できます。
検索 : TB6612FNG (\770) Sep/2022

ピン配置(md08a)

外観(md08a)

DCモータドライバ(DRV8833(R))

主な製品情報(DRV8833(R))

同じIC(DRV8833)の赤い基板と黒い基板のタイプがあります。
1個または2個のDCモータを個別に制御ができます。
PWM制御によりモータの回転数を制御できます。
モータの回転方向を設定できます。

モータ電源電圧2.7 ~ 10.8V
ロジック電源電圧0 ~ 5V

Amazonで購入できます。
検索 : DRV8833 (R)(\130~\200) Sep/2022

ピン配置(DRV8833(R))

外観(DRV8833(R))

DCモータドライバ(DRV8833(B))

特徴

同じIC(DRV8833)の赤い基板と黒い基板のタイプがあり、黒基板の方が小型で若干安価。
DRV8833(R)に比べて4ピン少ないが、できることはDRV8833(R)と同じ。
1個または2個のDCモータを個別に制御ができます。
PWM制御によりモータの回転数を制御できます。
モータの回転方向を設定できます。

製品情報

出力1.5A
モータ電源電圧3 ~ 10V
ロジック電源電圧

Amazonで購入できます。
検索 : DRV8833 (\120~\190) Sep/2022

ピン配置

外観

◆関連記事

DCモータ

特徴

小型のラジコンやミニ4駆で使われるモータです。
電流の流れる方向で回転方向、電圧で回転数を制御できますが、今回回転数はPWMにより制御します。

外観

軸には回転がわかるようにするためにシャフトが取り付けてあります。

実験

同じモータを使って、各モータドライバを最大回転させたときの回転数を調査しました。
回転数の調査にはレーザーの遮光を使った自作カウンタを使います。
実験ではモータ電源にダイソーアルカリ単三電池2本を使用しました。

1秒間のモータの回転数を計測した結果は以下の通りです。

モータドライバ回転数(rps)
md08a65
DEV8833(R)58
DRV8833(B)63

使ってみて

DCモータと複数のモータドライバをRaspberryPi Picoを使って制御してみました。

モータの回転が最もなめらかでした。
回転数を調査する実験でも最高回転を記録しています。

md08aは高価で配線が多く、スケッチもHブリッジを切り替える処理が必要なので手間は多いですが、性能が必要な場合はmd08aを選択することになりそうです。

DRV8833はRもBも安価で配線が少ないので導入は早いです。
スケッチもシンプルな記述で使いやすいです。

md08aと比べると回転が重そうに感じました。
回転数の調査でもmd08aと比べると若干少ないです。

準備

使うもの

名称(型番)用途
汎用DCモータ今回の主役。回ってもらいます。
DCモータドライバ
TB6612FNG
(md08a)
マイコン基板から指示を受け、DCモータを制御する。
DCモータドライバ
(DRV8833(R))
マイコン基板から指示を受け、DCモータを制御する。
DCモータドライバ
(DRV8833(B))
マイコン基板から指示を受け、DCモータを制御する。
制御マイコン基板
RaspberryPi Pico
回転数や方向を指示するマイコン基板。
制御マイコン基板
RP2040-Zero
RaspberryPi Pico の代わり
どちらを使ってもかまいません。
ブレッドボードマイコン基板、ドライバを配置する。
ジャンパワイヤ
両端ワニ口クリップ
マイコンやドライバとの配線に使用。
バッテリーモータの電源に使用。
今回充電式電池 単3を2本直列(2.4V)を使用します。
スライド抵抗つまみの位置により抵抗が変化します。
モーターの回転数や方向の設定に使用します。

ライブラリ

ボードライブラリ

マイコン基板ライブラリ
Raspberry Pi PicoRaspberry Pi RP2040 Boards(x.x.x)※ > Raspberry Pi Pico
※記載時は 2.3.2を使用

動作 TB6612FNG(md08a)

TB6612FNG(md08a)の配線

Raspberry
Pi Pico
配線色TB6612FNG
(md08a)
配線色DCモータ配線色可変抵抗配線色バッテリー
3.3VVCC
3.3VSTBY
3.3VP1
GNDGNDP3-minus
GP16PWMA
GP18AIN1
GP19AIN2
GP28P2
VMOT+plus
AO1M1
AO2M2

スケッチ TB6612FNG(md08a)

#define PIN_POTADC 28       //スライド抵抗からの電圧信号
#define PIN_PWM 16          //PWMによる回転速度制御
#define PIN_DIR1 18         //モータの回転方向1
#define PIN_DIR2 19         //モータの回転方向2

#define ADC_SIZE 1024       //ADCのサイズ(10bit)
#define PWM_SIZE 256        //PWMのサイズ(8bit)

void setup()
{

    //各ピンの出力方向の設定
    pinMode(PIN_POTADC, INPUT);   //固定抵抗は電圧の読み取りを行う

    pinMode(PIN_PWM,OUTPUT);      //回転速度と方向の出力
    pinMode(PIN_DIR1,OUTPUT);
    pinMode(PIN_DIR2,OUTPUT);
}
 
void loop()
{
  int pot_adc = analogRead(PIN_POTADC) - (ADC_SIZE / 2);        //スライドの位置が半分より左側ならマイナス、右側ならマイナスにする
  int pwm = pot_adc / (ADC_SIZE / PWM_SIZE);                    //ADCの読み取り分解能10bit(1024)を、PWMの設定分解能8bit(256)へ変換する

  //速度がマイナス側なら逆転、プラス側なら正転
  if(pwm < 0)
  {    
      digitalWrite(PIN_DIR1, LOW);
      digitalWrite(PIN_DIR2, HIGH);
  }
  else
  {
      digitalWrite(PIN_DIR1, HIGH);
      digitalWrite(PIN_DIR2, LOW);
  }

  //速度の設定を行う。
  //マイナスを使うため半値オフセットしていたため、倍にして最大PWM設定値を使用できるようにする。
  //整数のみ設定するため、abs()を使う
  analogWrite(PIN_PWM, abs(pwm) * 2);
}


結果

動作 DRV8833(R) & DRV8833(B)

DRV8833の動作は簡単にするために可変抵抗を使わないで、回転方向と速度を変更します。
端子が違うので配線はそれぞれ違いますが、同じスケッチを使用します。

配線図では単三2本を使って弱弱しく回転する程度なので、3.7Vバッテリー以上を推奨します。

DRV8833(R)の配線

RP2040 Zero配線色DRV8833(B)配線色DCモータ配線色バッテリー
GNDGND-minus
GP1IN1
GP2IN2
VM+Plus
OUT1M1
OUT2M2

DRV8833(B)の配線

RP2040 Zero配線色DRV8833(R)配線色DCモータ配線色バッテリー
GNDGND-minus
GP1AIN1
GP2AIN2
VM+Plus
AO1M1
AO2M2

スケッチ DRV8833(R) & DRV8833(B)

このスケッチはDRV8833(R)でもDRV8833(B)のどちらでも使用できます。
DRV8833(B)の時はSTBY端子がないので、配線しない状態で使用します。

#define VIN1 1
#define VIN2 2
void setup() 
{
  pinMode(VIN1, OUTPUT);
  pinMode(VIN2, OUTPUT);
}

void loop()
{
  int i = 0;

  //正回転
  digitalWrite(VIN2, LOW);
  //回転速度を上げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN1, i);
    delay(10);
  }

  //回転速度を下げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN1, 0xff - i);
    delay(10);
  }

  //逆回転
  digitalWrite(VIN1, LOW);

  //回転速度を上げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN2, i);
    delay(10);
  }

  //回転速度を下げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN2, 0xff - i);
    delay(10);
  }
}

結果

DRV8833(R)の結果

DRV8833(B)の結果

コメント

タイトルとURLをコピーしました