Project 7.2 パッシブブザーと正弦波/Alertor

前回はアクティブブザーを使用しながらトランジスタについて学びました。

あわせて読みたい
Project 7.1 トランジスタとアクティブブザー/Doorbell 前回はFreenove 8 RGB LEDモジュールを七色にグルグル光らせました。 https://kaneshige.org/?p=292 今回は『ボタンを押したらブザーが鳴る』を作ります。 【ブザーにつ...

今回はパッシブブザーを使用して音のトーンをコントロールしてみましょう。

回路はアクティブブザーからパッシブブザーに置き換えるだけです。

ボタンを押すとブザーが鳴り、ボタンを離すとブザーは鳴り止みます。論理的にはボタンによる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とシリアル通信を行ってみましょう。

あわせて読みたい
Project 8.1 シリアル通信/Serial Print 前回はパッシブブザーを使用して音のトーンをコントロールしてみました。 https://kaneshige.org/?p=308 今回はESP32-S3とのシリアル通信について学びます。ESP32-S3と...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

金重総合研究所の主席研究員。
子供の頃から研究者を目指し、ライフワークとして日々様々な研究をしています。
経営・マネジメント・金融・DXあたりが本職です。
私を採用したい人、私と一緒に働きたい人、一緒に知識を肥やしていきたい人はぜひお声がけ下さい。

コメント

コメントする

目次