ラジコンのミニヘリに搭載するロストアラームを製作するために、ブザーを鳴らすプログラムを作成した。
圧電ブザーには、アクティブ型とパッシブ型がある。アクティブ型は電源に接続するだけで鳴るのだが、パッシブ型は電源に接続しても鳴らない。パッシブ型を鳴らすには発振器が必要である。
素直にアクティブ型を使えば良いのだが、発振周波数にバラツキがあり、音のちいさな個体があるので使用するのをやめた。
パッシブ型のブザーとATtiny13Aを使い、音の大きくなる周波数で鳴らすことにした。
ATtiny13Aの比較一致タイマーを使えば周波数可変の矩形波を発生させることができる。
サンプルコード
#include <avr/io.h>
int main(void)
{
// ポート設定
DDRB = 0b00000001; // PB0:Buzzer(出力) PB1,PB2:Button(入力)
PORTB = 0b00000110; // PB1,PB2:プルアップ
// 比較一致タイマー:WGM02 WGM01 WGM00 -> 010
// 比較A出力選択:COM0A1 COM0A0 -> 01 比較一致でOC0Aピントグル(交互)出力
// カウンタクロック分周:CS02 CS01 CS00 -> 010 8分周
// 割込は使用しない
TCCR0A=0b01000010; // COM0A1:0 COM0A0:1 WGM01:1 WGM00:0
TCCR0B=0b00000011; // WGM02:0 CS02:0 CS01:1 CS00:0
int i;
int j=255;
while (1)
{
while( bit_is_clear(PINB,PB1) ){
i=1;
}
while( bit_is_clear(PINB,PB2) ){
i=-1;
}
j=j+i;
if (j < 1) j=1; // 34.7kHz
if (j >255) j=255; // 270Hz
OCR0A=j;
i=0;
}
}