Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。音を鳴らすには音階のしくみメロディーを奏でる人感センサーでチャイムを鳴らす最後に参考資料スピーカーでチャイムを鳴らすスピーカーは電気信号を音(振動)に変える装置です。2のGPIOピンに接続して音を鳴らしてみましょう。ちなみにスピーカーは振動をあたえると電気信号に変換できるため、一種の振動センサーともいえます。スピーカーとは機器の組み込み用途には、電圧をかけると変形する圧電素子を使った圧電スピーカーがよく使われますが、今回は一般的な、磁石とコイルを使ったダイナミック型の薄型スピーカーを利用しました。ダイナミック型スピーカーは、磁場内において電流が流れる導体に力が発生する、フレミングの左手の法則を利用したものです。2のGNDとGPIOピンに直接つなぐだけで可能です。2とスピーカーの保護のために、抵抗とコンデンサを直列に接続しました。スピーカーは直流に対しての抵抗が小さく、大きな電流が流れる恐れがあります。そのため、100Ω程度の抵抗を直列に接続します。直流電圧はスピーカーを振動させるには不要なため、コンデンサを用いてカットしています。コンデンサとは電荷を蓄えたり放出したりするパーツで、直流を通さずに交流を通すといった性質があります。このような交流電流だけを通過させる目的に使うコンデンサのことをカップリングコンデンサと呼びます。今回は手持ちのパーツの都合で、10μFのコンデンサを利用しました。1~10μF程度のものが適当です。F(ファラッド)はコンデンサ容量の単位で、数字が大きいほど容量が大きくなります。全体の回路図は、次のようになります。音を鳴らすにはスピーカーは、GPIOに接続して電圧をかけるだけでは音は出せません。音を鳴らすにはコイルを振動させないとならないため、コイルに流す電気信号に変化が必要です。そこで前回も用いたPWM出力を利用します。前回はPWM出力がONになる割合のデューティ比を変更して、LEDの明るさを変化させました。今回はPWM信号の時間間隔であるPWM周期を設定して、特定の周波数の音を発生させます。次のサンプルコードはPWM周期を440Hz、デューティ比50%のPWM信号を出力するものです。この出力にスピーカーを接続すると、440Hzの音が発生します。1000);スマートフォンのチューナーアプリで計測すると、ちゃんと440ヘルツの音になっています。音階のしくみメロディーを奏でるためには音の高さと周波数を変える必要があります。どのような周波数に設定すれば、音階となるのでしょうか。ある周波数の音を基準として周波数の比で音階を定めることを音律といいます。今回は1オクターブを12等分する音律(平均律)を使って、周波数を設定します。平均律では先ほどの440Hzの音を音階のA(ラ)の音と定め、他の音の周波数を決定します。standardなどを参考にしてください。メロディーを奏でる音階の周波数がわかったところで、音階を鳴らしてみましょう。次のコードは0.5秒単位でドレミと鳴らすサンプルです。2では整数値でしか周波数を指定できないため、小数点以下を切り捨てた値にしています。time));}このコードのポイントは2つあります。1つは、周波数を変更する処理です。pwmFrequency、pwmDutyCycleメソッドの順にセットで実行する必要があります。2つ目は、Node.jsでの同期処理の書き方です。サンプルでは指定時間後にコールバックされるようなPromiseオブジェクトを返すsleepメソッド(1)を定義しています。Promiseオブジェクトのthenメソッドで次の処理を指定することにより、処理が同期的に実行されるようにしています。人感センサーでチャイムを鳴らすでは最後に、人を検知するとチャイム(メロディー)を鳴らすようにしてみましょう。サンプルコードは次のようになります。サンプルではメロディーのデータ保存用に、buckets-jsモジュールのQueueクラスを使用しています。buckets-jsと実行して、モジュールをインストールしておきます。});}人感センサーの出力状態をsetIntervalで1秒ごとに判定し検知した場合は、演奏中でない(変数play_queueがnull)なら、メロディーデータを設定して演奏を開始してます(1)。キューのモジュールを使うと、onメソッドがうまく動作しなかったため、このような形にしています。メロディーデータは、周波数と1音の長さを1組として、キューに保存しています(2)。playメソッドではキューからデータを取り出し、1音の周波数、長さをPWMピンに設定しています(3)。このメソッドのポイントは、再帰呼び出しです。Promiseオブジェクトのthenメソッドでplayメソッド自身を指定することにより、キューのデータを同期的に処理するようにしています。キューが空になった時点で、再帰呼び出しを終了します。サンプルを実行すると次の動画のようになります。最後に今回利用した赤外線センサーモジュールは、まさにスイッチ代わりなので、チャイムを鳴らすだけでなく、いろいろなものに使えそうです。USBカメラを接続して、人を感知したときだけ画像を撮影するようにすれば、防犯カメラにもなるでしょう。2に標準モジュールだけでなく、さまざまなセンサーを接続すれば、IoTデバイスとしての活用範囲が大きく広がるのではないでしょうか。2接続図は、fritzing、回路図は、BSch3Vを利用しています。