ESP32のPWM機能を利用して、LEDの明るさを制御するとともに、ピエゾスピーカー(圧電サウンダー)の音を鳴らしてみましょう。
使用するボードはESP32-DEVC-HOMEです。
http://www.microfan.jp/esp32/esp32-devc-home
現時点では、ESP32用のArduinoでは、analogWrite()やTone()関数がないため、LEDの明るさを調整しようと思ったり、ピエゾスピーカーで音を出そうと思っても、手軽な手段がなく途方に暮れてしまいますね。
ESP8266やArduino UNOだと、スマートフォンのBlynkアプリでSliderなどを使うと、PWMが使えるデジタルピンにはPWMという表記がついており、そのようなピンを選択することで、気軽にPWM(analogWrite())出力ができたのですが、現状のESP32ではPWM表記の付いたデジタルピンはありません。
また、スケッチにTone()関数を記述してもコンパイルエラーになり、手軽に音を出すことができません。
ここでは、現状ではanalogWrite()やTone()に代わって使えるLEDC Driver機能を利用した例を示します。
https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32...
ESP32のLEDC Driver機能で利用できるPWMを使って、LEDにかける電圧のデューティー比を変えるのと、ピエゾスピーカーに出力する信号の周波数を変えます。
#define BLYNK_PRINT Serial #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h> // BlynkのAuth Tokenを設定 char auth[] = "YOURAPPAUTHTOKEN" ; char ssid[] = "YOURSSID" ; char pass[] = "YOURPASSWORD" ; #define SOUNDER 15 #define LED1 16 #define LED2 17 // PWM制御用のチャネルは16あり、その最初の3個を使います #define LEDC_CHANNEL_0 0 #define LEDC_CHANNEL_1 1 #define LEDC_CHANNEL_2 2 #define LEDC_TIMER_8_BIT 8 #define LEDC_TIMER_13_BIT 13 #define LEDC_BASE_FREQ 5000 void setup() { // Debug console Serial.begin(115200) ; // LEDのPWM制御の初期化 ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_8_BIT) ; // 8ビット精度で制御 ledcAttachPin(LED1, LEDC_CHANNEL_0) ; // CH0をLED1に ledcWrite(LEDC_CHANNEL_0, 0) ; // 消灯 ledcSetup(LEDC_CHANNEL_1, LEDC_BASE_FREQ, LEDC_TIMER_8_BIT) ; // 8ビット精度で制御 ledcAttachPin(LED2, LEDC_CHANNEL_1) ; // CH1をLED2に ledcWrite(LEDC_CHANNEL_1, 0) ; // 消灯 // SOUNDERのTONE出力の初期化 ledcSetup(LEDC_CHANNEL_2, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT) ; // 13ビット精度で制御 ledcAttachPin(SOUNDER, LEDC_CHANNEL_2) ; // CH2をSOUNDERに ledcWriteTone(LEDC_CHANNEL_2, 0.0) ; // 消音 Blynk.begin(auth, ssid, pass) ; Blynk.syncAll() ; } // LED1:GPIO16 - V16の範囲は0~255 BLYNK_WRITE(LED1) { int bright = param.asInt() ; ledcWrite(LEDC_CHANNEL_0, bright) ; } // LED2:GPIO17 - V17の範囲は0~255 BLYNK_WRITE(LED2) { int bright = param.asInt() ; ledcWrite(LEDC_CHANNEL_1, bright) ; } // SOUNDER:GPIO15 - V15の範囲は0~3000ぐらい BLYNK_WRITE(SOUNDER) { double hz = param.asDouble() ; ledcWriteTone(LEDC_CHANNEL_2, hz > 100.0 ? hz : 0.0) ; } void loop() { Blynk.run() ; }
スケッチでは、LEDと音の変更用の3個のBLYNK_WRITE()を定義します。
BLYNK_WRITE()の引数は通常V0,V1,...のようになっていますが、ここでは、GPIOのピン番号を指定しました。
V0,V1,...はBlynkのヘッダーファイルの中で、V0は0,V1は1に定義されています。
このため、今回のスケッチのように指定しても問題なく利用できます。この方が分かり易いですよね。
スマートフォンのBlynkアプリでは、LEDの明るさや音の周波数を、連続的に変えられるようにSliderを使用します。以下にSliderに設定する仮想端子の割り当てを示します。
スマートフォンのBlynkアプリ