Raspberry Pi Picoでスイープを鳴らす

今回はRaspberry Pi Picoとパッシブブザーでスイープを鳴らします。

パッシブブザーとは

パッシブブザーは、電気信号がかかると音を発生する装置です。音を発生させるためには、マイクロコントローラなどからの外部信号が必要です。

スイープとは

20Hzの低音から20kHまで徐々にサイン波が変化する信号のことです。音でいえば、低い音から高い音へ滑らかに変わっていく音になります。

高齢者でも聞き取りやすいため、サイレンの音などにもスイープ音は活用されています。

コード

import machine
import time


def play_tone(frequency, duration):
    """音再生

    指定された周波数の音を指定された時間だけ再生する

    Args:
        frequency: 周波数 (Hz)
        duration: 音の持続時間 (ミリ秒)
    Return:
        None
    Example:
        play_tone(440, 1000)  # 440Hzの音を1秒間再生
    """
    buzzer.freq(frequency)
    buzzer.duty_u16(32768)  # デューティサイクルを50%に設定
    time.sleep_ms(duration)
    buzzer.duty_u16(0)  # 音を停止


def sweep_tone(start_freq, end_freq, step, duration):
    """スイープ音生成

    指定された周波数範囲のスイープ音を生成する

    Args:
        start_freq: 開始周波数 (Hz)
        end_freq: 終了周波数 (Hz)
        step: 周波数の増減ステップ
        duration: 各トーンの持続時間 (ミリ秒)
    Return:
        None
    Example:
        sweep_tone(1000, 100, 1, 10)  # 1000Hzから100Hzまで1Hzずつ下がりながら10msずつ再生
    """
    # 周波数が増加する場合
    if start_freq < end_freq:
        for freq in range(start_freq, end_freq, step):
            play_tone(freq, duration)
    # 周波数が減少する場合
    else:
        for freq in range(start_freq, end_freq, -step):
            play_tone(freq, duration)


# PWMを使用するためにGPIO15を設定
buzzer = machine.PWM(machine.Pin(15))

# スイープ音の設定
start_frequency = 20  # 開始周波数
end_frequency = 2000  # 終了周波数
step_frequency = 1  # 周波数の増減ステップ
tone_duration = 1  # 各トーンの持続時間 (ミリ秒)

try:
    sweep_tone(start_frequency, end_frequency, step_frequency, tone_duration)
finally:
    # ブザーを停止
    buzzer.duty_u16(0)

ポイント① デューティサイクルとは

デューティサイクル(デューティ比)とは、一定周期で連続するパルス波において、パルスがオンになる時間とオフになる時間の比率のことです。

ポイント② PWMとは

PWM(Pulse Width Modulation)とは、パルス幅変調の略で、半導体を使った電力制御方式の一つです。オンとオフの繰り返しによって、出力される電力を制御します。

動作

実際に音を鳴らした様子です。

まとめ・感想

非常に単純な配線でスイープ音を鳴らすことができました。単純なループ処理ですが、滑らかに音が変化しているように聞こえます。

また、スイープ音は高齢者も聞き取りやすいためサイレン等に使用されていると知り、確かに警告などのサイレンは一定の音ではないと気づきました。

参考

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です