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と通信してみます。




