ArduinoとTB6612FNGを使ってDCモーターをPWM駆動する方法

この記事で学習できること

  • ArduinoとモータドライバIC(TB6612FNG)を使ってDCモータ(RC300)を回転させ電圧と回転数の関係を調べます。測定の過程で以下を学習・調査します。
    • DCモータ(RC300)の仕様
    • モータドライバの選定
    • TB6612FNG の仕様
    • モータ駆動の回路構成
    • PWM駆動するためのスッケチ
    • 回転速度の測定
    • よくあるトラブルと対処法

使用するDCモータ(RC300)の仕様

  • 株式会社タミヤ製のエコモーターギヤボックス(3速タイプ)を購入しました。DCモーターとしてRC300-FT/14270/DVが同梱されていました。詳しいモーターの仕様は掲載されていなかったのでWebで仕様を調べます。
ギヤボックス(TAMIYAのHPより)とDCモータ RC300 の外観
— ギヤボックス(TAMIYAのHPより)とDCモータ RC300 の外観 —
  • RC300-FT/14270/DVの仕様書としての文書は見つかりませんでした。断片的にWebに掲載されていた仕様をまとめました。参考値として使います。
用語参考値
無負荷電流 (回転数)1.9V:25 mA (3600 RPM)
3.0V:35 mA (5800 RPM)
4.5V:46 mA (8800 RPM)
定格電流 (印可電圧 3V時)約140mA (4800 RPM 5 g.cm)
最大動作電流約 250~300 mA。
ストール電流 (ロック電流)1.9V:約 0.6 ~ 1.2 A
3.0V:約 1.2 ~ 1.6 A
4.5V:約 1.8 ~ 2.2 A
定格電圧3V
最大定格電圧約 4.5V〜6.0V(4.5Vを推奨)

使用するDCモータドライバの選定

  • Arduinoでロボットを作っている記事でTB6612FNGというドライバICを見つけました。以前ドライバ(ICL293D)の学習結果を[ArduinoとL293Dを使ってDCモーターをPWM駆動する方法]の記事にまとめています。TB6612FNGとL293Dの仕様を比較してどちらを使うかを選択します。
項目TB6612FNGL293D
動作電圧(モーター側)2.5V ~ 13.5V4.5V ~ 36V
連続出力電流1.2A(1chあたり)600mA(1chあたり)
ピーク電流3.2A(短時間)約 1.2A(短時間)
出力構成フルブリッジ ×2ハーフブリッジ ×4(フルブリッジ×2として使用可)
出力トランジスタMOSFET(低オン抵抗)バイポーラ(Darlington)
電圧降下(損失)低い(0.5V程度)高い(1.8V程度)
PWM対応可能可能
保護機能過熱・低電圧遮断ありなし
  • TB6612FNGをRC300のモータドライバとして選択しました。
    • RC300-FT/14270 のストール電流(1.2A以上)に対して、L293D は定格を超える可能性が高く、発熱や故障のリスクがあります。
    • TB6612FNG は1.2A連続、3.2Aピーク対応なので、ストール時もある程度耐えられます。

TB6612FNG の仕様

TB6612FNG 回路ブロック図
— TB6612FNG 回路ブロック図 —
  • TB6612FNGのピン配置と機能を抜き出しました
PIN名称PIN番号機能
AO11,2chA 出力1
PGND13,4Power GND 1
AO25,6chA 出力2
BO27,8chB 出力2
PGND29,10Power GND 2
BO111,12chB 出力1
VM2,VM313,14Motor電源
PWMB15chB PWM 入力 *1
BIN216chB 入力2 *1
BIN117chB 入力1 *1
GND18小信号GND
STBY19”L”時にStandby *1
Vcc20小信号電源
AIN121chA入力 1 *1
AIN222chA入力 2 *1
PWMA23chA PWM 入力 *1
VM124Motor電源

*1 IC内部で200KΩのプルダウン

  • chA、chBともに、IN1とIN2のHi、Loを組み合わせて回転方向を制御します。
IN1IN2モータの動作
HiHiブレーキ
LoHi正転
HiLo逆転
LoLoストップ
  • STBY端子が設けてあり、この端子を”L”とすると回転はせずに低消費電流モードになります。モーターを回転させる時はHiで使います。

TB6612FNGをDIP化した製品

  • TB6612FNGのパッケージはSSOP24(端子間0.65mm)です。このままでは電子工作では使いづらいので、基板に実装してDIPパッケージのように2.54mm間隔の端子を出している製品を使いました。
  • ICは例えばモータ用の電源ピンは複数ありますが、DIP化時に一つの端子にまとめてあります。端子の機能はシルク印刷してありました。
TB6612FNGをDIP化した基板
— TB6612FNGをDIP化した基板 —

学習で使う部品

Arduino, DCモータ、ドライバ、外部電源、ブレッドボード、接続用の線材を準備します。

Arduino UNO R3CPUボード備考
RC300-FT/14270/DVDC モータ1 個
TB6612FNGのDIP化基板 モータードライバ1 個
1.5V単4電池(3本)モータ用電源(4.5V)1 個
ブレッドボード、ジャンパ線配線用部材(必要数)

ArduinoでDCモーターを駆動する回路構成

  • Arduino UNO R3のI/Oピンから取り出せる電流の最大値は20mAですからDCモータの直接駆動はできません。DCモータをArduino UNO R3に直接接続して駆動させようとするとArduino UNO R3は壊れる可能性があります。
  • DCモータRC300の最大定格電圧は4.5V~6V(4.5Vを推奨)とのことでしたので、モーター用の外部電源は、1.5Vの乾電池を3本使って4.5Vとしました
  • TB6612FNGのDIP化基板、Arduino UNO R3、モーター用電池(4.5V)は以下の表のように接続します。
