---
---
18F14K50のBootLoader基本ボードを使い、赤外線リモコンの送信機を作成しました。
基本PIC基板に、赤外線LEDと電流制限抵抗を半田付けした簡単なモジュールを作成し取り付けてあります。 基本PIC基板に、PushSWが1つしかないので、単純な信号しか送れませんが、PushSWさえ追加すれば、いくらでも拡張できます。
現在は、PushSWを押すたびにテレビリモコンの
チャンネル「1」 ⇒ チャンネル「2」 ⇒ チャンネル「3」 ⇒ チャンネル「4」
と4つのコマンドを順に送出しています。 赤外線受信機との連携を意識したものです。 赤外線受信機と2台でお互いの機能確認ができます。 プログラムの定数さえ書き直せば、既存リモコンのON/OFFなど単機能の実用リモコンとなります。現状は赤外線LEDに流す電力が少ないため、TRを追加して光量を増やす必要がありますが、抵抗とTR各1つの追加で可能です。
//------------------------------------------------ // PIC 13_Ir_Tx // 赤外線送信機 // PushSWを押すごとに NEC方式で0x01-0x04までの // コマンドを順に送信する。 // Notes: 12MhzXtal 48MHzシステムクロック // PwmOut RC4 赤外線LED // LED RC0 インディケーション用 // PushSW RB7 // Language: MPLAB xc8 // Target: PIC18F14K50 //------------------------------------------------ #include <p18f14k50.h> #include <delays.h> #include <timers.h> #include <pwm.h> #define PwmOut TRISCbits.TRISC4 #define LED LATCbits.LATC0 #define outON 0 #define outOFF 1 #define PushSW PORTAbits.RA3 // //------------ リセット ベクトルの移動-------------------- #define REMAPPED_RESET_VECTOR_ADDRESS 0x1000 extern void _startup (void); #pragma code reset_vect = REMAPPED_RESET_VECTOR_ADDRESS void _reset (void){_asm goto _startup _endasm} //--------------------------------------------------------- void irCmd(unsigned int,char); void dataOut(char); #pragma code void main(void){ char cmdCode; PORTC = 0; TRISC = 0b11011111; // RC4出力、RC5 は後で設定 ANSEL = 0b00000000; // すべてデジタル ANSELH = 0b00000000; // --------------- CCPの 設定 -------------------- // クロック(48Mhe/4)をカウントし、38KHzを出力する // 48M/4/4/(78+1)=37.97KHz // --------------------------------------------- SetDCPWM1(0x9C); // Duty 78x4x50%=156(0x9C) SetOutputPWM1( SINGLE_OUT, PWM_MODE_1); PwmOut = outOFF; // PWM出力を停止 PSTRCON = 0b00000010; // PWM出力がP1B(RC4) ピン OpenTimer2( // Timer2 TIMER_INT_OFF & // インタラプトOFF T2_PS_1_4 & // プリスケラ 1/4 T2_POST_1_1 ); // ポストスケラ 1/1 OpenPWM1(0x4E); // PRに78をセット PIR1bits.TMR2IF = 0; cmdCode=1; while(1){ while(PushSW); // PushSwを待つ while(!PushSW); irCmd(0x0055,cmdCode); // コマンド出力 Delay10KTCYx(240); // 200mSec irCmd(0x0055,cmdCode); // コマンド再出力 Delay10KTCYx(240); // 200mSec if(cmdCode++ >= 5)cmdCode = 1; } } // --------------- 赤外線信号出力 -------------------- // 16ビットのカスタムコード(ctm)と // 8ビットのコマンドコード(cmd)をNEC方式で出力する // --------------- Data出力 -------------------- void irCmd(unsigned int ctm,char cmd){ char i; // ---- リーダー出力 ---- LED = 1; // LED ON PwmOut = outON; // ON出力 Delay1KTCYx(108); // 9mSec PwmOut = outOFF; // OFF出力 Delay1KTCYx(54); // 4.5mSec // ---- カスタムコードの出力 ---- dataOut(ctm >> 8); // 上位8ビット出力 dataOut(ctm & 0xFF); // 下位8ビット出力 // ---- コマンドドの出力 ---- dataOut(cmd); // コマンド出力 dataOut(~cmd); // 反転コマンド出力 // ---- Stop bitの出力 ---- PwmOut = outON; Delay100TCYx(67); PwmOut = outOFF; LED = 0; // LED OFF } // --------------- Data出力 -------------------- // data を下位から出力する // --------------- Data出力 -------------------- void dataOut(char data){ char i; for(i=1;i<=8;i++){ PwmOut = outON; // ON出力 Delay100TCYx(67); // 560μSec PwmOut = outOFF; // OFF出力 if(data & 1) // Delay100TCYx(202); // 1680μSec else Delay100TCYx(67); // 560μSec data >>=1; // 右に1ビットシフト } }