はじめに
Nerves Livebook で Raspberry Pi 用スターター電子工作キットを楽しんでいます
SunFounder Raspberry Pi 用のスターター電子工作キット
これまでの記事
- Nerves Livebook で Raspberry Pi 4 のLチカ
- Nerves Livebook + Delux で簡単Lチカ
- MacBook 上の Livebook から Raspberry Pi 上の Livebook に接続してLチカする
- Nerves Livebook から GPIO 拡張ボードの LED を点滅させる
- Nerves Livebook から RGB LED を制御する(ソフトPWMもやってみる)
- Nerves Livebook から LED 棒グラフを制御する
- Nerves Livebook でボタンとLEDを連動させる
- Nerves Livebook で 7 セグメントディスプレイに文字を表示する
- Nerves Livebook で 4 桁 7 セグメントディスプレイに文字を表示する
- Nerves Livebook で LED ドットマトリックスにアニメーションを表示する
- Nerves Livebook でアクティブブザーを鳴らす
この記事ではアクティブブザーを鳴らします
また、必要なモジュールを追加するため、 Nerves Livebook をカスタマイズします
実装したノートブックはこちら
パッシブブザー
与えられた電気の周波数によって音程が変化します
回路の組み立て
オンライン説明書の通りに回路を組みます
Nerves Livebook のカスタマイズ
Raspberry Pi 4 を使っている場合、音階 = 周波数を操作する必要があるため、 PWM を実行する必要があります
以下の記事に従って、 PWM を実行するための Pigpiox を Nerves Livebook に追加してください
Raspberry Pi 0 〜 3 の場合は改造する必要がありません
ノートブックの実装
Nerves Livebook を開き、以降のコードを実行していきます
使用するピン
Raspberry Pi 4 では GPIO12 と GPIO13 が PWM に対応しているようです
今回は GPIO12 を使います
ブザーを鳴らす
まずは特定の周波数(音階)で音を鳴らしてみます
Pigpiox.Pwm.hardware_pwm
の引数は以下の通りです
- ピンの番号
- 周波数
- デューティー比(0 〜 1,000,000)
デューティー比を 1000_000
にしたときが 100% 出力で、 500_000
を指定すれば 50% 出力になります
デューティー比によって音量が調節できます
gpio = 12
# 50%
Pigpiox.Pwm.hardware_pwm(gpio, 440, 500_000)
デューティー比を 0
にしたときが 0% 出力なので、音が止まります
# 0%
Pigpiox.Pwm.hardware_pwm(gpio, 440, 0)
音階を鳴らす
3 オクターブ分のドレミファソラシに対応した周波数を用意します
codes = [
131,
147,
165,
175,
196,
211,
248,
262,
294,
330,
350,
393,
441,
495,
525,
589,
661,
700,
786,
882,
990
]
scales
に何番目の音階を鳴らすかを指定します
scales = [7, 8, 9, 10, 11, 12, 13, 14]
beats
に各音の長さ(八分音符何個分伸ばすか)を指定します
beats = [1, 1, 1, 1, 1, 1, 1, 1]
以下のコードを実行すると、ドレミファソラシドが演奏できます
scales
|> Enum.zip(beats)
|> Enum.map(fn {code_index, beat} ->
code = Enum.at(codes, code_index)
Pigpiox.Pwm.hardware_pwm(gpio, code, 500_000)
Process.sleep(beat * 500)
end)
Pigpiox.Pwm.hardware_pwm(gpio, 440, 0)
ドレミの歌を演奏する
演奏を関数化し、任意の音階、リズムで演奏できるようにします
play = fn gpio, scales, beats ->
scales
|> Enum.zip(beats)
|> Enum.map(fn {code_index, beat} ->
code = Enum.at(codes, code_index)
Pigpiox.Pwm.hardware_pwm(gpio, code, 500_000)
Process.sleep(beat * 250)
end)
Pigpiox.Pwm.hardware_pwm(gpio, 440, 0)
end
以下のコードを実行すると、ドレミの歌の冒頭部分が演奏されます
scales = [7, 8, 9, 7, 9, 7, 9, 8, 9, 10, 10, 9, 8, 10]
beats = [2, 1, 2, 1, 2, 2, 4, 2, 1, 1, 1, 1, 1, 8]
play.(gpio, scales, beats)
まとめ
パッシブブザーを使うことで、メロディーを奏でることができました
また、 Nerves Livebook をカスタマイズすることもできたため、これから色々応用できそうです