Python × Pico 電子工作 | #06 ブザーで音を出そう

今回は ブザー を鳴らして音を出してみます。前回 #04 / #05 で学んだ PWM の 周波数 を音の高さ(音階)に対応させると、Pico を簡易な楽器のように使えます。電子工作の世界に「聴覚」が加わって、表現の幅が一気に広がります。

  • アクティブブザーとパッシブブザーの違い
  • pico_buzzer_tone ブロックで 周波数(Hz)と時間(秒) を指定して鳴らす
  • ドレミファソラシドの周波数を順番に鳴らしてスケール演奏
  • メロディ演奏・サイレン音などの応用

PycoBlocks(MicroPythonモード) を開き、左カテゴリ「Pico 電子工作 / 出力」の「ブザー」ブロックが今回の主役です。ブザーは PWM 出力と同じ仕組みで動かすため、#04 PWM・#05 ADC で学んだ知識がそのまま活きます。

ブザーで音を出そう

ブザーの種類:アクティブとパッシブを見分けよう

電子工作で使われるブザーは大きく 2 種類 あります。見た目はそっくりですが、使い方が まったく違う ので注意が必要です。

アクティブブザーパッシブブザー
電源3V〜5V を繋ぐだけPWM 信号が必要
音の高さ固定(1 種類のみ)自由に変えられる
用途警告音・通知音メロディ・音階・音楽
本体マーク裏面にシール(隠れ気味)裏面が見える穴あり
本記事で使う—✓ こちらを使用

本記事では パッシブブザー(PWM 制御で音階を作れる方)を使います。ELEGOO スターターキットなどには両方が同梱されていることが多いので、裏面に穴が見える ほうを選んでください。(アクティブは裏面が黒いシールで覆われています)

ステップ1:ラの音を1秒鳴らそう

まずは「ラ(A4)」の音(440Hz)を 1 秒間鳴らしてみましょう。440Hz は楽器の調律にも使われる基準音で、オーケストラのチューニングで「ラー」と聞こえるあの音です。

パッシブブザーを GP15 と GND に配線した実体配線図
パッシブブザーの SIG(+)端子を GP15 へ、GND(−)端子を GND へ。極性に注意:本体の + 表記または長いリード線が SIG 側です。(実体配線図は Fritzing の部品画像をもとに作図・CC BY-SA 3.0)
ブザー GP15 で 440Hz を 1 秒鳴らすブロック
ブロック構成:ブザー ピン GP15 周波数 440Hz 時間 1秒。
from machine import Pin, PWM
import utime
_bz = PWM(Pin(15))
_bz.freq(440)
_bz.duty_u16(32768)
utime.sleep(1)
_bz.deinit()

PWM(Pin(15)) でブザー用の PWM オブジェクトを作り、.freq(440) で周波数を 440Hz に設定。.duty_u16(32768)(デューティ比 50%)で発振開始、utime.sleep(1) で 1 秒鳴らし続け、.deinit() で停止する流れです。

💡 試してみよう

ブロックの 周波数 を 262(ド C4)・523(高いド C5)・1000・2000 などに変えると、音の高さがどう変わるか体感できます。周波数を 2 倍にすると 1 オクターブ高く 聞こえます。

ステップ2:ドレミファソラシドを鳴らそう

ブザーブロックを縦に並べれば、メロディが演奏できます。ここでは ド・レ・ミ・ファ・ソ・ラ・シ・ド(C4〜C5 の 1 オクターブ)を順番に鳴らします。各音は 0.4 秒 ずつ、合計 3.2 秒の演奏です。

下の図のように、周波数が高いほど波が細かく(速く振動して)、音が高く聞こえます。ド C4(262Hz)→ ラ A4(440Hz)→ 高いド C5(523Hz)と周波数が上がるにつれ、1 秒間の振動回数が増えていくのがポイントです。

ド262Hz・ラ440Hz・高いド523Hz の波形と周波数の対応図
同じ時間幅でも、周波数が高い音ほど波の数が多い(=速く振動する)。周波数を 2 倍にすると 1 オクターブ上の音になり、ド 262Hz の倍が高いド 523Hz(≒2 倍)。
音階音名周波数 (Hz)
ドC4262
レD4294
ミE4330
ファF4349
ソG4392
ラA4440
シB4494
高いドC5523
ドレミファソラシドを 0.4 秒ずつ順番に鳴らすブロック
ブロック構成:8 つの「ブザー」ブロックを縦に積み、周波数を 262 → 523 まで変化。
from machine import Pin, PWM
import utime
for freq in [262, 294, 330, 349, 392, 440, 494, 523]:
    _bz = PWM(Pin(15))
    _bz.freq(freq)
    _bz.duty_u16(32768)
    utime.sleep(0.4)
    _bz.deinit()

