Forum: Mikrocontroller und Digitale Elektronik Servos mit DMX Signal steuern_DMXtoPWM


von Fabian L. (fabianliszt)



Lesenswert?

Hallo,

Ich bin ein absoluter Neuling in Sachen Microcontroller und Coding und 
habe  für ein Projekt Hilfe von jemandem in Anspruch genommen der nun 
aber auch nicht mehr weiter weiß.
Ich benutze ein Arduino Mega Board (ATXMEGA2560) um 20 Servomotoren zu 
steuern. Funktioniert mit Eingabe durch ein Poti soweit gut.
Da die Mechanik für ein Bühnenbild gedacht ist, bei dem die Servomotoren 
Lamellen in verschiedenen Winkeln und in Abstimmung auf eine 
Programmierte Lichtstimmung kippen sollen (also alles auf ein und dem 
selben Lichtpult geregelt werden muss), möchte ich ein DMX Signal auf 
mein PWM Signal übertragen.

Testhardware:

-Swisson XMT-350 (Im 'all channels' Mode) 
https://www.swisson.com/site/assets/files/1274/um-xmt-120350-d0-lde-v01-02.pdf

-SN75176BP https://www.ti.com/lit/ds/symlink/sn75176b.pdf

-Arduino Mega2560

-VOLTCRAFT DSO-1254F (Oscilloscop)

Verdrahtung der Schnittstelle (SN75176BP) mit Board und DMX Tester:

Pin1 -> RX0 (Arduino)
Pin2,3und5 -> GND (Arduino)
Pin6 -> DMXPin2 (Swisson)
Pin7 -> DMXPin3 (Swisson)

Code: ServoAttachDMX.ino (anbei)

Wegen der belegung desSerialports verbinde ich erst nach dem Upload des 
Arduino Sketch die Schnittstelle mit dem RX0Pin in den ich das DMX 
Signal lege.

Gestern funktionierte es kurz. Heute nach vermeindlich selbem Aufbau 
nicht. Veränderung der Werte am DMX Tester verändern die PWM Kurve 
nicht.
Mit Drücken des Reset Knopfes verschwindt die PWM Kurve am Osci ganz 
(Arduino scheint abzustürzen)

Ich komme nicht hinter den Fehler.

Könnt Ihr mir weiter helfen?

von Sam W. (sam_w)


Lesenswert?

Momentan setzt du alle Servos auf das, was auf Kanal 1 gesendet wird 
(vielleicht Absicht).
Du solltest allerdings den DMX-Wert (0-254) auf die Werte mappen, die 
mit der write() Funktion geschrieben werden können, nämlich 0-180. Die 
Winkelangabe erfolgt in Grad.
Schau mal nach der map() Funktion ;-)

Bin mir nicht sicher, ob das alle Probleme behebt, aber komisches 
Verhalten können Werte außerhalb des möglichen Bereichs schon 
hervorrufen.

: Bearbeitet durch User
von Marco H. (damarco)


Lesenswert?

Also das wird so nicht funktionieren. Wie wird der PWM denn erzeugt? 
Software oder Hardware ? Ich vermute mal per Software und das verträgt 
sich er weniger mit der DMX Bibliothek...

Die Aufgabe ist mit der Hardware nicht lösbar. Sobald der PWM wackelt 
bewegen sich die Servos.

Das ließe sich lösen mit einem LED PWM Treiber. Schau mal nach so 
Servoboard mit 16 Channels. Diese haben einen eigenen Clock und lassen 
sich per SPI oder i2c steuern.

Ehrlich gesagt hätte ich das auch nie so gebaut ! Denn das Problem ist 
die Stromversorgung der Servos ! Wenn ich den Aufbau sehe... Ohjee

von Marco H. (damarco)


Lesenswert?


von Sam W. (sam_w)


Lesenswert?

Fabian L. schrieb:
> Pin1 -> RX0 (Arduino)
> Pin2,3und5 -> GND (Arduino)
> Pin6 -> DMXPin2 (Swisson)
> Pin7 -> DMXPin3 (Swisson)

