【電子工作】パッシブブザーをPWM制御して電子オルゴールをつくってみる(Raspberry Pi 4で遊ぼう日記 その17)

投稿日:2022年6月7日
最終更新日:2022年6月7日

GPIOをPWM制御してパッシブブザーで音楽を鳴らしてみる

これまでのところでpigpioとPythonを使ってGPIOからPWM制御の周波数を変えて、2種類の音でパッシブブザーを鳴らしてみた。今回はもう少し発展させて、ボタンを押したら音楽が流れる電子オルゴールをつくってみる。部品はいつもと同様に以下のキットのものを使った。

ちなみに今回鳴らしてみる曲は、私が楽譜をみなくても音階がわかる唯一の曲である「子犬のマーチ」。以下が実際の今回つくった回路&コードで子犬のマーチを鳴らしてみた様子。

 

実行環境

Raspberry Pi 4 Model B

Raspberry Pi OS (Bullseye)

pigpio 1.79-1+rpt1

Python 3.9.2

 

ブレッドボードに回路をつくる

パッシブブザーの回路図は前回のブログと同じ。ボタン(タクトスイッチ)はRaspberry PiのSoCで内部プルアップするのでGPIOに直結している。

ブレッドボードの接続は前回と同じ。

実際に接続したのが以下の写真。

 

パッシブブザーに入力する周波数と音階の関係

パッシブブザーで曲を演奏するには、当然ながら出したい音階で音を出してやる必要がある。ラズパイでこれをやるには、ブザーに与える電圧をPWM制御して周波数を変えてやることで、音階を変えてブザーを鳴らすことができる。

音階と周波数の関係は以下のWebサイトを参考にさせて頂いた。

Micom Car Rally NET

 

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

これで記事の最初の動画のように、ボタンを押すことで電子オルゴールを鳴らすことができた。

ブザーで遊ぶのは満足したので、次回からは違う部品で遊んでみたいと思う。

 

日記まとめ

ラズパイで遊んでみた軌跡を以下でまとめてます。

【電子工作】Raspberry Pi 4で遊ぼう日記 まとめ


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください