2.2 フェーディング

前回のプロジェクトでは、デジタル出力を使用してLEDをオン/オフすることで制御しました。今回のプロジェクトでは、パルス幅変調(PWM)を活用してLEDに呼吸効果を作り出します。PWMは、正方形波信号のデューティ比を変えることで、LEDの明るさやモーターの速度を制御する技術です。

PWMでは、LEDを単純にオン/オフする代わりに、各サイクル内でLEDがオンになる時間とオフになる時間の割合を調整します。LEDを迅速にオン/オフする間隔を変えながら切り替えることで、LEDが徐々に明るくなったり暗くなったりする錯覚を生み出し、呼吸効果を模倣します。

ESP32 WROOM 32EのPWM機能を使用することで、LEDの明るさをスムーズかつ正確に制御できます。この呼吸効果は、プロジェクトにダイナミックで視覚的に魅力的な要素を加え、目を引くディスプレイや雰囲気を作り出します。

必要な部品

このプロジェクトには、以下の部品が必要です。

一式を購入することは非常に便利です。こちらがリンクです:

名前

このキットのアイテム

リンク

ESP32 Starter Kit

320+

ESP32 Starter Kit

以下のリンクから個別に購入することもできます。

コンポーネントの紹介

購入リンク

ESP32 WROOM 32E

BUY

ESP32カメラ拡張ボード

-

ブレッドボード

BUY

ジャンパーワイヤ

BUY

抵抗器

BUY

LED

BUY

利用可能なピン

こちらは、このプロジェクトのためのESP32ボード上で利用可能なピンのリストです。

利用可能なピン

IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23

回路図

../../_images/circuit_2.1_led.png

このプロジェクトは最初のプロジェクト 2.1 LEDを点灯させよう と同じ回路ですが、シグナルタイプが異なります。最初のプロジェクトはピン26からデジタルの高/低レベル(0&1)を直接出力してLEDを点灯/消灯させるもので、このプロジェクトはピン26からPWM信号を出力してLEDの明るさを制御します。

配線図

../../_images/2.1_hello_led_bb.png

コード

注釈

  • ファイル 2.2_fading_led.ino をパス esp32-starter-kit-main\c\codes\2.2_fading_led 以下から開けます。

  • ボード(ESP32 Dev Module)と適切なポートを選択した後、 Upload ボタンをクリックします。

  • "Unknown COMxx"が常に表示されますか?

コードのアップロードに成功すると、LEDが呼吸するのを見ることができます。

どのように動作するのか?

  1. 定数と変数を定義します。

    const int ledPin = 26; // The GPIO pin for the LED
    int brightness = 0;
    int fadeAmount = 5;
    
    • ledPin: LEDが接続されているGPIOピン番号(ここではGPIO 26)。

    • brightness: LEDの現在の明るさレベル(初期設定は0)。

    • fadeAmount: 各ステップでLEDの明るさが変わる量(5に設定)。

  2. PWMチャンネルを初期化し、LEDピンを設定します。

    void setup() {
        ledcSetup(0, 5000, 8); // Configure the PWM channel (0) with 5000Hz frequency and 8-bit resolution
        ledcAttachPin(ledPin, 0); // Attach the LED pin to the PWM channel
    }
    

    ここでは LEDC (LED制御)周辺機器を使用します。これは主にLEDの明るさを制御するために設計されていますが、他の目的でPWM信号を生成するためにも使用できます。

    • uint32_t ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);: この関数はLEDCチャンネルの周波数と解像度を設定するために使用されます。LEDCチャンネルに対して設定された``frequency``を返します。0が返された場合はエラーが発生し、LEDCチャンネルが設定されませんでした。

      • channel 設定するLEDCチャンネルを選択します。

      • freq PWMの周波数を選択します。

      • resolution_bits LEDCチャンネルの解像度を選択します。範囲は1-14ビットです(ESP32の場合は1-20ビット)。

    • void ledcAttachPin(uint8_t pin, uint8_t chan);: この関数はピンをLEDCチャンネルにアタッチするために使用されます。

      • pin GPIOピンを選択します。

      • chan LEDCチャンネルを選択します。

  3. loop() 関数にはプログラムの主要なロジックが含まれており、連続して実行されます。LEDの明るさを更新し、明るさが最小値または最大値に到達した際にfadeAmountを反転させ、遅延を導入します。

    void loop() {
         ledcWrite(0, brightness); // Write the new brightness value to the PWM channel
         brightness = brightness + fadeAmount;
    
         if (brightness <= 0 || brightness >= 255) {
             fadeAmount = -fadeAmount;
         }
    
         delay(50); // Wait for 20 milliseconds
         }
    
    • void ledcWrite(uint8_t chan, uint32_t duty);: この関数はLEDCチャンネルのデューティを設定するために使用されます。

      • chan デューティを設定するLEDCチャンネルを選択します。

      • duty 選択されたチャンネルに設定するデューティを選択します。