« 2012年 1〜3月期ドラマ | トップページ | RXコントローラーを解析してみるぞ!(1)通信コマンド1 »

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 ") ;
      }
}

●配線

20120213233507

●取得データ

シリアルモニターで、こんな感じにみれます。
Arduinoscreensnapz003_2

  • (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ビットより短いデータ

などがありました

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

|

« 2012年 1〜3月期ドラマ | トップページ | RXコントローラーを解析してみるぞ!(1)通信コマンド1 »

赤外線リモコン」カテゴリの記事

週刊 ロボゼロ」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: RXコントローラーを使ってみるぞ!(4)赤外線リモコンについて2:

« 2012年 1〜3月期ドラマ | トップページ | RXコントローラーを解析してみるぞ!(1)通信コマンド1 »