赤外線リモコン (受信) [Arduino]
赤外線リモコンの受信モジュールは PL-IRM2161-C438 というものを使いました。
出力は負論理で、普段はHigh、リモコンの赤外線信号を受信するとLowになります。
赤外線リモコン受信モジュール PL-IRM2161-C438 (2個入)
http://akizukidenshi.com/catalog/g/gI-03292/
ブレッドボードやワイヤーを使うのが面倒だったので、デジタル2番をデータ受信、3番をGND、4番をVcc扱いにしてみました。
<NECフォーマットの受信サンプル>
できるだけ簡略にしてみました。
リーダ部以外は赤外線ONの時間は一定で、赤外線OFFの時間の長さで 0 / 1 が決まるので、赤外線OFFの時間を測定し1000μ秒より短ければ 0、長ければ1 としました。これを32ビット分行い、データのチェックは簡易的に3バイト目と4バイトのXORでのみ行いました。リーダの長さや、赤外線ONの時間や、ストップビット以降のチェックなどはしていません。
pulseInのパラメータにタイムアウトがあるのですが、これはパルスが開始するまでのタイムアウト時間で、パルスが終了しない時のタイムアウトの指定はできません。LEDのダイナミック点灯をしながら赤外線がきたら受信するというような場合に、赤外線が途切れてしまったら次の赤外線がくるまでまちぼうけとなってしまいます。
次のようにすると信号途絶の対応ができると思います。
<赤外線リモコンの受信結果>
REGZAの場合は、
カスタムコード 1バイト目は0x40
カスタムコード 2バイト目は0xBF (1バイト目の反転)
データコードは各社バラバラのようで、REGZAの場合は、チャンネルの番号とデータの値が同じでした。
家電協フォーマットは可変長のようです。うちの照明用リモコンで解析してみたいと思っています。
出力は負論理で、普段はHigh、リモコンの赤外線信号を受信するとLowになります。
赤外線リモコン受信モジュール PL-IRM2161-C438 (2個入)
http://akizukidenshi.com/catalog/g/gI-03292/
ブレッドボードやワイヤーを使うのが面倒だったので、デジタル2番をデータ受信、3番をGND、4番をVcc扱いにしてみました。
<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; // 信号途絶なら終了 }
<赤外線リモコンの受信結果>
REGZAの場合は、
カスタムコード 1バイト目は0x40
カスタムコード 2バイト目は0xBF (1バイト目の反転)
データコードは各社バラバラのようで、REGZAの場合は、チャンネルの番号とデータの値が同じでした。
家電協フォーマットは可変長のようです。うちの照明用リモコンで解析してみたいと思っています。
2011-05-03 21:36
nice!(0)
コメント(1)
トラックバック(0)
大変参考になります。
ありがとうございます。
フォーマットを認識する受信機を作りたい場合は、リーダー部の時間計測で
判定でしょうか?
by Tadashi (2013-12-31 23:31)