ミニ四駆の遠隔操作を実現しよう!- プロトタイプ編

2013年3月22日(金)
藤原 敬弘

プロトタイプの作成

プロトタイプ(1)コマンド送信プログラム

それではコマンド送信プログラムを作成しましょう。これには、「Arduinoを始めよう!(1)シリアル通信編」で作成したプログラムが参考になります。LEDはArduino UNO付属のものを使うため、必要ありません。USBケーブルをつなぎ、次のプログラムを転送してください。

001/**
002  * グローバル変数の定義
003  *
004  * cmdStatus: コマンドを保持する。
005  * blinkStatus: 後退時のLEDの点滅を制御する。
006  */
007  int cmdStatus = 0;
008boolean blinkStatus = false;
009  
010 /**
011  * コマンドの定義
012  *
013  * cmdStatus変数にセットして利用する。
014  * cmdStatus変数とこのコマンドを比較し、プログラムはLEDの挙動を選択する。
015  */
016  const int STOP = 0;
017  const int FORWARD = 1;
018  const int BACK = 2;
019   
020 /**
021  * setup関数
022  *
023  * シリアル通信を使うため、初期化する。
024  * LEDを使うため、13番ピンをOUTPUTに指定する。
025  */
026  void setup() {
027      Serial.begin(9600);
028      pinMode(13, OUTPUT);
029  }
030 
031 /**
032  * stop関数
033  *
034  * 停止コマンドが来た場合のステータスの変更を行う。
035  */
036  void stop() {
037    cmdStatus = STOP;
038  }
039 
040 /**
041  * forward関数
042  *
043  * 前進コマンドが来た場合のステータスの変更を行う。
044  */
045  void forward() {
046    cmdStatus= FORWARD;
047  }
048 
049 /**
050  * back関数
051  *
052  * 後退コマンドが来た場合のステータスの変更を行う。
053  */
054  void back() {
055    cmdStatus = BACK;
056  }
057 
058 /**
059  * light関数
060  *
061  * 現在のステータスに応じて、LEDを点灯させる。
062  *  STOP: 消灯
063  *  FORWARD: 点灯
064  *  BACK: 点滅
065  */
066  void light() {
067    switch (cmdStatus) {
068      case STOP:
069        digitalWrite(13, LOW);
070        break;
071      case FORWARD:
072        digitalWrite(13, HIGH);
073        break;
074      case BACK:
075        digitalWrite(13, blinkStatus);
076        blinkStatus = !blinkStatus;
077        break;
078    }
079    delay(500);
080  }
081  
082 /**
083  * loop関数
084  *
085  * コマンドを受け取り、forward / back / stop のいずれかの適切な関数を呼ぶ。
086  * light関数をループ毎に呼び、LEDを制御する。
087  */
088  void loop() {
089    if (Serial.available() > 0) {
090      char c = Serial.read();
091      if (c == 'f') {
092        forward();
093      } else if (c == 'b') {
094        back();
095      } else if (c == 's') {
096        stop();
097      }
098    }
099  
100    light();
101  }

コンソールを開き、動作を確認します。

このプロトタイプは、次の動作が確認できれば、正常に動いています。

コマンド LEDの光り方
f 点灯
b 点滅
s 消灯

プロトタイプ(2) モーター回転プログラム

次は先ほどのプログラムにモーターの回転を加えます。このプログラムは、「Arduinoを始めよう!(2)モーター制御編」を参考にすると簡単に組むことができます。先ほどのプログラムでforward関数、back関数、stop関数を定義したので、ここにモーター回転のプログラムを組み込みましょう。

001/**
002 * ピンの定義
003 *
004 * signal1とsignal2で使用するピンに名前を付ける。
005 */
006 const int SIGNAL1_1 = 12;
007 const int SIGNAL1_2 = 13;
008 const int SIGNAL2_1 = 10;
009 const int SIGNAL2_2 = 11;
010 
011/**
012 * setup関数
013 *
014 * シリアル通信を使うため、初期化する。
015 * モーターの制御に使用するピンをOUTPUTに指定する。
016 */
017 void setup() {
018   Serial.begin(9600);
019   pinMode(SIGNAL2_1, OUTPUT);
020   pinMode(SIGNAL2_1, OUTPUT);
021   pinMode(SIGNAL1_1, OUTPUT);
022   pinMode(SIGNAL1_2, OUTPUT);
023 }
024 
025/**
026 * signal1関数
027 *
028 * モーターの制御をわかりやすくするため、シグナル関数を用意する。
029 * signal1関数とsignal2関数を使って、モーターの正転、逆転、停止を制御する。
030 *
031 * signal1関数とsignal2関数に同時に1を渡すと、FETモジュールが壊れるので注意する。
032 */
033 void signal1(int value) {
034   switch (value) {
035     case 0:
036       digitalWrite(SIGNAL1_1, HIGH);
037       digitalWrite(SIGNAL1_2, LOW);
038       break;
039     case 1:
040       digitalWrite(SIGNAL1_1, LOW);
041       digitalWrite(SIGNAL1_2, HIGH);
042       break;
043   }
044 }
045 
046/**
047 * signal2関数
048 *
049 * モーターの制御をわかりやすくするため、シグナル関数を用意する。
050 * signal1関数とsignal2関数を使って、モーターの正転、逆転、停止を制御する。
051 *
052 * signal1関数とsignal2関数に同時に1を渡すと、FETモジュールが壊れるので注意する。
053 */
054 void signal2(int value) {
055   switch (value) {
056     case 0:
057       digitalWrite(SIGNAL2_1, HIGH);
058       digitalWrite(SIGNAL2_2, LOW);
059       break;
060     case 1:
061       digitalWrite(SIGNAL2_1, LOW);
062       digitalWrite(SIGNAL2_2, HIGH);
063       break;
064   }
065 }
066 
067/**
068 * stop関数
069 *
070 * 停止コマンドが来た場合のステータスの変更を行う。
071 */
072 void stop() {
073   signal1(0);
074   signal2(0);
075 }
076 
077/**
078 * forward関数
079 *
080 * 前進コマンドが来た場合のステータスの変更を行う。
081 */
082 void forward() {
083   signal1(1);
084   signal2(0);
085 }
086 
087/**
088 * back関数
089 *
090 * 後退コマンドが来た場合のステータスの変更を行う。
091 */
092 void back() {
093   signal1(0);
094   signal2(1);
095 }
096/**
097 * loop関数
098 *
099 * コマンドを受け取り、forward / back / stop のいずれかの適切な関数を呼ぶ。
100 */
101 void loop() {
102   if (Serial.available() > 0) {
103     char c = Serial.read();
104     if (c == 'f') {
105       forward();
106     } else if (c == 'b') {
107       back();
108     } else if (c == 's') {
109       stop();
110     }
111   }
112 }

回路も第4回の記事と同一のものです。

(左)モーター回転プログラムの回路図(右)実際の配線イメージ(クリックで拡大)

実はここで紹介しているプログラムは前回の課題解答で紹介したものです。しっかりと毎回の課題をこなしている方は、簡単に理解することができたと思います。このプロトタイプは、次の動作が確認できれば、正常に動いています。

コマンド モーターの挙動
f 正転
b 逆転
s 停止

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メルマガ会員のサービス内容を見る

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