・赤外線リモコンと同じ周波数で変調された信号を発信し、赤外線リモコン受信モジュールで受信する回路です。マイコンには、PICマイコンを使いました。
・圧電サウンダを軽く叩くと、信号を発信します。信号を発信していないときに別の機器からのリモコン信号を受信すると、LEDが光り、ブザが鳴ります。
・さらに、LEDが消灯しているときに、外部からの赤外線信号を受信すると、LEDが点滅しはじめます。逆に、LEDが点滅しているときに赤外線信号を受信すると、LEDは消灯します。
・2台つくって、離れた場所から信号のやり取りをすると、面白い遊びができそう。
・回路図やファームウェアのソース、バイナリ(Hex)ファイルは、添付ファイルを参照してください。
・<注意!>本機から発信される信号により、テレビやエアコンなど、赤外線リモコンで操作できる機器が誤動作をする可能性があります。危険がないように注意して使用してください。
PICマイコン Microchip社製 PIC12F1822
赤外線リモコン受信モジュール PL-IRM-2161-C438 (2.4〜5V動作)
赤外線LED
LED
カーボン抵抗器 150Ω×2個、10kΩ
圧電サウンダ他励振 PKM13EPYH4000-A0
バッテリースナップ
電池ボックス 単3×3本用(プログラムの書込み後は、NiMH電池2本使用で動作)
ミニブレッドボード BB-601
/* * File: ir-com-ver3-12f1822.c * Author: kaimu * * Created on 2013/04/27, 17:35 *//* Target: PIC12F1822 * Digital Input : * Ir-remote controll reciever : RA0 * Analog Input : * Piezo Speaker : AN3 (RA4) * Digital Output : * LED : RA5 * Piezo Speaker : RA4 * InfraRed(Ir)-LED : RA2 */#include <xc.h>__CONFIG( FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);__CONFIG(PLLEN_OFF & STVREN_ON & WRT_OFF & BORV_LO & LVP_OFF);#define LED_BLINKING_PERIOD 100 // LED Blinking Interval#define led_on() ( RA5 = 0 )#define led_off() ( RA5 = 1 )#define led() ( RA5 ^= 1 )#define buz() (RA4 ^= 1 )#define is_ir_recieve() ( ~RA0 )void delay(volatile unsigned long t)// Delay{while(t-- > 0) NOP();
}void init_io(void){ //Initialization OSCCON = 0b01101010; // PLL disable, 4MHz internal clock GIE = 0; //Interrupt disable
// 76543210
TRISA = 0b00001001; //I/O Direction. RA1-2,4-5 : output , RA0,3 : Input
LATA = 0b00011001; ; // PORTA Latch Settings WPUA = 0b00001000; //weak pull up RA3// WPUA = 0b00010000; //weak pull up RA4 OPTION_REG &=0b01111111; //weak pull up enable ANSELA = 0b00000000; // All I/O digital port}void init_pwm_38khz(void){ CCP1SEL = 0; // CCP1 pin is RA2 CCP1CON = 0b00001100; // PWM Single output mode , PWM mode P1A, P1C active-high; P1B, P1D active-high T2CON = 0b00000000; // TMR2 1:1 Postscaler, Timer2 Clock Prescaler is 1 PR2 = 25; // PWM frequency is (4MHz / 4 / ( 25 + 1 ) = 38kHz) CCPR1L = 0; //Duty ratio 0 CCPR1H = 0; TMR2 =0; // Initialize TiMeR2 counter TMR2ON = 0; // Stop TMR2 ( PWM ) CCPR1L = 12; // Set Duty ratio}void init_adc8(void){ ANSELA = 0b00010000; //RA4 Analog port, others digital port ADCON0 = 0b00001101; //0:unimp, 00011:AN3, 0:GOnDone, 1:ADC enable ADCON1 = 0b01000000; //0:Left jutified (8bit res.), 100:Fosc/4 ,0:Reserved, 00:AVDD=VREF CM1CON0 = 0x00; //Comparator disable}unsigned char adc8(void){ unsigned char d; //ADC delay(10); GO_nDONE = 1; while (GO_nDONE); d = ADRESH; return d;}unsigned char is_sw_on(void) { // A/D Converter Input as Switch // When Analog signal is detected , return 0xff // When No Analog signal is detevted, return 0x00 unsigned char adcdata; TRISA4 = 1; ANSA4 = 1;// RA4 Input mode, Analog I/O adcdata = adc8(); if (adcdata > 0x02) { return 0xff; } else { return 0x00; }}void ir_beam_control(void)// PWM (38kHz) control{ if (is_sw_on()) { TMR2ON = 1; // PWM (38kHz) Start led_on();delay(10000); TMR2ON = 0; // PWM (38kHz) Stop led_off(); } else { TMR2ON = 0; // PWM (38kHz) Stop }}void ledbeep(void) { // Flash LED & Beep volatile int i, j; TRISA4 = 0; ANSA4 = 0; // RA4 Output mode, Digital I/O for (i = 0; i < 10; i++) { led(); delay(2000); for (j = 0; j < 400; j++) {buz(); delay(2);} } delay(100); // Wait for Buzzer vibration stop}void main(void){ volatile unsigned char operating_mode = 0xff; // Operating Mode Flag 0xff: blink LED, 0x00: LED OFF volatile int i, j; init_io(); // Initialize I/O port settings init_pwm_38khz(); // Initialize PWM settings init_adc8(); //initialize A/D converter settings ledbeep(); while(1){ if (operating_mode) { // when operating mode is NOT 0x00, blink LED led(); } else { // when operating mode is 0x00, power off LED led_off(); } if (is_ir_recieve()) { // when Ir-Signal detected, beep sound operating_mode ^= 0xff; // switch operating mode (toggle) ledbeep(); while (is_ir_recieve()); // wait for No signal from Ir-reciever } else { // blinking period control for (i = 0; i < LED_BLINKING_PERIOD; i++) { ir_beam_control(); } } }}