← Zurück

Hardware-Projekt // 01

DIY Art-Net
DMX Interface

Dieses Node-Interface konvertiert Art-Net Protokolle über WLAN direkt in native differentielle DMX-Signale (RS-485), um Lichttechnik-Equipment latenzfrei per Software (wie QLC+, DMXControl oder GrandMA) anzusteuern.

Das Herzstück bildet ein ESP32-WROOM-32, kombiniert mit einem MAX485-Transceiver zur Signalwandlung. Die Stromversorgung und Programmierung erfolgt minimal über einen einzelnen USB-C Port.

Gehäuse-Indikatoren

  • Power-LED (Grün): Logikspannung liegt stabil an.
  • Conn-LED (Blau): Blinkt bei WiFi-Suche, leuchtet dauerhaft bei Verbindung.
  • Status/Error-LED (Rot): Watchdog-Timeout (3s ohne Art-Net Paket) oder WiFi-Verlust.

Verkabelungsmatrix (ESP32 ➔ MAX485 Transceiver)

Der Transceiver (Platinenaufdruck u.A. C25B) wandelt das serielle TTL-Signal des ESP32-UART2 in den DMX512-Schnittstellenstandard um.

MAX485 Pin ESP32 GPIO / Target Beschreibung
VCC / GND 5V / GND Spannungsversorgung über USB-C Schiene
RO (Receiver Out) Nicht belegt Empfangsdaten-Leitung (nur Sende-Modus benötigt)
RE / DE GPIO 16 (DMX_DIR_PIN) Zusammengelegt auf HIGH geschaltet für permanenten Sende-Modus
DI (Driver In) GPIO 17 (DMX_TX_PIN) Verbindung zum UART2 TX Pin des ESP32
A / B DMX XLR Pin 3 / Pin 2 Differentieller DMX-Ausgang (Daten + / Daten -)

Firmware // Arduino C++

dmx_artnet_node.ino Firmware v1.0.0
// ===== PINS =====
#define DMX_TX_PIN   17
#define DMX_DIR_PIN  16
#define LED_POWER    14   // Grün
#define LED_CONN     26   // Blau
#define LED_ERROR    27   // Rot

// ===== ART-NET SPECIFIC =====
#define ARTNET_PORT      6454
#define ARTNET_UNIVERSE     0

void sendDMX() {
  digitalWrite(DMX_DIR_PIN, HIGH);
  Serial2.end();
  pinMode(DMX_TX_PIN, OUTPUT);
  digitalWrite(DMX_TX_PIN, LOW);
  delayMicroseconds(120); // DMX BREAK
  digitalWrite(DMX_TX_PIN, HIGH);
  delayMicroseconds(12);   // DMX Mark After Break (MAB)
  
  Serial2.begin(250000, SERIAL_8N2, -1, DMX_TX_PIN);
  Serial2.write(0); // Start Code
  for (int i = 1; i <= 512; i++) Serial2.write(dmxData[i]);
  Serial2.flush();
}