こんにちは!Matsuです。
Arduino、便利ですね。今年は久々に新機種も発売されてますます盛り上がっていますね。
https://ichiken-enArduino UNO R4を購入しました。 | イチケン
さて、今回は新機種ではなくArduino Dueを使って圧電ブザーを鳴らすお話です。
1.圧電ブザーとは

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

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

今回使った圧電ブザーは[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ライブラリが使えなくて困っている人もチラホラいましたのでこの記事がヒントになればよいなという期待も込めて書いてみました。
行き詰まったら一旦落ち着いて、少し視点を変えてみることも大事ですね。
関連記事
-
こんにちは、アバンセシステムのTIGERです。今回は、3Dスキャン技術を使って3Dオブジェク...
公開日:2023.04.14 更新日:2023.04.14
-
はじめまして、アバンセシステムのTIGERです。よろしくお願いします。 今回はRaspber...
公開日:2022.09.09 更新日:2022.09.09
tag : IoT Raspberry Pi
-
ラズパイ実験室 〜いろんなmicroSDで性能を測ってみた〜
こんにちは! IoT時代到来の真っ只中ということで、弊社でも数多くのセンシングデバイスを取り...
公開日:2021.04.30 更新日:2021.06.29
tag : Raspberry Pi
-
WSL2でLocalStackを使ってLambda を実行してみる~実行編~
こんにちは、motoKNです。前回 の続きとなります。 それではローカル環境にLocalSt...
公開日:2023.01.13 更新日:2023.01.13
tag : クラウド
-
こんにちは!Matsuです。 Arduino、便利ですね。今年は久々に新機種も発売されてます...
公開日:2023.10.06 更新日:2023.10.06
-
WSL2でLocalStackを使ってLambda を実行してみる~構築編~
こんにちは。ラボ記事投稿2回目のmotoKNです。 私自身、今のところ業務でクラウド環境を使...
公開日:2022.09.23 更新日:2022.12.08
tag : クラウド