[概要]
赤外線リモコンで動く恐竜のおもちゃをArduinoから操作するプログラムを作成します。
赤外線リモコンのraw信号を送信するプログラムを作るのが目的です。
[詳細]
2年前に娘の誕生日に購入した「ディズニー アーロと少年 ダイノRCアーロ」が赤外線リモコンで動くものだったので、Arduinoで動かせるようにしてみました。
[プログラムの流れ]
- ヘッダファイルをインクルード
- 定数の定義、オブジェクトの作成
- 赤外線のコマンドデータの貼り付け
- コマンド操作関数の作成
- setup関数にて、シリアルの初期化と赤外線オブジェクトの開始
- loop関数にて、シリアル入力に応じた赤外線コマンドの切り替えと赤外線コマンドの送信(LEDの点滅)
[ソース]
解説(番号)は、下記の説明の番号と一致しています。
// 解説 1
#include <IRremoteESP8266.h>
#include <IRsend.h>
// 解説 2
#define BAUD_RATE 115200 // シリアル・ポートの転送レート
#define IR_LED (D7) // 赤外線LEDを取り付けるピン
IRsend irsend(IR_LED); // 赤外線を送信するためのオブジェクトの作成
// 解説 3
// 曲がるためのコマンド
uint16_t turnData[65]
= {628, 3036, 642, 2026, 628, 1008, 642, 2028, 626, 2076, 578, 1030, 630, 1020, 626, 2026,
626, 2026, 628, 3046, 626, 38228, 626, 3036, 614, 2058, 624, 1010, 642, 2028, 626, 2026,
626, 1026, 626, 1026, 626, 2026, 626, 2024, 628, 3048, 626, 38248, 628, 3036, 614, 2082,
600, 1010, 640, 2032, 624, 2030, 624, 1028, 624, 1026, 628, 2026, 626, 2024, 630, 3046, 626
};
// まっすぐ歩くためのコマンド
uint16_t straghtData[65]
= {626, 3038, 612, 2056, 626, 1010, 642, 2030, 624, 2026, 628, 2026, 628, 1026, 626, 2028,
672, 978, 628, 3046, 628, 38262, 624, 3036, 614, 2056, 628, 1008, 642, 2028, 628, 2028,
626, 2028, 624, 1026, 626, 2026, 676, 976, 628, 3048, 626, 38222, 628, 3036, 616, 2054,
628, 1012, 640, 2028, 626, 2026, 626, 2028, 626, 1026, 626, 2026, 676, 978, 626, 3048, 628
};
uint16_t *rawData; // 送信する信号をスイッチするためのポインタ
// 解説4
// 送信する信号を決める
uint16_t *command(char x) {
uint16_t *data;
switch (x) {
case 's':
data = straghtData;
Serial.print("s data");
Serial.println(data[1]);
break;
case 'a':
Serial.print("r data");
data = turnData;
Serial.println(data[1]);
break;
case 'd':
Serial.println("q data");
data = NULL;
break;
default:
data = NULL;
}
return data;
}
// 解説5
// 起動時に初期設定を行います。
void setup() {
Serial.begin(BAUD_RATE); // シリアル・ポートの通信速度の設定
irsend.begin(); // 赤外線送信のオブジェクトをスタート
rawData = NULL; // コマンドのデータをNULLにセットし、赤外線LEDを点灯しないようにする。
}
// 解説6
// メインループ
void loop() {
char x;
if (Serial.available()) {
x = Serial.read();
rawData = command(x);
}
if (rawData != NULL) {
irsend.sendRaw(rawData, 65, 38);
}
delay(200);
}
[ソース解説]
- 赤外線を送るために2つのヘッダファイル"IRremoteESP8266.h"と"IRsend.h"をインクルードします。
- プログラムに必要な定数の定義と赤外線コマンドをグローバル・オブジェクトの作成を行います。
- BAUD_RATEにシリアルポートの通信速度115200 bpsを設定します。
- 赤外線LEDを取り付けるピン(IR_LED)を"D7"とします。
- IRsend irsend(IR_LED)で、赤外線を送信するためのオブジェクトの作成します。引数は赤外線LEDが接続されているピンを指定します。
- 赤外線コマンドになるRawデータを記述します。今回はまっすぐ進むと曲がるの2つのコマンドのみ。
コマンドの配列は学習プログラムがシリアルに出力したデータをコピー&ペーストしてください。
- turnData : 曲がるコマンドのデータ
- straghtData : まっす進むコマンドのデータ
- 送信する赤外線信号を決めるローカル関数を作成します。
- 送信するコマンドを決めるための関数を作成します。
[関数の概要]
入力された文字に応じてたコマンドのデータが格納してある配列のポインタを返します。
キーと動作の対応- a:曲がる。turnDataを指定する。
- s:まっすぐ進む。straghtDataを指定する。
- dとそれ以外:止まる。NULLを指定する。
- setup関数で起動時の初期設定をします。
- シリアルポートの通信速度をBAUD_RATE(115200 bps)に設定します。
- 赤外線送信を点滅できる状態にします。赤外線LEDを発光させるコマンドではありません。あくまで、点滅できるようにするだけです。
- コマンドのデータをNULLにセットし、起動時に恐竜が動き出さないようにします。
- loop関数の説明。
[関数の概要]
PCのキー入力に応じたコマンドを赤外線LEDで光らせます。- Serial.available() : シリアルが利用可能な状態かどうかを確認します。
- x = Serial.read() : シリアルからの入力を受け付けます。
- rawData = command(x): 解説xのcommand関数を呼び出し、実行するコマンドを取得します。
- irsend.sendRaw(rawData, 65, 38) : コマンドがNULL出ないときに、"rawData"に従ってLEDを点滅させます。関数の第二引数は配列の長さ。第三引数はメッセージを送信するときの周波数。
キーが押されない間は同じコマンドが繰り返されます。リモコンのボタンが押され続けることを実現するため。 - delay(200):200msの間休止します。この間隔が短すぎると部屋にある他の赤外線リモコンに干渉します。うちでは100msでテレビやエアコンのリモコンが効かなくなりました。逆に間隔が長いと恐竜の動きがスムーズになりません。