散々使われてきたネタだと思うが、せっかく作ったので投下。
使用したもの&環境
[1] パッシブブザーは与える信号によって音程を変更できるブザーであり、よく圧電スピーカーと呼ばれているものと同一のようだ。
[2] 以下のページによると、ブザーには保護のために抵抗をかますことが多いとの事なので、それに従うことにした。
synapse.kyoto
回路図
作成したプログラム
// everykalax.hateblo.jp // 2021.08.09 // ライブラリをinclude #include "pitches.h" #include "SR04.h" // 使用するピンの定義 #define SOUND_PIN 8 #define TRIG_PIN 12 #define ECHO_PIN 11 // 超音波センサの設定らしい SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN); long a; // 音符の長さ(四分音符など)の定義 #define L1 2000 // [ms] #define L2 (L1/2) #define L4 (L1/4) #define L8 (L1/8) // メロディと音の長さを定義 int melody[] = { NOTE_FS4, NOTE_D4, NOTE_FS3, NOTE_D4, NOTE_E4, NOTE_A4, NOTE_E3, NOTE_E4, NOTE_FS4, NOTE_E4, NOTE_FS3, NOTE_D4 }; int duration[] = { L8, L8, L8, L8, L8, L4, L8, L8, L8, L8, L8, L4 }; // =================================== void setup() { Serial.begin(9600); a = sr04.Distance(); // これいらないかも } // 距離の閾値 これより近くに接近したら音を鳴らす long threshold_length = 5L; void loop() { // 接近するまで待つ(ビジーウェイトなのでできれば改善したい) do { a = sr04.Distance(); delay(50); } while(a > threshold_length); // センサとの距離をシリアルポートに出力 Serial.print(a); Serial.println("cm"); // ファミマのチャイムを鳴らす for (int thisNote = 0; thisNote < 12; thisNote++) { tone(SOUND_PIN, melody[thisNote], duration[thisNote]); delay(duration[thisNote]); } // 一応数秒間待つ delay(2000); }
使用ライブラリ&参考にしたプログラム
買ったキットに入っていた"pitches.h" *1 と"SR04.h" *2 の2つのライブラリを使用した。
また、以下のページにあるzipファイル内の、
ELEGOO The Super Starter Kit for UNO V2.0.2021.03.31\English\Part 2 Module Learning\2.9 Ultrasonic Sensor Module\SR04_Example
にある"SR04_Example.ino"ELEGOO The Super Starter Kit for UNO V2.0.2021.03.31\English\Part 2 Module Learning\2.6 Passive Buzzer\passive_buzzer
にある"passive_buzzer.ino"
を参考にした。 www.elegoo.com
今後の課題
- 和音を鳴らせるようにしたい。
- ビジーウェイトを使わないで済む方法を模索したい。
補足
ファミマのチャイムの楽譜
この記事の中盤あたりに掲載されている楽譜を読み、メロディを作成した。いくつかの音には♯がついているため気を付ける。 dailyportalz.jp
*1:たぶんArduino公式ページにあるpitches.hと同一
*2:ELEGOOのサイトからDLできる