PICマイコン用リモコン受信プログラム
Remocon 3.0 for PIC

Receiving remocon signal for sending serial format by I.N. 2017/01/13


更新履歴
2017/01/13 ver.3.0 GPIO出力版の追加
2017/01/11 ver.3.0 VICTOR追加
2017/01/10 ver.2.0 SAMSUNG,FUNAI追加.リピート時のコード変更.
2016/11/25 ver.1.0 初版

1.概要
 リモコン送信機の信号を受信して,RS-232Cデータとして出力するプログラムです.PICマイコン(12F683)用のプログラムです.
 NEC,AEHA(家製協),SONY,SAMSUNG,FUNAI,VICTORの6フォーマットの受信が可能です(自動判別).
 AEHAフォーマットでは48ビット(カスタマーコード16+パリティ4+データ28)を前提とします.
 SAMSUNG,FUNAIおよびVICTORフォーマットについては本サイト独自の呼称です(手元にこのメーカのリモコンがたまたま転がっていたことに因ります).
 PICマイコンには12F683を使用しました.少し修正(コメント化されている内部発振器キャリブレーション部を有効化)すれば12F629でも動作します.それ以外のPICについては未確認です.
 赤外線受信モジュールはSPS-440-1を使用しました.それ以外のモジュールについては未確認です.
 汎用I/Oポートから下位5bitのみを出力するGPIO版は下の6.を参照して下さい.


2.動作の説明
 リモコン信号を受信するたびにPICマイコンのポートGP2からシリアル通信形式(38,400[bps],スタート1,ストップ1,パリティなし)で次のデータが出力されます.

NECフォーマットを受信した場合
 第1バイト 'N'
 第2バイト カスタマーコード(下位8ビット)
 第3バイト カスタマーコード(上位8ビット)
 第4バイト データ(8ビット)
 第5バイト データ(反転値)(8ビット)
NECフォーマット(リピート)を受信した場合
 第1バイト 'n'

VICTORフォーマットを受信した場合
 第1バイト 'V'
 第2バイト Data0(8ビット)
 第3バイト Data1(8ビット)
VICTORフォーマット(リピート)を受信した場合
 VICTORフォーマット(リピート)受信時の出力は,上述の'V'+2バイトと同じ形式になります.

VICTORフォーマットについて
 NECフォーマットと似ているため,NECフォーマットでデータが16ビットの場合をVICTORフォーマットと判別しています.
 VICTORフォーマット(リピート)はリーダ部が省略されていますが,データ16ビットは読み取っています.

AEHA(家製協)フォーマットを受信した場合
 第1バイト 'A'
 第2バイト カスタマーコード(下位8ビット)
 第3バイト カスタマーコード(上位8ビット)
 第4バイト Data0(4ビット)|パリティ(4ビット)
 第5バイト Data1(8ビット)
 第6バイト Data2(8ビット)
 第7バイト Data3(8ビット)
AEHAフォーマット(リピート)を受信した場合
 第1バイト 'a'

SONYフォーマットを受信した場合
 第1バイト 'S'
 第2バイト データ(下位7bitが有効,最上位1ビットは常に0)
 第3バイト アドレス(bit7..0)
          5ビットアドレス時はbit4..0が有効.他のビットは0.
          8ビットアドレスおよび13ビットアドレス時はbit7..0が有効.
          13ビットアドレス時のbit12..8は第4バイトに含まれる.
 第4バイト アドレス(bit15..13 | bit12..8)
          5ビットアドレスおよび8ビットアドレス時はbit15..8の全てが0.
          13ビットアドレス時はbit12..8が有効.bit15..13は常に0.

SAMSUNGフォーマットを受信した場合
 第1バイト 'G'
 第2バイト Data0(8ビット)
 第3バイト Data1(8ビット)
 第4バイト Data2(8ビット)
 第5バイト Data3(8ビット)
SAMSUNGフォーマット(リピート)を受信した場合
 第1バイト 'g'

SAMSUNGフォーマットについて
 独自に解析した結果に基づいています.
 1T=0.568ms.リーダ部=8T+8T.'0'=HL.'1'=HLLL.データ32bit.

FUNAIフォーマットを受信した場合
 第1バイト 'F'
 第2バイト Data0(下位6ビットが有効)
 第3バイト Data1(下位6ビットが有効)
 第4バイト Data2(下位6ビットが有効)
 第5バイト Data3(下位6ビットが有効)

FUNAIフォーマットについて
 独自に解析した結果に基づいています.
 1T=0.873ms.リーダ部=4T+4T.'0'=HL.'1'=HLLL.データ24bit.後半12bitは前半の反転.
 データは全部で24bitですが,これを6bit×4回に分けて送信しています.

 データのエラーチェックはPICマイコン内では行っていません. 全てのデータはそのまま出力されるので,読み取り側で必要に応じてエラーチェック等を行ってください.


3.回路
 下の回路で動作を確認しました.



4.プログラムソース
 ファイル remcn3.zip に次の5つのファイルが収められています.
