Arduinoを始めよう!(2)モーター制御編
プログラムと回路の解説
それでは、このプログラムと回路を解説していきます。とはいえ、このプログラムも回路もさほど難しいものではありません。FETモジュールの挙動と、プログラムに分けて解説していきます。
FETモジュールの挙動
FETモジュールは10本のピンを持っています。これらのピンはモーター用の電源(x1)、モーターの接続(x4)、制御信号(x4)、GND(x1)として使用します。
10番のピンにはモーターの電源、3番・5番・7番・9番のピンにはモーター、2番・4番・6番・8番のピンにはArduinoの制御信号、1番のピンにはGNDを接続します。FETモジュールの挙動は以下の通りです。
2番ピン | 4番ピン | 6番ピン | 8番ピン | 電流の方向 |
---|---|---|---|---|
5V | 0V | 5V | 0V | x方向 |
0V | 5V | 0V | 5V | y方向 |
0V | 0V | 5V | 5V | 流れない |
5V | 5V | 0V | 0V | FETモジュールが壊れる |
このように、FETモジュールは電流の流れる方向を制御してくれます。この機構を使うことで、モーターの正転、反転を制御することができます。
FETモジュール MP4212(MP4207)はHブリッジ回路としての使用を想定したモジュールです。Hブリッジ回路はモーターの正転、反転を制御するために考えられた回路です。
色々と事前知識が必要なため、ここでの解説は省きます。"Hブリッジ回路"と検索すると、たくさんの解説サイトが出てくるので、理解したい場合は、そこを参考にしてください。また、モータードライバという名のモジュールが市販されています。Arduinoの開発元であるSparkfunからも販売されています。
> デュアル・モータードライバTB6612FNG(連続最大1.2A)
このモータードライバモジュールも中身はHブリッジ回路なので、今回とほとんど同じように利用することができます。ただし、自分でモータードライバモジュールやFETモジュールを購入する場合は、耐電圧と許容電流量に注意してください。今回使用したモジュールのデータシートを載せておきます。
> MP4212データシート(PDF)
2.4Vの電圧を掛けたときに、ミニ四駆のモーターが使用する電流量は以下のページにまとまっています。
> モーター性能比較
この電流量に耐えられるモジュールをセレクトしてください。今回使用したモジュールは許容電流量5Aなのでこれを満たしています。また、乾電池1.5V x 2の3Vの電圧に耐えられることも確認してください。
プログラムの解説
プログラム自体はとても簡単なものです。先ほどのFETモジュールの動作に基づいて、2番・4番・6番・8番の電圧制御を行っているだけです。
// 命令を単純化するためにsignal1を定義 // 12番(FETモジュールの8番)と13番(FETモジュールの2番)は必ず反対の信号になる void signal1(int value) { switch (value) { case 0: digitalWrite(12, HIGH); digitalWrite(13, LOW); break; case 1: digitalWrite(12, LOW); digitalWrite(13, HIGH); break; } } // 命令を単純化するためにsignal2を定義 // 10番(FETモジュールの4番)と11番(FETモジュールの6番)は必ず反対の信号になる void signal2(int value) { switch (value) { case 0: digitalWrite(10, HIGH); digitalWrite(11, LOW); break; case 1: digitalWrite(10, LOW); digitalWrite(11, HIGH); break; } } // 正転 void forward() { signal1(1); signal2(0); } // 逆転 void back() { signal1(0); signal2(1); } // 使用する10番から13番のピンを出力に設定 void setup() { pinMode(10, OUTPUT); // FETモジュール4番ピン pinMode(11, OUTPUT); // FETモジュール6番ピン pinMode(12, OUTPUT); // FETモジュール8番ピン pinMode(13, OUTPUT); // FETモジュール2番ピン } // 1秒毎に正転と逆転を繰り返す void loop() { forward(); delay(1000); back(); delay(1000); }
2番と8番、4番と6番はNOTの関係にあるので、signal1とsignal2としてまとめて切り替えています。こうすることで、正転と逆転の制御を単純化できます。
signal1 | signal2 | モーターの方向 |
---|---|---|
0 | 1 | 正転 |
1 | 0 | 逆転 |
前回の課題の回答
前回の課題は以下の仕様を満たすように、光センサを使ったプログラムを改良することでした。
暗くした場合にLEDが200ms間隔で点滅する
以下に模範解答を書いておきます。参考にしてください。
void setup() { pinMode(13, OUTPUT); } void loop() { int val = analogRead(0); if (val < 255) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(200); digitalWrite(13, LOW); delay(200); }
今回の課題
今回作成したプログラムを、シリアル通信で制御できるように改良してください。仕様は以下の通りとします。
- シリアル通信で命令を送る
- fの文字列を送るとモーターが正転する
- bの文字列を送るとモーターが逆転する
- sの文字列を送るとモーターが停止する
模範解答は次回の記事で掲載します。
おわりに
今回紹介したように、モジュールを活用すると、モーターも簡単に制御できます。回路を小さくしたり、カスタマイズする場合は自分で回路を組む必要がありますが、基本的な機能はモジュールで事足ります。センサや今回のようなHブリッジ回路は汎用的なICチップとして、イーサネットやMP3デコーダなどはArduinoのシールドとして手に入れることができます。
何か実現したいアイディアがあるときに、まずはモジュールを使うことを検討してみてください。ものが動けばモチベーションが上がり、学習効率も上がるはずです。
次回はBluetoothモジュールを使って、Arduinoと通信してみます。