Arduinoでブザーを鳴らす|tone()関数の使い方を徹底解説

Arduinoでブザーに音を出させる方法は、LEDを光らせるのとは少し違います。tone()という専用の関数を使います。本記事では、配線の基本から、音の高さ(周波数)を変える方法まで解説します。さらに、配列を使った簡単なメロディーの鳴らし方まで、初心者の方に向けて順を追って紹介します。
01なぜtone()関数を使うのか
digitalWriteだけでは音の高さを変えられない
LEDの点灯ならdigitalWrite()でHIGH・LOWを切り替えるだけです。ブザーの場合も、原理としては似た部分があります。ブザーは、電圧のON/OFFを高速に繰り返すことで音を出す部品だからです。ただし、そのON/OFFの速さ(周波数)によって、聞こえる音の高さが変わります。digitalWrite()を自分で高速に切り替え続けるのは、現実的ではありません。そこでArduinoには専用の関数が用意されています。tone()を使えば、指定した周波数で自動的にON/OFFを繰り返してくれます。
tone()が向いている用途
tone()を使うと、決まった音を1音鳴らすだけではありません。周波数を変えて音階を作ったり、複数の音を並べてメロディーを鳴らしたりできます。通知音やアラーム、簡単なゲームの効果音など、Arduinoの入門的な作品でよく使われる機能です。
初めてブザーを扱うAさんは、LEDと同じ感覚で音を鳴らそうとした。digitalWrite()だけを使ったのだ。音は鳴ったものの、常に「ピー」という一定の音しか出せなかった。そこでtone()関数の存在を知った。書き換えてみると、簡単に音の高さを変えられるようになった。用途に合った関数を選ぶことが、遠回りを防ぐコツです。
02ブザーの基礎知識|アクティブとパッシブの違い

アクティブブザー:つなぐだけで一定の音が鳴る
アクティブブザーは、内部に発振回路をあらかじめ持っています。電源をつなぐだけで、決まった高さの音が鳴る仕組みです。配線は簡単ですが、音の高さを変えることはできません。tone()で周波数を指定しても、音程は変化しないので注意してください。
パッシブブザー:外部から信号を送って音を作る
パッシブブザーには、発振回路が入っていません。外部から送られてくる信号の周波数どおりに振動して音を出す仕組みです。つまり、tone()で送る信号の周波数を変えれば、そのまま音の高さが変わります。
本記事ではパッシブブザーを使用
本記事で紹介するメロディー再生には、このパッシブブザーが必須です。ピエゾスピーカーという名前で売られている部品も、同じ仕組みで使えます。
| 種類 | 内部の発振回路 | 音の高さ | tone()での用途 |
|---|---|---|---|
| アクティブブザー | あり | 固定(変更不可) | ON/OFFのみ可能 |
| パッシブブザー | なし | 自由に変更可能 | 音階・メロディーの再生に対応 |
※見た目がよく似ているため、購入時は商品名や説明文で必ず種類を確認してください。
「音は鳴るのに音階が変えられない」という相談があります。その多くは、アクティブブザーを使っていることが原因です。本記事の内容を試す前に、お手元の部品がパッシブブザーであることを確認しておきましょう。余計なつまずきを防げます。
03配線方法:Arduinoとブザー
基本の配線
パッシブブザーの配線はとてもシンプルです。ブザーの+側のリード線をArduinoのデジタルピンに、-側のリード線をGNDにつなぐだけで完成します。多くの2本足の小型ブザーでは、リード線の長さや基板の印字で+と-を見分けられます。
抵抗は必要か
多くの小型パッシブブザーは消費電流が小さいです。そのため、抵抗なしで直接つないでも問題なく動作します。ただし、音量を抑えたい場合や、部品の仕様に不安がある場合もあります。そうしたときは、100Ω程度の抵抗を直列に入れておくと安心です。初めて扱う部品の場合は、パッケージや購入先の説明を確認しておきましょう。
04基本のコード|tone()で音を鳴らす
tone()の基本的な書き方
Arduino公式のtone()リファレンスを確認しましょう。この関数には3つの引数を渡せます。音を鳴らすピン番号、周波数(Hz)、そして鳴らす時間(ミリ秒)です。時間を省略すると、noTone()を呼び出すまで音が鳴り続けます。まずは、1秒間だけ音を鳴らす最小限のコードを見てみましょう。
// ブザーを1秒間鳴らす最小構成コード
const int buzzerPin = 8;
void setup() {
tone(buzzerPin, 440, 1000); // 440Hzの音を1000ミリ秒(1秒)鳴らす
}
void loop() {
// 何もしない
}
noTone()で音を止める
時間を指定しない場合、音は鳴り続けます。任意のタイミングで止めたいときは、noTone(ピン番号)を呼び出します。次のコードは、ボタンを押している間だけ音を鳴らす例です。
// ボタンを押している間だけ音を鳴らすコード
const int buzzerPin = 8;
const int buttonPin = 2;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
tone(buzzerPin, 440); // 時間を指定しないので鳴り続ける
} else {
noTone(buzzerPin); // ボタンを離したら音を止める
}
}
タクトスイッチの配線や読み取り方について、詳しくは下記の記事でも解説しています。
05周波数を変える|音階を作る

