赤外線リモコンの信号を受信し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 **/