ESP8266 als DMX Master

Ein paar Worte zu DMX

Sehr vereinfacht erklärt, lassen sich mit DMX bis zu 512 Kanäle in je 256 Abstufungen dimmen. Üblicherweise wird DMX in der Bühnentechnik für Lichteffekte eingesetzt, aber eigentlich spricht auch nichts gegen die Verwendung im Eigenheim - wenn man es bunt mag.

DMX Master

Ein ESP8266 übernimmt die Aufgabe eines DMX Pultes (DMX Master) und stellt die Bedienerobfläche für ein kleines DMX System bereit.

Die Anzahl der genutzten Kanäle kann zur Laufzeit verändert werden und es können Szenen abgespeichert werden. Der ESP8266 hat einen zweiten seriellen Ausgang und ist daher Ideal für einen DMX Master.

Die Hauptseite meines DMX Masters

Auf der Hauptseite meines DMX Masters kann die Helligkeit der Känäle geändert werden, einzelne Kanäle ein oder aus geschaltet werden.

DMX Pulte haben üblicherweise einen Blackout Taster um "schnell" alle Kanäle auszuschalten (Einstellungen bleiben gespeichert). Auch ermöglicht die Hauptseite den Schnellzugriff auf die Szene 0 sowie eine Schnellspeichermöglichkeit der aktuellen Einstellungen in die Szene 0. Die Kanäle können mit Tastendruck auf einen Zufallswert gesetzt werden. Zusätzlich gibt es eine Fader für alle Kanäle.

Daran anschließend ist einerseits der Masterregler - zur Beinflussung ALLER Kanäle. Er ist ein Dimmer und wirkt auf alle Kanäle (sofern man schon welche in den Einstellungen erfasst hat).

Szenen

Eine Szene sind die gespeicherten Einstellungen von mehreren Kanälen. Hat man auf der Hauptseite eine Szene eingestellt, kann sie auf der Szenen Seite einem Programmplatz zugewiesen werden. Idealerweie geht man nach dem Speichern auch kurz in die Detailseite (ändern) und vergibt für diese Szene einen Namen (max 8 Stellen). Außerdem sieht man auf der Detailseite auch die eingestellten Kanäle und deren Werte. Die maximale Anzahl an speicherbaren Szenen ist abhängig von den gespeicherten Kanälen je Szene. Aber es sind schon "einige".

 

Kanal Übersicht

Die Kanal Übersicht zeigt die Fähigkeiten für die einzelnen Kanäle. auch hier kann man mit ändern in eine Detailansicht wechseln.

 

Kanal Einstellungen

Für jeden Kanal lässt sich festlegen, ob dieser über ein Regler (Slider) einen Analogwert von 0-254 annehmen kann oder mittels Schalter ein-/ausgeschaltet werden kann. Für die Farbwiedergabe kann man drei Kanäle (Regler!) zu einer RGB zusammenfassen. Eine RGB Gruppe bekommt einen zusätzlichen Regler für Weiß - der alle 3 Farbanteile Rot-Grün-Blau gleichzeitig ändert udn somit eine Weißwert ermöglicht. Aktuell sind nur 3 der maximal 8 Optionen möglich (daher ist der Platz hinter den Checkboxen auch leer).

Im Textfeld kann ein Name für den Kanal eingegeben werden.

 

Einstellungen

Anzahl Kanäle soll klar sein - das sind einfach die angeschlossenen Kanäle.

DMX Intervall: der Zyklus der DMX Pakete. Ich nutze einen großen Intervall 10.000 - also alle 10 Sekunden. Dieser Wert gilt nur im "Idle". Wenn sich ein Wert verändert wird der Wert natürlich sofort auf DMX weitergegeben.

Der Muster Intervall hat Einfluss für den Fade Effekt. Muster auf 1 bedeutet dass alle 50ms die Helligkeit verändert wird.

Über Firmware Update Link lässt sich ein OTA Update des DMX Master durchführen. Aus Sicherheitsgründen wird nur das Unterverzeichnis und die Bin-Datei angegeben. Der Webserver lässt sich nicht verändern und muss mit dem Sketch programmiert werden. Damit soll vermieden werden, dass ein unberechtigter den Webserver als missbräuchlich flaschen kann.

