赤外線リモコンのデータを受信する[Arduino]
赤外線リモコン(OE13KIR)でデータを送信して、赤外線リモコン受信モジュール(PL-IRM1261-C438)で受信をする方法です。
赤外線リモコンには「NECフォーマット」(NEC/東芝/日立など)や「家製協フォーマット」(パナソニック、シャープなど)、「SONYフォーマット」(SONY)など複数のフォーマットがあります。
今回は最も標準的な「NECフォーマット」を使用した赤外線を受信する方法をご紹介します。
使用部品・材料
総額で約670円です。(Arduino本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
ブレッドボード | ¥270 | 秋月電子の通販コード(P-00315) |
オプトサプライ赤外線リモコン(OE13KIR) | ¥300 | 秋月電子の通販コード(M-07245) |
赤外線リモコン受信モジュール(PL-IRM1261-C438) | ¥100 | この受信モジュールは片側しか受信できないように見えますが、壁の反射で360度どの方向からでも赤外線を受信できるようです。 秋月電子の通販コード(I-04169) |
LED 2種類 | 数円 | 赤色と緑色 |
カーボン抵抗器 | 数円 | LED用の220Ω(2個) |
配線図
FritZingで配線図を作成する時に「赤外線リモコン受信モジュール」のパーツがないので、他のパーツで代用しています。「赤外線リモコン受信モジュール」の端子は正面から見て、左から「Vout、GND、Vcc」となります。
※ページ先頭にある写真の配線図とは異なりますので注意して下さい。
スケッチ(プログラム)
赤外線リモコンの信号を受信すると緑色のLEDが点灯(300ms)して、シリアルモニターに受信データ(32bit)を表示します。受信に失敗した場合は赤色のLEDが点灯(300ms)します。
#define INFRARED 2 // 赤外線センサー #define RECEIVE_OK 3 // 受信OK(LED) #define RECEIVE_ERROR 4 // 受信失敗(LED) void setup() { pinMode(INFRARED , INPUT); pinMode(RECEIVE_OK ,OUTPUT); pinMode(RECEIVE_ERROR ,OUTPUT); Serial.begin(9600); } void loop() { unsigned long dword = 0, pls; // リーダーコードの開始(8T = 9ms) while(digitalRead(INFRARED) == HIGH){ // none } // リーダーコードの終了(4T = 4.5ms) while(digitalRead(INFRARED) == LOW){ // none } // NECフォーマットの読み込み(32bit) // (16bitのカスタマーコード(メーカー識別コード) + 8bitのデータコード + 8bitの反転データコード) for(int i = 0; i < 32; i++) { // パルスの検出(パルスの長さ) // ※戻り値はマイクロ秒(μs) pls = pulseIn(INFRARED, HIGH); // パルス検出のタイムアウト(1秒) if(pls >= 1000000) { Serial.println("timeout"); return; } // ビットが1の場合にデータを加算する // ※ビット0= 1125μs ビット1 = 2250μs if(pls >= 1126){ dword |= 1UL << i; } } // 待機状態のエラーを回避 // ※このスケッチ固有のエラーです。 if(dword == 0){return;} // リピートコード(9ms + 2.25ms) pulseIn(INFRARED, HIGH); // ストップビット(0.56ms) while(digitalRead(INFRARED) == HIGH){ // none } // データコードが正しく受信できているかを確認 byte bit8_data1 = (dword >> 16) & 0xFF; // データコード byte bit8_data2 = 255 - ((dword >> 24) & 0xFF); // データコードの反転 if(bit8_data1 == bit8_data2){ // 送信波形を反転する dword = (dword >> 24) & 0xFF | ((dword >> 16) & 0xFF) << 8 | ((dword >> 8) & 0xFF) << 16 | (dword & 0xFF) << 24; // デバッグ用 Serial.println(dword ,HEX); // LEDの点灯(成功) digitalWrite(RECEIVE_OK,HIGH); delay(300); digitalWrite(RECEIVE_OK,LOW); }else{ // LEDの点灯(失敗) digitalWrite(RECEIVE_ERROR,HIGH); delay(300); digitalWrite(RECEIVE_ERROR,LOW); } }
赤外線フォーマットの詳細は後述する参考サイトでご確認ください。
用語集 & メモ
時間の単位 1秒 = 1,000ms = 1,000,000μs 1ms = 1,000μs ※mはミリ、μはマイクロ、sは秒と読みます。 |
周波数の単位 kHz(キロヘルツ)とは、1秒間に1000回繰り返される周波数、振動数を表す単位である。38kHzとは1秒間に38,000繰り返される周波数、振動数を表す。 |
リモコンについて NECフォーマットの赤外線の送受信は108msが基準になっていますので、リモコンを押す際は0.1秒(108ms)の間、押し続けてください。 |
参考サイト
赤外線リモコンの通信フォーマット
リモコンフォーマット(PDF)
赤外線リモコンのフォーマット
赤外線リモコン (受信)
リモコンフォーマットについて
※赤外線リモコンのデータシートにも赤外線フォーマットの概要が掲載されていますので、必ずご確認ください。
最後に
この赤外線データの受信手法は完璧ではありませんのでご了承ください。
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。