Python コードの工夫:ブロック版では 8 個のブロックを縦に並べる必要がありましたが、Python コードでは for freq in [...] でリストを使って 8 行を 5 行 に圧縮できます。リストに 440(ラ)を追加・削除すれば自由に音階をカスタマイズできます。

各音の間に「無音」を入れたい場合:pico_buzzer_stop ブロックで一旦消音し、utime.sleep(0.05) 程度の短い待ち時間を挟むと音の区切りがはっきりします。ただし、本記事のように 0.4 秒 程度の一定間隔なら不要です。

ステップ3(コラム):周波数と音階の関係・人間の可聴範囲

音の高さは 周波数(Hz、ヘルツ) で決まります。1 秒間に 1 回振動する音が 1 Hz、440 回振動する音が 440 Hz。周波数が高いほど高音、低いほど低音に聞こえます。

📝 1 オクターブの法則

音楽では 周波数を 2 倍にすると 1 オクターブ高い音 になります。ラ A4 が 440Hz なら、ラ A5 は 880Hz、ラ A6 は 1760Hz。逆に半分にすると 1 オクターブ低くなり、ラ A3 は 220Hz、ラ A2 は 110Hz。

人間が聴ける周波数:20Hz 〜 20,000Hz(20kHz)が一般的な可聴域です。ただし高音は年齢とともに聴こえにくくなり、大人になると 15kHz 以上はほぼ聴こえなくなります。Pico のブザーは 100Hz〜10kHz 程度の範囲が実用的です。それ以上低くても高くても、ブザーの物理構造で音が出にくくなります。

音楽の 12 半音:ドからシまで 12 段階 に分けるのが「平均律」で、1 オクターブ(周波数 2 倍)を 2 ^ (1/12) ≒ 1.0595 倍ずつ 12 回かけて作ります。つまり ド → ド♯ は周波数が 1.06 倍。ピアノの黒鍵を含めた半音階を鳴らしたい場合は、この計算で周波数を求められます。

演習課題

課題3-6-1:オクターブの周波数を計算してみよう

ラ(A4)の周波数は 440Hz です。次の音の周波数を計算してみよう。

  • ラ A5(1 オクターブ上)
  • ラ A6(2 オクターブ上)
  • ラ A3(1 オクターブ下)
  • ラ A2(2 オクターブ下)

また、ド C4 = 262Hz を基準に、ド C2(2 オクターブ下)と C6(2 オクターブ上)の周波数も求めてみよう。

▶ 模範解答と解説を見る
# 答え:
# 「1 オクターブ上 = 周波数 × 2」「1 オクターブ下 = 周波数 ÷ 2」
#
# ラ A4 = 440 Hz (基準)
# ラ A5 = 440 × 2  = 880 Hz
# ラ A6 = 440 × 4  = 1760 Hz
# ラ A3 = 440 / 2  = 220 Hz
# ラ A2 = 440 / 4  = 110 Hz
#
# ド C4 = 262 Hz
# ド C2 = 262 / 4  ≒ 65.5 Hz  (低くてブザーが鳴りにくい)
# ド C6 = 262 × 4  = 1048 Hz
#
# 半音 1 つ上げる: 周波数 × 2 ^ (1/12) ≒ 1.0595 倍
# 例: ド C4 = 262 → ド♯ C♯4 ≒ 262 × 1.0595 ≒ 277.6 Hz

解説: 計算のコツ:オクターブが上がるたびに 2 倍、下がるたびに 半分。「ラの周波数を倍にすればまたラ」と覚えると音楽的にも納得しやすいです。Pico のブザーは 100Hz 以下 はうまく鳴らない傾向があるので、C2(約 66Hz)はブザーの種類によっては聞こえないかもしれません。発展:標準的なピアノの最低音 A0 は 27.5Hz、最高音 C8 は 4186Hz。ブザーは 中音域(200〜2000Hz) が一番きれいに鳴ります。

課題3-6-2:「カエルの歌」を演奏しよう

童謡「カエルの歌」の冒頭 「ド・レ・ミ・ファ・ミ・レ・ド」 を演奏しよう。各音は 0.4 秒 、最後の「ド」だけ 0.8 秒(少し長め)にすると、音楽的に「終わった感」が出ます。配線はステップ1 と同じ(GP15 + ブザー)です。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

