・家庭には、赤外線リモコンで操作できる機器が結構ある。テレビやブルーレイレコーダーは、赤外線リモコンがなければ操作できないほどだ。扇風機や照明器具までリモコン操作することができる。
・こんなに身近な赤外線リモコンだが、電子回路を作って実験しようとするとなかなか難しい。信号が38kHzで変調されているためだ。
・そこで、ブレッドボード上に、簡単に赤外線通信の回路を作成できるモノをつくってみた。マイコンを使って38kHzの変調波を出力し、赤外線リモコン受信モジュールを使って、お手軽に信号を受信する回路だ。
・本機のタクトスイッチを押すと、赤外線LEDから38kHzの信号が数ミリ秒間出力される。また、タクトスイッチを押していない状態で、38kHzの信号を受信すると、ブザーが鳴り、LEDが点滅する。
ミニブレッドボード BB-601
AVRマイコン ATTINY2313-20PU またはATTINY2313V-10PU
赤外線リモコン受信モジュール PL-IRM2161-C438 (動作電圧2.4〜5.5V)
赤外線LED
3mm径LED
圧電スピーカ (13mm)PKM13EPYH4000-A0
カーボン抵抗器 150Ω、1/4W 2個
タクトスイッチ
バッテリースナップ
単3電池2本用電池ボックス
ジャンパ線3本
// INT0/PD2 : Ir-remote communicator ( Transmitter / Reciever )
// INPUT
// PD2 (INT0) : sw (1:OFF, 0:ON)
// PD5 : Ir remotecontrol reciever module (1:OFF, 0:ON)
//OUTPUT
// PB4 (OC1B) : Ir-LED (1:OFF, 0:ON)
// PB6 : Buz
// PD4 : LED (1:ON, 0:OFF)
#include <avr/io.h>
#include <avr/interrupt.h>
#define led_on()
( PORTD |= (1<<PD4) )
#define led_off()
( PORTD &= ~(1<<PD4) )
#define led()
( PIND |= (1<<PD4) )
#define buz_on()
( PORTB |= (1<<PB6) )
#define buz_off()
( PORTB &= ~(1<<PB6) )
#define is_ir()
!( PIND & (1<<PD5) )
#define is_sw()
!( PIND & (1<<PD2) )
//#define FREQ38KHZ 96
// (CK 8Mhz) value of OCR1A at 38kHz Frequency
#define FREQ38KHZ 12
// (CK 1Mhz) value of OCR1A at 38kHz Frequency
#define FREQZERO 0
// value of OCR1A at No Frequency
void wait(volatile unsigned long i)
{
while (i-->0);
}
void beep()
{
volatile unsigned long i, j, k;
for (i = 0; i < 5; i++) {
led();
for (j = 0; j < 100; j++) {
for ( k = 0; k < 5; k++) {
buz_on();
wait(5);
buz_off();
wait(5);
}
}
}
led_off();
}
void init_timer1_ctc(void)
// Timer/Counter1 CTC (Clear Timer on Compare mode)
{
// Freq = IOclock (1MHz or 8MHz) / 2N(1 + OCR1A) , N=1(no Prescaling)
TCCR1A = (0<<WGM11) | (0<<WGM10) | (0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (1<<COM1B0);
TCCR1B = (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
OCR1A = FREQ38KHZ; OCR1B = 0x0000; // Freq. 38kHz
TIMSK |= (1<<OCIE1A);
}
void connect_OC1(void)
{
TCCR1A = (0<<WGM11) | (0<<WGM10) | (0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (1<<COM1B0);
}
void disconnect_OC1(void)
{
TCCR1A = (0<<WGM11) | (0<<WGM10) | (0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0);
}
int main(void)
{
// Initialize I/O Port
PORTD |= ( (1<<PD2) ); // PD2 weak pull up
DDRD &= ~( (1<<PD2) | (1<<PD5) ) ;
// PD2, PD5 Input Mode
DDRD |= (1<<PD4); // PD4 Output mode
DDRB = (1<<PB4) | (1<<PB6);
init_timer1_ctc();
while (1) {
if (is_sw()) {
connect_OC1(); OCR1A = FREQ38KHZ;
led_on();
wait(5000);
led_off();
wait(5000);
} else {
disconnect_OC1(); OCR1A = FREQZERO;
led_off();
wait(500);
if ( is_ir() ) {
beep();
}
}
}
return 0;
}