【MBC-07】赤外線リモコンLEDマーカ(PIC12F1822版)

概要

or-remote-control-led

・赤外線リモコンと同じ周波数で変調された信号を発信し、赤外線リモコン受信モジュールで受信する回路です。マイコンには、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

回路図

回路図

実体配線図

赤外線リモコンLEDマーカ実体配線図

ファームウェア (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();
            }
        }
    }
}