Avance.Lab

実験

Arduino Dueで圧電ブザーを鳴らしてみる

公開日:2023.10.06 更新日:2023.10.06

tag: ArduinoIoT組み込み

こんにちは!Matsuです。

Arduino、便利ですね。今年は久々に新機種も発売されてますます盛り上がっていますね。

https://ichiken-enArduino UNO R4を購入しました。 | イチケン

さて、今回は新機種ではなくArduino Dueを使って圧電ブザーを鳴らすお話です。

1.圧電ブザーとは

圧電ブザーの例

圧電ブザーとは、いわゆる「ビー」となる一般的なブザーです。

圧電ブザーにはマイコンから見ておおまかに2種類あり、自励式のブザーと他励式のブザーがあります。
自励式のブザーの場合は、マイコンからHIGH(5Vや3.3Vの信号)を送るだけで勝手に音が鳴ってくれるので、鳴らすのは楽です。
一方、他励式のブザーの場合は、鳴らしたい音の周波数に合わせて、マイコンからHIGHとLOの信号をいちいち切り替えてあげないといけません。1kHzの音を鳴らしたい場合、1秒あたり1000回切り替えるわけです。その代わり、切り替える回数を調整することで音の高低を比較的自由に変えることができます。

Arduino dueに圧電ブザーを接続した写真

配線は次のようにしています。

今回使った圧電ブザーは[GND] [I/O] [VCC]の3ピンのものでしたが、[GND]と電源の2ピンのみのものも多いです。その場合は、GNDは同様に、電源線は13番ピンに接続します。

2.Toneライブラリ

秒間1000回も2000回もHIGHとLOを切り替えないといけないとなると、意外と面倒ですね。自前でやろうとするとループでHIGHとLOを切り替えるのが一番楽ですが、鳴らしながら他のことをしたい場合はなかなかそうもいきません。

Arduinoにはさまざまなライブラリが公開されており、圧電ブザーを鳴らすのにちょうどいいライブラリもあります。今回は、Toneライブラリというものを使ってみることにします。これはArduinoで圧電ブザーを鳴らす場合の定番ライブラリのようです。

https://github.com/bhagman/Tone

Toneライブラリでブザーを鳴らすサンプルコードを次に記載します。

#include <Tone.h>

#define TONE_PIN 13

Tone tone1;

void setup() {
  tone1.begin(TONE_PIN);
}

void loop() {
}

これは簡単でいいですね。

さて、実行…したいのですが、なんと次のエラーが出てしまいコンパイルできません。

error: 'tone1' was not declared in this scope

動けば便利なToneライブラリですが、よく見てみると、残念ながら今回使っているArduino Dueには対応していないのです!(uno等のAVR系のArduinoには対応しているようです)

3.PWMライブラリで音を鳴らす

さてどうしましょう…

ところで、Arduinoは、PWM(Pulse Width Modulation)という機能に対応しています。PWMとは、出力ピンのHIGHとLOを高速で切り替えることで、擬似的に信号の強さを変更する機能です。 LEDの明るさ制御やモータ制御など、信号の強さを自在に変えたい用途で使われています。

さきほどのToneライブラリも、実はこのPWM機能を使って音を鳴らしています。Toneライブラリがダメなら他の手段でPWM機能を使えばいいのです。

というわけで、Arduino Dueに対応しているPWMライブラリを探します。

Arduino IDEから探してみると… SAMDUE_PWMというライブラリがありました。

https://github.com/khoih-prog/SAMDUE_PWM

名前からしてDueに対応していそうですね。確認してみるとちゃんとArduino Dueに対応していました。これを使って鳴らしてみます。

サンプルコードは次のようになります。

#include <SAMDUE_PWM.h> 

SAMDUE_PWM* PWM_Instance;

#define TONE_PIN 13

float frequency = 2000.0f;
float dutyCycle = 0.0f;

void setup() {
  PWM_Instance = new SAMDUE_PWM(TONE_PIN, frequency, dutyCycle);
}

void loop() {
  delay(500);

  dutyCycle = 50.0f;
  PWM_Instance->setPWM(TONE_PIN, frequency, dutyCycle);

  delay(500);

  dutyCycle = 0.0f;
  PWM_Instance->setPWM(TONE_PIN, frequency, dutyCycle);

}

はい、これで無事鳴らすことができました!サンプルコードでは、0.5秒ごとに「鳴らす→止める」を繰り返すようにしてみました。

setPWMを呼び出し、frequencyに周波数(音の高さ)、dutyCycleに0~100%で音の強さを指定するとダイナミックに音程や音の強さを変更できます。便利ですね。

4.まとめ

今回は、圧電ブザーを鳴らそうとしましたが、検索して出てきた定番のToneライブラリがArduino Dueに未対応で困ってしまいました。そこで、Arduinoがどういう機能を使って圧電ブザーを鳴らしているいるかを考えた結果、別のライブラリで簡単に実現することができました。
検索したところ、実際にArduino Dueでtoneライブラリが使えなくて困っている人もチラホラいましたのでこの記事がヒントになればよいなという期待も込めて書いてみました。

行き詰まったら一旦落ち着いて、少し視点を変えてみることも大事ですね。

Matsu
Matsu

最近ガレージをつくってDIYにハマってしまう。
無限に欲しくなる電動工具が怖い。

関連記事