スケッチ(プログラムソースコード)の入力
では、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