ESP32 と NeoPixel フルカラー LED テープで Wi-Fi 卓上イルミネーションオブジェを作ってみた

ESP32 ( ESP-WROOM-32 )

NeoPixel リング 12連を追加して光ファイバーを使った卓上イルミネーションオブジェを作ってみる

では、今度は前のプログラムをちょっとだけ応用して、NeoPixel Ring 12連と組み合わせた光ファイバー卓上イルミネーションオブジェを作ってみます。

光ファイバーの処理

以前、以下の記事で NeoPixel リングと光ファイバーを使ったオブジェを作ったことがありました。

光ファイバー 卓上オブジェ を作ってみた( NeoPixel フルカラー LED 使用 )

記事を合わせてご覧いただき、更にちょっと手を加えて、グルーガン(ホットボンド)で固定し、パッチワーク用こてアイロンで光ファイバーを曲げたりしてみます。

まず、下図のようにストローで束ねた光ファイバーをグルーガン(ホットボンド)で固定します。
グルーガン(ホットボンド)は以下の物を使いました。

次に、こてアイロンなどを使って、光ファイバーを適度に曲げます。
使ったアイロンは以下の物です。

Clover NEW パッチワークこて 57-903
クロバー(Clover)
¥4,950(2024/04/25 16:27時点)

ハンダごてでもOKかと思います。
ここで重要なのは、見せたい面に光ファイバーの先端をむけるようにアレンジすることです。
因みに、光ファイバーはこうやって曲げてしまうと、光量が落ちますのでご了承ください。

そうしたら、以前の記事で作成したプレートの上にグルーガン(ホットボンド)で固定します。
これは、NeoPixel リング 12連のLED 素子位置に合うようにセットします。

結果、こんな感じになります。

接続する

では、LED テープに NeoPixel Ring 12連を加えた接続例は以下になります。
※ACアダプターとパソコンの電源は同じコンセントおよびテーブルタップから取ってください。
ESP32 の電源をUSBアダプターから取っている場合も同じコンセントから取ってください。
GNDの電位差を極力少なくするためです。
ちなみに私は基本的に素人独学なので、この回路で起きたトラブルは一切保証しません。

写真ではこんな感じになります。

これで、あとは最初に紹介した動画のように光ファイバーを設置すればOKです。

スケッチ(プログラムソースコード)

では、スケッチ(プログラムソースコード)ですが、NeoPixel 12個追加しただけなので、DMX アドレスを36増やすだけにしてみます。

以下の様な感じです。

【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)
#include <WiFi.h>
#include <WiFiUdp.h>
#include <ArtnetWifi.h>
#include <FastLED.h>

// Wifi settings
const char* ssid = "xxxxxxxx"; //ご自分のルーターのSSIDに書き換えてください
const char* password = "xxxxxxxx"; //ご自分のルーターのパスワードに書き換えてください

// LED settings
const int numLeds = 144 + 12; // CHANGE FOR YOUR SETUP
const int numberOfChannels = numLeds * 3; // Total number of channels you want to receive (1 led = 3 channels)
const byte dataPin = 21; //ESP32 GPIO pin
CRGB leds[numLeds];

// Art-Net settings
ArtnetWifi artnet;
const int startUniverse = 0; // CHANGE FOR YOUR SETUP most software this is 1, some software send out artnet first universe as 0.

// Check if we got all universes
const int maxUniverses = numberOfChannels / 512 + ((numberOfChannels % 512) ? 1 : 0);
bool universesReceived[maxUniverses];
bool sendFrame = 1;
int previousDataLength = 0;

