このページでは赤外線リモコンコードをデコードして解析する解析ツールの製作方法を説明します。赤外線リモコン信号の受信やコードのデコード解析にArduinoを用います。赤外線リモコンの受信モジュールはArduino用プロトタイプシールドのブレッドボード上に実装します。
リモコン信号は家製協AEHA方式、NEC方式、SONY SIRC方式に対応しています。どの方式を受信するのかをプッシュボタンで選択します。
電波を使ったXBee通信によって隣の部屋の赤外線リモコン機器を制御したり、リモコン操作の履歴を収集したりする機器の製作方法については別のページで紹介しています。詳しくは「リモート赤外線リモコン」を参照してください。
ハードウェア製作の概要について説明します。最も簡単にはArduino のアナログ1番ピンに赤外線リモコン受光モジュールを接続するだけで動作します。家電製品協会フォーマット(AEHA)のリモコン信号を受光すると結果をシリアル(9600bps)に出力しますので、Arduino IDEの画面右上の虫眼鏡アイコン「シリアルモニタ」で確認します。
また、Arduino のアナログ5番ピンにプッシュボタンを接続するとNECフォーマットやSONY SIRCフォーマットのコードを解析することも出来ます。上記の例では上から順にAEHA形式、NEC形式、SIRC形式の信号を受信しています。プッシュボタンを押下した時にGNDに接続するように配線してください。
さらに、Digital 13番ピンに赤外線LEDを接続すると受光したリモコンコードを送信することも可能です。ただし、リモコン送信が可能なのはバイト単位(8ビット単位)の信号のみです。例えば、上例(実行画面)のSIRCのリモコンコード長は20ビットとなっておりバイト単位ではありませんので正しく送信することが出来ません。赤外線LEDは100Ω程度の抵抗を直列に経由し、アノード(A)側を電源(+5V)に、カソード(K)側がGNDになるように接続します。
以下に製作例を示します。この製作例では赤外線リモコン受信モジュールに秋月電子で販売されている「SHARP製GP1UXC41QS(参考価格50円)」もしくは「PARA LIGHT製PL-IRM2161-XD1(参考価格50円)」を用いて動作確認しました。これら以外のモジュールを使用する場合は端子配列や電源電圧、出力レベルなどに合わせて回路変更が必要です。
赤外線LEDの発光部は解析には不要ですが、この製作例ではFETを用いて制御する発光用の赤外線LEDを実装しています。具体的にはArduinoのDigital 13をFET 2N7000のG(ゲート)に入力し、FET D(ドレイン)に接続した赤外線LEDをFET S(ソース)のGNDにスイッチング制御します。
注意:すぐに電源を入れてはいけません。
ハードウェアが完成してもすぐに電源を入れてはいけません。本例では赤外線LEDに大きな電流を流すような設計となっています。Digital 13がHigh出力になると大きな電流が赤外線LEDに流れ続け、LEDやマイコン、FETが壊れる可能性があります。
まずシールドを外した状態でスケッチをArduino UNOに書き込み、Arduino上のLED Lが点灯していないことを確認します。点滅する場合は、その頻度を観察します。点滅期間が1秒以下で、その後5秒以上消灯している程度であれば何ら問題はありません。点灯しっぱなしになっていなければ、電源を切り、シールドを装着して動かします。
以下に主要な部品リストを示します。プロトシールド以外は秋月電子通商で入手可能です。製作例で使用したプロトシールドはDFRobot製 Screw Shield($12.95)です。このプロトシールド上のLED(黄色)はDigital 13番ピンに、プッシュボタン(タクトスイッチ)GeneralはAnalog 5ピン(Digital 19番)に接続されています。秋月で売られているプロトタイピングボード(DFRobot製 Prototyping Shield For Arduino)を使用する場合は、これらの配線をLED1とS1 Buttonに行って使用します。
品名
参考単価
| 数量
| 備考
| Arduino UNO
| 2,940
| 1
| 秋月互換機も対応(Arduino標準関数にてIO制御)
| プロトタイピングボード
| 1,100
| 1
| スイッチに合わせて要スケッチ変更
| 赤外線リモコン受信モジュール
| 50
| 1
| SHARP GP1UXC41QS/PARA LIGHT PL-IRM2161-XD1
| タクトスイッチ
| 10
| 1
| プロトシールドに実装されている場合は不要
| 高輝度赤外線LED
| 20
| 1
| 直径5mmタイプを推奨
| MOS FET Fairchild 2N7000
| 20
| 1
| ID=200mA VGS=4.5V
| カーボン抵抗10Ω 1/4W
| 1
| 1
| 製作例は1/6Wタイプだがより高電力タイプを推奨
| |
Arduino用のソフトウェアは「ir_tester.zip」からダウンロードし、ZIP展開し、Arduino IDEの開くから「ir_tester」フォルダー内の「ir_tester.ino」を開きます。「ir_read.ino」と「ir_send.ino」は、それぞれ受信用、送信用のソフトウェアモジュールです。赤外線リモコン受信モジュールとArduinoとの接続ピンを変更する場合は、「ir_read.ino」内の「#define IR_IN」の値を、赤外線LEDのポートは「ir_send.ino」内の「#define IR_OUT」の値を変更します。
ir_tester.ino 本ツールのメイン部 byte type = AEHA; // 解析フォーマットの初期値(家製協AEHA) ir_read.ino 赤外線リモコン受信処理・デコード部 #define IR_IN 15 // 受信モジュール接続ポート(Analog 1) ir_send.ino 赤外線リモコン送信処理・エンコード部 #define IR_OUT 13 // 赤外線LEDの接続ポート(Digital 13) |
起動してArduino IDEの「シリアルモニタ」を開くと「IR Tester」の表示と「Waiting for」の表示が出ます。この状態で家電に付属の赤外線リモコンを操作すると「Recieved」に続きデコード結果が表示されます。
data[n]のnはデコード結果のバイト数です。data[6]とあれば6バイトのデータを受信したという意味です。その後、「0xNN」のNNはリモコンコードのLSBファーストの16進数表記です。ラトルズ出版の「プリント基板で作るPIC応用装置」の「赤外線解析リモコン」で出力されるリモコンコードを始めMSBファーストが採用されている場合もありますが、規格上の一般的なフォーマットではLSBファーストのため、ここではLSBファーストとしています。
IR Tester by Wataru Kunino Waiting for IR type = AEHA ← 家製協AEHA方式で待ち受け中 Recieved. ← 受信 data[6] = {0xAA,0x5A,0x8F,0x12,0x16,0xD1}; ← 受信データ(ここでは6バイト) length = 48 ← 受信データ長(48ビット) |
続く「Length」は受信したリモコン信号のビット数です。上例だと8×6バイトで48ビットです。このように多くの場合は8×nの値と一致しますが、リモコンによっては一致しません。例えば実際の受信ビット数は20ビット(2.5バイト)のような場合であっても、デコード結果は3バイト(24ビット)となり、3バイト目は0x00〜0x0Fまでの4ビット値となります。
当方サイトでは赤外線リモコンの方式やフォーマットについて「地デジ方式編 - 赤外線リモコン方式」にて、より詳しく説明しています。
また、Arduino以外にもH8 Tiny マイコン上で動作する「赤外線リモコンの解析ソフトウェア」や、PICを用いた「BUFFALO製 Remote Station PC-OP-RS1を改造もしくは互換機を製作してリモコンコードを取得する方法」を紹介しています。
H8マイコン版では、より詳細な解析やテストが出来ますので赤外線リモコンや学習リモコンを製作した時のテストツールとして役立ちます。
また、PIC版は市販品の改造なのでハードウェア製作の手間を減らすことが出来ます。