【MBC-07】赤外線リモコンLEDマーカ(PIC12F1822版)
概要
概要
・赤外線リモコンと同じ周波数で変調された信号を発信し、赤外線リモコン受信モジュールで受信する回路です。マイコンには、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
回路図
回路図
実体配線図
実体配線図
ファームウェア (MPLAB xc8コンパイラ用)
ファームウェア (MPLAB xc8コンパイラ用)
/*
* 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();
}
}
}
}