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のライブラリマネージャーで簡単に追加できます

  1. // LED 制御(WS2812B)
  2. #include <M5unified .h>
  3. #include <dafruit_NeoPixel.h>
  4. #define PIN1 18 // LEDのデータを接続するGPIO
  5. #define PIN2 19 // LEDのデータを接続するGPIO
  6. #define LED_NUM 8 // 接続LED数(4の倍数)
  7. #define LED_MSK (LED_NUM/2) -1
  8. #define LED_DLY 50 // 点灯時間
  9. #define MAX_LED 128 // 明るさ
  10. // LED config
  11. Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(LED_NUM, PIN1, NEO_GRB + NEO_KHZ800);
  12. Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(LED_NUM, PIN2, NEO_GRB + NEO_KHZ800);
  13. void setup() {
  14. auto cfg = M5.config();
  15. M5.begin(cfg);
  16. // LED setup
  17. strip1.begin();
  18. strip2.begin();
  19. }
  20. int z = 0;
  21. void loop() {
  22. int x = 0;
  23. int y = 0;
  24. for (int i = 0; i < LED_NUM; i++ ){
  25. // LED1 設定
  26. strip1.clear(); // LED1 消灯
  27. x = i & LED_MSK;
  28. y = ~x & (LED_NUM-1);
  29. strip1.setPixelColor(x, strip1.Color(0, MAX_LED, 0));
  30. strip1.setPixelColor(y, strip1.Color(0, MAX_LED, 0));
  31. strip1.show();
  32. // LED2 設定
  33. strip2.clear(); // LED2 消灯
  34. if ((z % 2) == 0) {
  35. strip2.setPixelColor((i), strip2.Color(0, MAX_LED, 0));
  36. } else {
  37. strip2.setPixelColor(((LED_NUM-1)-i), strip2.Color(0, MAX_LED, 0));
  38. }
  39. strip2.show();
  40. delay(LED_DLY);
  41. }
  42. z++;
  43. }

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 件のコメント:

コメントを投稿