こんにちは、「メカのりまき」です。
この記事では、音についての基礎知識を説明した後、Arduinoでアクティブブザーとパッシブブザーの音を鳴らす方法について説明したいと思います。
この記事は、ArduinoでLEDの点灯を制御する方法を理解していると、より内容が理解しやすくなります。
以下のリンク先の記事で、LEDの点灯について説明していますので、LEDの点灯の仕方が分からないという方は、先に以下のリンク先の記事をご覧になることをお勧めします。
また、この記事は「Arduino IDE」の基本的な使い方を、理解していることを前提とした記事となっています。
「Arduino IDE」の使い方は以下のリンク先の記事で説明していますので、「Arduino IDE」の使い方が分からない方は、以下のリンク先の記事を是非ご覧になってください。
目次
本記事で使用するもの
本記事で私が使用した物は以下の通りです。
- 「Arduino IDE2.0.3」をインストールしたPC(Windows11)
- USBケーブル
- Arduino Uno R3(ELEGOO UNO R3でも可)
- ブレッドボード
- アクティブブザー
- パッシブブザー
- ジャンパーワイヤー
「Arduino Uno R3」の互換ボードであれば、「ELEGOO UNO R3」以外のボードでも、本記事と同様な手順で動作可能だと思われますが、動作検証はしていないので、その点はご了承ください。
以下のリンクのスターターキットを購入した場合、上記で述べた使用するものは、PC以外すべて入手することができます。
Arduinoをまだ購入していないという方やArduinoで動かすことができるたくさんのパーツが欲しいという方は、購入を検討してみてください。
音と振動
物を叩いたり、輪ゴムを指で弾いたりすると、音が鳴るのが確認できます。
これは、叩いた物の振動や輪ゴムの振動が、空気を伝わり、人間の耳の鼓膜を振動させ、その振動の情報が脳に伝わることによって、音として認識されているからです。
つまり、音と物の振動というのは、密接な関係にあるということになります。
振動は物体が、ある基準位置を中心にして、時間とともに上下や左右に位置の変化を繰り返す現象であり、よく以下のようなグラフを使って、時間と位置の関係を表されます。
振動と音の大きさ
以下の図のように、振動の振れ幅の半分のことを振幅と呼びます。
この振幅は音の大きさと関係していて、振幅が大きいほど、大きな音になります。
振動と音の高さ
以下の図のように、1秒間に発生する繰り返しの数を、振動数と呼び、単位を「ヘルツ[Hz]」で表します。
この振動数は音の高さと関係していて、振動数が大きいほど、高い音になります。
ブザーについて
ブザーが音を鳴らす仕組みは、電磁石を利用し、振動板を振動させて音を出すもの(電磁ブザーと呼ばれているもの)や、電圧で伸縮する板(圧電振動板)にかかる電圧を制御することにより振動させて音を出すもの(圧電ブザーなどと呼ばれているもの)などがあります。
音を鳴らす仕組みの違いによって、それぞれにメリット、デメリットがあるのですが、とりあえず、音を鳴らしたいだけならば、それらの違いについて気にする必要はありません。
それよりも、音を制御する上で、注意しなくてはならないのは、そのブザーがアクティブブザー(発振回路を内蔵しているブザー)であるか、パッシブブザー(発振回路を内蔵していないブザー)であるかです。
以下で、アクティブブザーとパッシブブザーの説明をしたいと思います。
アクティブブザーの説明
アクティブブザーは、発振回路を内蔵しており、特定の電圧を加えているだけで、中に入っている板が固有の振動数で振動して音を鳴らすことができるブザーで、下のような見た目をしています。
上記で紹介したスターターキットのアクティブブザーにはシールが貼ってありました。
アクティブブザーとパッシブブザーの記号は同じものであり、以下のような記号になります。
アクティブブザーは、電圧を加えている状態のとき、音が鳴り続け、電圧を加えていない状態のとき、音が鳴らないという、とてもシンプルで扱いやすいブザーです。
しかし、発振回路を内蔵しているため、その分パッシブブザーよりも高価であったり、中に入っている板は、決められた振動数で振動するため、音の高さを制御するにはあまり向いていなかったりするなどのデメリットがあります。
アクティブブザーで音を鳴らす
5[V]で動作可能な(動作電圧の範囲に5Vが含まれている)アクティブブザーを鳴らすのは簡単で、以下のような回路を作成し電源を入れれば音が鳴り続けます。
ブザーによっては、結構大きな音が鳴りますので注意してください。
ブザーの種類によっては、LEDのように、電圧のプラス部分とマイナス部分を、ブザーに合わせて接続する必要があるので注意してください。
ブレッドボードを使った回路は以下のようになります。
ここで、動作電圧の範囲に5[V]が含まれていないブザーの場合は、Arduinoだけで音を制御することはできません。
よって、今からブザーを購入して、Arduinoで制御したいという方は、動作電圧が5[V]のブザーを購入することをお勧めします。
動作電圧の範囲に5[V]が含まれていないブザーの鳴らし方は、後日別の記事で説明したいと思います。
アクティブブザーの音を制御する
上記では、5Vピンを使用して、アクティブブザーの音が鳴ることを、確認していただきました。
今度は、5Vピンに差さっている部分を2番ピンに差し替えて、アクティブブザーを制御する方法を説明したいと思います。
空のスケッチを書き込む
回路を作成する前に、空のスケッチ(「ファイル」タブの「New Sketch」をクリックしたときに出てくる何の処理も書かれていないスケッチ)を書き込みます。
そうすることにより、前に書き込んだスケッチが、新しく作成しようとしている回路に影響を及ぼすことを防げます。
新しい回路を作成するときは、いつもこの作業をやっておくと、安全に回路を作成することができます。
もし、Arduinoボードの接続の仕方やスケッチの書き込み方が分からくなった場合は、以下のリンク先の記事で説明しているので、やり方を確認してみてください。
回路を作成する
先程の回路の5Vピンに差さっている部分を2番ピンに差し替えて以下のような回路を作成してください。
スケッチを書き込む
回路が作成できましたら、音を鳴らすために、以下のようなスケッチを書き込んでください。
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { //2番ピンを出力ピンとして設定する pinMode(2,OUTPUT); } void loop() { //一定の間隔で音を鳴らす digitalWrite(2,HIGH); delay(200); digitalWrite(2,LOW); delay(200); } |
回路の作成とスケッチの書き込みが正しく出来ていれば、以下の動画のように、音が一定の間隔で鳴っているのが確認できます。
スケッチの解説
今回のスケッチで、やっていることは、LEDを点滅させている時と同じで、ブザーに電圧を加えたり、加えなかったりを「digitalWrite()」で制御することにより、音を一定の間隔で鳴らしています。
スケッチを図でまとめると以下のようになります。
この時、ブザーにかかる電圧は以下のように変化しています。
よって、上記のように、0.2秒間間隔で、ブザーにかかる電圧が変化しているため、音が一定の間隔で鳴るという仕組みになっています。
パッシブブザーの説明
パッシブブザーは発振回路を内蔵していないので、電圧を加えただけでは、音を鳴らすことができません。
その代わりに、パッシブブザーは、電圧を加える、加えないという動作を繰り返し続けることによって、振動を制御し音を鳴らすことができます。
見た目は以下の写真のようなもので、アクティブブザーと同じような見た目をしています。
記号については、アクティブブザーと同じものを使用します。
パッシブブザーで音を鳴らす
パッシブブザーはアクティブブザーと比べて、扱うのに知識が必要になります。
よって、まずはパッシブブザーが音を鳴らす原理について、説明をしたいと思います。
パッシブブザーの原理
パッシブブザーは電圧を加えても、音が鳴らないと説明しましたが、実は一瞬だけ音が鳴っています。
なぜかというと、電圧を加えることで、音を鳴らすための板が動くからです。
しかし、動いたのは一瞬だけで、振動はほとんどしません。
ここで、電圧を加えない状態に戻すと、音を鳴らすための板が元の位置に戻ります。
しかし、これも動いたのは一瞬だけで、振動はほとんどしません。
ですが、この電圧を加える、加えないという動作を繰り返し続けた場合はどうでしょうか。
音を鳴らすための板は、一定の間隔で動き続けます。
つまり、電圧を加える、加えないという動作のタイミングに合わせて、音を鳴らすための板が振動していることになります。
では、ここで一度、電圧を加える、加えないという動作を制御して、パッシブブザーを鳴らしていただきたいと思います。
回路を作成する
回路については、アクティブブザーを制御したときと同じで、以下の画像のような、回路をブレッドボードで作成します。
スケッチを書き込む
回路が作成できましたら、以下のようなスケッチを書き込んでください。
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { //2番ピンを出力ピンとして設定する pinMode(2,OUTPUT); } void loop() { //一定の振動数でブザーを振動させ音を鳴らし続ける digitalWrite(2,HIGH); delayMicroseconds(1500); digitalWrite(2,LOW); delayMicroseconds(1500); } |
回路とスケッチが正しければ、アクティブブザーを5Vピンで鳴らしたときのように、一定の高さの音で鳴り続けるのが確認できます。
スケッチの解説
上記のスケッチは、アクティブブザーの音を制御したときのスケッチとほとんど同じですが、「delay()」の部分が「delayMicroseconds()」に変更されています。
「delayMicroseconds()」を使うと、「delay()」よりもさらに、短い時間を指定して待機させることができます。
「delayMicroseconds()」の値の単位は「マイクロ秒[μs]」となっていて、( )の中身が「1」だと0.000001秒、「1000」だと0.001秒待機します。
上記のスケッチはアクティブブザーの制御を行ったときの、待機時間をかなり短くし、電圧を加える、加えないという動作を高速で行うようにしたものです。
これにより、パッシブブザーの中にある板は、0.003秒に1往復するような、振動をします。
ここで、振動数と音の高さについて、思い出してみてください。
振動数が大きい程、音の高さは高くなるという説明をしたと思います。
つまり、上記のスケッチの「delayMicroseconds()」の値を、小さいものにして、「HIGH」と「LOW」の切り替えを速くすれば、振動数が大きくなるので、より高い音が鳴り、「delayMicroseconds()」の値を大きいものにして、「HIGH」と「LOW」の切り替えを遅くすれば、振動数が小さくなるので、より低い音が鳴るということになります。
試しに、スケッチの「delayMicroseconds()」の値を書き換えて、音の違いを確かめてみてください。
パッシブブザーで音を制御する
上記のように、「delayMicroseconds()」を調節することで、感覚的に音の高さを調整しても良いのですが、音には音階というものがあります。
そして、音階によって、振動数は決まっています。
ピアノの音階と振動数の関係はおおよそ(小数点以下を四捨五入した場合)、以下のようになっています。
音階名 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
ド | 33 | 65 | 131 | 262 | 523 | 1047 | 2093 |
ド# | 35 | 69 | 139 | 277 | 554 | 1109 | 2217 |
レ | 37 | 73 | 147 | 294 | 587 | 1175 | 2349 |
レ# | 39 | 78 | 156 | 311 | 622 | 1245 | 2489 |
ミ | 41 | 82 | 165 | 330 | 659 | 1319 | 2637 |
ファ | 44 | 87 | 175 | 349 | 698 | 1397 | 2794 |
ファ# | 46 | 93 | 185 | 370 | 740 | 1480 | 2960 |
ソ | 49 | 98 | 196 | 392 | 784 | 1568 | 3136 |
ソ# | 52 | 104 | 208 | 415 | 831 | 1661 | 3322 |
ラ | 55 | 110 | 220 | 440 | 880 | 1760 | 3520 |
ラ# | 58 | 117 | 233 | 466 | 932 | 1865 | 3729 |
シ | 62 | 123 | 247 | 494 | 988 | 1976 | 3951 |
つまり、指定した振動数になるように、「HIGH」と「LOW」を切り替える出力を出せば、ピアノの楽譜に書かれている曲を演奏することが可能ということになります。
指定した振動数になるように、「delayMicroseconds()」の値を計算して、スケッチを書いても良いのですが、Arduinoでは「tone関数」というものを使うことで、簡単に、指定した振動数になるように「HIGH」と「LOW」を切り替える出力を出すことができます。
tone関数
「tone関数」は以下のような文を書くだけで、指定したピンの出力の「HIGH」と「LOW」を、指定した振動数になるように、切り替え続けることが出来ます。
1 |
tone(2,262); |
上記の文では、2番ピンの出力を、262[Hz](つまりド4の音)になるように、「HIGH」と「LOW」を切り替え続けています。
上記の文による出力を止めるためには、以下のような文を書きます。
1 |
noTone(2); |
上記の文では、「tone関数」による2番ピンの出力を止め「LOW」の状態にします。
また、以下のような文を書くことにより、出力の長さ、つまり音の長さを指定することが出来ます。
1 |
tone(2,262,3000); |
上記の2番ピンの出力を、262[Hz](つまりド4の音)になるように、「HIGH」と「LOW」を3秒間切り替え続けて、その後出力を「LOW」にしています。
ただし、実行中は処理が止まるわけではなく、出力し続けた状態で、別の処理(この処理より下に書いた処理)が行われるので、もし音が鳴っている間、別の処理を行いたくない場合は、以下のように、「delay()」と組みあわせて使用してください。
1 2 |
tone(2,262,3000); delay(3000); |
「tone関数」の使い方は、以上となりますが、「tone関数」を使う上でいくつか注意しなければならないことがあるので、説明したいと思います。
tone関数の注意点
tone関数は同時に実行することが出来ない
「tone関数」は同時に2つ以上使用することが出来ません。
もし、同時に別のピンで「tone関数」を使おうとすると、最初に指定したピンの「tone関数」が優先され、後から指定したピンは出力されないようになっています。
したがって、「tone関数」によって、複数のブザーの音を同時に制御するということはできないので、注意してください。
3番ピンと11番ピンのPWMが使用できなくなる
「Arduino Uno R3」の場合、「tone関数」を使用している間は、3番ピンと11番ピンのPWMを使用することができません。
どうしても、「tone関数」と、3番ピンと11番ピンのPWMを両方使いたい場合は、使用する時間をずらすなどの工夫をする必要があります。
したがって、「tone関数」を使用したい場合は、可能な限り3番ピンと11番ピンのPWMを使わないようにすることをお勧めします。
どのピンのPWMが使えなくなるかは、Arduinoボードに使われている、マイコンチップの種類によって変わります。
例えば、「Arduino Nano」の場合は、「Arduino Uno R3」と同じ「ATmega328P」というマイコンチップが使われているため、3番ピンと11番ピンのPWMが使用できなくなりますが、「Arduino Mega 2560 R3」の場合は、「ATmega2560」というマイコンチップが使われているため、9番と10番ピンのPWMが使用できなくなります。
スケッチを書き込む
上記で、説明した「tone関数」を使用して、「メリーさんの羊」を演奏するスケッチを作成しましたので、書き込んで、確認してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
void setup() { //2番ピンを出力ピンとして設定する pinMode(2,OUTPUT); } void loop() { //メリーさんの羊を演奏する tone(2,330,750); delay(750); tone(2,294,250); delay(250); tone(2,262,500); delay(500); tone(2,294,500); delay(500); tone(2,330,500); delay(500); tone(2,330,500); delay(500); tone(2,330,500); delay(1000); tone(2,294,500); delay(500); tone(2,294,500); delay(500); tone(2,294,500); delay(1000); tone(2,330,500); delay(500); tone(2,392,500); delay(500); tone(2,392,500); delay(1000); tone(2,330,750); delay(750); tone(2,294,250); delay(250); tone(2,262,500); delay(500); tone(2,294,500); delay(500); tone(2,330,500); delay(500); tone(2,330,500); delay(500); tone(2,330,500); delay(1000); tone(2,294,500); delay(500); tone(2,294,500); delay(500); tone(2,330,750); delay(750); tone(2,294,250); delay(250); tone(2,262,1000); delay(2000); } |
スケッチが正しければ、以下の動画のように、「メリーさんの羊」が演奏されます。
スケッチの解説
上記のスケッチでは以下の図のようなことを行っています。
基本的には上記で説明した「tone関数」を使い、決められた振動数になるように、出力させているだけですが、「delay()」を間に入れないと、「tone関数」が出力し始めてすぐに別の「tone関数」が実行され、出力の情報が上書きされていってしまうので、注意してください。
また、アクティブブザーは音の高さを制御するにはあまり向いていないと説明しましたが、実は音の高さを変えるのが不可能というわけではなく、上記のスケッチでメリーさんの羊を演奏することができます。
ただし、一定の電圧を加えたときの振動と、「tone関数」による振動が混じりあうため、少しノイズがかかったような音になります。(中にはアクティブブザーの音の方が好きという方がいらっしゃるかもしれません)
Arduinoでアクティブブザーとパッシブブザーの音を鳴らす方法について説明は以上となります。
余裕のある方は、是非、今回の記事を参考に、自分の好きなメロディを鳴らしてみてください。
次回の記事では、超音波距離センサの使い方について、説明したいと思います。
本記事はここまでです。ご清覧ありがとうございました。
広告
楽天モーションウィジェットとGoogleアドセンス広告です。
気になる商品がございましたら、チェックをしてみてください。