GPIOをPWM制御してパッシブブザーで音楽を鳴らしてみる
これまでのところでpigpioとPythonを使ってGPIOからPWM制御の周波数を変えて、2種類の音でパッシブブザーを鳴らしてみた。今回はもう少し発展させて、ボタンを押したら音楽が流れる電子オルゴールをつくってみる。部品はいつもと同様に以下のキットのものを使った。
ちなみに今回鳴らしてみる曲は、私が楽譜をみなくても音階がわかる唯一の曲である「子犬のマーチ」。以下が実際の今回つくった回路&コードで子犬のマーチを鳴らしてみた様子。
ラズパイでパッシブブザーをPWM制御して電子オルゴールつくってみた #RaspberryPi #電子工作 pic.twitter.com/pXdVqDTW1A
— Wakky (@wakky_free) May 21, 2022
実行環境
Raspberry Pi 4 Model B
Raspberry Pi OS (Bullseye)
pigpio 1.79-1+rpt1
Python 3.9.2
ブレッドボードに回路をつくる
パッシブブザーの回路図は前回のブログと同じ。ボタン(タクトスイッチ)はRaspberry PiのSoCで内部プルアップするのでGPIOに直結している。
ブレッドボードの接続は前回と同じ。
実際に接続したのが以下の写真。
パッシブブザーに入力する周波数と音階の関係
パッシブブザーで曲を演奏するには、当然ながら出したい音階で音を出してやる必要がある。ラズパイでこれをやるには、ブザーに与える電圧をPWM制御して周波数を変えてやることで、音階を変えてブザーを鳴らすことができる。
音階と周波数の関係は以下のWebサイトを参考にさせて頂いた。
Pythonのコードを書く
今回は以下のようなコードを書いた。ボタンを押してブザーを鳴らす処理はすでにこれまでのブログで書いているので割愛。今回、ドレミファソラシドの音階は英語表記でCDEFGABCで書いている。最初に各音階での周波数を定義し、PWMの周波数を変えることで音階を変えている。
また、今回の曲を鳴らすにあたって長い音と短い音(こういうのなんて呼ぶか音楽の授業で習った気がするけど忘れた…笑)が必要なので、
- buzzer:長い音を鳴らす関数
- buzzer_short:短い音を鳴らす関数
の2種類を使って音楽を鳴らしている。
#!/usr/bin/env python3 import pigpio import time c_freq = 262 #Hz d_freq = 294 e_freq = 330 f_freq = 349 g_freq = 392 pwm_duty = 10 #percent buzzer_gpio = 19 button_gpio = 27 gpio = pigpio.pi() gpio.set_mode(button_gpio, pigpio.INPUT) gpio.set_pull_up_down(button_gpio, pigpio.PUD_UP) def buzzer(freq, t): gpio.hardware_PWM(buzzer_gpio, freq, pwm_duty * 10000) time.sleep(t) def buzzer_short(freq, t): gpio.hardware_PWM(buzzer_gpio, freq, pwm_duty * 10000) time.sleep(0.1) gpio.hardware_PWM(buzzer_gpio, 0, 0) time.sleep(t - 0.1) while True: if gpio.read(button_gpio) == 0: # Bee March buzzer(e_freq, 0.5) buzzer(c_freq, 0.5) buzzer(e_freq, 0.5) buzzer(c_freq, 0.5) buzzer(e_freq, 0.5) buzzer_short(g_freq, 0.5) buzzer(g_freq, 1) buzzer(f_freq, 0.5) buzzer_short(d_freq, 0.5) buzzer(d_freq, 1) buzzer(e_freq, 0.5) buzzer_short(c_freq, 0.5) buzzer(c_freq, 1) buzzer(e_freq, 0.5) buzzer(c_freq, 0.5) buzzer(e_freq, 0.5) buzzer(c_freq, 0.5) buzzer(e_freq, 0.5) buzzer_short(g_freq, 0.5) buzzer(g_freq, 1) buzzer(f_freq, 0.5) buzzer_short(d_freq, 0.5) buzzer_short(d_freq, 0.5) buzzer_short(d_freq, 0.5) buzzer(c_freq, 0.5) buzzer(e_freq, 0.5) buzzer(c_freq, 0.5) else: gpio.hardware_PWM(buzzer_gpio, 0, 0)
あとはいつものお約束でPythonのコードを実行。ファイル名はbuzzer_pwm_orgel.pyとした。
sudo pigpiod sudo python buzzer_pwm_orgel.py
これで記事の最初の動画のように、ボタンを押すことで電子オルゴールを鳴らすことができた。
ブザーで遊ぶのは満足したので、次回からは違う部品で遊んでみたいと思う。
日記まとめ
ラズパイで遊んでみた軌跡を以下でまとめてます。