公開: 2013/05/20
TVリモコンの受信プログラム
今回の内容
Japaninoを使って、TVリモコンの命令を赤外線で送信することでTVを動かします。そのために、TVリモコンの命令を受信して解読するプログラム(受信プログラムと呼ぶ)および受信回路を製作していきます。
前回と次回の内容
前回は、TVリモコンを作成するためのTVリモコンのフォーマットを説明しました。
次回は、TVリモコンの送信回路とプログラムについて説明していきます。
[追記] JapaninoでTVリモコンを作成するための記事をまとめましたので、ぜひご覧ください。
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)。
| << リモコンのフォーマットへ | 送信用プログラムへ >> |