//----------------------------
uint8_t dmx[512] = {}; //DMX 1univers : 512ch
//*************************************************
void setup()
{
  Serial.begin(115200);
  ConnectWifi();
  artnet.begin();
  FastLED.addLeds<WS2812B, dataPin, GRB>(leds, numLeds);
  FastLED.setBrightness(20); //※これ以上大きくすると、回路電流が大きすぎて危険注意。(Max 255)

  // this will be called for each packet received
  artnet.setArtDmxCallback(onDmxFrame);

  TaskHandle_t th; //マルチタスクハンドル定義
  xTaskCreatePinnedToCore(Task1, "Task1", 4096, NULL, 5, &th, 0); //マルチタスク起動
}
//*************************************************
void loop()
{
  int i;
  int ch = 0; //DMX channel number
  for(i = 0; i < numLeds; i++){
    leds[i] = CRGB(dmx[ch], dmx[ch + 1], dmx[ch + 2]);
    ch = ch + 3;
  }
  FastLED.show();
  delay(1); //これ重要!これが無いと点灯しない。
}
//************ マルチタスクループ ******************
void Task1( void *pvParameters ) {
  while(1){
    artnet.read();
    delay(1); //マルチタスクの場合、これ絶対必要!
  }
}
//***************************************
boolean ConnectWifi(void)
{
  boolean state = true;
  int i = 0;

  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");

  // Wait for connection
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 20){
      state = false;
      break;
    }
    i++;
  }
  if (state){
    Serial.println("");
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("");
    Serial.println("Connection failed.");
  }
  return state;
}
//**************************************************
void onDmxFrame(uint16_t universe, uint16_t length, uint8_t sequence, uint8_t* data)
{
  sendFrame = 1;
  // set brightness of the whole strip
  if (universe == 15)
  {
    FastLED.setBrightness(data[0]);
    FastLED.show();
  }

  // Store which universe has got in
  if ((universe - startUniverse) < maxUniverses) {
    universesReceived[universe - startUniverse] = 1;
  }

  for (int i = 0 ; i < maxUniverses ; i++)
  {
    if (universesReceived[i] == 0)
    {
      //Serial.println("Broke");
      sendFrame = 0;
      break;
    }
  }

  // read universe and put into the right part of the display buffer
  for (int i = 0; i < length / 3; i++)
  {
    int led = i + (universe - startUniverse) * (previousDataLength / 3);
    if (led < numLeds)
      dmx[i * 3] = data[i * 3];
      dmx[i * 3 + 1] = data[i * 3 + 1];
      dmx[i * 3 + 2] = data[i * 3 + 2];
      //Serial.printf("%02X,%02X,%02X,", dmx[i * 3], dmx[i * 3 + 1], dmx[i * 3 + 2]);
  }
  //Serial.println();
  previousDataLength = length;
  
  if (sendFrame)
  {
    memset(universesReceived, 0, maxUniverses);
  }
}

これは先に紹介したスケッチの11行目を変えただけです。
とてもシンプルです。

では、これをコンパイル書き込みしておいて下さい。

Jinx! – LED Matrix Control の設定

では、Windows専用フリーウェア Jinx! – LED Matrix Control の設定です。

設定方法は前回の記事を合わせて参照してください。
ですが、ちょっと工夫が必要です。
なぜなら、この接続だと NeoPixel のアドレスが以下のようになるからです。

NeoPixel Ring : 0~35
LED Tape : 36~467

因みに、Jinx! – LED Matrix Control の Patch設定は自由が効きません。
同じアドレスを複数設定できないのが欠点です。

まず、メニューの「Setup」→「Matrix Options」設定は以下のようにしました。

そして、メニューの「Setup」→「Output Devices」設定は以下のようにしました。

そして、メニューの「Setup」→「Output Patch」設定は以下のようにしました。
1列目が NeoPixel Ring 12連ですが、3つ同じアドレスで Patch しようとしましたが、残念ながら同じアドレスを複数Patchできませんでした
Patch画面上で入力できたとしても、Outputされませんでした。
ですから飛び飛びにしました。
つまり、こんな感じです。

LED1 : DMX#0 Red, DMX#1 Green, DMX#2 Blue
LED2 : None
LED3 : None
LED4 : DMX#3 Red, DMX#4 Green, DMX#5 Blue
LED5 : None
…….etc

そして、2段目からの LED テープはアドレス36からFast Patch で連続Patchしました。

これで Start Output させて、エフェクトを作成してみて下さい。
下図のように、そして最初に紹介した動画のように動けばOKです。

FFT 的なスペクトラムアナライザー設定

まず、Windows パソコンに装備してあるマイクデバイスをONにしてください

次に、Jinx! – LED Matrix Control で、FFT 的なスペクトラムアナライザー表示は下図のように「Spectrum Analyzer」を選択すれば表示できます。

そして、とりあえず、ベースラインを Bottom にする設定は以下の感じです。

また、光ファイバー側の LED をベースラインにして、逆さ表示させる場合は以下の設定です。
こちらの方が、光ファイバーが常時光っていてキレイです。

