Arduinoを始めよう!(2)モーター制御編

2013年2月28日(木)
藤原 敬弘

プログラムと回路の解説

それでは、このプログラムと回路を解説していきます。とはいえ、このプログラムも回路もさほど難しいものではありません。FETモジュールの挙動と、プログラムに分けて解説していきます。

FETモジュールの挙動

FETモジュールは10本のピンを持っています。これらのピンはモーター用の電源(x1)、モーターの接続(x4)、制御信号(x4)、GND(x1)として使用します。

FETモジュールの10本のピンの振り分け(クリックで拡大)

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モジュールは電流の流れる方向を制御してくれます。この機構を使うことで、モーターの正転、反転を制御することができます。

[tips] Hブリッジ回路とモータードライバ

FETモジュール MP4212(MP4207)はHブリッジ回路としての使用を想定したモジュールです。Hブリッジ回路はモーターの正転、反転を制御するために考えられた回路です。

Hブリッジ回路としての機能を持つFETモジュール(クリックで拡大)

色々と事前知識が必要なため、ここでの解説は省きます。"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と通信してみます。

【参考リンク】

FULLER株式会社

1986年生まれ。北海道苫小牧市出身。苫小牧工業高等専門学校卒業。
Fuller, Inc. CTO
Webプログラマ、よく利用する言語はPython。Pythonコミュニティによく出没する。
趣味でArduinoやRaspberry Piなどを使って、便利なものを自作する。

twitter: @wutali / github: https://github.com/wutali

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています