Arduinoでブザーを鳴らす|アクティブとパッシブの見分け方、tone()の使い方と音階の周波数、メロディの組み方
Arduinoでブザーを鳴らすときに迷いやすい、アクティブ(発振回路内蔵)とパッシブの違いと見分け方、圧電ブザーと電磁ブザーの電流の違い、tone()とnoTone()の使い方、ドレミの周波数の求め方、配列でメロディを組む方法、PWMとの干渉や音が小さいときの原因までを、配線とスケッチの例で順に説明します。

Arduinoで LED を点滅させ、ボタンの入力を読めるようになると、次に「音を出したい」と考える人が多いのではないでしょうか。タイマーが終わったら知らせる、ボタンを押したら確認音を鳴らす、簡単なメロディを流す。ブザーは安価で配線も少なく、作品の手応えを大きく変えてくれる部品です。
ところが、通販や部品店で「ブザー」を買ってみると、ピンをHIGHにしても鳴らない、逆に音程が変えられない、思ったより音が小さい、ということがよく起こります。原因の多くは、ブザーの種類の違いと、音を出すしくみの理解にあります。この記事では、ブザーの種類の見分け方から、tone()の使い方、音階の周波数、メロディの組み方、つまずきやすい点までを順に説明します。Arduino の基本操作やブレッドボードの使い方は、Arduinoのはじめの一歩で紹介しています。
ブザーが音を出すしくみ
音は空気の振動
音は、物が細かく震えて空気を押し引きし、その振動が耳に届いたものです。1秒間に何回震えるかを周波数と呼び、単位はヘルツ(Hz)です。周波数が高いほど高い音、低いほど低い音に聞こえます。人が聞き取れるのはおよそ20Hzから20000Hzの範囲と言われますが、年齢とともに高い音は聞こえにくくなります。
ブザーは、電気の信号で薄い板を震わせて音を出す部品です。板を震わせる方法によって、大きく圧電式と電磁式に分かれます。
圧電式と電磁式
圧電式は、セラミックの薄い板(圧電素子)に電圧をかけると、わずかに伸び縮みする性質を利用します。電圧のオンとオフを繰り返すと板が震え、音が出ます。圧電素子は電気的にはコンデンサーに近い性質で、流れる電流はとても小さいのが特徴です。
電磁式は、コイルに電流を流して磁石の力で金属の板を引きつけ、それを繰り返して音を出します。仕組みはスピーカーに近く、圧電式より電流が多く流れる傾向があります。見た目が似ていても、中身によって必要な電流が大きく違う点は覚えておきましょう。

アクティブとパッシブの違いと見分け方
発振回路があるかどうか
ブザーにはもう一つ、重要な分け方があります。それが「アクティブ」と「パッシブ」です。

アクティブブザーは、中に音の振動を作る発振回路を持っています。電圧をかけるだけで決まった高さの音が鳴るため、Arduino ではピンを HIGH にすれば鳴り、LOW にすれば止まります。そのかわり、音の高さは基本的に変えられません。
パッシブブザーは、発振回路を持たず、外から振動の信号を与える必要があります。電圧をかけっぱなしにしても、最初に「カチッ」と小さな音がするだけで鳴り続けません。そのかわり、与える信号の周波数を変えれば、ドレミのように音の高さを自由に変えられます。
| 項目 | アクティブブザー | パッシブブザー |
|---|---|---|
| 発振回路 | 内蔵している | 内蔵していない |
| 鳴らし方 | ピンを HIGH にする | tone() などで周波数を与える |
| 音の高さ | ほぼ一定 | 自由に変えられる |
| 向いている用途 | 警告音、確認音 | メロディ、効果音 |
| 直流をかけたとき | 鳴り続ける | 「カチッ」と鳴って止まる |
見た目で見分ける手がかり
外見からの見分け方として、よく紹介されるのは次のような点です。
- 裏側が黒い樹脂などで封じられているものはアクティブ、緑色などの基板が見えるものはパッシブであることが多い
- 上面に「+」の印やシールが貼られているものはアクティブであることが多い
- 背の高さが違う組み合わせで売られている場合、高いほうがアクティブであることが多い
ただし、これらはあくまで傾向で、製品によって例外があります。購入したときの説明やデータシートで確かめるのが確実です。
実際に試して確かめる
説明書きがない場合は、実際に試すのがいちばん確実です。ブザーの+側(長い足や「+」の印がある側)をArduinoのデジタルピンに、もう一方をGNDにつなぎ、次のスケッチを書き込みます。
const int buzzerPin = 8;
void setup() {
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, HIGH); // 鳴り続ければアクティブ
delay(1000);
digitalWrite(buzzerPin, LOW);
delay(1000);
tone(buzzerPin, 440, 1000); // 音程が出ればパッシブ
}
void loop() {
}
最初の1秒間に鳴り続ければアクティブ、最初は「カチッ」とだけ鳴り、後の tone() で「ラ」の音がはっきり出ればパッシブです。アクティブブザーに tone() を使うと、内部の発振と外からの信号が重なり、濁った音になることがあります。