Vielleicht übersehe ich etwas im Bild, aber es ist gute Praxis und bei 
DMX absolut üblich, auch den GND/Masse/Abschirmung des DMX Kabels zu 
verdrahten. Also DMXPin1 auf GND des Treibers legen.

: Bearbeitet durch User
von Marco H. (damarco)


Lesenswert?

Quark.. RS422 ist symmetrisch.. Man legt ihn mit 100 Ohm auf das hat 
andere Gründe, der Schirm ist technisch gar nicht nötig.

Der Anschluss ist trotzdem Käse...

1 Schirm
2 -
3 +

Was A bzw B ist lasse ich als Hausaufgabe offen.

Den 75176 mit 100n Abblocken und den RX Mode am entsprechenden Pin 2/3 
setzen.

Den Ozzi am RX Pin nicht an 2 oder 3, es sei denn man hat einen 
entsprechenden Tastkopf.

: Bearbeitet durch User
von Sam W. (sam_w)


Lesenswert?

Marco H. schrieb:
> Quark.. RS422 ist symmetrisch..

Bei DMX wird RS485 verwendet, aber ist ja eng verwandt.
Klar ist das symmetrisch, aber den Schirm aufzulegen ist trotzdem nicht 
verkehrt. So gut wie alle DMX Geräte (die ich bislang gesehen habe), 
sofern sie am Eingang DMX nicht galvanisch trennen, machen das so.

Laut Spezifikation ist das wohl nicht zulässig, aber mit einem 
Widerstand von wenigen Ohm (bis 100 Ohm) zwischen Abschirmung (DMXPin1) 
und Schaltungsmasse (GND) geht es wieder.
Komplett floating ist wohl auch ok.

: Bearbeitet durch User
von Fabian Liszt (Gast)


Lesenswert?

Also das System an sich läuft ja schon.
Benutze momentan noch eine 6v netzteil mit ca.  4A Begrenzung und ein 20 
poliges Flachbandkabel für kein pwm Signal.
Das scheint für 20 Modellbauservos zu reichen, denn sie bewegen sich ja 
und das ziemlich stabil.
Würde sie dann auf Anraten mit einem 6v Bleiakku versorgen.

Mein Problem ist die Eingabe über das Lichtpult.


Marco H. schrieb:

> Ehrlich gesagt hätte ich das auch nie so gebaut ! Denn das Problem ist
> die Stromversorgung der Servos ! Wenn ich den Aufbau sehe... Ohjee

von Marco H. (damarco)


Lesenswert?

Es kann nicht laufen. Da für so viele PWM Kanäle keine Timer mit CC 
Registern vorhanden sind. Also wird die PWM Software mäßig erzeugt. 
Zumal man das DMX Value umrechnen muss. Entweder in einem Winkel oder CC 
Value.

Wenn du keine Ahnung hast dann nimm die fertige Lösung. Die Funktioniert 
!

Das Problem besteht darin, das die ISR für den Software PWM im Konflikt 
mit der ISR für DMX Break und Daten byte steht. Es ist ein AVR kein 
ARM...

: Bearbeitet durch User
von Mick (Gast)


Lesenswert?

So wie Marco H. das schildert, wollte ich es heute Morgen eigentlich 
auch schreiben ;-) Auf dem ATXMEGA fehlen die nötigen Ressourcen für 20 
PWM Kanäle UND DMX.

