うしこlog
公開: 2013/05/20

TVリモコンの受信プログラム

今回の内容

 Japaninoを使って、TVリモコンの命令を赤外線で送信することでTVを動かします。そのために、TVリモコンの命令を受信して解読するプログラム(受信プログラムと呼ぶ)および受信回路を製作していきます。

前回と次回の内容

 前回は、TVリモコンを作成するためのTVリモコンのフォーマットを説明しました。
次回は、TVリモコンの送信回路とプログラムについて説明していきます。

[追記] JapaninoでTVリモコンを作成するための記事をまとめましたので、ぜひご覧ください。

Japaninoでリモコン作成

  1. Japaninoの環境構築と使い方
  2. Japaninoで簡単プログラミング
  3. リモコンフォーマットについて
  4. この記事
  5. TVリモコンの送信プログラム

受信用回路

受信用回路は、赤外線受信モジュールを、japaninoのD3に繋ぐだけです。もちろんjapaninoに電源をつなぐことを忘れずに。

受信用回路
受信用回路

受信用プログラム

作成したTVリモコン信号受信プログラムは以下の通りです。このプログラムは、VIERAでのみ動作を確認しました。


#define READ_PIN 3  // 赤外線受信モジュール ピン番号

int Limit;  //HIGHとLOWの閾値

// 初期化処理
void setup()
{
  Limit = 1000;              //HIGHとLOWの閾値 : 1000us
  Serial.begin(9600);      // パソコン(ArduinoIDE)とシリアル通信の準備を行う
  pinMode(READ_PIN,INPUT);   // 赤外線受信モジュールに接続ピンをデジタル入力に設定
  Serial.println("Receive data...");
}
// メインの処理
void loop()
{
  unsigned long dt;      //offかon時間計測用
  int i , cnt;
  int receiveData[64];

  dt = 0;
  
  if (digitalRead(READ_PIN) == LOW) { //点灯したら
     /* リーダ部のチェックを行う */
    dt = micros();                              //現在の時刻(us)を得る
    while (digitalRead(READ_PIN) == LOW) ;  //点灯時間の計測
    dt = micros() - dt;             //点灯時間
  }
  
    /* リーダ部有りなら処理する(3400us以上のonにて判断する) */
  if (dt >= 3400) {  //点灯時間が3400us以上なら、処理する
    i = 0 ;
    while(digitalRead(READ_PIN) == HIGH) ;  //ここまでがリーダ部 offを読み飛ばす
    
    // データ部の読み込み
    while (1) {
      while(digitalRead(READ_PIN) == LOW) ;  //消灯するまで待つ
      
      dt = micros();   //off時間の測定開始
      cnt = 0 ;
      while(digitalRead(READ_PIN) == HIGH) { //消灯したら、off時間計測
        delayMicroseconds(10) ;  //10us単位で
        cnt++ ;
        if (cnt >= 1200){  //12000us(12ms)以上 offならエラー
          break ;
        }
      }
      dt = micros() - dt;  //off時間

      if(dt >= 10000){ //10000us(10ms)以上ならストップデータ
        Serial.println("Stop");
        break;
      }
      if(dt >= Limit){ //Limit(1000us)以上なら 1
        receiveData[i] = 1 ;
      }
      else{           //Limit(1000us)未満なら 0
        receiveData[i] = 0 ;
      }
      i++;
    }
    // データ有りなら表示を行う
    if (i != 0) {
      printData(i, receiveData);
    }
  }
}

// 受信データをシリアルモニタ画面に送り表示をさせる処理
void printData(int num, int *data)
{
  for(int i=0; i<num; i++){
    if(i%4 == 0){
      Serial.print(" ");
    }
    Serial.print(",");
    Serial.print(data[i]);
  }
  Serial.println("\n");
}

このプログラムを前回のようにJapaninoへ書き込み、実行する(図2)。実行したら、赤外線受信モジュールに向かってテレビのリモコンを向けてボタンを押してください(図3)。リモコンが送信したデータ(0,1の信号)が受信されると思います(図4)。

受信準備完了
受信準備完了
リモコンを押す
リモコンを押す
リモコンデータを受信したとき
リモコンデータを受信したとき
<< リモコンのフォーマット 送信用プログラムへ >>