赤外線リモコンとArduino
前回に引き続いてArduinoの話題。今回は赤外線リモコンの送受信をArduinoで処理する。
もともとAVRをアセンブラで書き始めて、そこからAVRGCCに移ってそろそろ10年になる。赤外線リモコンの送受信も以前自分で書いたことはあるが、今回の目標は「極力他人任せ、ライブラリはダウンロードして使うもの」とする。
さて、今回利用したライブラリはこちら
shirriff/Arduino-IRremote · GitHub
shirriffさんのRobotIRremoteと関数とかがぶつかるらしく、そのままダウンロードしてlibraryに入れるだけだとエラーが出る。RobotIRremoteを別のフォルダに移動したらすんなりコンパイルが通った。
このライブラリの凄い所は、送信をPWMを使って行うこと。いろいろなライブラリが見つかったけど、送信をハードウェアPWMを使ってやってくれるライブラリはこれhしかなかった。副作用として、Arduinoの種類によって送信できるピンが一つに絞られる。Arduino Microの場合は13。他のArduinoについてはIRremoteInt.hを見るしかない。Arduino Microの場合、緑色のLEDと被る。これもご愛嬌。
とりあえず2番の入力に秋月で買った受光モジュールを接続して、下みたいなプログラムで実験したら割とすんなり動いた。ちなみに赤外線LEDは50mA以上で動かしたりするので、できればFETとかで増幅した方がいい。回路図は今後載せる。
受信に関しては結構再現性が悪いのでライブラリ書き直そうかな。そうするとついでに送信も緑のLEDと被らせたくないしこっちも書くか…。当初のコンセプトが。
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;
void setup() {
Serial.begin(9600);
while (!Serial) {
;
}
irrecv.enableIRIn();
}
void loop()
{
if (Serial.available() > 0) {
inByte = Serial.read();
if (inByte == 'i') {
for (int i = 0; i < 3; i++) {
irsend.sendNEC(0xC02EB847, 32);
delay(40);
}
}
} else if (inByte == 'd') {
if (irrecv.decode(&results)) {
Serial.print("\r\n");
Serial.println(results.decode_type, DEC);
Serial.println(results.value, HEX);
Serial.println(results.bits, DEC);
irrecv.resume(); // Receive the next value
}
delay(100);
}
}