今回は音の仕組みと圧電スピーカーの仕組みを理解して、Arduinoで音を鳴らしてみます。
音の仕組み
いよいよキッチンタイマーらしく、時間になったらアラーム音を鳴らすようにプログラミングしていきます。
といきたいところですが、その前に音の仕組みと圧電スピーカーの仕組みを理解してからプログラミングすることにします。
「音」の仕組みや性質は小学校で習ったと思いますが、簡単に復習しておきましょう。
「音」の正体は空気の振動でしたよね。何かが振動すると、その振動が空気を伝わって耳まで届いて音を感じます。
空気を振動させて音を発生させるものはたくさんありますが、その中でもスピーカーはよく見かけます。スピーカーは製品の中に入っていてスピーカーそのものを見る機会はなかなかないかもしれません。スピーカー本体はこのようになっています。
スピーカーの黒い部分は紙などでできていて、電気信号を加えると紙が振動して音が発生します。
スピーカーから出る音の高さ(音程)は、紙の部分が1秒間に何回振動するかで決まります。例えば紙の部分が1秒間に262回振動するとドレミの「ド」の音に聴こえます。また、振動する回数が多くなると高い音が、回数が少なくなると低い音が出ます。
上の画像のようなスピーカーは紙の部分が振動して音が発生しますが、今回使用する圧電スピーカーはどのようになっているのか、その仕組みを確認しておきましょう。
圧電スピーカーの仕組み
圧電スピーカーは、以下のように「圧電セラミック」という物質と金属を貼り合わせた部品です。
「セラミック」という言葉が出てきますが、この「セラミック」を使った製品は多く見かけますよね。例えばセラミック包丁とか、身近な製品でも使われています。「圧電セラミック」は「セラミック」に高電圧をかけて電気的な処理をした物質で、不思議な性質があります。
この「圧電セラミック」に電圧をかけると、電圧をかける向きによって伸びたり縮んだりするんです。先ほどのように圧電セラミックと金属を貼り合わせたものに電圧をかけると、圧電セラミックが伸びて以下のように曲がります。
電池の向きを逆にすると、圧電セラミックが縮んで以下のように曲がります。
圧電スピーカーは加える電圧によってこのように変形します。このように変形することにより空気を振動させて音が発生する、という仕組みです。例えば1秒間に262回振動するように圧電スピーカーに加える電圧を制御すると、「ド」の音が出るわけです。
圧電スピーカーは普通のスピーカーとして使えるのか?
圧電スピーカーは、電気信号を空気の振動に変換する部品で、普通のスピーカーとやっていることは同じです。ということは、圧電スピーカーは普通のスピーカーとして使えるのでしょうか。手元にMP3プレーヤーがあったので実験してみました。
以下は、MP3プレーヤーに今回使用する圧電スピーカーを接続した回路です。
MP3プレーヤーに効果音や普通の音楽を入れて再生してみると、、、普通のスピーカーのように音楽が聞こえます。ただ、普通のスピーカーにくらべて音量は小さく、音質もあまりよくないです。手元にスピーカーがないけど、音を確認したい場合などには使えそうです。
圧電スピーカーの概要はわかったところで、前回製作したスピーカーを接続した回路でスケッチを作成して音を鳴らしてみましょう。
Arduinoで音を鳴らす仕組み
それでは、Arduinoでスケッチを作成して「ド」の音を鳴らしてみましょう。
前回の記事で、圧電スピーカーを18番端子に接続しました。先ほどの圧電スピーカーの仕組みを説明した時の図を使用すると以下のように接続されています。
18番端子のスイッチをOFF、つまり「digitalWrite(18, LOW);」にしている状態では、圧電スピーカーは普通の状態です。
この18番端子のスイッチをONにすると、つまり「digitalWrite(18, HIGH);」にすると、圧電スピーカーは以下のように反応します。
これを繰り返せば圧電スピーカーが振動して音が発生するわけです。
それでは「ド」の音を出すにはどうすればよいか一緒に考えていきましょう!
Arduinoで「ド」の音を鳴らす
「ド」の音は、圧電スピーカーを1秒間に262回振動させればよいわけです。つまり以下のようにArduinoの18番端子のスイッチをON/OFF制御すれば「ド」の音を出すことができます。
端子のスイッチを制御するにはdigitalWrite命令を使えば実現できますよね。あとは圧電スピーカーが1秒間に262回振動するように時間待ちをすればOKです。時間待ちの命令としてdelay命令を習得しましたので、以下のように制御すれば実現できそうです。
それでは、時間待ちのdelayのパラメータをいくつにすればよいか計算してみましょう。まずは以下の部分を計算してみます。
delay命令のパラメータはミリ秒です。また、1秒は1000ミリ秒です。上のパターンを1秒間、つまり1000msの間に262回繰り返せばいいわけですから、上の繰り返しパターンの時間は、
1000 ÷ 262 = 3.81679…
と計算すると、約3.817ミリ秒になります。
ここでちょっと問題が発生しました。というのは、delay命令のパラメータは整数なんです。整数ということで四捨五入して4ミリ秒の指定「delay(4);」としてしまった場合、これは「ド」の音程にならなくなってしまいます。以下のように4ミリ秒にした場合を考えてみます。
このパターンは1秒間に何回繰り返されるかというと、1回の振動が4ミリ秒ですので1000ミリ秒では、
1000 ÷ 4 = 250
ということで、1秒間に250回の振動になります。振動が1秒間に250回の場合、「ド」の半音下ぐらいの音程になってしまいます。ということで、音階を再現するにはミリ秒の指定では精度が足りません。
そこで、Arduinoではdelay命令よりさらに細かい待ち時間の指定ができる命令が用意されていますので、その命令を使います。
delay命令ではパラメータはミリ秒ですが、delayMicroseconds命令では1ミリ秒のさらに1000分の1のマイクロ秒で指定ができます。
マイクロ秒って普段あんまり耳にしませんよね。1秒 = 1,000ms(ミリ秒) = 1,000,000μs(マイクロ秒)です。
先ほどの図の1つの振動の時間をマイクロ秒にすると、1秒間、つまり1,000,000マイクロ秒で262回パターンを繰り返すわけですから、以下のように計算できます。
1000000 ÷ 262 = 3816.79…
計算すると、約3817μs(マイクロ秒)になります。
ということで、マイクロ秒で以下のようにすれば圧電スピーカーは262回振動するはずです。
この制御を実際のArduinoの命令で考えると以下のようになります。
あとは4つの命令を繰り返すスケッチを作ればいいのですが、スピーカーがずっと鳴っているとうるさいので、3秒間「ド」の音を鳴らすようにスケッチを作成してみましょう。
3秒間「ド」の音を鳴らすには、上の図の1回の振動を何回繰り返せばよいかわかりますか???
「ド」の音は1秒間に262回振動するので3秒間では
262 x 3 = 786
ということで、786回繰り返せばOKです。
これで「ド」の音を圧電スピーカーで鳴らすための知識が一通り習得できましたのでスケッチにまとめてみましょう。特にスケッチの細かい説明はしませんので、じっくり読み解いてみてください。
/*
* 圧電スピーカーのテスト
*
* 内容: 「ド」の音を鳴らす
* 変更履歴:
* 2019.10. 3: 新規作成
*/
// 圧電スピーカーの接続端子番号
#define PIN_SPEAKER 18
void setup() {
// 圧電スピーカー接続端子の設定
pinMode(PIN_SPEAKER, OUTPUT);
}
void loop() {
// 「ド」の音を3秒間鳴らす
for(uint16_t count=0; count<786; count++){
digitalWrite(PIN_SPEAKER, HIGH);
delayMicroseconds(1908);
digitalWrite(PIN_SPEAKER, LOW);
delayMicroseconds(1909);
}
// 何もしないで待つ
while(true) {
}
}
ミニチャレンジ課題
電子工作のプログラミングではいろいろな計算をすることが多いです。LEDを特定のパターンで光らせたり、一定時間ごとにセンサの値を読み取ったりするのに時間で制御します。また扱う時間も秒からマイクロ秒まで幅広い範囲を扱います。
そこで、時間の扱いに慣れるためにミニチャレンジをしてみましょう。
先ほどのスケッチは「ド」の音を3秒間鳴らす内容でしたが、このスケッチを改良して以下のスケッチを作成してください。
- 「ド」を3秒間鳴らす
- 0.5秒待つ
- 「ソ」を3秒間鳴らす
- 0.5秒待つ
- 1オクターブ高い「ド」を3秒間鳴らす
- 動作停止
それぞれの音程で圧電スピーカーを1秒間に何回振動させればよいか、以下にまとめます。
音程 | 振動数 |
---|---|
ド | 262 |
ソ | 392 |
1オクターブ高いド | 523 |
こんなプログラミング、やってられませんよね?
今回は時間の計算に慣れていただくために、ずいぶんと面倒なスケッチを作成しました。
これから、キッチンタイマーのスケッチにアラーム音を追加しますが、こんなプログラミングは正直やってられませんよね。ただ「ド」の音を出したいのに面倒な計算をしてスケッチを書くというのはやってられません。
「最初から言ってよ」と言われそうですが、Arduinoでは特定の音程を出すための便利な命令があります。そこで、次回のアラーム音追加では、その命名を習得してからアラーム音を追加します。
更新履歴
日付 | 内容 |
---|---|
2019.10.3 | 新規投稿 |
2021.8.26 | 新サイトデザイン対応 |
こんにちは。最近Arduinoはじめたばかりで勉強させて頂いております。
電子工作&プログラム中々楽しいですw
えーと コピペ検証で22行でエラー出ました < にしたら受付てくれましたので
ご報告までかお
コメントどうもありがとうございます。
ご指摘どうもありがとうございました!
修正しようとしたのですが、なぜかうまく修正できませんでした…
ちょっと見た目が変ですが、これで正しく表示されていると思います。
このサイトはWordpressで作成しているのですが、ソースコードがシステムに勝手に書き換えられることもあるので、他のページでも同じような現象が出ているかもしれません。気付いたら修正いたします。
重ねて、ご指摘どうもありがとうございました!