So-net無料ブログ作成

赤外線リモコン (受信) [Arduino]

赤外線リモコンの受信モジュールは PL-IRM2161-C438 というものを使いました。
出力は負論理で、普段はHigh、リモコンの赤外線信号を受信するとLowになります。

pl-irm2161-c438.png
赤外線リモコン受信モジュール PL-IRM2161-C438 (2個入)
http://akizukidenshi.com/catalog/g/gI-03292/

ブレッドボードやワイヤーを使うのが面倒だったので、デジタル2番をデータ受信、3番をGND、4番をVcc扱いにしてみました。

irrcv.png

<NECフォーマットの受信サンプル>
できるだけ簡略にしてみました。
リーダ部以外は赤外線ONの時間は一定で、赤外線OFFの時間の長さで 0 / 1 が決まるので、赤外線OFFの時間を測定し1000μ秒より短ければ 0、長ければ1 としました。これを32ビット分行い、データのチェックは簡易的に3バイト目と4バイトのXORでのみ行いました。リーダの長さや、赤外線ONの時間や、ストップビット以降のチェックなどはしていません。
// NECフォーマットリモコン(東芝テレビ REGZAなど)用サンプルプログラム
#define IR_IN   2          // IR Receiver

void setup()  { 
  pinMode( IR_IN , INPUT );
  pinMode( 3, OUTPUT );  digitalWrite( 3, LOW );  // GND
  pinMode( 4, OUTPUT );  digitalWrite( 4, HIGH ); // Vcc
  Serial.begin( 115200 );
}

void loop() {
  unsigned long irData = 0x00000000, irOff;
  while( digitalRead( IR_IN ) == HIGH );      // 赤外線を感知するまで待つ(信号としてはLOWになるまで待つ)
  while( digitalRead( IR_IN ) == LOW );       // リーダ部をやりすごす
  for( int dig = 0; dig < 32; dig++ ) {       // データを32桁読み込む
    irOff = pulseIn( IR_IN, HIGH );             // 赤外線消灯時間(信号としてはHIGHの時間)
    if( irOff > 10000 ) return;                 // 信号途絶なら終了
    if( irOff >  1000 ) irData |= 1UL << dig;   // Data=1 とき
  }
  if( (byte)((irData>>16)^(irData>>24)) == 0xff )
    Serial.println( irData , HEX );          // データOKならシリアル出力
}

pulseInのパラメータにタイムアウトがあるのですが、これはパルスが開始するまでのタイムアウト時間で、パルスが終了しない時のタイムアウトの指定はできません。LEDのダイナミック点灯をしながら赤外線がきたら受信するというような場合に、赤外線が途切れてしまったら次の赤外線がくるまでまちぼうけとなってしまいます。
次のようにすると信号途絶の対応ができると思います。
    usec = micros();
    while( digitalRead( IR_IN ) == HIGH ) {   // IR信号がOFFの時間を測定
      irOff = micros() - usec;
      if( irOff > 10000 ) return;             // 信号途絶なら終了
    }

<赤外線リモコンの受信結果>
regzacode.png

REGZAの場合は、
カスタムコード 1バイト目は0x40
カスタムコード 2バイト目は0xBF (1バイト目の反転)
データコードは各社バラバラのようで、REGZAの場合は、チャンネルの番号とデータの値が同じでした。

家電協フォーマットは可変長のようです。うちの照明用リモコンで解析してみたいと思っています。

nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

Tadashi

大変参考になります。
ありがとうございます。

フォーマットを認識する受信機を作りたい場合は、リーダー部の時間計測で
判定でしょうか?


by Tadashi (2013-12-31 23:31) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。