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 夕雨