赤外線リモコンの信号を受信しLEDを点灯させるプログラムです。
リモコンの「1」ボタンを押すと「LED4(RA5)」 が点灯します。再び「1」を押すとLEDは消灯します。
同様に、リモコンの「2」「3」「4」が
それぞれ LED5(RA1)」「LED6(RA2)」「LED7(RC5)」に対応します。
PICのペリフェラルは以下の用途に使用しています。
この受信機は、JVCTVリモコンの使用を想定したプログラムになっています。JVCは、NECが設定した赤外線リモコン仕様に準拠しており、以下のフォーマット仕様です。
キャリア | 赤外線(λp = 940nm) | Data部 詳細 (T = 562μs) | |
サブキャリア | fsc = 38kHz, 1/3duty | Data の '1' | Mark 1T + Space 3T |
Leader 部 | Mark 9mSec Space 4.5mSec | Data の '0' | Mark 1T + Space 1T |
Data 部 | 固定長フレーム (16bit) 8bitのカスタマーコード + 8bitのコマンドデータ |
Stop bit | Mark 1T |
下の波形は、リモコンのチャンネル1Keyを押し、赤外線受信モジュールの出力波形をロジックアナライザーで測定したものです。リーダー部に続き 16 ビットのデータが観測できます。
ロジックアナライザーの時間軸を長くとると、下図のようにデータ部の後に20ms程度の間隔を開けて、データ部が再送されているのがわかります。この例では、データ部は合計3回送信されていました。
JVCの汎用リモコンをビクターに設定した時のキーと出力される16ビットコードの関係を示します。
出力される16bitコード | |||||||
---|---|---|---|---|---|---|---|
入力切換 | C0C8 | 大 | C078 | 1 | C084 | 7 | C0E4 |
電源 | C0E8 | 小 | C0F8 | 2 | C044 | 8 | C014 |
タイマー | C0C0 | 消音 | C038 | 3 | C0C4 | 9 | C094 |
BS/e2 | C030 | + | C098 | 4 | C024 | 10 | C054 |
地デジ | F0A8 | − | C018 | 5 | C0A4 | 11 | C0D4 |
機能 | 赤外線の出力なし | 6 | C064 | 12 | C034 |
プログラム例を示します。
赤外線送信が終了するまで、赤外線センサーのSpace信号(赤外線を送っていない時間)をTimer1で計測します。
Spaceが 65msを超えると送信が終了したと判断し、最後の4バイト分だけを取得し、Keyコードと比較し該当のLEDを点灯させます。
/************************************************* * NECタイプの赤外線リモコン受信 Device : PIC16F1619 on Curiosity XC8 Version : 2.20 ***************************************************/ #include <xc.h> #include <stdint.h> #define _XTAL_FREQ 4000000 // CONFIG #pragma config FOSC = INTOSC, PWRTE = OFF, MCLRE = ON, CP = OFF #pragma config BOREN = ON, CLKOUTEN = OFF, IESO = ON, FCMEN = ON #pragma config WRT = OFF, PPS1WAY = ON, ZCD = OFF, PLLEN = OFF #pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = ON #pragma config WDTCPS = WDTCPS1F, WDTE = OFF, WDTCWS = WDTCWSSW, WDTCCS = SWC /********************************************************* Main application *********************************************************/ void main(void) { uint16_t ircode = 0; OSCCON = 0b01101000; // PLL disabled; 4MHz_HF; FOSC; LATA = 0; // LED 消灯 LATC = 0; // TRISA = 0b11011001; // LED接続Pinは出力 TRISC = 0b11011111; // ANSC7 = 0; // センサーPinはデジタル入力 T1CON = 0; // Fosc/4 pre 1:1 T1GCON = 0xC0; // Gateenable Gatepin負極性 TMR1 = 0; // Eimer値 0 リセット T1GPPS = 0x17; // GatepinをRC7に指定 while(1){ while(RC7); // 赤外線信号を待つ TMR1ON = 1; // Timer ON TMR1GIF = 0; // Gate flag OFF TMR1IF = 0; // TMR1 flag OFF while(1){ // Data bit毎の繰り返し if(TMR1GIF){ // Space終了なら TMR1GIF = 0; // Gate flag OFF ircode <<= 1; // 1 bitシフト if(TMR1H > 4)ircode |= 1; // 長いSpaceなら"1" TMR1 = 0; // Timerクリア } if(TMR1IF) break; // Gap(65msec以上)なら } // Data収集終了 TMR1ON = 0; // Timer OFF TMR1 = 0; // Timer 0 にリセット switch (ircode){ // 受信コードによりLED制御 case 0xC084: LATA5 ^= 1; break; // Key 1 LED4 反転 case 0xC044: LATA1 ^= 1; break; // Key 2 LED5 反転 case 0xC0C4: LATA2 ^= 1; break; // Key 3 LED6 反転 case 0xC024: LATC5 ^= 1; break; // Key 4 LED7 反転 default: LATA = 0; LATC = 0; break; // 他のKey 全消灯 } } } /** End of File **/