Der Website AJAX Intervall ist jener Zeitabstand, in dem die Webseite aktualisiert wird. Wenn mehrere Endgeräte auf den Webserver zugreifen und Einstellungen verändern, so werden in diesem Intervall die Webseiten aktualisiert. 10 Sekunden war bei mir eigentlich immer ausreichend. Mit der Checkbox dahinter kann man AJAX ganz deaktivieren.

 

Der Webserver und seine Stylesheets

Im Programmspeicher vom ESP8266 ist nur ein sehr einfaches Stylesheet (f.css) abgelegt. Ein Beispiel für dieses einfache Stylesheet siehst du nebenan.

Zusätzlich erwartet das Programm ein weiteres Stylesheet direkt im Filesystem des ESP (SPIFFS), damit die Regler auf mehreren Browsern "schön" dargestellt werden. Das umfangreicheres Stylesheet i.css (i steht für internal) kann daher aus dem SPIFFS abgerufen werden. Bzw. wird im setup() geprüft, ob dieses File am ESP vorhanden ist und wenn ja, wird auch dieses interne Stylesheet eingebunden.

Um Dateien im SPIFFS des ESP zu speichern, können diese in der Arduino IDE mittels "Werkzeuge |  ESP8266 Sketch Data Upload" hochgeladen werden. Dazu muss im Sketch ein Unterverzeichnis data enthalten sein. Der Upload dauert über die IDE einige Minuten, in der Regel braucht dies aber nur selten durchgeführt werden. Wenn in deiner Arduino IDE der Menüpunkt nicht vorhanden ist, muss das ESP8266fs-plugin erst installiert werden. Am Ende der Seite gibt es einen Link auf das Github Repository sowie einen Link auf ein Youtube Tutorial. Aufpassen, das .jar File muss in das Verzeichnis: DEIN_ARDUINO_SKETCH_VERZEICHNIS/Tools/ESP8266/tool/

Ist das zweite interne Stylesheet nicht erreichbar, stehen nur die Standard Slider zur Verfügung. Funktionieren soll es dennoch.

 

Der Webserver und das externe Stylesheet

Ein drittes Stylesheet kann direkt von einem externen Webserver eingebunden werden. Daher muss vor dem Kompilieren der absolute Pfad zu diesem externen Stylesheet im Sketch angegeben werden. Ein Muster des externen Stylesheets ist im Download enthalten.

So ein externes Stylesheet hat auch den Vorteil, dass man schnell mal eine Änderung am Stylesheet vornehmen kann ohne jedes mal den ESP neu programmieren zu müssen oder ein neues File im SPIFFS hochladen zu müssen.

Zur DMX Hardware

Ich entwickle für einen NodeMCU V1.0. Für DMX benötigt man einen MAX485. Ich verwende ein einfaches Breakout Board für den MAX485 und der verwendete GPIO ist daher GPI02/D4/TX1 (am NodeMCU).

Wie geht es weiter

Irgendwann soll der DMX Master um physische Schalter sowie der Auswertung des LDR ergänzt werden. Auf der Wunschliste steht auch das Abspeichern von Sequenzen.

Zur Installation

Die Oberfläche steht entweder in deutsch oder in english zur Verfügung. Je nach Bedarf muss die web.de oder web.en am Anfang des Sketch aktiviert werden.

Ebenso können Webserver und Verzeichnis für das externe Stylesheet und das OTA Upload gespeichert werden, und SSID und Passwort für WLAN gesetzt werden.

Vor dem eigentlichen Upload bitte zunächst das ganze EEPROM löschen. Daten werden im EEPROM (!) gespeichert. Vor dem Upload des Programms empfehle ich das gesamte EEPROM des ESP mit einem einfachen Sktech komplett (4096Byte!) zu löschen und erst danach meinen DMX Master aufzubringen.

/*
 * EEPROM Clear
 *
 * Sets all of the bytes of the EEPROM to 0.
 * Please see eeprom_iteration for a more in depth
 * look at how to traverse the EEPROM.
 *
 * This example code is in the public domain.
 * 
 * 2017-11-15 extended for parallel use with ESP8266 ... untested yet
 * 
 */

#include <EEPROM.h>

//defines depending on the used board
#ifdef ESP8266              
  #define LED_PIN D0
  uint16_t eepromlength = 4092;              
#else
  #define LED_PIN 13             // for all other (AVR) plattforms
  uint16_t eepromlength = 512;   // might be changed later
