---
---
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ビットシフト
}
}