Arduinoでブザーを鳴らす|アクティブとパッシブの見分け方、tone()の使い方と音階の周波数、メロディの組み方
うまく鳴らないときの原因と対処
よくある症状と確かめ方
ブザーが思ったように鳴らないときは、症状から原因を絞り込みます。
| 症状 | 考えられる原因 | 確かめ方・対処 |
|---|---|---|
| まったく鳴らない | 配線ミス、ピン番号の違い、+-の逆 | 配線とスケッチのピン番号を照らし合わせる |
| 「カチッ」としか鳴らない | パッシブブザーに HIGH だけを与えている | tone() で周波数を与える |
| 音程が変わらない | アクティブブザーを使っている | パッシブブザーに替える |
| 音が濁る | アクティブブザーに tone() を使っている | HIGH と LOW で鳴らす |
| 音が小さい | 共振周波数から遠い、抵抗が大きい | 1オクターブ上げる、抵抗値を見直す |
| LED の明るさがおかしい | tone() とPWMのタイマーが重なっている | LED を別のPWMピンに移す |
PWMとのタイマーの干渉
Arduino Uno などでは、tone() が内部のタイマーの一つを使います。このタイマーは、ピン3と11の analogWrite()(PWM)にも使われているため、tone() を使っている間は、これらのピンの PWM が正しく動かなくなります。
LED の明るさを変えたりモーターの速さを調整したりする作品で、音を鳴らした途端に動きがおかしくなる場合は、この干渉を疑います。PWM を使う部品を5、6、9、10番などのほかのピンにつなぎ替えると、解決することが多いです。また、赤外線リモコンを受信するライブラリなど、同じタイマーを使うものとも干渉することがあります。
音の大きさを調整したい
tone() には音量を指定する引数がありません。音を小さくしたい場合は、ブザーと直列に入れる抵抗の値を大きくする、ブザーの穴の上に薄いテープを貼る、といった方法があります。音を大きくしたい場合は、共振周波数に近い音を使う、トランジスタで駆動して電源電圧を上げる、といった方法が考えられますが、部品の定格を超えないように注意しましょう。
ブザーの音は、近くで聞くと思った以上に大きく感じます。耳を近づけて鳴らしたり、夜間に長時間鳴らし続けたりしないように気をつけましょう。家族や近所への配慮として、試すときは短い音から始めると安心です。
一歩進んだ使い方:鳴らしながら別の処理をする
delay()を使わない書き方
メロディを delay() で待つ方法は分かりやすい反面、待っている間はボタンの入力を読んだり、LEDを点滅させたりできません。音を鳴らしながらほかの処理も続けたい場合は、millis() を使って「前の音を鳴らし始めてから何ミリ秒たったか」を確かめ、時間が来たら次の音に進む書き方にします。
unsigned long noteStart = 0;
int noteIndex = 0;
void loop() {
unsigned long now = millis();
if (noteIndex < noteCount && now - noteStart >= durations[noteIndex] * 1.2) {
noteIndex++;
if (noteIndex < noteCount) {
if (melody[noteIndex] == 0) {
noTone(buzzerPin);
} else {
tone(buzzerPin, melody[noteIndex], durations[noteIndex]);
}
noteStart = now;
}
}
// ここでボタンの読み取りやLEDの処理を続けられる
}
この書き方では、loop() は止まらずに回り続け、時間が来たときだけ次の音を鳴らします。最初の音は setup() で鳴らし、noteStart にその時刻を入れておきます。少し複雑に見えますが、時間で状態を切り替える考え方は、ほかの電子工作にも応用できる大切な技術です。
効果音を作ってみる
音の周波数を少しずつ変えていくと、サイレンのような音や、上がっていく効果音を作れます。
for (int f = 500; f <= 2000; f += 20) {
tone(buzzerPin, f);
delay(5);
}
noTone(buzzerPin);
周波数を変える幅と待ち時間を変えるだけで、さまざまな音を作れます。ゲームの効果音やタイマーの終了音など、作品の雰囲気に合わせて工夫してみましょう。
まとめ
Arduino でブザーを鳴らすときは、まず手元のブザーがアクティブかパッシブかを確かめることが出発点です。アクティブはピンを HIGH にするだけで鳴り、パッシブは tone() で周波数を与えて鳴らします。圧電式は電流が小さく直接つなぎやすい一方、電磁式は電流が大きいことがあるので、データシートで確かめてから配線します。音階はラの440Hzを基準に計算でき、配列にまとめるとメロディも組みやすくなります。
最初の一歩として、この記事の見分け用のスケッチを書き込み、手元のブザーがどちらの種類かを確かめてみてください。種類が分かったら、ドレミの8音を順に鳴らすスケッチに進み、音と音の間の長さを変えて、聞こえ方の違いを試してみましょう。
よくある質問
アクティブブザーとパッシブブザーはどう見分けますか?
裏側が樹脂で封じられているものはアクティブ、基板が見えるものはパッシブであることが多いですが、例外もあります。確実なのは、ピンをHIGHにするだけで鳴ればアクティブ、tone()で音程が変わればパッシブと、実際に試して確かめる方法です。
ブザーをArduinoのピンに直接つないでも壊れませんか?
圧電ブザーは流れる電流が小さいため、直接つなぐ例が多く見られます。電磁式のブザーや、電流の大きいモジュールは、ピンの許容電流を超えるおそれがあるので、データシートで電流を確かめ、必要ならトランジスタを介して駆動します。
tone()で鳴らしている間、ほかの処理は止まりますか?
tone()自体は音を出し始めるとすぐに次の行へ進みます。メロディで処理が止まって見えるのは、音の長さを待つためにdelay()を使っているからで、millis()で時間を管理すれば鳴らしながら別の処理もできます。
低い音が小さく、高い音ばかり大きく聞こえるのはなぜですか?
圧電ブザーには、よく響く周波数(共振周波数)があり、多くは数キロヘルツの高めの音です。そこから離れた低い音は小さく聞こえるので、メロディを1オクターブ上げると聞き取りやすくなることがあります。
tone()を使ったらLEDの明るさ調整がおかしくなりました。
Arduino Unoでは、tone()がタイマーの一つを使うため、ピン3と11のanalogWrite()に影響が出ます。LEDは別のPWMピンにつなぎ替えるか、音を鳴らす間だけ影響が出ることを前提に組み立てます。











コメント
まだコメントはありません。最初の感想をどうぞ。