送信データのフォーマット
通信データフォーマットの記事はこちらを参照しましょう。
赤外線受信のサンプル回路
--------------------------------------------------------------------- // 赤外線リモコンの"NEC系フォーマット"と"家電製品協会フォーマット"に対応 *6) // 《赤外線リモコンの送信データを探る》 // #define IRpin 2 // 赤外線受信モジュール接続ピン番号 // 初期化処理 void setup() { Serial.begin(9600) ; // パソコン(ArduinoIDE)とシリアル通信の準備を行う pinMode(IRpin,INPUT) ; // 赤外線受信モジュールに接続ピンをデジタル入力に設定 } // メインの処理 void loop() { unsigned long t ; int i ; char IRbit[512] ; static int pre_val ; t = 0 ; if (digitalRead(IRpin) == LOW) { // リーダ部のチェックを行う t = micros() ; // 現在の時刻(us)を得る while (digitalRead(IRpin) == LOW) ; // HIGH(ON)になるまで待つ t = micros() - t ; // LOW(OFF)の部分を測る } // リーダ部有りなら処理する(2.8ms以上のLOWにて判断する) if (t >= 2800) { i = 0 ; while(digitalRead(IRpin) == HIGH) ; // ここまでがリーダ部(ON部分)読み飛ばす // データ部の読み込み while (1) { while(digitalRead(IRpin) == LOW) ; // OFF部分は読み飛ばす t = micros() ; while(digitalRead(IRpin) == HIGH) ;// ON部分の長さを測る t = micros() - t ; //Serial.println(t); // ON部分時間表示(debug用) if (t >= 8000) break ; // ストップデータ if (t >= 1000) IRbit[i] = (char)0x31 ; // ON部分が長い else IRbit[i] = (char)0x30 ; // ON部分が短い i++ ; } // データ有りなら表示を行う //Serial.print("bit kosu = "); //Serial.println(i); // ビットの個数表示(debug用) if (i != 0) { IRbit[i] = 0 ; DspData(i,IRbit) ; } } } // 受信データをシリアルモニタ画面に送り表示をさせる処理 void DspData(int num,char *data) { int i , j , x , dt ; Serial.print(data) ; // ビットデータで表示 Serial.write(" ( ") ; x = num / 8 ; // ビット文字列データから数値に変換する for (j=0 ; j < x ; j++) { dt = 0 ; for (i=0 ; i < 8 ; i++) { if (*data++ == 0x31) bitSet(dt,i) ; } Serial.print(dt,HEX) ; // HEX(16進数)で表示 Serial.write(' ') ; } Serial.println(')') ; } ---------------------------------------------------------------------CIDEツールバーの赤枠部分「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを
--------------------------------------------------------------------- // 赤外線リモコンの"NEC系フォーマット"と"家電製品協会フォーマット"に対応 *6) // 《赤外線リモコンからデータを受信する》 // #define IR_PIN 2 // 赤外線受信モジュール接続ピン番号 #define DATA_POINT 5 // 受信したデータから読取る内容のデータ位置 // 初期化処理 void setup() { Serial.begin(9600) ; // パソコン(ArduinoIDE)とシリアル通信の準備を行う pinMode(IR_PIN,INPUT) ; // 赤外線受信モジュールに接続ピンをデジタル入力に設定 } // メインの処理 void loop() { int ans ; ans = IRrecive() ; // 赤外線リモコンのデータを受信する if (ans != 0) Serial.println(ans,HEX) ; // リモコンからデータを受信したら表示する } // 赤外線リモコンのデータを受信する処理関数 int IRrecive() { unsigned long t ; int i , j , ans ; char IRbit[512] ; static int pre_val ; ans = 0 ; t = 0 ; if (digitalRead(IR_PIN) == LOW) { // リーダ部のチェックを行う t = micros() ; // 現在の時刻(us)を得る while (digitalRead(IR_PIN) == LOW) ; // HIGH(ON)になるまで待つ t = micros() - t ; // LOW(OFF)の部分を測る } // リーダ部有りなら処理する(2.8ms以上のLOWにて判断する) if (t >= 2800) { i = 0 ; while(digitalRead(IR_PIN) == HIGH) ; // ここまでがリーダ部(ON部分)読み飛ばす // データ部の読み込み while (1) { while(digitalRead(IR_PIN) == LOW) ; // OFF部分は読み飛ばす t = micros() ; while(digitalRead(IR_PIN) == HIGH) ;// ON部分の長さを測る t = micros() - t ; if (t >= 8000) break ; // ストップデータ if (t >= 1000) IRbit[i] = (char)0x31 ; // ON部分が長い else IRbit[i] = (char)0x30 ; // ON部分が短い i++ ; } // データ有りなら指定位置のデータを取り出す if (i != 0) { i = (DATA_POINT-1) * 8 ; for (j=0 ; j < 8 ; j++) { if (IRbit[i+j] == 0x31) bitSet(ans,j) ; } pre_val = ans ; // データを記憶して置く } else { // リピートコードと見なす ans = pre_val ; // 記憶して置いたデータを返す } } return( ans ) ; } ---------------------------------------------------------------------
ans = IRrecive() ; // 赤外線リモコンのデータを受信する if (ans != 0) { switch(ans) { case 0x20: // LEDを点灯する break ; case 0xd8: // LEDを消灯する break ; case 0xd7: // モータをON break ; case 0x57: // モータをOFF break ; } }あ、これで、モータを制御する方法は次回の記事で予定、って言うかぁ、予定は未定みたいなぁ
#define DATA_POINT 1 // 受信したデータから読取る内容のデータ位置が有りますがぁ、これは変更しないで下さい。
NEC・SONY・家製協フォーマットに対応(*6) 2021/05/30
リピートコードを受信する様にした話(*5) 2019/03/23
追記(*4) 2014/12/27
追記(*3) 2014/10/28
追記(*2) 2014/05/22
追記(*1) 2011/08/05
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2021 Shigehiro Kimura All Rights Reserved.