今回は圧電ブザーを利用して音を出してみましょう. 圧電ブザーとはピエゾ素子を使ったブザー(スピーカ)で,両端に電圧をかけるとブツッという音がします. 連続して音を出すには電圧を周期的に変化させて電気の波を入力する必要があります(つまり電池をつないだだけでブーと鳴ったりはしません)が,そのぶん,与えた波によってそれに応じた音が出力されるという楽しさがあります.
下図のような回路を作ります.
#ref(): File not found: "2009-11-16_2216.png" at page "演習II-7"
圧電ブザーの端子には極性(プラスとマイナス)があるので注意してください. 黒い方をグラウンド(GND)につなぎ,信号を出す端子に赤い方(プラス)をつなぐようにします. 圧電ブザーの端子は細いので,Arduinoの端子ではユルユルだという場合は適宜ブレッドボードを利用してください.
次に,いま圧電ブザーを接続した13番ピンを一定周期でHIGH⇄LOWさせるプログラムを作ってArduinoに転送します.
const int buzzerPin = 13; int d = 10; void setup() { pinMode(buzzerPin, OUTPUT); } void loop() { digitalWrite(buzzerPin, HIGH); delay(d); digitalWrite(buzzerPin, LOW); delay(d); }
どんな音が聞こえましたか?
上記プログラムでは13番ピンをHIGHにして10ms待ち,今度は13番ピンをLOWにして再び100ms待つという動作を繰り返しています. この動作によって圧電ブザーには下図のような電圧が入力されます. このような四角い波を矩形波といいます.
#ref(): File not found: "2009-11-16_2307.png" at page "演習II-7"
上図からわかるように,この波は20msで1回の繰り返しが終わります. つまり,1周期が20msというわけです. 波の周期の逆数が周波数ですから,この波は 1/20ms = 1/0.02s = 50Hz ということで,いま圧電ブザーから聞こえた音は50Hzの音ということになります.
うまくいったらプログラム中の変数 d の値を変えて,どんな音が聞こえるか試してみてください. 値を大きくしたり小さくしたりすると,それに応じて音の高さはどうなるでしょうか.
上記のプログラムを応用して「ラ」の音を出してみましょう.
「ラ」の音の周波数は440Hzです. 上記の式を逆向きに使って周波数から波の周期を求めると, 1/440 = 0.002272... ということで約2.272msです.
上記プログラムで用いた delay() 関数 は引数にms単位の整数しか指定できませんから,こんなに細かい数値は使えません. そこで delayMicroseconds() 関数 を使いましょう. 1ms = 1000us ですから,2.272ms = 2272us です.
さて,ここまでのヒントで上記プログラムを改造して,「ラ」の音が出るようにしてみてください.
のべつ幕無しに音を出し続けていたのではうるさくてかなわないので,スイッチをONにしている間だけ音が出るように上記のプログラムを改造してみてください.
例えば下図のような回路を作れば,押しボタンを押したときだけアナログピンの0番に5Vの電圧が入力される(analogRead(0) の値が1000程度の値になる)はずなので,これを使って if 文を作り,analogRead(0) で読み取った値が1000程度(例えば800以上)だったら音を出すようにしてみましょう.
#ref(): File not found: "2009-11-16_2329.png" at page "演習II-7"
電話(117番)やラジオなどで流れる時報は「ラ,ラ,ラ,(1オクターブ上の)ラ」という音階で構成されています. また,周波数が2倍になると1オクターブ上の音になります.