カエルの歌「ド・レ・ミ・ファ・ミ・レ・ド」を演奏するブロック
ブロック構成:ブザーブロック 7 個を縦に積み、周波数を 262→294→330→349→330→294→262。最後だけ 0.8 秒。
from machine import Pin, PWM
import utime
# カエルの歌: ド・レ・ミ・ファ・ミ・レ・ド
melody = [
    (262, 0.4),  # ド
    (294, 0.4),  # レ
    (330, 0.4),  # ミ
    (349, 0.4),  # ファ
    (330, 0.4),  # ミ
    (294, 0.4),  # レ
    (262, 0.8),  # ド (最後はやや長め)
]
for freq, dur in melody:
    _bz = PWM(Pin(15))
    _bz.freq(freq)
    _bz.duty_u16(32768)
    utime.sleep(dur)
    _bz.deinit()

解説: ポイントは 「行って戻る対称的なメロディ」 です。ド→ファまで上がって、ファ→ドまで戻ってくる形になっています。最後の音だけ 0.8 秒(他の倍) にすることで「終止感」が生まれます。発展:「カエルの歌が きこえてくるよ」の続きは「ド・レ・ミ・ファ・ミ・レ・ド・〜・ド・ド・ド・ド・ド・ド・ド・ド」(最後の「クワクワクワクワ ゲゲゲゲゲゲゲ」は同じ音の連打)と歌詞が続きます。別の童謡「きらきら星」も「ド・ド・ソ・ソ・ラ・ラ・ソ」で始まるので試してみよう。

課題3-6-3:救急車サイレンを作ろう

救急車のサイレン音 「ピーポー、ピーポー」 を再現しよう。実際の救急車のサイレンは 「ピー」が高音(約 960Hz)・「ポー」が低音(約 770Hz) の 2 音を交互に鳴らす仕組みになっています。ずっと繰り返す ブロックの中に 2 つのブザーブロックを並べて、ループさせよう。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

救急車サイレン:950Hz と 700Hz を交互に鳴らすブロック
ブロック構成:ずっと → ブザー 950Hz 0.5秒 → ブザー 700Hz 0.5秒。
from machine import Pin, PWM
import utime
while True:
    # ピー (高音)
    _bz = PWM(Pin(15))
    _bz.freq(950)
    _bz.duty_u16(32768)
    utime.sleep(0.5)
    _bz.deinit()
    # ポー (低音)
    _bz = PWM(Pin(15))
    _bz.freq(700)
    _bz.duty_u16(32768)
    utime.sleep(0.5)
    _bz.deinit()

解説: 鍵は while True(ずっとループ) です。2 つの音を 1 回だけ鳴らすのではなく、無限に交互に鳴らし続けることでサイレン感が出ます。停止するには 停止ボタン または USB を抜くしかありません。発展:

  • パトカーのサイレン:もっと速く(0.2 秒ずつ)切り替えるとパトカー風に。
  • 消防車のサイレン:800Hz と 1000Hz を 1 秒ずつでゆっくり交互。
  • 連続周波数スイープ:for ループで 500Hz〜2000Hz を 1 段階ずつ上げると 「ヒューン」というドップラー風の効果音が作れます(pico_buzzer_tone は周波数が固定なので、次の単元で学ぶ 変数版ブザー が必要)。

まとめ

  • パッシブブザーは PWM 信号で 音の高さを自由に変えられる。アクティブブザーは電源直結のみで音は固定。
  • 周波数(Hz)が音の高さを決める。ラ A4 = 440Hz、ド C4 = 262Hz、1 オクターブ上は 周波数 2 倍。
  • pico_buzzer_tone で 周波数(Hz)と時間(秒)を指定して鳴らす。ブロックを縦に積めばメロディに、while True に入れれば連続音やサイレンに。
  • 人間の可聴域は 20Hz〜20kHz。Pico のブザーは 200〜2000Hz がきれいに鳴る範囲。
  • 音楽の半音は 2 ^ (1/12) ≒ 1.0595 倍。12 半音で 1 オクターブ(周波数 2 倍)。

次の記事は #07「7セグメントで数字を表示しよう」。8 本のピンを使って 0〜9 の数字を表示する 7 セグメント LED を扱います。ビットパターンと配線がちょっと大変ですが、デジタル時計やスコアボードの基礎技術です。

トップへ戻る