Arduinoに音圧ブザーと超音波距離センサーを繋げて部屋に入室したら、ファミマのBGMが流れるものを作ってみました
足跡として記載しておきます
必要なもの
-
Arduino Uno
最初から始める人は、Arduinoを単体で購入するよりもフレップボードやジャンパワイヤなどが同梱しているセットを購入したほうが良いと思います → こちらから
-
音圧ブザー
私はセットで同梱したものを使用したため割愛
-
超音波距離センサー
Amazonで購入可能
-
その他フレップボードやジャンワイヤ
プログラム
/*
Create date: 2014/10/05
implementafor: Momiji Miyakawa
*/
#include "pitches.h"
//超音波センサのピン
#define trigPin 12
#define echoPin 13
//音圧ブザーのピン
#define bzr 8
//入店距離確認距離
#define nyuuten 80
//誤差を無くすための入店確認距離
#define er_nyuten 40
//距離をグローバル変数にすることでどこでもつかえるようにする
int distance;
//pitchesのために必要
int melody[] = {
NOTE_FS5, NOTE_D5,NOTE_A4, NOTE_D5, NOTE_E5, NOTE_A5, NOTE_E5, NOTE_FS5, NOTE_E5, NOTE_A4, NOTE_D5};
float noteDurations[] = {
4, 4, 4, 4, 4, 1.5, 4 ,4, 4, 4, 2 };
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
//超音波センサの関数化
void echo(){
int duration;
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
if (distance >= 200 || distance <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distance);
Serial.println(" cm");
}
}
//ファミマBGMの関数化
void tonemelody(){
for (int thisNote = 0; thisNote < 11; thisNote++) {
float noteDuration = 1000/noteDurations[thisNote];
tone(bzr, melody[thisNote],noteDuration);
float pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(bzr);
}
}
void loop() {
echo();
//検出範囲の限定
if(distance < nyuuten && distance > er_nyuten){
tonemelody();
delay(2000);//一度ファミマBGMが流れたら2秒待つ
}
}
一連の流れとして、
1. 超音波距離センサにて40~80cmの範囲で人を検出する 2. 検出したらファミマのBGMが流れる
ということになっています
超音波距離センサの検出範囲はプログラムを弄ることで広くしたり狭めたりすることが可能です
ファミマのBGMはNoriNori様が運営している『NoriNoriDiaryラジコンCR-01サイクリング』から拝借しました
Arduinoの開発環境を開き、ファイル → スケッチ例 → 02.Digital → toneMelody を押す
toneMelody内のプログラムをすべて削除
pitches.hは削除しないでください
toneMelodyに下記のプログラムをコピーアンドペースト
#define nyuuten 80 #define er\_nyuten 40
を弄ることで検出範囲を変えることが可能です このプログラムでは、40~80cmの間にいる人を検出しています
超音波センサと音圧ブザーをArduinoに接続するピンはプログラムに記載してあります
超音波センサのピン 12 と13
音圧ブザーのピン 8
欠点として、超音波距離センサは音波を飛ばして跳ね返ってくるまでの時間を測定します。
そのため、人が通っていないのにBGMが流れることがあります
対処法は、検出範囲を狭くするか赤外線距離センサを使用する 方法があります 私は光距離センサが手元にないため検出範囲を狭める方法をとりました
正確に検出をして欲しければ光距離センサを使いましょう → 購入先
参考
- NoriNori様『NoriNoriDiaryラジコンCR-01サイクリング』 http://d.hatena.ne.jp/Nori327/20140109/p1