Arduinoで赤外線リモコンの信号を解析する

リモコンを制御したい!

家電製品の大半はリモコンで操作することができます。冷蔵庫とか洗濯機とかは無理ですが、テレビとか照明はリモコンで操作できますね。Arduinoからこのリモコンの赤外線を出すことができれば、これらの家電をパソコンから制御できます。IoTみたいで素敵ですね。

ただし、適当に赤外線を出せば良いというものではありません。正しい信号を送ってあげる必要がありますが、取扱説明書を見てもそんな技術的なことは書いてありません。正しい信号を知るためには本物のリモコンの信号を受信してみることが確実です。そこで、ここでは赤外線信号を受信してパソコンに表示することにチャレンジしてみます。

動画を作成しました

配線図

ir_recv

ここでは秋月電子通商から販売されている

赤外線リモコン受信モジュール PL-IRM2121(38kHz)
取り扱いを終了したとのことです。

を使用しています。僅か100円です。画像の「RECV」と書かれた部分が受光部だと考えてください。配線は簡単ですが、うっかり間違えると高熱を発して壊れますので注意してください。

スケッチ(プログラム)

#define READ_PIN 11
#define LOW_STATE 0
#define HIGH_STATE 1

void setup(){
  Serial.begin(115200UL);
  pinMode(READ_PIN,INPUT);

  Serial.println("Ready to receive");
}

void waitLow() {
  while (digitalRead(READ_PIN)==LOW) {
    ;
  }
}

int waitHigh() {
  unsigned long start = micros();
  while (digitalRead(READ_PIN)==HIGH) {
    if (micros() - start > 5000000) {
      return 1;
    }
  }
  return 0;
}

unsigned long now = micros();
unsigned long lastStateChangedMicros = micros();
int state = HIGH_STATE;

void loop() {
    if (state == LOW_STATE) {
      waitLow();
    } else {
      int ret = waitHigh();
      if (ret == 1) {
        Serial.print("\n");
        return;
      }
    }

    now = micros();
    Serial.print((now - lastStateChangedMicros) / 10, DEC);
    Serial.print(",");
    lastStateChangedMicros = now;
    if (state == HIGH_STATE) {
      state = LOW_STATE;
    } else {
      state = HIGH_STATE;
    }
}

とりあえず、こんな感じです。
類似のソースはあちこちにありますが、たぶんいちばん安定しています。

実行してから、シリアルコンソールを起動すると「Ready」メッセージが表示されているはずです。表示されていない場合は通信速度が115200になっているか確認してください。

その状態でリモコンのボタンを押すと、赤外線のON/OFF状態の時間がマイクロ秒単位でシリアルコンソールに表示されます。

735608,804,383,60,40,60,41,59,136,60,40,57,43,60,135,60,135,58,136,60,383,54,141,59,135,60,40,60,40,60,41,60,40,60,41,60,40,59,2022,804,383,60,40,60,41,60,135,60,40,60,40,60,135,60,135,60,134,60,383,60,135,60,135,60,41,59,41,60,41,59,40,60,40,60,40,60,2022,804,384,54,46,60,40,60,135,60,40,59,41,60,135,60,135,60,134,60,383,57,138,57,138,60,40,60,41,59,41,60,40,60,41,60,40,60,2022,804,384,59,42,59,40,60,135,60,41,60,40,60,135,60,135,60,134,60,383,57,138,60,135,60,40,60,40,58,43,60,40,60,41,59,40,60,2022,804,384,57,43,60,41,60,135,60,40,60,40,60,135,60,135,60,134,60,383,60,135,61,134,60,41,60,40,60,41,60,40,60,41,60,40,60

こんな感じですが、いちばん最初の大きな値の数値はリモコン照射前までの赤外線が当たっていない時間を示しているので削除します。そうして、似たようなパターンを探していきます。

804,383,60,40,60,41,59,136,60,40,57,43,60,135,60,135,58,136,60,383,54,141,59,135,60,40,60,40,60,41,60,40,60,41,60,40,59,2022,
804,383,60,40,60,41,60,135,60,40,60,40,60,135,60,135,60,134,60,383,60,135,60,135,60,41,59,41,60,41,59,40,60,40,60,40,60,2022,
804,384,54,46,60,40,60,135,60,40,59,41,60,135,60,135,60,134,60,383,57,138,57,138,60,40,60,41,59,41,60,40,60,41,60,40,60,2022,
804,384,59,42,59,40,60,135,60,41,60,40,60,135,60,135,60,134,60,383,57,138,60,135,60,40,60,40,58,43,60,40,60,41,59,40,60,2022,
804,384,57,43,60,41,60,135,60,40,60,40,60,135,60,135,60,134,60,383,60,135,61,134,60,41,60,40,60,41,60,40,60,41,60,40,60

信号パターンが分かるかと思います。ボタンを押している間、同じパターンが繰り返されるので、下記のパターンで赤外線LEDを点滅させれば、機器を操作することができます。

804,383,60,40,60,41,59,136,60,40,57,43,60,135,60,135,58,136,60,383,54,141,59,135,60,40,60,40,60,41,60,40,60,41,60,40,59,2022

ちなみに800マイクロ秒点灯、380マイクロ秒消灯という感じで読んでいってください。

Arduino関連の記事

Arduino

Posted by @erestage