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); } }