ホーム > カテゴリ > ロボット・電子工作・マイコン >

赤外線リモコンのデータを受信する[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・ラズパイ等)でユーザー同士で情報を共有して下さい。

関連記事



公開日:2017年03月29日 最終更新日:2017年08月20日
記事NO:02309