(第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)が過電流で一時停止(動かなくなる)を防ぐためにも大切な制御になります。
-------------