TB6612FNG DIP化基板Arduino UNO R3備考
AIN1Digital 2ピン回転制御信号 #1
AIN2Digital 3ピン回転制御信号 #2
PWMADigital 5ピンPWM駆動信号
VCC5V制御回路用電源
GNDGNDグランド
STBY5V5VでStandbyを解除
VMモーター駆動用電源

● モーター用電源(4.5V)のGNDはTB6612FNGのDIP化基板のGNDとArduino UNO R3のGNDとに接続します。

部品接続図
— 部品接続図 —

ArduinoのPWM駆動機能

  • Arduino UNO R3にはPWMを出力する機能が備わっています。Arduino IDEにはPWM波形を出力する関数が提供されており、スケッチでその関数を呼び出せば設定したポートからPWM波形が出力されます。
  • PWM出力のできるArduino UNO R3の端子とPWM周波数です。ボードにポート番号が印刷されています。PWM波形が出力できるポート番号の前に’~’が加えられています。
PIN 番号PWM 周波数
3, 9, 10, 11490 Hz
5, 6980 Hz
  • PWMを出力する関数は、analogWrite(pin, value) です。
  • pinでPWMを出力するpin番号を設定します。変数を使う場合は、int型です。
  • valueでデューティ-サイクルを設定します。0~255の数値で設定し、0の場合はデューティ-サイクルが0%、255の場合はデューティ-サイクルが100%になります。
analogWrite(5, 128);
  • analogWrite(5, 128)はArduino UNO R3の5pinにデューティ-サイクルが50%の波形を出力した例です。

DCモーターをPWM駆動するスケッチ

● DCモータ(RC300)をTB6612FNGからのPWM波形で回転させるスケッチを作成します。

  • const int pwmValue = 128; // Duty(0〜255の間で設定)の行の数値を変えてデューティ-サイクルを変化させます。
  • 指定したデューティ-サイクルで時計方向と反時計方向に90秒ずつ回転します。この後止まります。(ループはしません)
// TB6612FNG モーター制御ピン定義
const int AIN1 = 2;
const int AIN2 = 3;
const int PWMA = 5;

// PWM設定
const int pwmValue = 128;       // Duty(0〜255の間で設定)
const int runDuration = 90;     // 回転時間(秒)
const int stopDuration = 10000; // 停止時間(ミリ秒)

void setup() {
  // ピンモード設定
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
  pinMode(PWMA, OUTPUT);

  // 初期状態:モーター停止
  stopMotor();

  // シリアル通信開始
  Serial.begin(9600);
  Serial.println("モーター制御開始");
}

void loop() {
  // 正転
  Serial.println("正転開始(50% Duty)");
  rotateMotor(true);
  countSeconds(runDuration);

  // 停止(10秒)
  stopMotor();
  Serial.println("停止中(10秒)");
  delay(stopDuration);

  // 逆転
  Serial.println("逆転開始(50% Duty)");
  rotateMotor(false);
  countSeconds(runDuration);

  // 最終停止
  stopMotor();
  Serial.println("完了:モーター停止");

  // 以降は何もしない
  while (true);
}

// モーター回転関数(方向指定)
void rotateMotor(bool forward) {
  if (forward) {
    digitalWrite(AIN1, HIGH);
    digitalWrite(AIN2, LOW);
  } else {
    digitalWrite(AIN1, LOW);
    digitalWrite(AIN2, HIGH);
  }

  analogWrite(PWMA, pwmValue);
}

// モーター停止関数
void stopMotor() {
  digitalWrite(AIN1, LOW);
  digitalWrite(AIN2, LOW);
  analogWrite(PWMA, 0);
}

// 経過秒数を1秒ごとに表示
void countSeconds(int seconds) {
  for (int i = 0; i < seconds; i++) {
    Serial.print("経過時間: ");
    Serial.print(i + 1);
    Serial.println(" 秒");
    delay(1000);
  }
}

PWM波形のデューティ-サイクルを変えてDCモーターの回転数を測定

PWM波形のデューティ-サイクルを変えてDCモータの回転数を測定します。購入したDCモータRC300はギヤボックスの部品でした。このギヤボックスは減速の比率を3種類から選べます。実際のギヤボックスの比率を決める時の参考にできます。

DCモータRC300の動作学習と回転数の測定
— DCモータRC300の動作学習と回転数の測定 —
  • 測定結果をグラフにまとめました。電源電圧が4.5Vの場合はPWMのデューティ-サイクル比率と回転数に比例関係があるようです。
PWM デューティ-サイクルとRC300の回転数の関係
— PWM デューティ-サイクルとRC300の回転数の関係 —

● 株式会社タミヤ製のエコモーターギヤボックス(3速タイプ)は、114.7:1、38.2:1 そして12.7:1の比率で減速できます。RC300は定格電圧の3Vでは5300RPM程度で回転していました。38.2:1の減速比では140RPM程度になります。この回転数使って、今後は倒立振子・自己バランスロボットへの使用を考えています。

よくあるトラブルと対処法

モーターが動かない配線の確認、駆動ICの制御ピンの操作を確認
逆回転しない駆動ICの制御ピンの操作を確認
電源が落ちる電源の配線を確認

まとめ

  • TB6612FNGでDCモータを駆動する基本知識を学習できました。DCモータRC300を動作させるには過去学習したL293Dでは性能不足の可能性があることが解りました。もちろんL293Dで十分に駆動できる機器もあるはずです。DCモータを駆動する場合はDCモータの特性を調査・理解し適切なICを選ぶ必要があることも学習できました。

ご質問、誤植の指摘などありましたら。「問い合わせ 」のページからお願いします。