前回はアクティブブザーを使用しながらトランジスタについて学びました。
今回はパッシブブザーを使用して音のトーンをコントロールしてみましょう。
回路はアクティブブザーからパッシブブザーに置き換えるだけです。
ボタンを押すとブザーが鳴り、ボタンを離すとブザーは鳴り止みます。論理的にはボタンによるLEDの制御と同じですが、制御方法においては、パッシブブザーを鳴らすためには特定の周波数のPWM信号が必要です。
【注意】
今回のプログラムは実行するとかなり大きな音が鳴りますのでご注意ください。
コード
/**********************************************************************
Filename : Alertor
Description : Control passive buzzer by button.
Auther : www.freenove.com
Modification: 2022/10/20
**********************************************************************/
#define PIN_BUZZER 14
#define PIN_BUTTON 21
#define CHN 0 //define the pwm channel
void setup() {
Serial.begin(115200);
pinMode(PIN_BUTTON, INPUT);
pinMode(PIN_BUZZER, OUTPUT);
Serial.printf("setup: %f \n", ledcSetup(CHN, 1, 10)); //setup pwm channel
Serial.printf("write: %f \n", ledcWriteTone(CHN, 0));
ledcAttachPin(PIN_BUZZER, CHN); //attach the led pin to pwm channel
ledcWriteTone(CHN, 2000); //Sound at 2KHz for 0.3 seconds
delay(300);
}
void loop() {
if (digitalRead(PIN_BUTTON) == LOW) {
alert();
} else {
ledcWriteTone(CHN, 0);
}
}
void alert() {
float sinVal; // Define a variable to save sine value
int toneVal; // Define a variable to save sound frequency
for (int x = 0; x < 360; x += 10) { // X from 0 degree->360 degree
sinVal = sin(x * (PI / 180)); // Calculate the sine of x
toneVal = 2000 + sinVal * 500; // Calculate sound frequency according to the sine of x
ledcWriteTone(CHN, toneVal);
delay(10);
}
}
パッシブブザーを鳴らすには特定の周波数のPWM信号が必要なので、ledcSetup() 関数を使ってPWMチャネルを作成する必要があります。この用途の場合、可変周波数でデューティ比が50%に固定された方形波を生成できるledcWriteTone() 関数がブザーの制御に適しています。
setup()関数内でledcの初期化とピンのアタッチを行い、2KHzの音を0.3秒だけ鳴らして初期化を終えています。
メインループについては説明不要だと思います。
alert()関数を見てみましょう。
void alert() {
float sinVal; // Define a variable to save sine value
int toneVal; // Define a variable to save sound frequency
for (int x = 0; x < 360; x += 10) { // X from 0 degree->360 degree
sinVal = sin(x * (PI / 180)); // Calculate the sine of x
toneVal = 2000 + sinVal * 500; // Calculate sound frequency according to the sine of x
ledcWriteTone(CHN, toneVal);
delay(10);
}
}
メイン関数のwhileループ内にて、ボタンが押された場合、サブ関数 alert() が呼び出され、アラーム音が発せられます。アラーム音の周波数変化は、正弦波(サインカーブ)に基づいています。そのため、 0度から360度までの正弦波の値を計算し、それに特定の係数 (ここでは 500) を乗算した値に、ブザーの共振周波数を足しています。
プログラムとしては10ミリ秒間隔で音のトーンを変えていますが、実際に聞いてみるとサイレンのようなうねる音が連続しているように聞こえると思います。
どのくらい間隔をあけると連続性を感じなくなるのか実験してみてもおもしろそうですね!
【注意】
今回のプログラムは実行するとかなり大きな音がなりますので、ご注意ください。
次回はESP32-S3とシリアル通信を行ってみましょう。
コメント