ESP32 Arduino開発 #3 PWM制御|ブザーでドレミファソラシドを鳴らす

ESP32 Arduino開発 #3 PWM制御|ブザーでドレミファソラシドを鳴らす

今回はESP32を使って、PWM制御を行い、ブザーを鳴らそうと思います。

手順も記載してますので、ぜひ実践してみてください。

ちなみに前回は、ESP32のIO制御のサンプルになりますので、こちらも良かったらご覧になって頂けたらと思います。

概要

やりたいこと

以下の事をやりたいと思います。

  • 電源を入れたら、ブザーを鳴らす。
  • ブザーの音は、ドレミファソラシド~♪

図面・配線

HW担当より、以下のように配線して頂きました。ありがとうございます!

今回は、ブザーのみ使用します。

  • ブザー・・・P2

用語解説

PWM

PWMとは、Pulse Width Modulationの略で、波長のような制御を行います。
細かい部分で見ると、ONとOFFを一定間隔で繰り返しているだけです。
ここで周波数といった名前が登場しますが、ONの長さの事を指します。
ブザーにとっての周波数とは、ドレミの音階を指定することができることになります。

ESP32では、PWM制御の関数が用意されております。(ledcSetup、ledcAttachPin、ledcWriteTone)

チャネル

PWM制御(ledcSetup、ledcAttachPin、ledcWriteTone)の引数に、チャネルというものがあります。
チャネルとは、ただの内部的な番号です。(0~15)
例えば、ブザー2個つなげたとき、それぞれ別の番号を指定するようにしてください。(例:ブザー1つ目にはチャネル0番を割り当てて、ブザー2つ目にはチャネル1番に割り当てて使用する等)
この2個をソフト内で区別するために用意されております。
ピン番号で区別できていれば不要なのでは?と思うかもしれませんが、これはメモリ管理の都合上でそうなっていると思って頂ければと思います。
ピン番号は、ハードウェア面で区別し、チャネル番号は、ソフトウェア面で区別して使っているというイメージでよいと思います。

作成手順

開発環境

開発環境は、Arduino IDEを使用します。
Arduino IDEはオープンソースですので無料でダウンロード&インストール可能です。
プログラミング言語はC++です。

※今回使用したESP32開発ボードは、「Node MCU ESP32」です。
※環境設定などは省略いたします。各ESP32開発ボードのマニュアルに従って設定してください。

ESP32側のプログラミング

  • PWMのチャネル番号を新たに作成します。
  • ブザーのピン番号と、PWMのチャネルを連動させます。
  • 周波数を指定して、音を鳴らします。
  • 0.5秒間隔で、ドレミファソラシドと鳴らします。

以下、サンプルコードになります。

#define BUZZER_PIN 2              // ブザーのピン番号
#define BUZZER_CHANEL 0           // ブザーのチャネル番号

#define BEAT 500                  // 音の長さ(0.5秒間隔)

void setup() {
  ledcSetup(BUZZER_CHANEL, 12000, 8);
  ledcAttachPin(BUZZER_PIN, BUZZER_CHANEL);

  ledcWriteTone(BUZZER_CHANEL, 262); // ド
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 294); // レ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 330); // ミ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 349); // ファ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 392); // ソ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 440); // ラ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 494); // シ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 523); // ド
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 587); // レ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 659); // ミ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 698); // ファ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 784); // ソ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 880); // ラ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 988); // シ
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 1049); // ド
  delay(BEAT) ;
  ledcWriteTone(BUZZER_CHANEL, 0);    // 消音
}
void loop()
{
}

ESP32へ書込み

  • 使用したESP32開発ボードは、「Node MCU ESP32」ですので、メニュー「ツール」-「ボード」の項目は、「NodeMCU-32S」を選択しました。(※1)
  • シリアルポートは、ESP32をUSBでPCと接続すると、COM番号が追加されるので、それを選択します。
  • 書込みは、ツールボックスの「⇒」右矢印ボタンで開始します。
  • ESP32開発ボードの、右側のボタン(IO0)長押しすると、書込み開始するので、直後にボタンを離します。(※2)
  • 書込みが開始されます。

(※1)他のESP32っぽい名前の項目がありますが、書込みできない場合があります。製品のマニュアルをご確認ください。

(※2)機種によって書込み操作が違う場合があります。例えば、IO0ボタン押しながらEN(リセット)ボタンを押さないと書込みできない場合もあります。

実行結果

電源を入れると、0.5秒間隔で、

ド~レ~ミ~ファ~ソ~ラ~シ~ド~レ~ミ~ファ~ソ~ラ~シ~ド~♪

と鳴ります。

最後に

ESP32で、ブザーの制御(PWMの制御)が行えたことが確認できました。
これを元に、好きなメロディーを流してみてはどうでしょうか。

PWMの制御は、ブザーだけでなく、LEDの明るさの制御にも使えます。(関数名にもledcなんて付いてるだけに)
部屋のLED照明(LEDシーリングライトなど)の明るさ調整も、ON/OFFの繰り返しの幅で調整していたわけなんですね。
前回のサンプルコードで、LEDのI/O制御をしているのがありますので、これをPWM制御に置き換えて試してみるのも良いかもしれません。

次回は、今までのボタン・LED・ブザーを組み合わせたサンプルを紹介しておりますので、良かったらこちらもご覧になってください。

最後までご覧頂きましてありがとうございました。

ハードな疑問にもソフトに対応します!【無料相談】
ご相談はコチラ
ハードな疑問にもソフトに対応します!【無料相談】
ご相談はコチラ