2025年4月5日土曜日

M5Stamp PicoでLチカ(WS2812)

Aliexpressで面白うそうなLEDモジュールを見つけたので、M5Stamp PicoでLチカ 第2弾をしました。なお、このLEDモジュールはアマゾンでも販売していました

このLEDモジュールはWS2812 5050を8個搭載しており、1本のデータ信号でこれらを制御することが出来ます。それにより1モジュール1ピンとなるため、GPIOピンの節約が出来そうです。今回もナイトライダー風にしますが、折角なのでパターン違いで2モジュール制御したいと思います。回路は非常に簡単です


本モジュールの制御には、Adafruit_NeoPixelライブラリを使用しました。ArduinoIDEのライブラリマネージャーで簡単に追加できます

// LED 制御(WS2812B)

#include <M5unified .h>
#include <dafruit_NeoPixel.h>
#define PIN1 18                 // LEDのデータを接続するGPIO
#define PIN2 19                 // LEDのデータを接続するGPIO
#define LED_NUM  8              // 接続LED数(4の倍数)
#define LED_MSK (LED_NUM/2) -1
#define LED_DLY 50              // 点灯時間
#define MAX_LED 128             // 明るさ

// LED config
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(LED_NUM, PIN1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(LED_NUM, PIN2, NEO_GRB + NEO_KHZ800);


void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);
  
  // LED setup
  strip1.begin();
  strip2.begin();
}


int z = 0;
void loop() {
  int x = 0;
  int y = 0;

  for (int i = 0; i < LED_NUM; i++ ){

    // LED1 設定
    strip1.clear();  // LED1 消灯
    x = i & LED_MSK;
    y = ~x & (LED_NUM-1);
    strip1.setPixelColor(x, strip1.Color(0, MAX_LED, 0)); 
    strip1.setPixelColor(y, strip1.Color(0, MAX_LED, 0)); 
    strip1.show();

    // LED2 設定
    strip2.clear();  // LED2 消灯
    if ((z % 2) == 0) {
      strip2.setPixelColor((i), strip2.Color(0, MAX_LED, 0)); 
    } else {
      strip2.setPixelColor(((LED_NUM-1)-i), strip2.Color(0, MAX_LED, 0));
    }
    strip2.show();

    delay(LED_DLY);
  }
  z++;
}

13行目、14行目のAdafruit_NeoPixel宣言は、モジュール内のLED総数、割当てピン、蘇秦データのカラー順序(今回はRGB)、駆動周波数は800KHzで設定しています

22行目、23行目の.begin()でGPIOの出力設定が行われます

25行目、43行目の.clean()で全てのLEDを消灯しています

38,39行目、45,47行目の.setPixelColor()で表示するLEDとカラー(RGB順)を設定します(今回は緑色にしています)

なお、strip1はLED 0 → 3、LED 7 → 4の順で2個づつ表示、strip2はLED 0 → 7 → 0の順で表示しています

カラー設定値を半分にして明るさが変わるか試しましたが、これでも眩しいです


次は何をしてみようかな...

0 件のコメント:

コメントを投稿