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?
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
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
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
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
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
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
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
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)
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.
c-hater hat scheinbar alles theoretisch im Kopf und doch nicht richtig ganz ;-) Praktisch vermutlich noch weniger :()|-X
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.