(第4回)モーター制御(その1)

モーターは手動のスイッチであれば、電源を直接接続すればよいのですが、マイコンでモーターを制御する場合、LEDをチカチカさせるのとは違います。 例えばマブチモーター「FA-130RA」の場合、500mAの電流が流れます。マイコンの端子は数十mAしか電流が流れませんので、 モーターを直接接続しても動きません。

まえばしロボコンは主に「FA-130RA」を使っているので、ロームのモータードライバーを使用します。 モータードライバーはスイッチの役割をします。 「BD-6211F」は3.3Vで動作するICで、最大1000mAの電流を流すことができます。

注意)モータードライバーは壊れやすい部品です。
故障原因No1:連続して動作させる。ICに連続して電流を流すと熱で故障します。
故障原因No2:急に逆回転する。ICに逆起電力が発生して壊れる場合があります。(電源のプラスマイナスが逆転)
故障原因No3:大きいモーターで急にONにする。突入電流が1A以上流れて、壊れる場合があります。

モーターが大きくなると流れる電流が大きくなるので、故障する可能性が増えます。例えば「RE-280RA」を「モーターだけ(ギヤなし)で連続して10分通電」「急に逆回転する」と簡単に故障してICが動かなくなります。

マイコンでモーターを動かす

マイコンの信号をモータードライバーに入力することで、モータードライバーからモーターへ電力を供給してモーターを動作させます。

<使っている部品>

a.Arduino Pro Mini 328 3.3V 8MHz

b.BD-6211F-E2

c.SOP8(1.27mm)DIP変換基板 金フラッシュ

d.RE-280RA(説明用に大きいモーターを使用します)

e.ショットキーダイオード 40V1A 1S4 +コンデンサ10uF

 1.接続

bとcを半田付けします。小さくてちょっと難しいですが、はんだ フラックス(H-722)を使えば、問題なく半田付け可能です。Arduinoは4,5,6番に接続。モーターとは1,7番に接続します。

(BD-6211Fの端子と機能)

(接続図)

<注意>図のモーターはギアがついてませんが、必ずギア付きのモーターで実験してください。

モーターとBD-6211F(変換基板)の間にあるのがダイオード・コンデンサ(無極性なので図略)です。このダイオード・コンデンサが故障原因No2の逆起電力をICに流れないようにしてくれています。ただし完全に防止できるわけではありません。 大きいモーターの回転開始時にノイズが発生しますので、コンデンサはそのピーク電圧を小さくする役割があります。(ドライバーのドキュメントにも記載されています)

(参考)電源-GND間のコンデンサの効果
下のグラフは電源とGND間のコンデンサの容量を変えた時のグラフです。RE-280RAをONしたときに、「容量の小さいコンデンサ1uF」と「ロームの ドキュメントの指定どおりの10uFのコンデンサ」の違いを確認しました。1uFではモータードライバーの定格の7~-0.3Vを超えてしまいますが、10uFでは発生しません。 このノイズは小さいモーターの時はほとんど発生しませんのでコンデンサは不要ですが、大きいモーターでは駆動した瞬間や逆転時(特にひどい)にICの定格を超えるので、故障する場合があります。 このノイズからモータードライバーを保護するためにコンデンサとダイオードを取り付けています。
これに気付くまでにかなりの数のICを壊しました・・・(^^;)

2.プログラムの準備

①以下がサンプルプログラムです。コピーして使います。

//----(プログラム)----
uint16_t MyCount;//モーター加速用カウント
uint16_t MyCount2;//モーター加速用カウント
uint8_t Mode;//モーター状態
uint8_t Plus_Count;//モーター加速幅
uint8_t KirikaeFlag;//モーター切り替え判断
void setup() {

delay(100);
pinMode(2, OUTPUT);//正転指令
pinMode(4, OUTPUT);//逆転指令
pinMode(5, OUTPUT);//モーター速度
Plus_Count = 1;
KirikaeFlag = 1;
Mode = 3;
}


void loop() {
if (MyCount > 254) {
MyCount2 = 255;
} else if (MyCount < 50) {
MyCount2 = 50;
} else {
MyCount2 = MyCount;
}
analogWrite(5, MyCount2);//ここでモーターの速度を決める
delay(10);
if (KirikaeFlag == 1)
{
KirikaeFlag = 0;
if (Mode == 0) {
Mode = 1;
} else if (Mode == 1) {
Mode = 2;
} else if (Mode == 2) {
Mode = 3;
} else if (Mode == 3) {
Mode = 4;
} else if (Mode == 4) {
Mode = 5;
} else if (Mode == 5) {
Mode = 0;
}
if (Mode == 0) {
digitalWrite(2, HIGH) ;
digitalWrite(4, LOW) ;
}
if (Mode == 1) {
digitalWrite(2, LOW) ;
digitalWrite(4, LOW) ;
}
if (Mode == 2) {
digitalWrite(2, LOW) ;
digitalWrite(4, HIGH) ;
}
if (Mode == 3) {
digitalWrite(2, LOW) ;
digitalWrite(4, LOW) ;
}
if (Mode == 4) {
digitalWrite(2, HIGH) ;
digitalWrite(4, LOW) ;
}
if (Mode == 5) {
digitalWrite(2, LOW) ;
digitalWrite(4, LOW) ;
}
} else if (MyCount > 254) {
if (Mode == 1) {delay(100);Plus_Count = 2;KirikaeFlag = 1;}
if (Mode == 1) {delay(500);Plus_Count = 1;KirikaeFlag = 1;}
if (Mode == 2) {delay(100);Plus_Count = 2;KirikaeFlag = 1;}
if (Mode == 3) {delay(500);Plus_Count = 1;KirikaeFlag = 1;}
if (Mode == 4) {delay(100);Plus_Count = 2;KirikaeFlag = 1;}
if (Mode == 5) {delay(10000);Plus_Count = 1;KirikaeFlag = 1;}
MyCount = 0;
}
MyCount = MyCount + Plus_Count ;

}

②プログラムをArduinoに書き込むとモーターが動きます。少し複雑ですが、モーターにゆっくり電力を供給するようなプログラムになっています。連続して動作させると発熱でモータードライバーが壊れてしまうので、10秒間停止しています。またタミヤのギヤモーターが完全に停止してから次の回転がするようになっています。

実験の様子

モーターは動きましたか?小さいモーターの場合は、「Plus_Count=1」の数値を大きくしても問題ないです。この実験では大きいモーターを使っているので、ゆっくり加速するプログラムになっています。これは、まえばしロボコンで使っているACアダプター(3.3V 2A)が過電流で一時停止(動かなくなる)を防ぐためにも大切な制御になります。

-------------