スポンサーリンク
ものづくり・DIY

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ピンにつなぎ替えるか、音を鳴らす間だけ影響が出ることを前提に組み立てます。

コメント

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

個人情報(本名・住所・電話番号など)やリンクの書き込みはご遠慮ください。内容によっては表示しないことがあります。プライバシーポリシー

スポンサーリンク
  1. 秋の戸口に並ぶかぼちゃの明かりとかぶ、麦束
  2. 資料を手に落ち着いて話し合う二人
  3. ノートパソコンと資料、外付け記憶装置がある机
  4. 冬の木で越冬する卵のうやミノムシ、テントウムシ
  5. 青い折り鶴と三角に折った紙、無地の折り紙