(1) remcn3.asm
    PIC(12F683)用プログラムソース.アセンブラは秋月電子のPA.EXEを使用.
    タイマーやUARTなどPIC固有の機能は一切使用していないので,
    GPIO初期設定のわずかな変更で他のPICでも使える可能性がある.
    ただしクロック周波数4MHzに調整されてあるためこれ以外の周波数の場合
    大幅な書き換えが必要となる可能性が大きい.
(2) REMCN3-30C4.HEX
    PIC12F683書き込み用HEXファイル.アセンブラがなくてもこれを書き込めばOK.
    ライターは秋月電子のPICプログラマーVer.4を使用.
(3) REMCN3-3184.HEX
    PIC12F629書き込み用HEXファイル.アセンブラがなくてもこれを書き込めばOK.
    ライターは秋月電子のPICプログラマーVer.4を使用.
(4) remocon_read_con.cpp
    データ表示プログラムの例.次節(5.)にあるものと同じ.
(5) remocon_read.cpp
    データ表示プログラムの例.ESPLIB併用版.

ダウンロード(シリアル出力版)

 remcn3.zip


5.データ表示プログラムの例 (for Visual C++)
 上記zipファイル内に収められている remocon_read_con.cpp の内容です.
 (拙者のシリアル通信ライブラリ ERSLIB を併用しています)
// PICプログラム"remcn3.asm"の読み取りと表示 [console版]
//                by I.N.

// 2016.11.22 ver.1.0 初版(NEC)
// 2016.11.24 ver.1.1 AEHA, SONYの追加
// 2017.01.10 ver.1.2 SAMSUNG/FUNAIの追加
// 2017.01.11 ver.1.3 VICTORの追加

#include <erslib.h>
int ncom=4;

void main(void)
{
    int count=0;
    unsigned char buf[32];
    char *str[6]={
        "N4:NEC",
        "V2:VICTOR",
        "G4:SAMSUNG",
        "A6:AEHA",
        "F4:FUNAI",
        "S3:SONY"
    };

    int r;
    r=ERS_Open(ncom,4096,4096);
    if(r){
        printf("com open error.\n");
        return;
    }
    ERS_BaudRate(ncom,38400);
    printf("Start\n");

    for(;;){
        if(ERS_CheckRecv(ncom)>0){
            int c= ERS_Getc(ncom);

            printf("%04d : ",count++);

            for(int i=0;i<6;i++){
                if(c==str[i][0]){
                    printf("[%s] ",&str[i][3]);
                    int bytes= str[i][1]-'0';
                    ERS_Recv(ncom,buf,bytes);
                    for(int k=0; k<bytes; k++){
                        printf("%02Xh ",buf[k]);
                    }
                    printf("\n");
                }else if(c==str[i][0]+32){
                    printf("[%s] Repeat\n",&str[i][3]);
                }
            }

        }
    }

    ERS_Close(ncom);
    printf("End\n");
}


6.GPIO出力版



 こちらのプログラムは,リモコン送信機の信号を受信すると,押されたリモコンボタンのコードのうち下位5ビットを汎用I/Oポートから正論理で出力します.リモコンのリピート信号を受信した場合は無視され,出力は変化しません.
 内部処理は上述のremcn3.asmと同じですが,ポートから出力されるのはNECフォーマットの第4バイト,VICTORフォーマットの第3バイト,AEHAフォーマットの第6バイト,SONYフォーマットの第2バイト,SAMSUNGフォーマットの第4バイト,FUNAIフォーマットの第3バイトです.ただし,いずれも下位5ビットのみです.
 ソースファイルremcn3t.asmとremcn3n.asmの違いは,電源投入時のLEDチェックの有無だけです.remcn3t.asmの方は起動時に5個のLEDを0.1秒ずつ順に点灯させた後,本来の動作に入ります.

 下の回路で動作を確認しました.


 ファイル remcn3t.zip に次の4つのファイルが収められています.
(1) remcn3t.asm
    PIC(12F683)用プログラムソース.起動時のLED点灯チェックあり.アセンブラは秋月電子のPA.EXEを使用.
(2) REMCN3T-30C4.HEX
    remcn3t.asmをアセンブルしたもの.PIC12F683書き込み用HEXファイル.
    アセンブラがなくてもこれを書き込めばOK.ライターは秋月電子のPICプログラマーVer.4を使用.
(3) remcn3n.asm
    PIC(12F683)用プログラムソース.起動時のLED点灯チェックなし.アセンブラは秋月電子のPA.EXEを使用.
(4) REMCN3N-30C4.HEX
    remcn3n.asmをアセンブルしたもの.PIC12F683書き込み用HEXファイル.
    アセンブラがなくてもこれを書き込めばOK.ライターは秋月電子のPICプログラマーVer.4を使用.

ダウンロード(GPIO出力版)

 remcn3t.zip


7.謝辞
 このプログラム(ver.1.0)の作成には,ChaN氏の赤外線リモコンの通信フォーマットのページが大変参考になりました.
リモコンの信号について分かりやすく解説して下さっているChaN氏にこの場を借りてお礼を申し上げます.


1つ上へ戻る