Was bei dir aber funktionieren könnte:
- Arduino Mega Board (wie vorhanden)
- 2 x PCA9685 über I2C ansteuern (https://www.adafruit.com/product/815)

von c-hater (Gast)


Lesenswert?

Marco H. schrieb:

> Es kann nicht laufen.

Quatsch mit Soße.

> Da für so viele PWM Kanäle keine Timer mit CC
> Registern vorhanden sind. Also wird die PWM Software mäßig erzeugt.

Ja klar. Wo soll da das Problem sein?

Ein vernünftig programmierter DMX-Empfänger für AVR8 braucht ca. 20 
Takte in der ISR. Was bedeutet (wenn es nur ISRs für DMX-Empfang und 
Software-PWM gibt): der Jitter der Software-PWM beträgt eben 20 Takte.

Was bei 8Mhz Takt wiederum bedeutet: 20*125ns=2,5µs. Der Wertebereich 
der Servo-PWM beträgt 1000µs (nämlich zwischen 1 und 2 ms Puls). D.h.: 
der Fehler der PWM durch den vom DMX-Empfang verursachten Jitter beträgt 
"satte" 0,25%.

Selbst wenn man mal optimistisch annimmt, dass die Software-PWM so 
intelligent umgesetzt ist, dass sie den Wertebereich wirklich mit 8 Bit 
Auflösung umsetzen kann, ist der durch den Jitter verursachte Fehler 
deutlich unterhalb eines PWM-Schritts, denn die Schrittweite beträgt 
dann ca. 0,4% des Stellbereichs.

> Zumal man das DMX Value umrechnen muss.

So what? Das muss man doch nicht in der ISR erledigen. Das macht man, 
wenn Zeit dafür ist. In main(). Denn main würde in dieser Anwendung 
schlicht aus einer Endlosschleife bestehen, der über die relevanten 
Servokanäle des  DMX-Frames iteriert und jeweils, basierend auf dem 
zuletzt empfangenen Steuerwert den PWM-Wert des entsprechenden 
Servokanals setzt. Diese Routine stört weder den DMX-Empfang noch die 
PWM-Erzeugung.

> Wenn du keine Ahnung hast

Das sagt jemand, der offensichtlich selber keine hat...

> Das Problem besteht darin, das die ISR für den Software PWM im Konflikt
> mit der ISR für DMX Break und Daten byte steht.

Ja klar gibt es da einen Konflikt, wie immer bei konkurrierenden 
Anforderungen an die Rechenzeit. Der ist aber hier vollkommen irrelevant 
bezüglich der Aufgabe.

von Mick (Gast)


Lesenswert?

c-hater hat scheinbar alles theoretisch im Kopf und doch nicht richtig 
ganz ;-) Praktisch vermutlich noch weniger :()|-X

von Marco H. (damarco)


Lesenswert?

Das meine ich auch :,-)..

Och also ich habe einen eigenen DMX RDM Code lauffähig auf einen AVR u. 
ARM vorzuweisen? und du!?

Wenn tritt denn die UART ISR auf? und wie wird der Software PWM erzeug? 
Wenn darf man die DMX Values lesen ? Wie viel Zeit hat man dazu ? Kann 
man das in einer Schleife laufen lassen?

von Marco H. (damarco)


Lesenswert?

Was hinzufügen ist..

Wenn man sich darüber Gedanken macht ist die Abgabe schon lösbar. 
Allerdings nicht mit der eingesetzten IDE und Bibliotheken.

Sie wird aber einfacher wenn man die Erzeugung des PWMs auslagert. Wie 
schon erwähnt mit einem LED Driver Board.

von c-hater (Gast)


Lesenswert?

Marco H. schrieb:

> Wenn man sich darüber Gedanken macht ist die Abgabe schon lösbar.
> Allerdings nicht mit der eingesetzten IDE und Bibliotheken.

Ganz genau so ist das. Wenn man's selber und optimiert für die Aufgabe 
programmiert, ist es eigentlich überhaupt kein Problem.

Nimmt man irgendwelche Arduino-Gülle, braucht man Hardware mit sehr viel 
mehr Leistung. Weil Arduino-Gülle eben dramatisch ineffizient ist.

Das ist so gewollt. Denn damit kann man "größere" Boards verkaufen und 
viele Shields...

Ist aber die freie Entscheidung jedes Einzelnen: Lerne ich lieber Denken 
und Programmieren oder benutze ich Arduino...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.