2.2 LEDのフェード効果

前回のプロジェクトでは、デジタル出力を使って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! と同じ回路ですが、信号の種類が異なります。最初のプロジェクトではpin26から直接デジタルの高低レベル(0&1)を出力してLEDを点灯または消灯させますが、このプロジェクトではpin26からPWM信号を出力してLEDの明るさを制御します。

配線図

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

コード

注釈

  • esp32-starter-kit-main\micropython\codes パスにある 2.2_fading_led.py ファイルを開くか、コードをThonnyにコピー&ペーストしてください。その後、「現在のスクリプトを実行」をクリックするかF5キーを押して実行します。

  • 右下の角にある「MicroPython (ESP32).COMxx」インタープリターを選択してください。

# Import the necessary libraries
from machine import Pin, PWM
import time

# Create a PWM object
led = PWM(Pin(26), freq=1000)

while True:
    # Gradually increase brightness
    for duty_cycle in range(0, 1024, 1):
        led.duty(duty_cycle)
        time.sleep(0.01)

    # Gradually decrease brightness
    for duty_cycle in range(1023, -1, -1):
        led.duty(duty_cycle)
        time.sleep(0.01)

コードが実行されると、LEDは徐々に明るくなります。

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

このコードは、PWM信号を使用してLEDの明るさを制御する方法を示しています。

  1. machinetime の2つのモジュールをインポートします。 machine モジュールはマイクロコントローラのハードウェアに低レベルでアクセスするためのものであり、 time モジュールは時間に関連する操作のための関数を提供します。

    import machine
    import time
    
  2. 次に、ピン26に接続されたLEDを制御するための PWM オブジェクトを初期化し、PWM信号の周波数を1000 Hzに設定します。

    led = PWM(Pin(26), freq=1000)
    
  3. ループを使用してLEDを徐々に明るくしたり暗くしたりします:外側の while True ループは無限に実行されます。2つのネストされた for ループを使用して、LEDの明るさを徐々に増減します。デューティサイクルは0から1023の範囲で、0%から100%のデューティサイクルを表します。

    # Import the necessary libraries
    from machine import Pin, PWM
    import time
    
    # Create a PWM object
    led = PWM(Pin(26), freq=1000)
    
    while True:
        # Gradually increase brightness
        for duty_cycle in range(0, 1024, 2):
            led.duty(duty_cycle)
            time.sleep(0.01)
    
        # Gradually decrease brightness
        for duty_cycle in range(1023, -1, -2):
            led.duty(duty_cycle)
            time.sleep(0.01)
    
    • range(): 0から1023までの整数のシーケンスを作成します。

    • PWM オブジェクトの duty() メソッドを使用して、シーケンスの各値にPWM信号のデューティサイクルを設定します。

    • time.sleep(): ループの各反復の間にプログラムの実行を10ミリ秒間一時停止し、時間の経過とともに徐々に明るさを増加させます。