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.
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.
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.
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
DANNdigitalWrite(deinRelaisPin1, LOW)
SONST bzw. ELSEdigitalWrite(deinRelaisPin1, HIGH)
Viel Erfolg, ich freue mich auf dein Feedback!
Hallo, super erklärt!
Noch zwei Fragen, kann ich mit der Library auch senden? Ich möchte ein eingehendes Signal empfangen/auslesen und darauf basierend ein neues DMX Signal weitergeben.
Wäre das umsetzbar mit zwei dieser Max485-Module oder wie wäre es sinnvoller? Man könnte auch ein fertiges shield verwenden da hab ich aber noch nichts richtiges gefunden.
Vielen Dank im Voraus
Hallo Paul, leider muss ich an dieser Stelle zugeben, dass ich damit überfragt bin. Klar – theoretisch ist es möglich. Ob die Library von Andreas Hertel aber 2 Module unterstützt und wie man die konfigurieren müsste, um einen als Sender und einen als Empfänger zu konfigurieren findest du glaube ich am Besten auf seiner Seite raus.
Da habe ich mir jetzt tatsächlich mehr erhofft. Wenigstens mal Adressieren über DIP switch, ein wenig Code um eine RGB LED oder einen Stepper Motor zu steuern. So für mich als Arduino Noob mit Bastelideen nicht brauchbar.
Hallo Julian,
Bevor man die Daten weiterverarbeiten kann muss man sie nun mal erstmal empfangen. Das ist der erste Schritt von vielen, um ein „sinnvolles“ Gadget daraus bauen zu können. Ich arbeite gerade an einem Ladet, welches ich auf meiner Webseite auch dokumentieren wollte. Dort findest du dann den Code für 1 weisse LED, einen DC-Motor mit Motor-Shield und 12 RGB-LEDs. Vielleicht schaust du einfach bald nochmal rein, ich werde den Artikel dann hier verlinken.
Moin, danke erstmal für deinen Beitrag. Echt sehr hilfreich da man ja fast nur was zum senden von DMX Signalen findet. Hab damit jetzt aber leider auch ein kleines Problem, und zwar möchte ich das ganze mit einem ESP8266 machen aber die Library scheint nur mit den Arduino Boards kompatibel zu sein. Weißt du eventuell wie ich das anstellen kann das es auch mit dem ESP läuft?
Hallo Julian,
Leider nein. Die größte Chance wirst du wohl haben, wenn du Mathias Hertel anschreibst – von ihm stammt ja die Library.
Hi Jonas,
Ich habe mir zwei erste Licht-Projekt gesucht und kam auf die Idee das ganze über einen Arduino zu steuern, da bin ich über deinen Beitrag gestolpert. Da frag ich mich ob für meine Ideen die Steuerung über ein Arduino so überhaupt sinn macht, oder ob du mir eine andere Herrangehensweise empfehlen kannst.
Die eine Idee ist mehrere LEDs in einer geometrischen Form angeordnet anzusteuern, so dass Muster durchlaufen können oder sich alle gleichzeitig dimmen etc.
Die zweite ist eine Kette aus Glühlampen. Auch hier sollen unterschiedliche Programme drauf laufen.
Insgesamt sollen die Dinge völlig autark laufen, also einfach aufhängen und „Start drücken“.
Merci für den Rat
Maxi
Hi Jonas,
Ich bin neu in dem Thema und habe vor für unsere Partys ein paar Lichtkonstruktionen zu bauen. Dabei ist mir wichtig, dass die Sachen autark laufen und sich niemand darum kümmern muss. Wenn es mal nicht klappt wäre das auch egal. Daher kam ich auf die Idee das über einen Arduino zu steuern und habe deinen Beitrag gelesen.
Einmal wären es ca 100 LEDs die ich unterschiedlich ansteuern, dimmen etc möchte, also quasi Muster darüber laufen lassen. Beim anderen eine kette an Glühlampen, die ich einzeln an-/ausschalten möchte. alles über vordefinierte Programme.
Ist die Lösung mit dem Arduino da sinnvoll oder lohnt sich hier ein Einsteiger Controllpad?
Merci maxi
Hallo Maxi,
vorab sorry, dein Kommentar ist irgendwo im nirgendwo gelandet, daher die späte Antwort.
Für deine Anwendung (Einstecken und Start drücken) brauchst du dann ja aber keine externe Steuerung mittels DMX – oder haben deine LEDs eine DMX-Steuerung und du willst den Arduino zum ausspielen von DMX benutzen?
Beachte bei der Kette von Glühlampen bitte unbedingt die elektrische Sicherheit und arbeite nicht mit hohen Spannungen. Eine LED anzulöten ist das eine, Glühlampen (üblicherweise 230 Volt) bitte nur, wenn du dafür ausgebildet bist.
Hallo,
vielen Dank für den Beitrag, er hat mir wirklich weiter geholfen.
Wie performant ist das lesen des DMX Signals? Ich würde gerne in meinem Main Loop gleichzeitig eine LED Matrix multiplexen und frage mich ob ich irgendwelche delays des Dmx signals berücksichtigen muss
Hallo Robert,
Ich habe da unterschiedliche Erfahrungen gemacht. Bei diesem Setup hier habe ich immer meinen DMX-Tester von Swisson benutzt – der hat immer wunderbar gespielt. Als ich das ganze dann mal an eine GrandMA geklemmt habe, fing das ganze an zu flackern.
Im Endeffekt ist es mit Sicherheit nicht so performant wie „normale“ Hardware der Veranstaltungstechnik, es hängt aber scheinbar auch von dem Signal ab, was man rein schickt. Im Endeffekt wirst du es also probieren müssen.
Lass mich doch mal wissen, wie dein Projekt im Endeffekt aussieht – das interessiert mich!
Hallo,
Ich habe jetzt alles so nachgebaut, den Code hochgeladen und versucht, es zu testen, aber die LEDs machen nix, habe das ganze mit einem Arduino Uno getestet. Alles Kabel und Komponenten funktionieren, aber er will das DMX Signal einfach nicht verarbeiten. Funktioniert die Libary nur mit original Arduinos oder kann man auch z.B. den Elegoo nutzen (ist ja eigentlich baugleich).
Muss beim Snden von Signalen die RX Led leuchten?
Viele Grüße Luis
Habe es selbstständig hinbekommen… mein Arduino hat an den Analog-Pins keine PWM-Ausgänge. Das war der Fehler.
Viele Grüße Luis