スケッチ(プログラムソースコード)の入力
では、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 素子の列がピッタリ揃えば良いです。
コメント
mgo-tecさん、H.Wです。
ご無沙汰してます。。。
多連LEDテープと12連リングLED を使ったイルミネーション。。。
ダイナミック且つ幻想的でとても素晴らしいですね…
(過去にもESP-WROOM-02 で同様なモノを作られてるんですね…?)
これを上手く活用すれば、株式市場のリング状電光掲示板モドキ?も作れそうですね?(笑)
私も何とか手持ちに無い部品を手に入れ、クリスマスまでに間に合わせてみたいと思います。。。
今回は消費電流も多いので、元々ブレッドボードは接触不良、誤配線、ノイズ混入、見た目の悪さ等々から殆ど使用しないので、少し時間が掛かりそうです。
実は時間がさけない一番の理由は、mgo-tecさんも既に手に入れられて検討されてるかも知れませんが、7月末に発売されたSONYの「Spresence」基盤を最近入手し、ここ暫くこれに嵌ってしまってることにあります。
メインボードはESP32devkit より一回り小さく、WiFiやBLEは搭載されてませんが、その代わりにGPS 機能とハイレゾ DACが搭載されており、サンプルスケッチを適宜改造して楽しんでます。。。
何しろ消費電力がとても少なく、Lipo電池直結で携帯動作できる所が非常に気に入ってます。
(ここは適切ではないので、詳細についてはgmailの方に書きます。)
H.Wさん
いつもブログご覧いただき、ありがとうございます。
確かに、株式市場の電光掲示板っぽいものは出来そうな気がしますね。
私的には予算が無いので、これ以上LEDを増設できませんが・・・。
ぜひ、クリスマスイルミネーション試してみて下さい。
色んな人のアイデア見てみたいですね。
SONYの「Spresence」は、とっても興味あるのですが、今は経済的に厳しくてとても買えない状況です。
余裕のある時期に obniz を購入してたものの、まだ開封すらしていません。
積み基板がまだ沢山あります。
でも、いつかSpresenceは試そうと思っています。
Spresenceいいなぁ・・・。
管理人の mgo-tec です。
ブログ読者の juchangさんからの写真投稿がありました!
3Dプリンターで自作されたパイプに NeoPixel LED テープを貼り付けているとのことです。
インシュロックを使うよりも格段に良い感じですね。
このアイデアは素晴らしいです!!!
いつも実験していただき、本当にありがとうございます。
この後、光ファイバーも設置するみたいです。
どうなるか期待しちゃいます!
(^^)
管理人のmgo-tecです。
前コメントで紹介した juchangさんから更に進化した素晴らしい工作例の写真投稿がありました。
クリアーカバーを入れて、光が屈折してイイ感じですね。
光ファイバーの設置も、私と違ったセンスで、新鮮な感じがします。
光ファイバーは、125mm、150mm、200mmに切断したものを使っているとのことです。
梱包時の丸みをそのまま利用しファイバー立てに挿しているとのことです。
いろいろ工夫次第で、面白い効果の卓上イルミネーションができそうですね。
私自身も負けていられないと思いました。
juchangさん、いつもありがとうございます。
m(_ _)m