プログラミング

【Arduino】NeoPixelのLED70個をフラッシュさせる方法を紹介

今回はスイッチサイエンスさんの「WS2812C搭載ネコユニット」を指定した箇所を中心にピカッと光らせるコードを作成したので紹介します。

👆実際にこのコードを使用してWS2812C搭載ネコユニットを光らせている様子。この制作物では音がした方向に対応した箇所を中心に光らせています。光ったあとは中心に向かって徐々に色が元に戻るのが特徴です。

紹介するコードについて

今回のプログラムは「WS2812C搭載ネコユニット」というネオピクセルが70個入ったパーツをピカッと光らせます。具体的には「今の色をあらかじめ設定した色に徐々に近づける」ことと「指定した箇所の中心を明るく、左右20LEDは徐々に暗くなるように色を設定」することを組み合わせて、ピカッと光らせます。

ネオピクセルはICチップ入りのLEDで光る色や明るさを1つずつ変えることができる商品です。これを使えば何十個、何百個のLEDを簡単に操作することができます。今回使用しているWS2812C搭載ネコユニットの他にもテープ状のものや輪っか状の物があるのでぜひ調べてみてください。

このコードの利点は実装が簡単な割に動作をリッチにできる点、光らせ方が急激に変わる場合に自然な表現になる点があります。今回のようにピカッと光らせたい場合やモードの切り替えで光り方が急激に変わる場合に役立ちます。

コードの紹介

こちらが今回紹介するコード全体になります。詳細な解説は解説ボタン💬をクリックすると表示できます。分かりにくいところがある場合などにご活用ください。

  1. #include <Adafruit_NeoPixel.h>
  1. // LED制御用の変数
  2. int default_color[3] = {40,40,50};
  3. float LED_now[70][3];
  4. int location = 0;
  1. // ネコミミPINとか
  2. #define PIN 2 // ネコ耳LEDに接続するピン
  3. #define NUMPIXELS 70 // ネコ耳モジュールは左右合わせて35 * 2 の 70LED
  4. Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
  5. #define DELAYVAL 10 // ループに使用するディレイ
  1. void setup() {
  2.     pixels.setBrightness(20);
  3.     pixels.begin();
  4.     // 配列初期化
  5.     for (int i = 0; i < 70; i++) {
  6.       for (int j = 0; j < 3; j++){
  7.         LED_now[i][j] = 250;
  8.       }
  9.     }
  10.     // ランダムシード
  11.     randomSeed(analogRead(0));
  12. }
  1. void loop(void) {
  2.   location = (int)random(NUMPIXELS);
  3.   delayAndFlashLED(300, location); // Adjust the delay as needed
  4. }
  1. void delayAndFlashLED(int delay_time, int center) {
  2.   int color_select = (int)random(2);
  3.   for (int i = 0; i < 20; i++){
  4.     if (center + i < NUMPIXELS) { // 右側20個の色を指定
  5.       LED_now[center + i][color_select] = 250 - i * 8;
  6.     }
  7.     if (center - i >= 0) { // 左側20個の色を指定
  8.       LED_now[center - i][color_select] = 250 - i * 8;
  9.     }
  10.   }
  11.   for (int cnt = 0; cnt < delay_time; cnt += DELAYVAL){
  12.     // LED動作
  13.     for (int i = 0; i < NUMPIXELS; i++){
  14.       for (int j = 0; j < 3; j++){
  15.         LED_now[i][j] = LED_now[i][j] + ((float)default_color[j] - LED_now[i][j]) / 20 ;
  16.       }
  17.       pixels.setPixelColor(i, pixels.Color((int)LED_now[i][0], (int)LED_now[i][1], (int)LED_now[i][2]));
  18.     }
  19.     pixels.show();
  20.     delay(DELAYVAL);
  21.   }
  22. }

まとめ

今回は「WS2812C搭載ネコユニット」をピカッと光らせるコードを紹介しました。「今の色をあらかじめ設定した色に徐々に近づける機能」と「指定した箇所の中心を明るく、左右20LEDは徐々に暗くなるように色を設定する機能」に分けて考えてもらえるとより活用の幅が広がると思います。ぜひ、ご活用ください。

謝辞

このコードはTechSeeker Hackathon 2024の成果物の一部です。このような学習の機会を用意してくださった方々、同じチームとして支えてくださったデジもく会のみなさんに感謝します。本当にありがとうございました。

-プログラミング
-, ,