日々のつぶやき

なんとなく興味のあることを書いています

赤外線リモコンと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);
    }

}