お店の入り口によくついている、入店するとピロピロピロピローンと音が鳴る装置を作りました。
回路
人感センサにはSR602を使います。
SR602は人に反応すると、出力ピンがHiになります。ATtiny13AはINT0ピンがLowになると、スリープから復帰できます。そのため、SR602の出力にMOS-FETの2N7000を接続して、SR602の出力がHiになったら、INT0ピンをLowにするようにしました。
ATtiny13AのPB0ピンに、抵抗をつないでスピーカーを接続しました。
部品数が少ないので、とても小さく作れました。人感センサSR602はとても省電力です。ATtiny13Aのスリープと組み合わせて、待機電力はとても小さいので、コイン電池で動作させることにしました。
ジャンパーは使わず、基板の片面配線だけで、配線が済みました。
プログラム
プログラムは、Arduinoで作りました。ATtiny13AをArduinoで開発できる、MCUdudeのMicroCoreというパッケージを利用しています。詳しくはこちらをご覧ください。
#include <avr/sleep.h> #include <avr/interrupt.h> #define Triger 1 void setup() { pinMode(Triger, INPUT_PULLUP); pinMode(0, OUTPUT);//スピーカー出力 //非反転 高速PWM動作 //比較一致でLow、BOTTOMでHighをOC0Aピンへ出力 (非反転動作) TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00); //clkI/O (前置分周なし) TCCR0B = (1 << CS00); /* 761Hz , 601Hzを0.181秒ごとに切り替える */ } void wakeUpNow() { } void sleepNow() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); attachInterrupt(0, wakeUpNow, LOW); sleep_mode(); sleep_disable(); detachInterrupt(0); } uint8_t counter = 0; int16_t volume = 255; uint8_t vol_div = 0; void loop() { int wait = (long)976 * 500 / 761; int cycle = (long)181 * 488 / wait; int TCNT0_old = 0; for (int i = 0; i < cycle; i++) { OCR0A = volume; delayMicroseconds(wait); OCR0A = 0; delayMicroseconds(wait); if (TCNT0 < TCNT0_old) { vol_div++; if ((vol_div & 1) == 0) { volume -= 1; } if (volume < 0)volume = 0; } TCNT0_old = TCNT0; } wait = (long)976 * 500 / 601; cycle = (long)181 * 488 / wait; for (int i = 0; i < cycle; i++) { OCR0A = volume; delayMicroseconds(wait); OCR0A = 0; delayMicroseconds(wait); if (TCNT0 < TCNT0_old) { vol_div++; if ((vol_div & 1) == 0) { volume -= 1; } if (volume < 0)volume = 0; } TCNT0_old = TCNT0; } counter++; if (counter == 2) { //2ピロピロ volume = 255; } if (counter == 6) { //4ピロピロ volume = 255; counter = 0; sleepNow(); } }
スリープやスリープから復帰する方法は、こちらの記事の後半のプログラムを利用しました。
音の発生は、タイマー0を使ってPB0ピンをON,OFFしています。ピーンとだんだん音が小さくなるエンベロープにはPWMを使っています。
761Hz , 601Hzを交互に出すことで、ピロピロピロピローンと鳴るようにしました。
動作
人に反応して、お店に入店する時に聞くチャイムの音が鳴るようになりました。音が小さいのでアンプを付ければ、完璧だと思います。
コメント