RaspBerryPi Picoから音を出す
マイコンボードは、光を制御したり、モータを動かしたりと様々なことができますが、その中でも特に身近で、何をしていても気づくことができるのが「音」です。アラーム音で時刻を知らせたり、ゲームの効果音を鳴らしたり、あるいは複雑なメロディを奏でたりと、音を使うことでマイコンボードの機能性を大きく広げることが出来ます。ここでは、マイコンボードを使ってどのように音を生成し、出力するかについて紹介します。
圧電スピーカの接続
圧電スピーカは、電圧をかけることで変形する圧電セラミックスに振動板を装着した構造をしています。軽く、少ない消費電力で音を出せることから、マイコン端子に直接接続して使用することができます。音を再生できる周波数域が高域に偏りがあるため、音声や音楽の再生には適しませんが、音域が狭くて済む操作指示やアラーム音の用途には広く使われています。単音のメロディ等なら鳴らすことができます。マイコンボードの上にある丸い黒い部品が圧電スピーカです。
また、マイコンとの接続は以下のようになります。
アラーム音等の音を出力するには、マイコンの出力ピンからパルス幅変調(PWM)機能と呼ばれるやり方で、一定の周波数で電圧レベルがHigh/Lowを繰り返す信号を圧電スピーカに出力します。パルス幅変調については、ベルーフ情報基礎リテラシー研修の中でも紹介しています。
メロディ演奏
ドレミの音程に合わせた周波数の音をPWM機能を使って出力し、かつ発音時間をタイマ等を使用して設定することで、メロディを出力することができます。メロディの音符情報を配列に格納し、1音1音読み出してPWMで出力することで曲を演奏するアプリケーションが作れます。発音時間はdelay()を使って変更すればプログラムは簡単ですが、他のアプリケーションとの共存が難しくなるため、割り込みを使用して発音時間を制御するようにしました。このプログラムでは、演奏をsetup()内でスタートすると、曲の最後まで全て割り込み処理で演奏されます。したがって、loop()内では独立したアプリケーションを実行することができます。サンプルでは、押しボタンスイッチのチェック処理を行い、ボタンが押されたときは演奏を中断して、曲の最初から演奏を開始するようにしました。
1オクターブは、例えばラ音440Hzから880Hz間を平均音律では12分割されており、以下の計算式で各音程の周波数を算出することができます。
周波数 =440Hz(ラ音)×2n/12 (n:音番号)
曲のデータは、音程(音番号)と音長(mS)の2つのデータを格納した2次元配列としました。
アプリケーション全体の動きは以下のようになります。