・マイコン工作の第一歩といえば、LEDピカピカ……LEDを点滅させる回路だ。次の一歩は、A/Dコンバータで、センサに反応してLEDが光る回路だろうか。
・久しぶりに、フツーのサイズ(小さい方のカテゴリに分類されると思うが……)のブレッドボードで、マイコン工作の第二歩のための回路を紹介しよう。
・起動時の明るさをフォトトランジスタで検出し、明るいときと暗いときで動作を切り替えてみた。
・起動時、周囲が明るい場合…ブザーの鳴動が光センサの明るさで変わる。センサに手を近づけて暗くするほど、ブザーの鳴る間隔が短くなる。
・起動時、周囲が暗い場合…LEDが高速に点滅する。このとき、ブザー(圧電サウンダ)を叩いたり、息を吹きかけたりして衝撃を与えると、ブザが鳴った後でLEDが短い間消灯する。
AVRマイコン ATTiny26L/261/861
カーボン抵抗器 100kΩ、10kΩ、150Ω
フォトトランジスタ NJL7502L
圧電スピーカ SPT08-Z185
LED 5mmφ
ブレッドボード
電池ボックス 単3×2本用、バッテリースナップタイプ
バッテリースナップ
※TINY26Lは、ATTINY261やATTINY861に置き換えることができる。
※ATTINY26Lは、ATTINY261やATTINY861に置き換えることができる。
#ATtiny26L用
// ATTINY26// ADC0 : A-D Convertor Input// PA7(ADC6) : Speaker// PB5 : LED1 1:ON 0:OFF#include <avr/io.h>#define led_on() PORTB |= (1<<PB5)
#define led_off() PORTB &= ~(1<<PB5)
#define led() PORTB ^= (1<<PB5)
#define buz() PORTA ^= (1<<PA7);
#define buz_off() PORTA &= ~(1<<PA7);
#define MODE_TERUMEEN 0x00
#define MODE_CANDLE 0xff
#define buz_output_mode() DDRA |= (1<<PA7)
#define buz_input_mode() DDRA &= ~(1<<PA7)
volatile char mode = MODE_TERUMEEN; // Mode Switchvoid wait(volatile long i){while (i-- > 0);
}int adconv0(void)/* AD Convertor */{int adata;
ADCSR |= (1<<ADEN) | (1<<ADSC); // A-D convertor enable,
ADMUX = (1<<ADLAR) | 0x00; /* ADLAR=1, ADC0 SingleEndedInput */
while ( !(ADCSR & (1<<ADIF)) );
adata = ADCH;
ADCSR &=~(1<<ADIF);
return adata;
}int adconv6(void)/* AD Convertor */{int adata;
buz_input_mode();
ADCSR |= (1<<ADEN) | (1<<ADSC); // A-D convertor enable,
ADMUX = (1<<ADLAR) | 0x06; /* ADLAR=1, ADC6 SingleEndedInput */
while ( !(ADCSR & (1<<ADIF)) );
adata = ADCH;
ADCSR &=~(1<<ADIF);
return adata;
}void beep(void){volatile int i, j;
buz_output_mode();
for ( i = 0; i < 10; i++ ) {
for (j = 0; j < 100; j++) {
buz(); wait(5);
}
buz_off(); wait(1000);
}
}int main(void){unsigned int adc, i;
// Initialize I/O Port
DDRB = (1<<PB3) | (1<<PB5);
for ( i = 0 ; i < 5; i++ ) {
led_on(); wait(3000);
led_off(); wait(3000);
}
adc = adconv0();
if ( adc > 0x40 ) {
buz_input_mode();
mode = MODE_CANDLE;
} else {
buz_output_mode();
mode = MODE_TERUMEEN;
}
while (1)
{
switch (mode) {
case MODE_TERUMEEN:
DDRA |= (1<<PA7);
adc = adconv0();
adc = 0xff - adc;
led_on();
for ( i = 0; i < (adc>>1); i++) {
buz(); wait(adc);
}
led_off(); wait(adc * 100);
break;
default:
led(); wait(100);
adc = adconv6();
if (adc > 0x03) {
led_off();
beep();
wait(200000);
}
}
}
return 0;
}#ATtiny261/861用
// ATTINY261/861// ADC0 : A-D Convertor Input// PA7(ADC6) : Speaker// PB5 : LED1 1:ON 0:OFF#include <avr/io.h>#define led_on() PORTB |= (1<<PB5)
#define led_off() PORTB &= ~(1<<PB5)
#define led() PORTB ^= (1<<PB5)
#define buz() PORTA ^= (1<<PA7);
#define buz_off() PORTA &= ~(1<<PA7);
#define MODE_TERUMEEN 0x00
#define MODE_CANDLE 0xff
#define buz_output_mode() DDRA |= (1<<PA7)
#define buz_input_mode() DDRA &= ~(1<<PA7)
volatile char mode = MODE_TERUMEEN; // Mode Switchvoid wait(volatile long i){while (i-- > 0);
}int adconv0(void)/* AD Convertor */{int adata;
ADCSRA |= (1<<ADEN) | (1<<ADSC); // A-D convertor enable,
ADMUX = (1<<ADLAR) | 0x00; /* ADLAR=1, ADC0 SingleEndedInput */
while ( !(ADCSRA & (1<<ADIF)) );
adata = ADCH;
ADCSRA &=~(1<<ADIF);
return adata;
}int adconv6(void)/* AD Convertor */{int adata;
buz_input_mode();
ADCSRA |= (1<<ADEN) | (1<<ADSC); // A-D convertor enable,
ADMUX = (1<<ADLAR) | 0x06; /* ADLAR=1, ADC6 SingleEndedInput */
while ( !(ADCSRA & (1<<ADIF)) );
adata = ADCH;
ADCSRA &=~(1<<ADIF);
return adata;
}void beep(void){volatile int i, j;
buz_output_mode();
for ( i = 0; i < 10; i++ ) {
for (j = 0; j < 100; j++) {
buz(); wait(5);
}
buz_off(); wait(1000);
}
}int main(void){unsigned int adc, i;
// Initialize I/O Port
DDRB = (1<<PB3) | (1<<PB5);
for ( i = 0 ; i < 5; i++ ) {
led_on(); wait(3000);
led_off(); wait(3000);
}
adc = adconv0();
if ( adc > 0x40 ) {
buz_input_mode();
mode = MODE_CANDLE;
} else {
buz_output_mode();
mode = MODE_TERUMEEN;
}
while (1)
{
switch (mode) {
case MODE_TERUMEEN:
DDRA |= (1<<PA7);
adc = adconv0();
adc = 0xff - adc;
led_on();
for ( i = 0; i < (adc>>1); i++) {
buz(); wait(adc);
}
led_off(); wait(adc * 100);
break;
default:
led(); wait(100);
adc = adconv6();
if (adc > 0x03) {
led_off();
beep();
wait(200000);
}
}
}
return 0;
}