#endif


void setup() {
  // initialize the LED pin as an output.
  pinMode(LED_PIN, OUTPUT);
 
  /***
    Iterate through each byte of the EEPROM storage.

    Larger AVR processors have larger EEPROM sizes, E.g:
    - Arduno Duemilanove: 512b EEPROM storage.
    - Arduino Uno:        1kb EEPROM storage.
    - Arduino Mega:       4kb EEPROM storage.
    - ESP8266:            4092 EEPROM storage

    Rather than hard-coding the length, you should use the pre-provided length function.
    This will make your code portable to all AVR processors.
  ***/
  Serial.begin(115200);
  Serial.println(F("I: will delete EEPROM"));

  #ifdef ESP8266
    
    EEPROM.begin(eepromlength);
  #else
    EEPROM.begin();
    eepromlength=EEPROM.length();
  #endif
  Serial.print (F("I: EEPROM size ="));
  Serial.println (eepromlength);
  for (uint16_t i = 0 ; i < eepromlength ; i++)
  {
    EEPROM.write(i, 0);
  }
  #ifdef ESP8266
    EEPROM.commit();
  #endif
  // turn the LED on when we're done
  digitalWrite(LED_PIN, HIGH);
  Serial.println(F("I: finished"));
}

void loop() {
  /** Empty loop. **/
}

Außerdem holt sich der ESP mittels DHCP eine IP-Adresse, daher wäre es sinnvoll, den ESP in seinem Router immer die gleiche IP Adresse zuweisen zu lassen. Das erleichtert den späteren Abruf der Weboberfläche ungemein.

Inbetriebnahme - Zusammenfassung

  1. EEPROM löschen - wirklich ganz wichtig besonders bei neuem ESP der noch nie verwendet wurde!
  2. Änderungen im Sketch durchführen (WIFI und Webservereinstellungen).
  3. DMX Masters Sketch aufbringen.
  4. i.css aus dem Verzeichnis data in den ESP8266 hochladen.
  5. external.css auf einen eigenen Webserver hochladen.
  6. Nach dem Programmieren, IP Adresse des ESP am Router rausfinden.
  7. IP Adresse des ESP im Browser eingeben.
  8. Der DMX Master soll erreichbar sein.
  9. Zunächst unter Einstellungen die Anzahl der verwendeten Kanäle festlegen.
  10. Dann unter Kanäle für jeden Kanal festlegen, ob es ein Regler oder Schalter ist. RGB Gruppen bilden etc. Ratsam ist auch die Vergabe eines sprechenden Namens für den Kanal.
  11. So, dann kann man eigentlich schon auf Home gehen und versuchen, ob die ersten Kanäle so funktionieren wie es soll.
  12. Sobald man Szenen abspeichert hat man eigentlich die Sache heraußen.

Und dann noch in eigener Sache

  • Der Sketch ist so wie er ist. Ich bin kein Programmierer und so sieht der Code auch aus.
  • Kommentare gibt es dann, wenn ich glaube dass sie notwendig sind. Andere machen sicher mehr.
  • MISSING in den Kommentaren deuten auf Unzulänglichkeiten im Code, notwendige Klärungen oder Todo's.
  • Meine Entwicklung ist für einen NodeMCU V1.0 entstanden.
  • Die HTML Seiten sollen eine W3C Validierung überstehen, aber ich verwende zu oft fälschlicherweise HTML GET wo man eigentlich POST machen sollte.
  • OTA ist nicht besonders abgesichert, aber für ein schnelles Update reicht's
  • Nett gelöst finde ich die Umstellung der Sprache mit einer einfachen Precompiler Anweisung
  • Die Speicherverteilung des EEPROM hat mich einige grauen Haare gekostet, sinnvollerweise macht man das aber eigentlich im SPIFFS. Das habe ich aber erst gefunden, als ich fast fertig war.
  • Aktuell gibt es eine Beschränkung auf maximal 255 Kanäle. Das liegt an der Art, wie die Kanäle einer Szene gespeichert werden. DMX kann eigentlich 512 Kanäle.

Wenns nützlich war, freue ich mich über ein Kommentar/email, wenns gar nicht geht, darfst du mir gern einen Link auf deine Variante senden die ich ausprobieren kann.

Links


Protokoll

erstellt: 2017-12-14 | Stand: 2020-12-07