送信データのフォーマット

通信データフォーマットの記事はこちらを参照しましょう。


赤外線受信のサンプル回路
秋月通商のこちらで購入できます。
---------------------------------------------------------------------
// 赤外線リモコンの"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.