IoT
milkcocoa
ESP8266
DMX

DMX照明機器をIoT化(MQTT対応)してみた。

舞台設備照明機器の標準的なインターフェイスとなっている 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 を使用した。

ESP8266_MQTT-Dmx_86LEDs.ino
#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();
}

参考

https://qiita.com/Ina3