2.7 RGB LEDストリップ

このプロジェクトでは、WS2812 LEDストリップの駆動と、鮮やかな色彩の展示を目指します。ストリップ上の各LEDを個別に制御する能力により、視覚を魅了するライティングエフェクトを作り出すことができます。

さらに、このプロジェクトにはランダム性の世界を探求するというワクワクする拡張機能を含んでいます。ランダムな色を導入し、流れるような光のエフェクトを実装することで、見る者を魅了する幻想的なビジュアル体験を創出します。

必要な部品

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

一式を購入するのが便利です。こちらがリンクです:

名前

このキットのアイテム

リンク

ESP32 Starter Kit

320+

ESP32 Starter Kit

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

コンポーネントの紹介

購入リンク

ESP32 WROOM 32E

BUY

ESP32カメラ拡張ボード

-

ジャンパーワイヤ

BUY

WS2812 RGB 8 LED ストリップ

BUY

回路図

../../_images/circuit_2.7_ws2812.png

利用可能なピン

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

利用可能なピン

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

注釈

IO33はこのプロジェクトでは使用できません。

WS2812 LEDストリップは、正確なパルス幅変調(PWM)信号を要求するタイプのLEDストリップです。PWM信号は時間と電圧の両方で厳密な要求があります。例えば、WS2812の「0」ビットは約0.4マイクロ秒のハイレベルパルスに対応し、「1」ビットは約0.8マイクロ秒のハイレベルパルスに対応します。これは、ストリップが高周波の電圧変化を受け取る必要があることを意味します。

しかし、IO33に4.7Kのプルアップ抵抗と100nfのプルダウンコンデンサーをつけると、簡単なローパスフィルターが作成されます。このタイプの回路は、コンデンサーが電圧変化を受けたときに充電と放電をする時間が必要なため、高周波信号を「平滑化」します。そのため、信号があまりにも速く変化する(つまり、高周波である)場合、コンデンサーは追い付けず、結果として出力信号がぼやけて、ストリップに認識不可能になります。

配線図

../../_images/2.7_rgb_strip_bb.png

コード

注釈

  • esp32-starter-kit-main\c\codes\2.7_rgb_strip のパスの下にあるファイル 2.7_rgb_strip.ino を開くか、このコードを Arduino IDE にコピーしてください。

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

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

  • ここでは Adafruit NeoPixel ライブラリが使用されています。これは Library Manager からインストールできます。

    ../../_images/rgb_strip_lib.png

コードが正常にアップロードされると、ストリップのLEDが順に黄色で点灯し、次に消灯し、単純なチェイス効果を作り出します。

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

  1. Adafruit NeoPixelライブラリを含める:この行はAdafruit NeoPixelライブラリをインポートし、LEDストリップを制御するためにその関数やクラスをスケッチで使用できるようにします。

    #include <Adafruit_NeoPixel.h> // Include the Adafruit NeoPixel library
    
  2. LEDストリップのための定数を定義します。

    #define LED_PIN 13 // NeoPixel LED strip
    #define NUM_LEDS 8 // Number of LEDs
    
  3. Adafruit_NeoPixelクラスのインスタンスを作成します。

    // Create an instance of the Adafruit_NeoPixel class
     Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
    

    この行は Adafruit_NeoPixel クラスの strip というインスタンスを作成し、LEDの数、LEDストリップに接続されたピン、および信号パラメータ(GRBカラーオーダーと800 kHzのデータレート)で設定します。

    • Adafruit_NeoPixel (uint16_t n, int16_t p = 6, neoPixelType t = NEO_GRB + NEO_KHZ800)

    長さ、ピン、ピクセルタイプがコンパイル時に既知の場合のNeoPixelコンストラクタ。Adafruit_NeoPixelオブジェクトを返します。使用前に begin() 関数を呼び出してください。

    • n: ストランド内のNeoPixelの数。

    • p: NeoPixelデータを駆動するArduinoピン番号。

    • t: ピクセルタイプ - Adafruit_NeoPixel.h で定義された NEO_* 定数を加算します。例えば NEO_GRB+NEO_KHZ800 は、800 KHz(対400 KHz)データストリームを期待するNeoPixelと、ピクセルごとに緑、赤、青の順番で表現されるカラーバイトのためです。

  4. WS2812 RGBストリップを初期化し、ストリップの初期色を黒(オフ)に設定します。

    void setup() {
        strip.begin(); // Initialize the NeoPixel strip
        strip.show(); // Set initial color to black
    }
    
    • void begin (void): NeoPixelピンを出力用に設定します。

    • void show (void): RAM内のピクセルデータをNeoPixelsに送信します。

  5. loop() 関数では、LEDストリップ上のLEDが順に黄色で点灯し、その後消灯します。これによりシンプルな追跡効果が作成されます。

    void loop() {
        // Turn on LEDs one by one
        for (int i = 0; i < NUM_LEDS; i++) {
            strip.setPixelColor(i, 100, 45, 0); // Set the color of the i-th LED to red
            strip.show(); // Update the LED strip with the new colors
            delay(100); // Wait for 100 milliseconds
        }
    
        // Turn off LEDs one by one
        for (int i = 0; i < NUM_LEDS; i++) {
            strip.setPixelColor(i, 0, 0, 0); // Set the color of the i-th LED to black (turn it off)
            strip.show(); // Update the LED strip with the new colors
            delay(100); // Wait for 100 milliseconds
        }
    }
    
    • void setPixelColor (uint16_t n, uint8_t r, uint8_t g, uint8_t b)

    赤、緑、青のそれぞれの成分を使用してピクセルの色を設定します。RGBWピクセルを使用する場合、白は0に設定されます。

    • n: ピクセルのインデックスで、0から始まります。

    • r: 赤の明るさで、0は最小(オフ)、255は最大です。

    • g: 緑の明るさで、0は最小(オフ)、255は最大です。

    • b: 青の明るさで、0は最小(オフ)、255は最大です。