Arduinoで圧電ブザーを鳴らす方法|tone関数・配線・音階を解説

プログラミング・電子工作






Arduinoでブザーを鳴らす|tone関数入門







入門 / Arduino

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

Arduinoでブザーを鳴らすtone関数の使い方と配線を解説した図解

Arduinoでブザーに音を出させる方法は、LEDを光らせるのとは少し違います。tone()という専用の関数を使います。本記事では、配線の基本から、音の高さ(周波数)を変える方法まで解説します。さらに、配列を使った簡単なメロディーの鳴らし方まで、初心者の方に向けて順を追って紹介します。

YOFUKASI LAB編集部
公開日:2026年8月27日
読了目安:11分

執筆・実機検証:YOFUKASI LAB運営者

理学療法士/Arduino・Pythonを使った医療機器制作・学会発表経験あり

Chapter 01 / Basics

01なぜtone()関数を使うのか

digitalWriteだけでは音の高さを変えられない

LEDの点灯ならdigitalWrite()でHIGH・LOWを切り替えるだけです。ブザーの場合も、原理としては似た部分があります。ブザーは、電圧のON/OFFを高速に繰り返すことで音を出す部品だからです。ただし、そのON/OFFの速さ(周波数)によって、聞こえる音の高さが変わります。digitalWrite()を自分で高速に切り替え続けるのは、現実的ではありません。そこでArduinoには専用の関数が用意されています。tone()を使えば、指定した周波数で自動的にON/OFFを繰り返してくれます。

tone()が向いている用途

tone()を使うと、決まった音を1音鳴らすだけではありません。周波数を変えて音階を作ったり、複数の音を並べてメロディーを鳴らしたりできます。通知音やアラーム、簡単なゲームの効果音など、Arduinoの入門的な作品でよく使われる機能です。

編集部想定シナリオ

初めてブザーを扱うAさんは、LEDと同じ感覚で音を鳴らそうとした。digitalWrite()だけを使ったのだ。音は鳴ったものの、常に「ピー」という一定の音しか出せなかった。そこでtone()関数の存在を知った。書き換えてみると、簡単に音の高さを変えられるようになった。用途に合った関数を選ぶことが、遠回りを防ぐコツです。



Chapter 02 / Component

02ブザーの基礎知識|アクティブとパッシブの違い

Arduinoで使うアクティブブザーとパッシブブザーの違いを比較した図解

アクティブブザー:つなぐだけで一定の音が鳴る

アクティブブザーは、内部に発振回路をあらかじめ持っています。電源をつなぐだけで、決まった高さの音が鳴る仕組みです。配線は簡単ですが、音の高さを変えることはできません。tone()で周波数を指定しても、音程は変化しないので注意してください。

パッシブブザー:外部から信号を送って音を作る

パッシブブザーには、発振回路が入っていません。外部から送られてくる信号の周波数どおりに振動して音を出す仕組みです。つまり、tone()で送る信号の周波数を変えれば、そのまま音の高さが変わります。

本記事ではパッシブブザーを使用

本記事で紹介するメロディー再生には、このパッシブブザーが必須です。ピエゾスピーカーという名前で売られている部品も、同じ仕組みで使えます。

種類 内部の発振回路 音の高さ tone()での用途
アクティブブザー あり 固定(変更不可) ON/OFFのみ可能
パッシブブザー なし 自由に変更可能 音階・メロディーの再生に対応

※見た目がよく似ているため、購入時は商品名や説明文で必ず種類を確認してください。

編集部見解

「音は鳴るのに音階が変えられない」という相談があります。その多くは、アクティブブザーを使っていることが原因です。本記事の内容を試す前に、お手元の部品がパッシブブザーであることを確認しておきましょう。余計なつまずきを防げます。

Chapter 03 / Wiring

03配線方法:Arduinoとブザー

基本の配線

パッシブブザーの配線はとてもシンプルです。ブザーの+側のリード線をArduinoのデジタルピンに、-側のリード線をGNDにつなぐだけで完成します。多くの2本足の小型ブザーでは、リード線の長さや基板の印字で+と-を見分けられます。

[画像挿入位置]Arduino Unoとパッシブブザーの配線図(デジタルピン・ブザー・GNDの接続関係がわかるもの)

抵抗は必要か

多くの小型パッシブブザーは消費電流が小さいです。そのため、抵抗なしで直接つないでも問題なく動作します。ただし、音量を抑えたい場合や、部品の仕様に不安がある場合もあります。そうしたときは、100Ω程度の抵抗を直列に入れておくと安心です。初めて扱う部品の場合は、パッケージや購入先の説明を確認しておきましょう。



Chapter 04 / Code

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); // ボタンを離したら音を止める
  }
}

タクトスイッチの配線や読み取り方について、詳しくは下記の記事でも解説しています。

Chapter 05 / Frequency

05周波数を変える|音階を作る

Arduinoのtone関数で周波数を変えて音階とメロディーを鳴らす方法の図解

数値を変えるだけで音の高さが変わる

