ArduinoでDCモーターを動かしてみました。モーターは130モーターです。
まず、Arduinoでモーターを動かすのに必要なものを準備します。今回は、マイコンの電源はPCからUSB供給で、ブレッドボードを使用して動かしてみます。
- PC
- Arduino UNO(互換品)
- モーター(マブチ製FA-130RA)
- モータードライバ(TB6612とDRV8835の2種類)
- モーター用電源(単3x2本)
- ブレッドボード
- ジャンパーワイヤ
部品等の購入先リンクは記事の一番下に記載してあります。
モータードライバは、2種類のPololuの製品を試しました。左側がTB6612FNGデュアルモータードライバ、右側がDRV8835デュアルモータードライバです。TB6612FNGの方が少し大きいです。
モータードライバについて
モータードライバは、モーターを制御するためのICで、簡単にモーターの回転方向や速度を制御することができます。
モータードライバを使用しない場合、MOS-FETを4つ使用するなど回路が複雑になってしまいます。制御用のMOS-FETを内蔵しているモータードライバを使用することで、回路はすっきりします。また、大電流が流れることを防ぐ回路や高温になったらモータを止める回路を内蔵していますので、モータードライバはとても便利なICです。
今回試した2つのモータードライバは、流せる電流やモーターの電圧、回転方向と回転速度の制御方法が少し異なります。今回のように小型のモーターを動かす際、どちらが使いやすいかを試してみたいと思います。
モータードライバの比較
スペック
Pololu製品ページより
TB6612FNGについて、モーター電圧が「4.5~13.5V」となっていますが、単3電池2本(3V)で問題なく動かすことができました。
モータードライバの回路
Arduinoの電源はPCから、モーターの電源は電池ボックスから供給しました。モーターに使う電源の電圧と制御系の電源電圧が異なったり、モーターの電流によるノイズによる制御系への影響を少なくするために、別とした方が良いようです。
DRV8835の2種類のモードとも、TB6612FNGよりも方が使用するピンが少なくて済むのはメリットだと思います。
なお、ブレッドボードの図は、「Fritzing」というソフトを使用して作成しています。以前は無料だったのですが、現在は有料となっています。
図中のモータードライバは同じ製品の図がなかったため、近いものを使用しています。
TB6612FNG
回転方向制御にArduinoのピン2本(IN1/IN2用)、速度制御に1本(PWM用)が必要です。当然ながら、PWM用のArduinoのピンは、PWM出力が可能なピン(3・5・6・9・10・11)となります。
- Arduinoの5VピンをモータードライバのVCCとSTBY
- ArduinoのGNDピンをモータードライバのGND
- モーター電源をモータードライバのVMOTとGND
- モーターをモータードライバのAO1とAO2
- Arduinoの7ピン、8ピン、9ピンとモータードライバのAIN1,AIN2、PWMA
DRV8835(IN/INモード)
回転方向と回転速度を2本の入力で制御します。2本ともArduinoのPWM出力のピンが必要となります。
- Arduinoの5VピンをモータードライバのVCC
- ArduinoのGNDピンをモータードライバのGNDとMODE
- モーター電源をモータードライバのVMMとGND
- モーターをモータードライバのAOUT1とAOUT2
- Arduinoの8ピン、9ピンとモータードライバのAPHASE,AENABLE
DRV8835(PHASE/ENABLEモード)
同様に、回転方向と回転速度を2本の入力で制御します。ただし、回転速度用のピンのみArduinoのPWM出力のピンが必要となります。
- Arduinoの5VピンをモータードライバのVCCとMODE
- ArduinoのGNDピンをモータードライバのGND
- モーター電源をモータードライバのVMMとGND
- モーターをモータードライバのAOUT1とAOUT2
- Arduinoの9ピン、10ピンとモータードライバのAIN1,AIN2
制御方法
TB6612FNG
東芝TB6612FNGデータシートより
DRV8835
Texas Instrumentデータシートより
プログラム
TB6612FNG
#define IN1 7
#define IN2 8
#define PWM 9
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(PWM, OUTPUT);
}
void loop() {
//モーター正転
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(PWM, 128);
delay(2000);
//モーターブレーキ
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(PWM, 0);
delay(1000);
//モーター逆転
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(PWM, 130);
delay(2000);
//モーターストップ
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
analogWrite(PWM, 130);
delay(1000);
//モーター速度変化
for (int i= 0; i<= 255; i++) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(PWM, i);
delay(50);
}
for (int i= 0; i<= 255 ; i++) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(PWM, i);
delay(50);
}
}
DRV8835(IN/INモード)
#define IN1 10
#define IN2 11
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
}
void loop() {
//モーター正転
analogWrite(IN1,145);
analogWrite(IN2,0);
delay(2000);
//モーターブレーキ
analogWrite(IN1,145);
analogWrite(IN2,145);
delay(1000);
//モーター逆転
analogWrite(IN1,0);
analogWrite(IN2,145);
delay(2000);
//モーターストップ
analogWrite(IN1,0);
analogWrite(IN2,0);
delay(1000);
//モーター速度変化
for (int i= 0; i<= 255; i++) {
analogWrite(IN1, i);
analogWrite(IN2, 0);
delay(50);
}
for (int i= 0; i<= 255 ; i++) {
analogWrite(IN1, 0);
analogWrite(IN2, i);
delay(50);
}
}
DRV8835(PHASE/ENABLEモード)
#define PHASE 9
#define ENABLE 10
void setup() {
pinMode(PHASE, OUTPUT);
pinMode(ENABLE, OUTPUT);
}
void loop() {
//モーター正転
digitalWrite(PHASE,LOW);
analogWrite(ENABLE,145);
delay(2000);
//モーターブレーキ
analogWrite(ENABLE,0);
delay(1000);
//モーター逆転
digitalWrite(PHASE,HIGH);
analogWrite(ENABLE,145);
delay(2000);
//モーター速度変化
for (int i= 0; i<= 255; i++) {
digitalWrite(PHASE, LOW);
analogWrite(ENABLE, i);
delay(50);
}
for (int i= 0; i<= 255; i++) {
digitalWrite(PHASE, HIGH);
analogWrite(ENABLE, i);
delay(50);
}
}
- DRV8835の方がサイズが小さい。
- TB6612FNGは、最低モーター電圧が4.5Vとなっていましたが、3V(乾電池2本)でも問題なく動くことが確認できた。
- DRV8835の方が、Arduinoの使用するピンが少なくて済む。
- 低速での駆動はTB6612FNGの方が良かった(大きな差はないけど)。
結局、130モーターのような小型のモーターを動かすには、どちらでもよいと思います。
購入先リンク
Pololu TB6612FNGデュアルモータドライバの購入ページ