数値を変えるだけで音の高さが変わる
音階を作る方法はとてもシンプルです。tone()の第2引数(周波数)に渡す数値を変えるだけです。数値が大きいほど高い音、小さいほど低い音になります。Arduino公式のリファレンスによると、31Hzより低い音は生成できません。これはハードウェア上の制約です。
ドレミの周波数でスケールを鳴らす
音楽の世界には、それぞれの音階に対応する周波数の値が決まっています。例えば、中央のド(C4)はおよそ262Hzです。レ(D4)はおよそ294Hzです。これらの数値をそのままコードに書けば、ドレミの音階を鳴らせます。
// ドレミファソラシドの音階を順番に鳴らすコード
const int buzzerPin = 8;
// 各音の周波数(Hz)
int notes[] = {262, 294, 330, 349, 392, 440, 494, 523};
// ド, レ, ミ, ファ, ソ, ラ, シ, ド(高い)
void setup() {
for (int i = 0; i < 8; i++) {
tone(buzzerPin, notes[i], 300); // 300ミリ秒ずつ鳴らす
delay(400); // 次の音までの間隔(音の長さより少し長めに取る)
}
noTone(buzzerPin);
}
void loop() {
// 何もしない
}
配列(notes[])を使うと、たくさんの音をまとめて管理できます。配列の基本については、下記の記事も参考にしてください。
06配列を使って簡単なメロディーを鳴らす

音の高さと長さを2つの配列で管理する
メロディーを鳴らすには、音の高さ(周波数)だけでは足りません。音の長さも必要です。Arduino公式のtoneMelodyサンプルを見てみましょう。音の配列と長さの配列を2つ用意し、順番に鳴らしていく方法が紹介されています。本記事でも、同じ考え方でシンプルなメロディーを作ってみましょう。
// 配列を使って簡単なメロディーを鳴らすコード
const int buzzerPin = 8;
// 音の高さ(Hz)
int melody[] = {262, 262, 392, 392, 440, 440, 392};
// 音の長さ(ミリ秒)
int durations[] = {400, 400, 400, 400, 400, 400, 800};
void setup() {
int songLength = sizeof(melody) / sizeof(melody[0]);
for (int i = 0; i < songLength; i++) {
tone(buzzerPin, melody[i], durations[i]);
// 音と音の間に少し隙間を空けると、粒立ちよく聞こえる
delay(durations[i] * 1.3);
noTone(buzzerPin);
}
}
void loop() {
// 何もしない
}
音を区切る「間」の作り方
音と音の間に、少しだけ隙間を空けるのがコツです。隙間がないと、音がつながって聞こえてしまいます。上のコードでは、音の長さの1.3倍だけ待ってから次の音に進むようにしています。この倍率を変えると、メロディーの印象も変わります。ぜひ色々な数値を試してみてください。
さらに多くの音階を使いたい場合
より多くの音階や、オクターブ違いの音を使いたい場合もあるでしょう。その場合は、Arduino公式サンプルにあるpitches.hというファイルを使う方法もあります。よく使う音の周波数があらかじめ定義されているため、コードが読みやすくなります。コードの基礎については、コピペで使える下記の記事も参考にしてください。
07よくあるトラブルと対処法

症状別の対処早見表
| 症状 | 主な原因 | 対処法 |
|---|---|---|
| 音は鳴るが高さが変わらない | アクティブブザーを使っている | パッシブブザーに交換する(2章参照) |
| まったく音が鳴らない | 配線ミス、またはピン番号の指定違い | ブザーの+-の向きと、コード内のピン番号を再確認する |
| 特定の音だけ鳴らない、または無音になる | 31Hzより低い周波数を指定している | 周波数の数値を31以上に修正する |
| tone()実行中にPWM出力(LEDの明るさ調整など)が乱れる | Arduino Unoでピン3・11のタイマー競合 | PWMを使うピンをそれ以外の番号に変更する |
| メロディーの音がつながって聞こえる | 音と音の間に隙間(delay)がない | noTone()と短いdelay()を音の間に挟む(6章参照) |
原因を素早く切り分けるコツ
Wさんは音階のコードを試したが、どの周波数を指定しても同じ音しか鳴らなかった。配線を何度確認しても間違いは見当たらない。そこで、購入したブザーの商品ページを見直してみた。すると、アクティブブザーだったことが判明した。パッシブブザーに交換すると、狙った通りに音階が変化するようになった。「配線は合っているのに音が変わらない」場合は、まず部品の種類を疑うことが近道です。
08よくある質問
基本のQ&A
応用のQ&A
関連記事・参考資料
基礎を学べる記事
- YOFUKASI LAB「Arduinoに必要な工具・部品リスト」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-tools-parts/
- YOFUKASI LAB「Arduinoでタクトスイッチ入力|配線とコード」2026年, https://yofukasi-lab-wp.com/2026/08/27/arduino-tact-switch-input/
- YOFUKASI LAB「Arduinoのコード・プログラムの書き方(コピペ可20選)」2026年, https://yofukasi-lab-wp.com/2026/07/18/arduino-cord/
応用・トラブルシューティング記事
- YOFUKASI LAB「Arduinoの配列の使い方|複数センサーの値を一元管理する」2026年, https://yofukasi-lab-wp.com/2026/08/18/arduinoの配列の使い方――複数センサーの値を一元管/
- YOFUKASI LAB「Arduinoのシリアルモニタ活用術」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-serial-monitor-debugging/
- YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/
参考資料(外部・一次情報)
- Arduino Documentation「tone()」, https://docs.arduino.cc/language-reference/en/functions/advanced-io/tone/
- Arduino Documentation「Play a Melody using the tone() function」, https://docs.arduino.cc/built-in-examples/digital/toneMelody/
※本記事は個人の学習・電子工作用途を対象にしています。実際の製品や医療機器へ組み込む場合は、電気安全・製品規格の専門家に別途ご相談ください。
コメント