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

ESP32 ( ESP-WROOM-32 )

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

では、Arduino IDE にスケッチ(プログラムソースコード)を入力していきます。

基本的に ArtnetWifi ライブラリのサンプルスケッチ ArtnetWifiFastLED を改変しているだけです。

【ソースコード】 (※無保証 ※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; // 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);
  }
}

【簡単な解説】

●7-8行目:
ご自分の Wi-Fiルーターの SSID とパスワードに書き換えてください。

●11行目:
 LED テープの LED 素子数を入力します 。
ここでは144と入力します。

●13行目:
ESP32 開発ボードの信号出力のGPIOピンを設設定します。

●35行目:
ここが重要です。
 LED の明るさは0~255まで定義できます。
しかし、明るさを255にしてしまうと、回路に3Aくらいの大電流が流れてしまうので危険です。
とりあえずポリスイッチ(リセッタブルヒューズ)が入っているので大丈夫かと思うのですが、明るさを20にしておけば、白色でフル点灯させても最大電流 400 mA 程度に抑えられ、より安全です。
これでも卓上イルミネーションオブジェとしては眩しいくらい十分に明るいと思います。

● 40-41行:
ここではESP32 の FreeRTOS のマルチタスクを定義しています。
Art-Net データ受信と、LED点灯をタスク分けしています。

●44-54行:
メインループで、マルチタスクの core 1 で動かしています。
ここでは主に LED を点灯させるタスクです。
前回の記事では既に訂正しましたが、FastLED ライブラリの show() 関数は forループの外に置くことが重要です。
これを forループ内に置いてしまうと、LED 点灯が遅くなり、フレームレートがめちゃくちゃ下がってしまいます。
そして、もう一つ重要なのが、53行目の delay(1) です。
これが無いと点灯してくれませんでした。

●56-61行:
ここが ESP32 CPU core 0 のマルチタスクループです。
ここでは Art-Net DMX のデータを受信するタスクです。

●96-138行:
Art-Net DMX で受信したデータはここで処理します。
ここで、グローバル変数の dmx 配列にデータを渡しています。
LEDが点灯しないトラブルがあったら、129行目と131行目のコメントを解除して再コンパイルすれば、シリアルモニターでデータ受信しているかを確認できます。

コンパイル書き込み実行

では、Wi-Fi ルーターを起動しておき、Arduino IDE でコンパイル書き込み実行させてみてください。

そして、ACアダプターに電源を入れておきます。
次にパソコンソフトウェアの設定をします。

フリーウェア Jinx! – LED Matrix Control の設定

前回の記事で紹介した、Windows専用フリーウェア Jinx! – LED Matrix Control の設定をザッと説明します。

まず、メニューの「Setup」→「Matrix Options」は以下のように設定します。
この設定では、Height を4以下に出来ないので注意です。

次に、メニューの「Setup」→「Output Devices」で、「Add」または「Edit」をクリックして、下図のように設定します。
Data のところは、使用する DMX チャンネル数を設定します。
RGB三原色フルカラーLED なので、144 × 3 = 432 とします。
DMX の 1universe が 512ch なので、これだけで 1universe 分をほぼ占有してしまいますね。
ここではブロードキャストアドレスを使っていますが、マルチキャストにしておいても良いと思います。

次に、メニューの「Setup」→「Output Patch」で以下のように設定します。
設定する前に、Patch をクリアーしてから、新たにパッチし直すと良いと思います。
全てパッチできると緑色になります。

そうしたら、下図のように Art-Net Output start させます。

次に、以下のように「Rader/Scan Lines」を選択しておきます。
Master フェーダーは最大にしておいてください。

そうしたら下の動画のように点灯すれば OK です。
光った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をコピーしました