You are here

ESP32: BlynkでPWM機能を使ったLEDの明るさ制御と音の出力

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に設定する仮想端子の割り当てを示します。


  • V15: 圧電スピーカー(0-3000)
  • V16: LED1(0-255)
  • V17: LED2(0-255)

3端子とも、[SEND ON RELEASE]をOFFにします。

スマートフォンのBlynkアプリ


使用パーツ


開発ソフト: 
チップファミリー: 
MCUチップ: