DMX empfangen mittels Arduino

Schaltung zum DMX-Empfang aus Fritzing

Das Empfangen von einem DMX Signal mit einem Arduino ist eigentlich nicht wirklich schwer. Sucht man aber Informationen bei Google darüber findet man erstmal nur Beiträge die erklären, wie das Senden funktioniert.

Aber fangen wir mal vorne an: DMX512 ist ein Datensignal, welches man vor allem in der Lichttechnik zum Steuern von Scheinwerfern benutzt. Es basiert auf dem RS-485-Signal. Ein 5 oder 3-poliger XLR-Stecker kann dabei 512 einzelne Kanäle mit einer Auflösung von 8 Bit übertragen – sprich 256 Werte. Der jeweilige Wert wird dabei mit bis zu 44,1 Hertz übertragen, so dass eine Update der Informationen etwa alle 22 Millisekunden erfolgt. Für die meisten Anwendungen reicht das vollkommen. Die Mechanik und Glühlampen der zu steuernden Teile sind meist so träge, dass diese kurze Zeitspanne gar nicht auffällt.
Seit einiger Zeit setzten sich auch diverse Alternativen durch, welche durch Netzwerkprotokolle übertragen werden – beispielsweise ArtNet oder sACN.

DMX ist trotzdem noch der Standard in der Lichttechnik – und die Anbindung an einen Arduino ist relativ simpel. Gerade für Lichtdesigner, die eigene Ideen haben, kann sich ein Arduino als Basis für ein Selbstbauprojekt anbieten. Als Warnung sei hier jedoch gesagt: jeder Computer und jeder Mikrocontroller kann abstürzen oder Fehlfunktionen haben. Jedes Selbstbauprojekt welches du umsetzt sollte also höchstens als Gimmick benutzt werden. Wenn ohne dieses Teil die komplette Show nicht funktioniert gehst du ein hohes Risiko ein!

Benutzte Hardware

Zunächst einmal gucken wir uns die Hardware an, die wir dem Empfang von DMX benötigen:

  • einen Arduino
  • ein Max485-Modul
  • idealerweise ein Breadboard zum testen
  • ein XLR Stecker (männlich 5-Pol)
  • ein paar LEDs, mit denen du beim Testen das Signal ausgeben kannst

Welchen Arduino du benutzt ist dabei vollkommen egal, der Arduino Nano kann genau so gut DMX empfangen wie der Arduino Uno oder der Arduino Mega. Ich benutze nachher eine Library zum Empfangen des DMX Signals, welche auf allen Arduino, ATmega oder kompatiblen Geräten funktionieren sollte.

Ich benutze ein vorgefertigtes Max485-Modul, welches es für ein paar Euro gibt. Es geht auch ohne dieses Modul, die anderen Lösungen bieten aber entweder diverse Nachteile wie Kurzschlussgefahren oder einen deutlichen Mehraufwand.
Der XLR-Stecker sollte nach der Norm ein 5-Poliger sein, im Zweifelsfalle tuts aber auch der 3-Polige. Beide Varianten sind in der Lichttechnik verbreitet, da man eh nur 3 Pole benutzt – wegen der Norm bleibe ich jedoch bei der 5-Poligen Variante.

Verkabelung des DMX-Signals

Sehen wir die Schaltung mal als Signal-Kette. Von links kommt das DMX-Signal, welches das MAX485-Modul empfängt. Das Modul leitet die Daten an den Arduino weiter, welcher dann entsprechende LEDs, Motoren oder sonstige angeschlossene Hardware damit steuert. In unserem Falle benutzen wir hier einfache LEDs, aber hier sind der Kreativität ja keine Grenzen gesetzt.

Schaltung zum Empfangen von DMX Daten
Steckplatinenansicht aus Fritzing

Den Shield – oder Pin 1 vom XLR – verbinden wir mit dem Ground vom Arduino, die anderen beiden mit dem MAX485-Modul: Pin 2 auf den Verbinder B und Pin 3 auf den Verbinder A.

Das MAX485-Modul wird mit einer 5V-Spannung vom Arduino gespeist. Je nach Spannungsquelle kann man auch direkt aus dieser abgreifen, ansonsten nimmt man den entsprechend Pin vom Arduino und verbindet diesen mit dem VCC des Moduls. Um den Stromkreis zu schließen muss der GND-Pin vom Modul auch an den Ground vom Arduino angeschlossen werden. DE und RE werden ebenfalls mit der Masse (also dem Ground) verbunden. Die Daten werden über eine einzelne Leitung vom R0 in den RX-Pin vom Arduino geschickt.

An der Ausgangsseite schließen wir dann noch unsere zwei LEDs an, welche den Test-Output darstellen können. Später könnte man eine davon benutzen, um dem Empfang vom DMX Signal auf dem Arduino anzuzeigen.

Software auf dem Arduino

