お店の入り口によくついている、入店するとピロピロピロピローンと音が鳴る装置を作りました。
回路
人感センサには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を交互に出すことで、ピロピロピロピローンと鳴るようにしました。
動作
人に反応して、お店に入店する時に聞くチャイムの音が鳴るようになりました。音が小さいのでアンプを付ければ、完璧だと思います。










コメント