ブザー2種類とドレミ
はじめに
当方手持ちのブザーモジュールには、二種類あります。以前、衝動買いしてしまった37種類のセンサーセット
中に含まれています。基板のシルク印刷見ても
「Keyes K845755」 と同じ番号なのですが
・シールがある方は「有源蜂鳴器(アクティブブザー:Active Buzzer)」信号ピンをHighにすれば「ピー」と鳴る。
・シールが無い方は「無源蜂鳴器(パッシブブザー:Passive Buzzer)」信号ピンにHIGH、LOWを交互出力して「音の振動」を作り出してやる必要がある。(音の高低をプログラムで変えられる自由度がある)
ということのようです。試してみましょう。
アクティブブザー
信号をHIGH(5V)に
「ピー」と鳴っています。
パッシブブザー
信号をHIGHにしても音はでないですが、触れたり離したりすると「カリカリ」音がします。
ドレミを鳴らすには
パッシブブザーの方は、音程をコントロールできるわけで、ドレミファソラシドを鳴らしたくなります。音階の基準音は440Hz の「ラ」だそうで、その前後のドレミファソラシドだと、
ド:261.6 レ:293.7 ミ:329.6 ファ:349.2 ソ:392.0 ラ:440.0
シ:493.9 ド:523.3 (Hz)だそうです。
Arduinoでよく使う「一定時間待つ関数」に delay()がありますが、引数がミリ秒(1/1000秒)単位で、ちょっと荒いので、マイクロ秒(1/百万 秒) で指定できる、delayMicroseconds() を使ってみましょう。xヘルツの矩形波を出力するには1.0/(2x)秒おきにオンオフを切り替えればよい。マイクロ秒単位なので100万/(2x) 。あと継続時間を秒単位で与えることにします。
ソースコード
#define IO 7 //信号7番ピン
void setup() {
// put your setup code here, to run once:
pinMode(IO, OUTPUT);
}
void mybeep(double hz,double sec){
int times;
int period;
times = round(hz*sec);
period = round(1000000.0/2.0/hz);
for (int i = 0; i < times; i++){
digitalWrite(IO, HIGH);
delayMicroseconds(period) ;
digitalWrite(IO, LOW);
delayMicroseconds(period) ;
}
}
void loop() {
// put your main code here, to run repeatedly:
mybeep(261.6,0.25);//ド
mybeep(293.7,0.25);//レ
mybeep(329.6,0.25);//ミ
mybeep(349.2,0.25);//ファ
mybeep(392.0,0.25);//ソ
mybeep(440.0,0.25);//ラ
mybeep(493.9,0.25);//シ
mybeep(523.3,0.25);//ド
}