赤外線リモコンのデータを受信する[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・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









