この記事の結論
- アクティブブザーは電源をつなぐだけで音が鳴り、パッシブブザーはtone()で音程を変えられる
- tone(ピン, 周波数, 長さ)で音を鳴らし、noTone(ピン)で止めるのが基本の構文
- 音階ごとの周波数(ドレミファソラシド)を配列にし、for文で順番に鳴らせば簡単な曲になる
- LEDの点灯と組み合わせれば、光と音が連動する簡易メロディ装置に発展できる
電子工作の入門でLEDの点滅(Lチカ)の次によく挑戦されるのが、ブザーで音を鳴らす工作です。
Arduinoのtone()という関数を使えば、部品を1個足すだけで、簡単な音や短いメロディを鳴らせるようになります。
この記事では、ブザーの種類の見分け方からtone()の使い方、簡単な曲を鳴らすコードの組み方までを整理します。
アクティブブザーとパッシブブザーの違い
アクティブブザー(電源をつなぐだけ)
アクティブブザーは、内部に発振回路をあらかじめ内蔵していて、電源をつなぐだけで決まった音程のブザー音が鳴る部品です。
digitalWrite(ピン, HIGH)で鳴らし、digitalWrite(ピン, LOW)で止めるだけなので、配線・コードともにもっとも簡単です。
その代わり、音程を変えることはできないため、警告音やお知らせ音としての用途がメインになります。
紹介した商品:アクティブブザーモジュール 5個入り
アクティブブザーモジュール 5個入り DC3.3〜5V
電源をつなぐだけで決まった音程が鳴る、警告音・お知らせ音向けのタイプです。
Amazon ¥1,088(5個入り)
※価格は記事執筆時点のものです。購入前に最新価格をご確認ください。
パッシブブザー(tone関数で音程を変えられる)
パッシブブザーは発振回路を内蔵しておらず、Arduino側から送る信号の周波数によって音程が変わる部品です。
この記事で紹介するメロディ工作には、音程を変えられるパッシブブザーを使います。

価格の目安は、どちらのタイプもモジュールで100〜300円程度と大きな差はありません。
紹介した商品:パッシブブザーモジュール 5個入り
パッシブブザーモジュール 5個 3.3〜5V 3ピンコントロール(Naroote)
この記事のメロディ工作で使う、tone()で音程を変えられるタイプです。
Amazon ¥1,013(5個入り)
※価格は記事執筆時点のものです。購入前に最新価格をご確認ください。
tone関数の使い方
基本構文とドレミの周波数
tone()関数は、「tone(ピン番号, 周波数)」または「tone(ピン番号, 周波数, 鳴らす長さ)」という形で使います。
周波数はHz(ヘルツ)単位で指定し、鳴らす長さはミリ秒(1000で1秒)単位で指定します。
ドレミファソラシドの周波数は、ド(262Hz)・レ(294Hz)・ミ(330Hz)・ファ(349Hz)・ソ(392Hz)・ラ(440Hz)・シ(494Hz)・高いド(523Hz)が目安の数値です。
noTone()と、同時に1音しか鳴らせない制限
鳴らす長さを指定しなかった場合、音はnoTone(ピン番号)を実行するまで鳴り続けます。
tone()は同時に1つの音程しか出せないため、別のピンで既に音が鳴っている状態でもう一度tone()を呼んでも、後から呼んだ方の音は出ません。
また、31Hzより低い音は生成できないという制限もあります。
1つのメロディを鳴らし切ってから次の音を鳴らす、という順番を意識すればこの制限は特に問題になりません。
簡単な曲を鳴らすコードを組む
配列とfor文でメロディを作る考え方
1音ずつtone()を書き並べてもメロディは作れますが、音の数が増えると管理が大変になります。
そこで、鳴らしたい音階の周波数を配列にまとめ、for文で順番に取り出しながらtone()を呼ぶ方法がよく使われます。
「int melody[] = {262, 294, 330, 349, 392};」のように音階の配列を作り、「int noteDurations[] = {400, 400, 400, 400, 800};」のように1音ずつの長さの配列も別に用意しておくと、音の長さにも変化をつけられます。
for文の中で「tone(ブザーのピン, melody[i], noteDurations[i]);」を呼び、そのあとに「delay(noteDurations[i] * 1.3);」のように少し余裕を持たせたdelay()を入れると、音と音の間に自然な間隔が生まれます。
ここまでの内容をまとめた、簡単なメロディを鳴らす完全なスケッチは、次のようになります。
const int BUZZER_PIN = 8;
int melody[] = {262, 294, 330, 349, 392};
int noteDurations[] = {400, 400, 400, 400, 800};
void setup() {
}
void loop() {
for (int i = 0; i < 5; i++) {
tone(BUZZER_PIN, melody[i], noteDurations[i]);
delay(noteDurations[i] * 1.3);
}
noTone(BUZZER_PIN);
delay(2000);
}
配線
パッシブブザー単体(足が2本の部品)の配線は、プラス側をArduinoの任意のデジタルピンへ、マイナス側をGNDへつなぐだけです。
紹介したような3ピンのブザーモジュールの場合は、信号ピン(「S」や「I/O」の印字)をデジタルピンへ、VCC(+)を5Vへ、GND(−)をGNDへつなぎます。
ピンの並び順は製品によって違うため、挿す前に基板の印字を確認しておきましょう。
圧電タイプなら抵抗を挟まなくても壊れる心配はほとんどありませんが、音量が大きすぎると感じる場合は、100Ω程度の抵抗を直列に入れると音量を少し抑えられます。