あとは、いろいろ設定してみてください。
最初に紹介した動画のように、なかなか面白いエフェクトができて、クリスマスイルミネーション的にも見ていて楽しいですよ!

編集後記

いかがでしたでしょうか。

ESP32 や M5Stack とパソコンソフトを組み合わせれば、簡単なプログラムで楽しい LED イルミネーションオブジェがいろいろできますね。
クリスマスソングに合わせて、イルミネーションが光るっていうこともできますね。
クリスマス用の卓上オブジェとしては、私的には今年のシーズンは乗り切れそうで満足です。

でも、多量のLEDを扱う時には、電源の安全対策がとても重要ですね。

特に熱対策をしっかりやっておかないと、火災につながるので要注意です。
そうすると、既製品を使った方が安全かも知れませんね。 ということで、今回はここまでです。
ではまた・・・。

 

コメント

  1. H.W より:

    mgo-tecさん、H.Wです。
    ご無沙汰してます。。。

    多連LEDテープと12連リングLED を使ったイルミネーション。。。
    ダイナミック且つ幻想的でとても素晴らしいですね…
    (過去にもESP-WROOM-02 で同様なモノを作られてるんですね…?)
    これを上手く活用すれば、株式市場のリング状電光掲示板モドキ?も作れそうですね?(笑)

    私も何とか手持ちに無い部品を手に入れ、クリスマスまでに間に合わせてみたいと思います。。。
    今回は消費電流も多いので、元々ブレッドボードは接触不良、誤配線、ノイズ混入、見た目の悪さ等々から殆ど使用しないので、少し時間が掛かりそうです。

    実は時間がさけない一番の理由は、mgo-tecさんも既に手に入れられて検討されてるかも知れませんが、7月末に発売されたSONYの「Spresence」基盤を最近入手し、ここ暫くこれに嵌ってしまってることにあります。
    メインボードはESP32devkit より一回り小さく、WiFiやBLEは搭載されてませんが、その代わりにGPS 機能とハイレゾ DACが搭載されており、サンプルスケッチを適宜改造して楽しんでます。。。
    何しろ消費電力がとても少なく、Lipo電池直結で携帯動作できる所が非常に気に入ってます。
    (ここは適切ではないので、詳細についてはgmailの方に書きます。)

    • mgo-tec mgo-tec より:

      H.Wさん

      いつもブログご覧いただき、ありがとうございます。

      確かに、株式市場の電光掲示板っぽいものは出来そうな気がしますね。
      私的には予算が無いので、これ以上LEDを増設できませんが・・・。
      ぜひ、クリスマスイルミネーション試してみて下さい。
      色んな人のアイデア見てみたいですね。

      SONYの「Spresence」は、とっても興味あるのですが、今は経済的に厳しくてとても買えない状況です。
      余裕のある時期に obniz を購入してたものの、まだ開封すらしていません。
      積み基板がまだ沢山あります。
      でも、いつかSpresenceは試そうと思っています。
      Spresenceいいなぁ・・・。

  2. mgo-tec mgo-tec より:

    管理人の mgo-tec です。
    ブログ読者の juchangさんからの写真投稿がありました!

    comment_artnet01.jpg

    3Dプリンターで自作されたパイプに NeoPixel LED テープを貼り付けているとのことです。
    インシュロックを使うよりも格段に良い感じですね。
    このアイデアは素晴らしいです!!!
    いつも実験していただき、本当にありがとうございます。

    この後、光ファイバーも設置するみたいです。
    どうなるか期待しちゃいます!
    (^^)

  3. mgo-tec mgo-tec より:

    管理人のmgo-tecです。
    前コメントで紹介した juchangさんから更に進化した素晴らしい工作例の写真投稿がありました。

    comment_led_tape01.jpg

    クリアーカバーを入れて、光が屈折してイイ感じですね。
    光ファイバーの設置も、私と違ったセンスで、新鮮な感じがします。
    光ファイバーは、125mm、150mm、200mmに切断したものを使っているとのことです。
    梱包時の丸みをそのまま利用しファイバー立てに挿しているとのことです。
    いろいろ工夫次第で、面白い効果の卓上イルミネーションができそうですね。
    私自身も負けていられないと思いました。
    juchangさん、いつもありがとうございます。
    m(_ _)m

タイトルとURLをコピーしました