PR 記事には広告が含まれています
スポンサーリンク
Translate

人感センサSR602とATtiny13Aで人に反応してチャイムが鳴るドアベルを作りました

スポンサーリンク

お店の入り口によくついている、入店するとピロピロピロピローンと音が鳴る装置を作りました。

スポンサーリンク

回路

人感センサにはSR602を使います。

HiLetgo 3個セットミニSR602モーションセンサー検出器モジュール焦電式赤外線感覚スイッチArduino PI向け高感度
HiLetgo

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を交互に出すことで、ピロピロピロピローンと鳴るようにしました。

スポンサーリンク

動作

人に反応して、お店に入店する時に聞くチャイムの音が鳴るようになりました。音が小さいのでアンプを付ければ、完璧だと思います。