Sirius -旧ブログ、更新されません-

2011年1月12日(水) 22:11

赤外線信号の解析その1

KURO-RS で保存したリモコンのデータをビット列で表示したところ、先頭の 1 のビット列がリーダのようです。

リモコンの赤外線信号がどのようなフォーマットになっているか調べたところ、いくつかの種類があるようです。

その中で、HDUSF のリモコン信号は、NEC フォーマットといわれるもののようです。次のようなページが見つかりました。



赤外線リモコンの利用

赤外線リモコンの製作 送信側



その他のフォーマットとしては、NEC フォーマットに似た SONY フォーマットと、マンチェスター符号化を利用した PHILIPS フォーマットがあるようです。上の二つのサイトの説明は NEC フォーマットのようです。詳しい形式については参考サイトを見てください。



同じビットが何個連続するかを表示するプログラムをつくり、実行してみました。




----------------------ここから----------------------

#include <stdio.h>

#include <stdlib.h>



#define bits(x) ((x) < 0 ? 0 : (buf[(x)/8]>>((x)%8))&0x1)

#define max(x, y) (((x) > (y)) ? (x) : (y))



int main(int argc, char *argv[])

{

    FILE *fp;

    unsigned char buf[255];

    int i, max_on, max_off, on, off, count;



    if( argc != 2 ) exit(1);



    if( !(fp = fopen(argv[1], "rb")) ) exit(1);



    fread(buf, sizeof(unsigned char), 240, fp);



    max_on = max_off = on = off = count = 0;

    for( i = 0; i < 240*8; i++ ) {

        if( bits(i) ) {

            if( bits(i-1) ) on++;

            else {

                if( i ) {

                    count++;

                    printf("%-3d, " , off);

                    if( (count % 8) == 7 ) printf("\n");

                } else count--;

                max_off = max(max_off, off);

                on = 1;

            }

        } else {

            if( bits(i-1) ) {

                count++;

                printf("%-3d, ", on);

                if( (count % 8) == 7 ) printf("\n");

                max_on = max(max_on, on);

                off = 1;

            } else off++;

        }

    }

    if( bits(i-2) == bits(i-1) ) {

        if( bits(i-1) ) {

             printf("%-3d\n", on);

             max_on = max(max_on, on);

        } else {

             printf("%-3d\n", off);

            max_off = max(max_off, off);

        }

    }

    printf("max on bit %d, off bit %d\n", max_on, max_off);

}



----------------------ここまで----------------------




実行した結果

91 , 45 , 6 , 5 , 6 , 17 , 6 , 5 ,

6 , 17 , 5 , 6 , 6 , 5 , 6 , 6 ,

5 , 6 , 5 , 17 , 6 , 17 , 6 , 16 ,

6 , 6 , 5 , 17 , 6 , 17 , 5 , 17 ,

6 , 17 , 5 , 17 , 6 , 6 , 5 , 6 ,

6 , 5 , 6 , 5 , 6 , 6 , 5 , 6 ,

6 , 16 , 6 , 6 , 5 , 17 , 6 , 17 ,

5 , 17 , 6 , 17 , 6 , 16 , 6 , 17 ,

6 , 5 , 6 , 388, 90 , 23 , 6 , 719

max on bit 91, off bit 719



最初のビットの並びは、1 が 91 個、次が 0 が 45 個です。KURO-RS は 0.1ms 毎にサンプリングするので、HIGH が 9ms、LOW が 4.5ms のリーダ部とぴったりマッチします。



データは、



1 -- 0.56 ms の HIGH 1.69 ms の LOW

0 -- 0.56 ms の HIGH 0.56 ms の LOW



となるそうです。また、データの最後には 0.56ms の HIGH があります。つまり、リーダ部以外では 0.56ms 以上の HIGH はこないということです。カウントした結果では、1 の連続は、5 〜 6 個、0 の連続が 5 〜 6 または 16 〜 17 個なのでこれもぴったり合います。

上の実行結果を色分けしてみます。リーダ部を赤、データ部を青、データの最後を緑色で表示しています。

91 , 45 , 6 , 5 , 6 , 17 , 6 , 5 ,

6 , 17 , 5 , 6 , 6 , 5 , 6 , 6 ,

5 , 6 , 5 , 17 , 6 , 17 , 6 , 16 ,

6 , 6 , 5 , 17 , 6 , 17 , 5 , 17 ,

6 , 17 , 5 , 17 , 6 , 6 , 5 , 6 ,

6 , 5 , 6 , 5 , 6 , 6 , 5 , 6 ,

6 , 16 , 6 , 6 , 5 , 17 , 6 , 17 ,

5 , 17 , 6 , 17 , 6 , 16 , 6 , 17 ,

6 , 5 ,
6 , 388, 90 , 23 , 6 , 719



データ部の 1 の連続 + 0 の連続のペアは 32 個です。リモコンのデータも 32bit だそうなのでこれもぴったりと合います。

これをもとにして信号をデコードできそうです。

written by sirius [KURO-RS] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Sirius -旧ブログ、更新されません-

MySketch 2.7.2 written by 夕雨