ミニ四駆の遠隔操作を実現しよう!- プロトタイプ編
2013年3月22日(金)
プロトタイプの作成
プロトタイプ(1)コマンド送信プログラム
それではコマンド送信プログラムを作成しましょう。これには、「Arduinoを始めよう!(1)シリアル通信編」で作成したプログラムが参考になります。LEDはArduino UNO付属のものを使うため、必要ありません。USBケーブルをつなぎ、次のプログラムを転送してください。
/** * グローバル変数の定義 * * cmdStatus: コマンドを保持する。 * blinkStatus: 後退時のLEDの点滅を制御する。 */ int cmdStatus = 0; boolean blinkStatus = false; /** * コマンドの定義 * * cmdStatus変数にセットして利用する。 * cmdStatus変数とこのコマンドを比較し、プログラムはLEDの挙動を選択する。 */ const int STOP = 0; const int FORWARD = 1; const int BACK = 2; /** * setup関数 * * シリアル通信を使うため、初期化する。 * LEDを使うため、13番ピンをOUTPUTに指定する。 */ void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } /** * stop関数 * * 停止コマンドが来た場合のステータスの変更を行う。 */ void stop() { cmdStatus = STOP; } /** * forward関数 * * 前進コマンドが来た場合のステータスの変更を行う。 */ void forward() { cmdStatus= FORWARD; } /** * back関数 * * 後退コマンドが来た場合のステータスの変更を行う。 */ void back() { cmdStatus = BACK; } /** * light関数 * * 現在のステータスに応じて、LEDを点灯させる。 * STOP: 消灯 * FORWARD: 点灯 * BACK: 点滅 */ void light() { switch (cmdStatus) { case STOP: digitalWrite(13, LOW); break; case FORWARD: digitalWrite(13, HIGH); break; case BACK: digitalWrite(13, blinkStatus); blinkStatus = !blinkStatus; break; } delay(500); } /** * loop関数 * * コマンドを受け取り、forward / back / stop のいずれかの適切な関数を呼ぶ。 * light関数をループ毎に呼び、LEDを制御する。 */ void loop() { if (Serial.available() > 0) { char c = Serial.read(); if (c == 'f') { forward(); } else if (c == 'b') { back(); } else if (c == 's') { stop(); } } light(); }
コンソールを開き、動作を確認します。
このプロトタイプは、次の動作が確認できれば、正常に動いています。
コマンド | LEDの光り方 |
---|---|
f | 点灯 |
b | 点滅 |
s | 消灯 |
プロトタイプ(2) モーター回転プログラム
次は先ほどのプログラムにモーターの回転を加えます。このプログラムは、「Arduinoを始めよう!(2)モーター制御編」を参考にすると簡単に組むことができます。先ほどのプログラムでforward関数、back関数、stop関数を定義したので、ここにモーター回転のプログラムを組み込みましょう。
/** * ピンの定義 * * signal1とsignal2で使用するピンに名前を付ける。 */ const int SIGNAL1_1 = 12; const int SIGNAL1_2 = 13; const int SIGNAL2_1 = 10; const int SIGNAL2_2 = 11; /** * setup関数 * * シリアル通信を使うため、初期化する。 * モーターの制御に使用するピンをOUTPUTに指定する。 */ void setup() { Serial.begin(9600); pinMode(SIGNAL2_1, OUTPUT); pinMode(SIGNAL2_1, OUTPUT); pinMode(SIGNAL1_1, OUTPUT); pinMode(SIGNAL1_2, OUTPUT); } /** * signal1関数 * * モーターの制御をわかりやすくするため、シグナル関数を用意する。 * signal1関数とsignal2関数を使って、モーターの正転、逆転、停止を制御する。 * * signal1関数とsignal2関数に同時に1を渡すと、FETモジュールが壊れるので注意する。 */ void signal1(int value) { switch (value) { case 0: digitalWrite(SIGNAL1_1, HIGH); digitalWrite(SIGNAL1_2, LOW); break; case 1: digitalWrite(SIGNAL1_1, LOW); digitalWrite(SIGNAL1_2, HIGH); break; } } /** * signal2関数 * * モーターの制御をわかりやすくするため、シグナル関数を用意する。 * signal1関数とsignal2関数を使って、モーターの正転、逆転、停止を制御する。 * * signal1関数とsignal2関数に同時に1を渡すと、FETモジュールが壊れるので注意する。 */ void signal2(int value) { switch (value) { case 0: digitalWrite(SIGNAL2_1, HIGH); digitalWrite(SIGNAL2_2, LOW); break; case 1: digitalWrite(SIGNAL2_1, LOW); digitalWrite(SIGNAL2_2, HIGH); break; } } /** * stop関数 * * 停止コマンドが来た場合のステータスの変更を行う。 */ void stop() { signal1(0); signal2(0); } /** * forward関数 * * 前進コマンドが来た場合のステータスの変更を行う。 */ void forward() { signal1(1); signal2(0); } /** * back関数 * * 後退コマンドが来た場合のステータスの変更を行う。 */ void back() { signal1(0); signal2(1); } /** * loop関数 * * コマンドを受け取り、forward / back / stop のいずれかの適切な関数を呼ぶ。 */ void loop() { if (Serial.available() > 0) { char c = Serial.read(); if (c == 'f') { forward(); } else if (c == 'b') { back(); } else if (c == 's') { stop(); } } }
回路も第4回の記事と同一のものです。
実はここで紹介しているプログラムは前回の課題解答で紹介したものです。しっかりと毎回の課題をこなしている方は、簡単に理解することができたと思います。このプロトタイプは、次の動作が確認できれば、正常に動いています。
コマンド | モーターの挙動 |
---|---|
f | 正転 |
b | 逆転 |
s | 停止 |
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。