ESP32でLEDをPWD制御

はじめに

LEDを遠隔操作で調光する方法を探していたら、Raspberry PiもいいけどArduinoでいいじゃないか、ということで衝動買いしてしまいました。

買ってはみたものの、さっぱり使い方が分からないので調べまくり、何とかLチカならぬLぬるチカまではできたのでメモしておきます。

ESP32-WROOM-32 開発ボード

買った商品は以下です。

ESPRESSIF社が開発したESP-WROOM-32に、USBやスイッチなどをプラスしてすぐに使えるようにした開発ボードです。
技適を取得済な上に90日間の無条件に返品返金保証付きなので、初心者でも安心。

開発ボードについてはGitHub-LuaNodeを参照

注意

  • ESP-WROOM-32モジュールのみで購入すると、USB-シリアル変換モジュールやスイッチなどの入手&はんだ付けが必要になります
  • 名前も見た目も似ているESP-WROOM-02(ESP8266)はBluetoothが使えません

接続

今回はLEDをPWMで光らせるというシンプルプロジェクトなので、回路もシンプル。
開発ボードとブレッドボード1枚のみで完結します。

D5→LED→抵抗→GND

プログラム

せっかくなので2次関数的に変化させています。
今後遠隔操作させることを考えて、ONとOFFを関数に分けて、変数もたくさん用意しました。

※素人が書いています。信用しないように。

const int ledPin = 5; //PWMピンの指定
static uint8_t brightness = 0; //明るさの初期値
const uint8_t brightnessMin = 0; //明るさの最小値(>=0)
const uint8_t brightnessMax = 127; //明るさの最大値(<=255)
const float powerTurnStep = 0.5; //明るさ変化度合(>0, <=255)
const int powerTurnDelay = 10; //明るさ変化の待ち時間ms

void setup() {
ledcSetup(0, 12800, 8); //PWMで利用するチャネルを設定
ledcAttachPin(ledPin, 0); //PWMで利用するピンとチャネルを結びつける
}

void loop() {
powerON();
powerOFF();
}

void powerON(){
float i;
if(brightness == 0){
brightness = brightnessMin;
}
i = round(255*brightness/brightnessMax);
while(brightness < brightnessMax){
brightness = round(i*i/255);
if(brightness > brightnessMax){
brightness = brightnessMax;
}
ledcWrite(0, brightness);
i+=powerTurnStep;
delay(powerTurnDelay);
}
}

void powerOFF(){
float i;
if(brightness == 0){
i = 0;
}else{
i = round(255*brightness/brightnessMax);
}
while(brightness > 0){
brightness = round(i*i/255);
if(brightness < brightnessMin){
brightness = 0;
}
ledcWrite(0, brightness);
i-=powerTurnStep;
delay(powerTurnDelay);
}
}

最後に

次はBluetoothで制御してみるか、アクアリウム用の照明に接続してみようと思います。