舞台設備照明機器の標準的なインターフェイスとなっている DMX(DMX512) を外部から制御するため IoT化(MQTT対応) してみた。
DMX(DMX512) をネットワーク対応した Art-Net という規格や DMX / MQTT Converter 製品が存在するが、今回は ESP8266 と Grove - DMX512 モジュールを使用して IoT化(MQTT対応) してみた。
動作確認
まず、Grove - DMX512 モジュールと照明機器 (Lixada 86 RGB LED Light
DMX Lighting Projector) の動作確認のため、wiki に記載されているとおりに DmxSimple Library を使用して Arduino UNO と Grove - DMX512 モジュール と照明機器を接続して操作してみた。(当然、問題無く動作する。)

※ 照明機器 Lixada DMX-512 LED PAR Light 12LED RGBW は PC + Lixada USB-DMX512 との組み合わせでは動作したが、Grove - DMX512 モジュールとの組み合わせでは正常に動作しなかった。
接続構成・配線図
今回、外部から照明機器を制御するため Wi-Fi 機能を持つ ESP8266 を Arduino 化して使用するが、DmxSimple Library は ESP8266 に対応していないため、DMX Library for Arduino with ESP8266 を使用した。このライブラリは ESP8266 の UART1 TX (D4端子:GPIO2) を使用するため、ESP8266 と Grove - DMX512 を Groveケーブル で接続する際に黄色ケーブル (EN) を D4、赤色ケーブルを 3.3V、黒色ケーブルを GND へ接続する。



ソースコード
ESP8266 のサンプルコードはこちら。
MQTT Broker は Milkcocoa を使用した。
# include <ESP8266WiFi.h>
# include <Milkcocoa.h>
# include <Arduino.h>
# include <ESPDMX.h>
# define WLAN_SSID "" // Wi-Fi SSID
# define WLAN_PASS "" // Wi-Fi Password
WiFiClient client;
DMXESPSerial dmx;
# define MILKCOCOA_APP_ID "" // MilkCocoa Application ID
# define MILKCOCOA_DATASTORE "" // MilkCocoa Datastore Name
# define MILKCOCOA_SERVERPORT 1883
const char MQTT_SERVER[] PROGMEM = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] PROGMEM = __TIME__ MILKCOCOA_APP_ID;
Milkcocoa milkcocoa = Milkcocoa(&client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);
int red = 0;
int green = 0;
int blue = 0;
int dimmer = 0;
int address = 0;
void onpush(DataElement *elem) {
Serial.println("onpush");
Serial.print("r:");
Serial.print(elem->getInt("r"));
Serial.print(",g:");
Serial.print(elem->getInt("g"));
Serial.print(",b:");
Serial.print(elem->getInt("b"));
Serial.print(",s:");
Serial.print(elem->getInt("s"));
Serial.print(",t:");
Serial.print(elem->getInt("t"));
Serial.println();
red = elem->getInt("r"); // R [0-255]
green = elem->getInt("g"); // G [0-255]
blue = elem->getInt("b"); // B [0-255]
dimmer = elem->getInt("s"); // Dimmer Strength [0-127]
address = elem->getInt("t"); // DMX Address [1-512]
//write to DMX bus
dmx.write(address, dimmer);
dmx.write(address+1, red);
dmx.write(address+2, green);
dmx.write(address+3, blue);
dmx.update();
}
void setupWiFi() {
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
setupWiFi();
Serial.println( milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush) );
}
void loop() {
milkcocoa.loop();
}
参考