Um DMX mit dem Arduino zu empfangen hat sich Matthias Hertel glücklicherweise schon die Arbeit gemacht und eine Arduino Library veröffentlicht. Diese muss auf den Arduino kopiert werden und mit #include <DMXSerial.h> in unserem Editor eingebunden sein.

In der Setup-Funktion initialisieren wir nun die Library mittels DMXSerial.init(DMXReceiver);

Jetzt können wir die per DMX empfangenen Werte mit DMXSerial.read(Adresse)) auslesen. Die Adresse steht hierbei natürlich für den gewünschten Kanal der 512 möglichen.

Hier jetzt ein kleiner Beispielcode, mit welchem wir die beiden LEDs nun dimmen können. Hierfür müssen wir dem Arduino natürlich auch mitteilen, an welchen PWM-Pins die LEDs angeschlossen sind. Vorweg noch ein Hinweis: Praktischerweise sind sowohl der ankommende DMX-Wert als auch der ausgehende PWM-Wert im Bereich 0-255. Das macht eine Umrechnung – beispielsweise in Prozentuale Werte – also überflüssig.

#include <DMXSerial.h>
const int Led1Pin =  5;  // PWM Pin für die erste LED
const int Led2Pin =  6;  // PWM Pin für die zweite LED

void setup () {
  DMXSerial.init(DMXReceiver);
  pinMode(Led1Pin, OUTPUT); // Pin von der ersten LED als Ausgang definieren
  pinMode(Led2Pin, OUTPUT); // Pin von der zweiten LED als Ausgang definieren
}

void loop() {
  analogWrite(Led1Pin, DMXSerial.read(1));
  analogWrite(Led2Pin, DMXSerial.read(2));
}

Die ersten beiden Kanäle des DMX Signals werden jetzt zum Testen an die LEDs geschickt. Natürlich bietet es sich an das Programm ein bisschen Auszubauen. Eine weitere Variable mit einer Start-Adresse mag sinnvoll sein, oder eine Überprüfung, wie lang bereits kein DMX-Signal mehr empfangen wurde. Die Methode DMXSerial.noDataSince() ist bereits ein in die Library eingebaut und gibt einen Wert in Millisekunden zurück, wann das letzte Signal empfangen wurde.

Eine der beiden LEDs könnte jetzt auch als Indikator funktionieren, ob ein DMX-Signal anliegt. Es gibt bei DMX immer mal wieder Signalverluste – man sollte hier also den Wert nicht bei den oben genannten 22ms anlegen, muss aber auch keine Sekunde warten.

Fazit zum DMX Empfang mit einem Arduino

Wie bereits erwähnt würde ich keine wirklich showrelevanten Geräte im Selbstbau mit einem Arduino herstellen. Als kleines „Add-On“ oder Gimmick kann man aber durchaus einen Arduino benutzen, um ein DMX-Signal zu verarbeiten. Mein erstes Projekt wo ich das genutzt habe ist eine Spiegelkugel, im Originalzustand einfach nicht so toll war.

Autor: Jonas Rüter

Hallo, mein Name ist Jonas und ich bin der Betreiber dieser Webseite.

2 Gedanken zu „DMX empfangen mittels Arduino“

  1. Hallo,
    erstmal danke für den Code, hat mir sehr weiter geholfen.

    ich hab es ausprobiert und funktioniert sehr gut. Allerdings hab ich zwei Probleme. Ich möchte auf Kanal 1 und 2 je ein Relais steuern dieses sollte eigentlich ab einem Wert vom Fader bei 50% an und unter 50% aus gehen wie kann ich das lösen?

    und zweites Problem, wenn ich die Fader unten habe leuchtet die angeschlossene LED auf 100% um so mehr ich den Fader nach oben bewege um so dunkler wird sie. Wie kann ich den Fader invertieren?

    Ich hoffe du kannst meine Fragen beantworten.

    1. Hallo Marius, schön, wenn der Code bisher funktioniert.
      Deine zweite Frage möchte ich zuerst beantworten: Wie beschrieben sind ja beide Werte (also Eingang vom DMX und Ausgang an die LED) im Bereich 0-255. Schaue doch erstmal in der Konsolenausgabe, mittels Serial.print(), ob dein Eingang oder dein Ausgang falsch rum ist. Schickst du 0% vom Fader – bekommst du dann 0 (das wäre korrekt) oder 255?

      Zu deiner ersten Frage: Wenn du diesen Wert ja jetzt weisst, kannst du nun mit einer if-else-anweisung deine Relais schalten.
      Zum schalten des Relais benutzt du natürlich nicht analogWrite sondern digitalWrite
      Also: Wenn DMXSerial.read(1) < 127 DANN digitalWrite(deinRelaisPin1, LOW) SONST bzw. ELSE digitalWrite(deinRelaisPin1, HIGH)
      Viel Erfolg, ich freue mich auf dein Feedback!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.