Arduino IDEを使ってESP-WROOM-32(ESP32)のPWMを制御するプログラムを書く方法を記載します。
PWMとは
PWM(Pulse Width Modulation)は、次の図のような周期的なパルス信号を生成し、1になっている時間と0になっている時間の比率(デューティー比)を変えることで送信する電力を変化させます。

LEDの点灯にPWMを使うと、1になっている時間が短いと人間の目にはLEDが暗くなったように見え、時間が長いと明るく見えます。
PWMを使う場合、2つの値を指定します。
- パルスの周期
- デューティー比
ESP-WROOM-32をArduino IDEでプログラムする場合、LEDCライブラリを使ってPWMを制御します。LEDCでは上記2つの値を指定するために3つの値を使います。
- パルスの周期(Hzで指定)
- 1周期に含まれる目盛の数(ビット数で指定。10bitなら1024目盛。最大は16bit。)
- 1になっている時間の長さ(上記の目盛で指定。10bit目盛の場合は0〜1023の値。)
また、LEDCではどのチャンネルを使うかを指定します。チャンネルは0〜15の16個あります。

LEDの明るさを制御するプログラム例
LEDをだんだん明るくし、輝度が最大になったら、今度はだんだん暗くする動作を繰り返すプログラムです。setup( )関数内のledcSetup( )関数でパラメータを設定し、ledcAttachPin( )関数で使用するピンを指定しています。loop( )関数内では、ledcWrite( )関数でLEDの明るさを変更しています。
#define PIN 23
// LEDCのパラメータ設定
// LEDC_CHANNEL : チャンネル : 0
// LEDC_RESOLUTION_BITS: 目盛数 : 10bit (0〜1023)
// LEDC_FREQUENCY : 周波数 : 50Hz (= 20ms周期)
#define LEDC_CHANNEL 0
#define LEDC_RESOLUTION_BITS 10
#define LEDC_FREQUENCY 50
const int32_t min = 0;
const int32_t max = 1023;
const int32_t delta = 32;
int32_t i;
void setup() {
Serial.print("PIN = ");
Serial.println(PIN);
ledcSetup(LEDC_CHANNEL, LEDC_FREQUENCY, LEDC_RESOLUTION_BITS);
ledcAttachPin(PIN, LEDC_CHANNEL);
}
void loop() {
for (i = min; i < max; i += delta) {
ledcWrite(LEDC_CHANNEL, (uint32_t)i);
delay(50);
}
for (i = max; i > min; i -= delta) {
ledcWrite(LEDC_CHANNEL, (uint32_t)i);
delay(50);
}
}
