RXコントローラーを使ってみるぞ!(4)赤外線リモコンについて2
前回、RXコントローラーを使って、いろいろリモコンを認識させてみましたが、RXコントローラーは、どんなデータが読み取れて、どんなデータが読み取れないのかを関連づけする為に、Arduino+赤外線受信モジュール(PL-IRM0101-3)でリモコンのデータをチェックしてみました
●スケッチ
以前にやった時のArduinoのスケッチを、さらにネット上のサンプルを組み合わせて、見やすいように
- H/Lのデータ
- Bitデータ
- Hexデータ
で表示できるようにしました。※ただし適当な部分も多々含まれていますし、赤外線信号もいろいろなパターンありますので、すべてに対応しているわけではありませんので、その都度、数値などを書き換える必要があります。以下コピペして使ってみて下さい。
int ir_in = 8;//IR受信機シグナル
int state=0;
int tunit=10;
int last = 0;
unsigned long us = micros();
#define datanum 512
int bitData[datanum];
int nnn=0;
double bitDataH=0,bitDataL=0;
double ratio=2;
// セットアップ
void setup() {
Serial.begin(57600); // シリアル通信速度の設定
pinMode(ir_in, INPUT); // 入出力ピンの設定
}
void loop() {
unsigned int val;
unsigned int cnt = 0;
// Wait for incoming IR signal
while ((val = digitalRead(ir_in)) == last) { // パルスが切り替わるまで待機
if (++cnt >= 30000) { // 30000回ループで信号が終了したとみなす
if (cnt == 30000) {
Serial.print("L");
Serial.print("----");
Serial.print(")\n");//ストップやリピートの場合は、改行する
printBitData();//binary, Hex表示
Serial.print("\n");
}
cnt = 30000;
}
}
unsigned long us2 = micros();
unsigned long us3=us2-us;//時間
if(state==1 && val==LOW && us3>10000) {//ストップ
state=0;
Serial.print("L");
Serial.print(us3/tunit, DEC);
Serial.print(")\n");//ストップやリピートの場合は、改行する
printBitData();//binary, Hex表示
}
//if(status==0 && val==HIGH && us3>5000) status=1;//リーダーを区別する
if(state==0 && val==HIGH) state=1;//リーダーを無視する
if(state==1) {//受信中
if(val==HIGH) {//Hiの時
bitDataH=0;
if(us3<3400) bitDataH=us3;//Hiの時間を記録、リーダーなら無視
Serial.print("(H");//Hiです
Serial.print(us3/tunit, DEC); //赤外線のON/OFFが続いた時間を tunit us単位で送信
Serial.print("/");
} else {
bitDataL=0;
if(us3<3400) bitDataL=us3;//Lowの時間を記録
if(bitDataH>0 && bitDataL>0) {//HiもLowもデータありなら
//if(bitDataL/bitDataH>ratio || bitDataH/bitDataL>ratio) bitData[nnn]=1;//bitオン
if(bitDataL>1000) bitData[nnn]=1;//bitオン
else bitData[nnn]=0;//オフ
nnn=nnn+1;//カウンター
if(nnn>=datanum) nnn=datanum-1;//バッファー越えの対処
}
bitDataH=0;
bitDataL=0;
Serial.print("L");//Lowです
Serial.print(us3/tunit, DEC); //赤外線のON/OFFが続いた時間を tunit us単位で送信
Serial.print(")");
}
}
last = val;
us = us2;
}
//binaryで表示
void printBitData(void) {
int i;
if(nnn>0) {
for(i=0; i<nnn; i++) {
Serial.print(bitData[i],DEC);
if(i%8==7) Serial.print(" ");
}
Serial.print("\n");
DspData(nnn,bitData);//Hexで表示
Serial.print("\n");
nnn=0;
}
}
//Hexで表示
void DspData(int num,int *data)
{
int i , j , x , dt ;
x = num / 8 ;
// ビット文字列データから数値に変換する
for (j=0 ; j < x ; j++) {
dt = 0 ;
for (i=0 ; i < 8 ; i++) {
if (*data++ == 1) bitSet(dt,i) ;
}
Serial.print(dt,HEX); // HEX(16進数)で表示
Serial.print("H ") ;
}
}
●配線
- 受信機(PL-IRM0101-3)の出力とArduinoのデジタルピン8番を繋ぐ(黄色)
- 5Vの電源とGND
- 配線とは関係ありませんが、スナップオン・エンクロージャ for Arduino
●取得データ
シリアルモニターで、こんな感じにみれます。
- (H77/L168)(H38/L205) ... HとLの時間(10us単位)
- 11100010 00000100 ... (1)のH/Lをビットで表したもの
- 47H 20H ... (2)を16進数で表したもの(※ビットは左から並べる)
という感じに、データをみることができ分かり易いです。ただし、ビットの決め方は決めうちなので、例えばHの方が長いと1のソニーのリモコンの場合とか、リモコンごとにスケッチを書き換える必要があるかと思います。
●RXコントローラー(HSWB-4F)との対応
さて、上記の値は、RXコントローラー(HSWB-4F)では、どの様に読み取っているかというと
- 18208 -1
これは
- V130=18208
- V131=-1
です。これは16進数で
- 0247H FFFFH
となっていることからわかるように、V130の方は、エンディアンがリトルで表されてるので逆にすれば、上記の47H 20Hと同じですねで、V131の方は、リピートが来ちゃうとFFFFとなるのかな?V131が-1以外の値を示すリモコンがないので正確なところは不明です。
で、いろいろなリモコンのデータを見てみて、RXコントローラー(HSWB-4F)が読み取れないデータは
- Hの方が長いデータ
- 1のLが1000us以下のデータ
- 16ビットより短いデータ
などがありました
----------------
にほんブログ村
| 固定リンク
「赤外線リモコン」カテゴリの記事
- RXコントローラーを使ってみるぞ!(5)赤外線リモコンについて3(2012.02.19)
- RXコントローラーを使ってみるぞ!(4)赤外線リモコンについて2(2012.02.14)
- RXコントローラーを使ってみるぞ!(3)赤外線リモコンについて(2012.02.11)
- 「SoftModemインターフェースボード2」を買いました(2011.05.29)
- SoftModemインターフェースボード で遊んでみる(3)(2011.01.10)
「週刊 ロボゼロ」カテゴリの記事
- Xcontroller 0.7.0 公開(2014.02.12)
- JO-ZERO2&ROBOXEROに対応した無線式送受信機JXB-1(2014.02.05)
- RCBController 1.0.0 公開(2013.09.28)
- 「SBDBT BLE for RCB」ファーム更新 (2013/9/23)(2013.09.24)
- 「SBDBT BLE for RCB with techBASIC」更新 (2013/9/23)(2013.09.27)
この記事へのコメントは終了しました。
コメント