今回はDCモータをRaspberryPiで制御してみます。ミニ四駆でおなじみのFA130モータを用意しました。
DCモータの回転を制御しながら駆動させる回路にはトランジスタやFETを使ったフルブリッジ回路がよく使われます。今回はフルブリッジ回路が内蔵されているモータドライバIC TA7291P を使いました。
TA7291Pは小電力モータ用で内部にフルブリッジと保護回路が入っています。このICを使うとDCモータの「正転」、「逆転」、「ブレーキ」、「ストップ」、「電圧の制御」の制御がでます。このICで使えるモータの電流は平均0.4A、ピーク1.0A、モータ電圧は20Vまで、ICの電源は4.5Vから20Vです。
モータドライバICと電池、モータをつなぎます。画像では電池が入っていませんが、実験ではアルカリ単3乾電池を2本使用しました。
モータードライバICへの信号はすべてRaspberryHabuのデジタル出力につなぎます。TA7291Pの4ピンに電圧をかけたりPWM信号を送ることでモータの速度を調整できます。今回は電圧制御ではなくPWM信号を試します。ハードウェアPWMを使うのでRaspberryHabuのデジタル出力1ピンにICのモータ出力制御ピン(ICの4ピン)、モータ回転制御ピン(ICの5ピンと6ピン)はRaspberryHabuのデジタル出力2ピンと3ピンにつなぎます。ICの5ピンにLOW、6ピンにHIGHを入力すると正転、5ピンにHIGH、6ピンにLOWを入力すると逆転、両方にHIGHを入力するとブレーキ、両方にLOWを入力すると停止の信号を送ることができます。
とりあえず回すだけのプログラム。PWM信号は約50%(512)に設定しました。正転と逆転を切り替えるときに一度停止した状態を作らないと逆起電力で回路が壊れることがあるので注意です。
// Licence CC 0 ( Public Domain ) #include "stdio.h" #include "stdlib.h" #include "wiringPi.h" #define MOTORPWM 1 #define MOTOROUT1 2 #define MOTOROUT2 3 int main() { if (wiringPiSetup() == -1) { printf("setup error!"); exit(1); } pinMode(MOTOROUT1,OUTPUT); pinMode(MOTOROUT2,OUTPUT); pinMode(MOTORPWM,PWM_OUTPUT); digitalWrite(MOTOROUT1,0); digitalWrite(MOTOROUT2,0); digitalWrite(MOTORPWM,0); while(1){ printf("foward\n"); digitalWrite(MOTOROUT1,1); pwmWrite(MOTORPWM,512); sleep(5); pwmWrite(MOTORPWM,0); digitalWrite(MOTOROUT1,0); usleep(50000); printf("back\n"); digitalWrite(MOTOROUT2,1); pwmWrite(MOTORPWM,512); sleep(5); pwmWrite(MOTORPWM,0); digitalWrite(MOTOROUT2,0); printf("STOP\n"); sleep(5); } return 0; }
動きました。正転5秒、一瞬停止、逆転5秒、停止5秒の順で動いています。
モータ出力制御ピンに5V、モータ用電源に3.1Vの電圧をかけた場合、モータへの出力電圧は1.36Vでした。データシート(8p,左上の表)にもありますがIC内部ロスがあるため、モータ用電源はそのロスも加味したうえで決定する必要があります。
電池を直接モータにつなぎ可変抵抗などで電圧を変化させることで制御することもできますが、その場合電圧が下がるとトルクが小さくなるという欠点があります。TA7291Pを使って電圧で速度を制御する場合、制御端子にかける電圧とモータ用電源の電圧との差はIC内で熱に変換されるため、電圧差が大きければ大きいほどICの発熱が増えてしまうという欠点があるため制御用電圧はモーター電圧よりも少なくする必要があります。
それに対し、PWMで制御するとモータのトルクの変化が少ないことやモータとの電圧が少ないのでICの発熱も抑えることができるという利点があります。
いっぱい使えば、ロボットにも応用できます。無線を使えばラジコンカーも作れそうですね。