音階を作る方法はとてもシンプルです。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[])を使うと、たくさんの音をまとめて管理できます。配列の基本については、下記の記事も参考にしてください。



Chapter 06 / Melody

06配列を使って簡単なメロディーを鳴らす

Arduinoとブザーの配線とtone・noTone関数による押しボタン制御の図解

音の高さと長さを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というファイルを使う方法もあります。よく使う音の周波数があらかじめ定義されているため、コードが読みやすくなります。コードの基礎については、コピペで使える下記の記事も参考にしてください。



Chapter 07 / Troubleshooting

07よくあるトラブルと対処法

Arduinoのブザーが鳴らない原因やtone関数のトラブル対処法をまとめた図解

症状別の対処早見表

症状 主な原因 対処法
音は鳴るが高さが変わらない アクティブブザーを使っている パッシブブザーに交換する(2章参照)
まったく音が鳴らない 配線ミス、またはピン番号の指定違い ブザーの+-の向きと、コード内のピン番号を再確認する
特定の音だけ鳴らない、または無音になる 31Hzより低い周波数を指定している 周波数の数値を31以上に修正する
tone()実行中にPWM出力(LEDの明るさ調整など)が乱れる Arduino Unoでピン3・11のタイマー競合 PWMを使うピンをそれ以外の番号に変更する
メロディーの音がつながって聞こえる 音と音の間に隙間(delay)がない noTone()と短いdelay()を音の間に挟む(6章参照)

原因を素早く切り分けるコツ

編集部想定シナリオ

Wさんは音階のコードを試したが、どの周波数を指定しても同じ音しか鳴らなかった。配線を何度確認しても間違いは見当たらない。そこで、購入したブザーの商品ページを見直してみた。すると、アクティブブザーだったことが判明した。パッシブブザーに交換すると、狙った通りに音階が変化するようになった。「配線は合っているのに音が変わらない」場合は、まず部品の種類を疑うことが近道です。

Chapter 08 / FAQ

08よくある質問

基本のQ&A

Q.アクティブブザーとパッシブブザー、どちらを買えばいいですか?
A.メロディーを鳴らしたい場合は、必ずパッシブブザー(またはピエゾスピーカー)を選んでください。アクティブブザーは内部に発振回路を持っているため、電源を入れると常に決まった高さの音しか出ません。tone()で周波数を変えても音程は変化しません。購入時は商品名や説明に「パッシブ」と書かれているか確認しましょう。

Q.tone()を使うと音がどうしても鳴りません。原因は何ですか?
A.もっとも多い原因は、アクティブブザーとパッシブブザーの取り違えです。次に多いのが配線ミスやピン番号の指定違いです。それでも解決しない場合は、31Hzより低い周波数を指定していないか確認してください。tone()はこれより低い音を出せません。

応用のQ&A

Q.tone()で同時に2つの音を鳴らせますか?
A.1枚のArduinoでは、同時に鳴らせる音は1つだけです。tone()は内部のタイマーを1つだけ使う仕組みのため、複数のピンで同時に別の音を鳴らすことはできません。和音を鳴らしたい場合は、専用のオーディオ出力モジュールなど別の部品を検討する必要があります。

Q.tone()を使うとPWMで動かしているモーターやLEDが乱れます。なぜですか?
A.Arduino Unoでは、tone()は内部のタイマー2を使って音を作っています。このタイマーは、ピン3とピン11のPWM出力(analogWrite)とも共有されています。そのため、tone()を実行している間は、この2つのピンのPWM出力が正常に働きません。競合を避けるには、PWMに使うピンをそれ以外の番号に変更してください。

関連記事・参考資料

基礎を学べる記事

  1. YOFUKASI LAB「Arduinoに必要な工具・部品リスト」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-tools-parts/
  2. YOFUKASI LAB「Arduinoでタクトスイッチ入力|配線とコード」2026年, https://yofukasi-lab-wp.com/2026/08/27/arduino-tact-switch-input/
  3. YOFUKASI LAB「Arduinoのコード・プログラムの書き方(コピペ可20選)」2026年, https://yofukasi-lab-wp.com/2026/07/18/arduino-cord/

応用・トラブルシューティング記事

  1. YOFUKASI LAB「Arduinoの配列の使い方|複数センサーの値を一元管理する」2026年, https://yofukasi-lab-wp.com/2026/08/18/arduinoの配列の使い方――複数センサーの値を一元管/
  2. YOFUKASI LAB「Arduinoのシリアルモニタ活用術」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-serial-monitor-debugging/
  3. YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/

参考資料(外部・一次情報)

  1. Arduino Documentation「tone()」, https://docs.arduino.cc/language-reference/en/functions/advanced-io/tone/
  2. Arduino Documentation「Play a Melody using the tone() function」, https://docs.arduino.cc/built-in-examples/digital/toneMelody/

※本記事は個人の学習・電子工作用途を対象にしています。実際の製品や医療機器へ組み込む場合は、電気安全・製品規格の専門家に別途ご相談ください。


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE