2.3 カラフルライト

このプロジェクトでは、RGB LEDを使用した加法色混合の魅力的な世界について探求します。

RGB LEDは、赤、緑、青の三原色を一つのパッケージに組み合わせています。これら三つのLEDは共通のカソードピンを共有し、各アノードピンが対応する色の強度を制御します。

各アノードに加える電気信号の強度を変えることで、幅広い色を作り出すことができます。たとえば、高強度の赤と緑の光を混ぜると黄色の光が、青と緑の光を混ぜるとシアンが生成されます。

このプロジェクトを通じて、加法色混合の原理を学び、RGB LEDを操作して魅力的で活発な色を表示させることで、私たちの創造力を解き放ちます。

必要な部品

このプロジェクトには以下のコンポーネントが必要です。

キット全体を購入することは非常に便利です。リンクはこちらです:

名前

このキットのアイテム

リンク

ESP32 Starter Kit

320+

ESP32 Starter Kit

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

コンポーネント紹介

購入リンク

ESP32 WROOM 32E

BUY

ESP32カメラ拡張ボード

-

ブレッドボード

BUY

ジャンパーワイヤ

BUY

抵抗器

BUY

RGB LED

BUY

利用可能なピン

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

利用可能なピン

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

回路図

../../_images/circuit_2.3_rgb.png

PWMピンのpin27、pin26、pin25はそれぞれRGB LEDの赤、緑、青のピンを制御し、共通カソードピンをGNDに接続します。これにより、異なるPWM値をこれらのピンに重ねて特定の色をRGB LEDに表示させることができます。

配線図

../../_images/rgb_pin.jpg

RGB LEDには4つのピンがあります:長いピンが共通のカソードピンで、通常はGNDに接続されています。最も長いピンの隣の左側のピンが赤で、右側の二つのピンが緑と青です。

../../_images/2.3_color_light_bb.png

コード

ここでは、お好きな色を描画ソフト(たとえばペイント)で選び、RGB LEDで表示させます。

注釈

  • esp32-starter-kit-main\c\codes\2.3_rgb_led のパスの下にあるファイル 2.3_rgb_led.ino を開けます。

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

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

../../_images/edit_colors.png

color_set() にRGB値を書き込むと、ご希望の色をRGB LEDで点灯させることができます。

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

  1. GPIOピン、PWMチャネル、周波数(Hz)、解像度(ビット)を定義します。

    // Define RGB LED pins
    const int redPin = 27;
    const int greenPin = 26;
    const int bluePin = 25;
    
    // Define PWM channels
    const int redChannel = 0;
    const int greenChannel = 1;
    const int blueChannel = 2;
    
    // Define PWM frequency and resolution
    const int freq = 5000;
    const int resolution = 8;
    
  2. setup() 関数では、指定された周波数と解像度でPWMチャネルを初期化し、その後、LEDピンを対応するPWMチャネルにアタッチします。

    void setup() {
        // Set up PWM channels
        ledcSetup(redChannel, freq, resolution);
        ledcSetup(greenChannel, freq, resolution);
        ledcSetup(blueChannel, freq, resolution);
    
        // Attach pins to corresponding PWM channels
        ledcAttachPin(redPin, redChannel);
        ledcAttachPin(greenPin, greenChannel);
        ledcAttachPin(bluePin, blueChannel);
    }
    

    ここでは 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() 関数は、各色(赤、緑、青、黄色、紫、シアン)を順に切り替え、各色の変更間に1秒のインターバルを設けています。

    void loop() {
        setColor(255, 0, 0); // Red
        delay(1000);
        setColor(0, 255, 0); // Green
        delay(1000);
        setColor(0, 0, 255); // Blue
        delay(1000);
        setColor(255, 255, 0); // Yellow
        delay(1000);
        setColor(80, 0, 80); // Purple
        delay(1000);
        setColor(0, 255, 255); // Cyan
        delay(1000);
    }
    
  4. setColor() 関数は、それぞれのPWMチャネルに適切なデューティサイクル値を書き込むことにより、希望の色を設定します。この関数は赤、緑、青の色の値を整数で3つ受け取ります。

    void setColor(int red, int green, int blue) {
        // For common-anode RGB LEDs, use 255 minus the color value
        ledcWrite(redChannel, red);
        ledcWrite(greenChannel, green);
        ledcWrite(blueChannel, blue);
    }
    
    • void ledcWrite(uint8_t chan, uint32_t duty);: この関数はLEDCチャネルのデューティを設定するために使用されます。

      • chan デューティを書き込むLEDCチャネルの選択。

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