LEDを同時に光らせて演出を加える
音を鳴らすタイミングに合わせてdigitalWrite()でLEDを点灯させれば、光と音が連動する簡易のメロディ装置になります。
ただし、Uno R3など多くのボードではtone()がピン3・11のPWM出力と内部のタイマー(Timer2)を共用しているため、音を鳴らしている間はこの2本のピンのanalogWrite()が効かなくなります。
LEDの明るさをanalogWrite()で細かく変えたい場合は、ピン3・11を避けて、5・6・9・10番などの別のPWM対応ピンを使ってください。
for文の中で、tone()を呼び出す直前にLEDを点灯し、そのあとの待ち時間の終わりに消灯するだけで、音とタイミングを合わせられます。
音の高さによって光らせるLEDの色を変える、というように複数のLEDを組み合わせると、見た目にも楽しい装置になります。

LEDの色ごとの特性や必要な抵抗値については、別の記事で詳しく整理しています。
土の乾きをお知らせする装置のように、通知音としてこのブザーの鳴らし方を応用することもできます。
紹介した商品:LED 10色セット 200個入り
DiCUNO 発光ダイオード 3mm 10色 透明LEDセット 各20個入り 200個セット
赤・青・緑など10色が揃っているので、音の高さごとに光らせる色を変える演出にも使いやすいセットです。
Amazon ¥749(200個入り)
※価格は記事執筆時点のものです。購入前に最新価格をご確認ください。
まとめ:よくあるつまずきの早見表
最後に、ブザー工作でつまずきやすいポイントを表にまとめます。
| 症状 | 考えられる原因 | 対処 |
|---|---|---|
| 音がまったく出ない | 配線ミス(信号ピンの番号違い・GNDのつなぎ忘れ)、モジュールのVCCが未接続 | コードのピン番号と配線を見直し、VCC・GND・信号の3本を確認 |
| ずっと同じ高さの音しか鳴らない | アクティブブザーを使っている(内蔵の発振回路で決まった音が鳴るため、tone()で周波数を指定しても音程は変えられない) | 音程を変えたい場合はパッシブブザーに交換する |
| 音程がおかしい・思った曲にならない | 周波数の指定ミス、配列の対応関係のズレ | 音階と周波数の対応表を見直す、配列の要素数を確認 |
| 音が途中で止まらない・鳴りっぱなしになる | noTone()の呼び出し忘れ | 鳴らし終えたい場所でnoTone(ピン番号)を実行する |
作り始める前に、以下の点がなんとなくつかめているか確認してみてください。
- アクティブブザーとパッシブブザーの違い、音程を変えたいならパッシブという見当がついている
- tone(ピン, 周波数, 長さ)の書き方と、noTone()で止める流れが分かっている
- 配列とfor文を組み合わせれば、音を並べてメロディにできる仕組みがなんとなくつかめている


コメント