M5Stack に四角形を12個表示させるサンプルスケッチ(プログラム)の入力
では、Arduino IDE にスケッチ(サンプルプログラム)を入力していきます。
ArtnetWifi ライブラリや、FastLED ライブラリのサンプルスケッチをほんのちょっと変えただけです。
解説は省略させていただきます。
かなりシンプルです。
それに私の自作ライブラリを入れて、M5Stack のディスプレイに表示させています。
35行目で、NeoPixel の明るさを 10 にしていますが、最大 255 まで可能です。
ただし、かなり眩しくて、目に悪い影響を与えますので気を付けてください。
ちなみに、最初でも申し上げたように、私は独学アマチュアです。
以下のコードは間違えていることもあるかも知れません。
多数のNeoPixelを使う時、速度が遅くなる原因を修正。
16行目: uint16_t 型に変更。
54行目: FastLED.show()関数をforループの外に出しました。
(2018/12/05)
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)
#include <WiFiUdp.h>
#include <ArtnetWifi.h>
#include <FastLED.h>
#define MGO_TEC_BV1_M5STACK_SD_SKETCH
#include <mgo_tec_bv1_m5stack_sd_simple1.h> //ESP32_mgo_tec library beta ver 1.0.67
WiFiUDP UdpSend;
ArtnetWifi artnet;
const char* ssid = "xxxxxxxx"; //ご自分のルーターのSSIDに書き換えてください
const char* password = "xxxxxxxx"; //ご自分のルーターのパスワードに書き換えてください
const uint16_t max_pixels = 12; //NeoPiexel の LED素子数
const uint8_t neopixel_gpio = 21; //M5Stack GPIO pin
const uint16_t max_dmx_ch = max_pixels * 3;
CRGB leds[max_pixels];
uint8_t dmx[512] = {}; //DMX 1univers : 512ch
//*************************************
void setup()
{
Serial.begin(115200);
ConnectWifi();
// this will be called for each packet received
artnet.setArtDmxCallback(onDmxFrame);
artnet.begin();
LCD.ILI9341init();
LCD.displayClear();
LCD.brightness(255); //LCD LED Full brightness
FastLED.addLeds<WS2812B, neopixel_gpio, GRB>(leds, max_pixels);
FastLED.setBrightness(10); //Max 255
}
//*************************************
void loop()
{
artnet.read();
int rec_num; //四角形番号
int ch = 0; //DMX channel number
uint16_t x0 = 0, y0 = 0;
uint16_t rec_width = 80; //四角形幅
for(rec_num = 0; rec_num < max_pixels; rec_num++){
x0 = rec_num * rec_width - 320 * (uint16_t)floor((double)rec_num / 4.0);
y0 = rec_width * (uint16_t)floor((double)rec_num / 4.0);
LCD.drawRectangleFill255(x0, y0, x0 + rec_width, y0 + rec_width, dmx[ch], dmx[ch + 1], dmx[ch + 2]);
leds[rec_num] = CRGB(dmx[ch], dmx[ch + 1], dmx[ch + 2]);
ch = ch + 3;
}
FastLED.show();
}
//*************************************
// connect to wifi – returns true if successful or false if not
boolean ConnectWifi(void)
{
boolean state = true;
int i = 0;
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("Connecting to WiFi");
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)
{
boolean tail = false;
Serial.print("DMX: Univ: ");
Serial.print(universe, DEC);
Serial.print(", Seq: ");
Serial.print(sequence, DEC);
Serial.print(", Data (");
Serial.print(length, DEC);
Serial.print("): ");
if (length > max_dmx_ch) {
length = max_dmx_ch;
tail = true;
}
// send out the buffer
for (int i = 0; i < length; i++)
{
Serial.print(data[i], HEX);
Serial.print(" ");
dmx[i] = data[i];
}
if (tail) {
Serial.print("...");
}
Serial.println();
}
M5Stack のディスプレイに日本語ひらがな表示を Art-Net で制御するスケッチ(プログラム)
では、今度は、M5Stack のディスプレイに12個の日本語ひらがなを表示させて、Art-Net で文字を切り替えるお遊び的なサンプルプログラムです。
ひらがな表示させたくなければ、ここは読み飛ばしてください。
多数のNeoPixelを使う時、速度が遅くなる原因を修正。
20行目: uint16_t 型に変更。
77行目: FastLED.show()関数をforループの外に出しました。
(2018/12/05)
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)
#include <WiFiUdp.h>
#include <ArtnetWifi.h>
#include <FastLED.h>
#define MGO_TEC_BV1_M5STACK_SD_SKETCH
#include <mgo_tec_bv1_m5stack_sd_simple1.h> //ESP32_mgo_tec library beta ver 1.0.67
WiFiUDP UdpSend;
ArtnetWifi artnet;
const char* ssid = "xxxxxxxx"; //ご自分のルーターのSSIDに書き換えてください
const char* password = "xxxxxxxx"; //ご自分のルーターのパスワードに書き換えてください
const char* utf8sjis_file = "/font/Utf8Sjis.tbl"; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく
const char* shino_full_font_file = "/font/shnmk16.bdf"; //オリジナル東雲全角フォントファイル
const char* shino_half_font_file = "/font/shnm8x16.bdf"; //半角フォントファイル名を定義
const uint16_t max_pixels = 12; //NeoPiexel の LED素子数
const uint8_t neopixel_gpio = 21; //M5Stack GPIO pin
const uint16_t max_dmx_ch = max_pixels * 3;
CRGB leds[max_pixels];
uint8_t dmx[512] = {}; //DMX 1univers : 512ch
String str[max_pixels] = {"あ","あ","あ","あ",
"あ","あ","あ","あ",
"あ","あ","あ","あ"};
uint16_t font_width; //四角形幅 (pixel)
double hira_tmp1 = (double)(0xBF - 0x81) / 200.0;
double hira_tmp2 = (double)(0x93 - 0x80) / 55.0;
//*************************************
void setup()
{
Serial.begin(115200);
ConnectWifi();
// this will be called for each packet received
artnet.setArtDmxCallback(onDmxFrame);
artnet.begin();
mM5.init( utf8sjis_file, shino_half_font_file, shino_full_font_file );
LCD.brightness(255); //LCD LED Full brightness
mM5.font[0].Xsize = 5, mM5.font[0].Ysize = 5;
font_width = mM5.font[0].Xsize * 16;
FastLED.addLeds<WS2812B, neopixel_gpio, GRB>(leds, max_pixels);
FastLED.setBrightness(10); //Max 255
}
//*************************************
void loop()
{
artnet.read();
int font_num; //四角形番号
int ch = 0; //DMX channel number
uint16_t x0 = 0, y0 = 0;
for(font_num = 0; font_num < max_pixels; font_num++){
x0 = font_num * font_width - 320 * (uint16_t)floor((double)font_num / 4.0);
y0 = font_width * (uint16_t)floor((double)font_num / 4.0);
mM5.font[0].x0 = x0; mM5.font[0].y0 = y0;
if( dmx[ch] <= 200 ){
str[font_num][1] = 0x81;
str[font_num][2] = 0x81 + (uint8_t)round( (double)dmx[ch] * hira_tmp1 );
}else{
str[font_num][1] = 0x82;
str[font_num][2] = 0x80 + (uint8_t)round( (double)(dmx[ch] - 201) * hira_tmp2 );
}
mM5.font[0].colorRGB255( dmx[ch], dmx[ch + 1], dmx[ch + 2] );
mM5.disp_fnt[0].dispText( mM5.font[0], str[font_num] );
leds[font_num] = CRGB(dmx[ch], dmx[ch + 1], dmx[ch + 2]);
ch = ch + 3;
}
FastLED.show();
}
//*************************************
boolean ConnectWifi(void)
{
boolean state = true;
int i = 0;
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("Connecting to WiFi");
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)
{
boolean tail = false;
Serial.print("DMX: Univ: ");
Serial.print(universe, DEC);
Serial.print(", Seq: ");
Serial.print(sequence, DEC);
Serial.print(", Data (");
Serial.print(length, DEC);
Serial.print("): ");
if (length > max_dmx_ch) {
length = max_dmx_ch;
tail = true;
}
// send out the buffer
for (int i = 0; i < length; i++)
{
Serial.print(data[i], HEX);
Serial.print(" ");
dmx[i] = data[i];
}
if (tail) {
Serial.print("...");
}
Serial.println();
}
【簡単な解説】
●14-16行:
ここでは、M5Stack の micro SDHC カードに保存したフォントファイル等を定義しています。
●29-30行:
ひらがなの「ぁ」~「み」までを DMX レベルの 0~200 までの数値に対応させ、「む」~「ん」までを 200 ~ 255 に対応させるための定数初期化です。
●51-78:
送信されてきた DMX データを平仮名の文字コードに割り当てて、M5Stack のディスプレイに表示させ、更に NeoPixel の LED を光らせています。
文字コード UTF-8 では、日本語ひらがなは16進数で以下のように割り当てられています。
「ぁ」= E38181 ~ 「み」= E381BF
「む」= E38280 ~ 「ん」= E38293
ひらがなでは、最初のバイト E3 が共通なので、2バイト目と3バイト目を DMX のレベル 0 ~ 255 に割り当てます。
そして、「ぁ」~「み」を 0~200、「む」~「ん」を 200 ~ 255 に割り当てています。
文字が変化するのは、赤色に対応した DMX ch にデータが変化したときだけにしました。
緑と青が変化しても文字は変化しません。
ここはいろいろ工夫すると面白いと思います。
あとは基本的に先に紹介した四角形表示のスケッチと同じです。
コンパイル書き込み実行
では、前述のスケッチ(プログラム)の何れかを、Arduino IDE でコンパイル書き込みしてみてください。
この時点では M5Stack や NeoPixel は何も点灯しないと思います。
点灯させるためには、次に紹介する Art-Net コントローラーソフトを使います。
ENTTEC NMU (Node Management Utility) をインストールして、Art-Net 通信の動作チェック
基本的に、Art-Net で制御するアプリやソフトは有料のものばかりですが、機能は制限されるものの、わずかに無料のアプリやソフトがあります。
まず、Art-Net チェック用として、とってもシンプルなフリーソフトを見つけました。
照明の DMX 制御機器で有名な ENTTEC というメーカーにある、NMU ( Node Management Utility ) というものです。
Windows 用と MAC OS 用があります。
これは、あくまでチェック用途で、演出的な制御はできず、これで遊ぶことは殆どできません。
遊べるソフトは後で紹介します。
これは、以下のリンクから exe形式のファイルをダウンロードして、インストールします。
https://www.enttec.com/products/protocols/artnet/nmu/
すると、下図のようなウィンドウが表示されるので、「Artnet」のところをクリックします。
すると、下図のようになるので、
「 ENABLE Art-Net 」
をクリックすると、使えるようになります。
そうしたら、画面のフェーダーを動かしてみて下さい。
下の動画のように M5Stack や NeoPixel が光ればOKです。
Send To IP が
255:255:255:255
となっていますが、これはブロードキャストアドレスです。
つまり、ローカル環境のすべてのデバイスに Art-Net データを送っている状態です。
ですから、複数のデバイスを同時に制御できるというわけです。
初期設定で簡単に使えてしまう Art-Net って、電子工作的には有り難いですね。
本当はマルチキャストの方がCPU負荷的に良いらしいのですが、ここではあえて説明しません。
では、次ではスマホアプリによるコントロールを説明します。
コメント