DMX-Signal um 1 nach oben shiften

  • Ersteller livebox
  • Erstellt am
Hallo livebox,

ich hab dich mal in unsere Lichtwerkstatt gelotst ;)

Was für Hardware brauche ich denn dafür? Wie sieht es mit Softwaretools aus, Schnittstellen,...?
Schau zunächst mal in diesen Thread: https://www.musiker-board.de/lichtwerkstatt-licht/428837-dmx-bastelecke.html
Die Codefiles die dort angehängt sind, sind schon etwas älter, ich habe sie zuletzt mangels Nachfrage nicht mehr gepflegt.

Die Schaltung selbst braucht:
- stabile 5V Spannung (z.B. 7805)
- Mikrocontroller, würde hier Atmel ATtiny2313 nehmen
- RS485-Schnittstellentreiber-IC für DMX, z.B. SN75179 (senden und empfangen)
- Quarz für den µC
- wenn gewünscht Dipschalter für Einstellungen
- ein paar Kondensatoren und anderer Kleinkram drum herum.

Das Programmieren des Controllers kannst du mit günstigen USB-Programmern aus der Bucht oder im Selbstbau als Bausatz auf der Kommandozeile in Linux machen (-> avrdude).
Ich habe den hier, es gibt aber auch andere Derivate des Originals. Suche einfach mal nach "USBasp". Ich kann dir später aber auch einen brennen und per Post schicken...
Bisher hatte ich das Ganze zum schnell ausprobieren unter Verwendung meiner DMX-Lib in ein paar Zeilen C-Code so umgesetzt. Funktion fehlte mir noch, kann aber auch noch nicht sagen, ob das ein Hardware- oder Softwareseitiges Problem ist.

Code:
#define F_CPU		8000000UL // set crystal frequency
#define CHANNEL_TO_RX 3 // number of DMX channels to be received
#define CHANNEL_TO_TX 5 // number of channels to be send


#include 		<avr/io.h> // headers and definitions for Atmel AVR µC
#include		<avr/interrupt.h> // headers for interrupt support
#include 		"DMX-lib.c" // include DMX-Library

int main(void){
	
	DmxRx.startAddr = 1; // set startaddress
	dmx_init(); // initialize DMX library
	
	
	sei(); // global enable interrupts
	
	
	while(1){ // main loop µC is working in
		
		DmxTx.values[1] = DmxRx.values[0]; // shift first three channels
		DmxTx.values[2] = DmxRx.values[1];
		DmxTx.values[3] = DmxRx.values[2];
		
	}
	
	return 0; // never reached
}


Für mich wäre noch interessant zu wissen, was du (beruflich) an Vorwissen in Elektronik und C-Programmierung mitbringst, damit ich weiß wie weit ich meine Beiträge erläutern muss.

Grüße :)
 
Zuletzt bearbeitet:
Besteht noch Interesse?
 
Oh... jetzt weiß ich wieder, welchen Thread ich vergessen habe! Entschuldige...

Ja, an der Lösung hab ich immer noch Interesse. Allerdings muss ich zugeben, dass ich von deinem Überblick etwas überrascht war. Ich hatte mir vorgestellt, da gäbe es ein verbautes Modul zu kaufen, welches man per USB an den Rechner hängt, einen Code drauf flasht, verbaut und fertig. Das war wohl etwas blauäugig! ;)
Vor dem Lötkolben hab ich keine Angst, aber elektronisch null Wissen. Malen nach Zahlen funktioniert, selbst denken leider noch nicht.

C? Na ja, ich hab vor 5 Jahren mal ein paar Schleifen geschrieben und verkettete Listen gebaut, das ist alles. Heute schreibe ich öfter mal bash Scripte. An der Logik soll's nicht scheitern.

Ich grüble grade nur etwas des Aufwandes wegen... Verkaufst du so Zeug auch? ;)

MfG, livebox

- via Handy
 
Es gibt schon ein Projekt vom User "midi-rakete" aus dem DMXC-Forum.
http://www.dmx4you.de/dmxaddresschanger/DMX-Address-Changer.htm

Ich hatte dort damals einen Thread aufgemacht, weil ich im Prinzip auch sowas gesucht hatte, wie du (nur mit ein paar mehr Features wie einer variablen Startadresse und DMX-Hold). Hab dann kurz danach selber das o.g. Projekt gefunden und zu meinen spezifischeren Fragen aber leider bis heute keine Antwort erhalten, der Thread ist wohl irgendwann untergegangen. Ich komm aber momentan eh zu nix, daher hab ich das dann damals auch erstmal nicht mehr weiter verfolgt. Müsste man dem guten Mann mal eine PN oder Mail schreiben...
 
Ich grüble grade nur etwas des Aufwandes wegen... Verkaufst du so Zeug auch?
OK. Quellcode könntest du funktionsfähig kriegen, ein bespielten Mikrocontroller zu verschicken ist auch kein Problem. Wenn du Schaltung komplett haben willst, dann sehe ich folgende Probleme:
Ich hab kein Gewerbe. Ich kann dir keine Garantie oder Konformitätserklärung ausstellen. Daher würde ich das eher ungern tuen.

Malen nach Zahlen heißt für mich mindestens: Schaltplan und fertig kompiliertes Programm brächtest du?

Grüße :)
 
Hallo jw-lighting,

ich habe auch interesse an diesem Projekt, leider auch keine Kenntnisse im C programmieren.
Löten, AVR Programm daruf schreiben, Schaltplan lesen alles kein Problem.

Dein Code den du da oben gepostet hast sieht sehr simpel aus, ist das schon alles um die Startadresse zu shiften?

DmxTx.values[1] = DmxRx.values[0]; // shift first three channels
DmxTx.values[2] = DmxRx.values[1];
DmxTx.values[3] = DmxRx.values[2];

Dann könnte man z.B. auch so schreiben?:

DmxTx.values[60] = DmxRx.values[1]; // shift Channel 1 to Channel 60
DmxTx.values[80] = DmxRx.values[16]; // shift Channel 16 to Channel 80
DmxTx.values[100] = DmxRx.values[40]; // shift Channel 40 to Channel 100

Dann müsste man aber auch Hardwaremässig ein 75179 als Eingang und ein 75179 als Ausgang nehmen.
hast du da einen Schaltplan?

Ich hatte auch mal beim Herrn MIDI Rakete angefragt, wegen dem Shifter (das wäre genau das richtzige Teil für mich) aber leider keine Antwort bekommen. :(
 
Zuletzt bearbeitet:
Hallo just-lights,

Dein Code den du da oben gepostet hast sieht sehr simpel aus, ist das schon alles um die Startadresse zu shiften?

DmxTx.values[1] = DmxRx.values[0]; // shift first three channels
DmxTx.values[2] = DmxRx.values[1];
DmxTx.values[3] = DmxRx.values[2];
Ja, es ist Dank DMX-Bibliothek tatsächlich ziemlich einfach. Da ich mittlerweile ein digitales Speicheroszilloskop hier habe, konnte ich die Bibliothek auch nochmals etwas verbessern (jetzt seh ich was sie tut, vorher war ich "blind") - der Stand ändert sich momentan laufend, wenn du Interesse an der aktuellen Version hast gerne nachfragen!
Du musst am Anfang die Startadresse setzen (erste Zeile in main()), zählt von 1 an. Die Array-Keys (in eckigen Klammern) mit denen du in DmxRx und DmxTx auf die Werte zugreifst, zählen von null an - Kanal eins ist also Array-Key 0. Mit den Werten kannst du dann einfach arbeiten. Beim Empfänger (Rx) noch die Startadresse abziehen. Mit Startadresse 12 findest du Dmx-Kanal 13 also in DmxRx.values[1].

Dann könnte man z.B. auch so schreiben?:

DmxTx.values[60] = DmxRx.values[1]; // shift Channel 1 to Channel 60
DmxTx.values[80] = DmxRx.values[16]; // shift Channel 16 to Channel 80
DmxTx.values[100] = DmxRx.values[40]; // shift Channel 40 to Channel 100
Jein. Die beiden Konstanten, die oben gesetzt werden, bestimmen die Anzahl der zu empfangenden Kanäle ab Startadresse bzw. die Anzahl der zu sendenden Kanäle. Dazwischen kann nichts frei sein. Die Konstanten müsstest du also anpassen. Für zweimal 512 Kanäle (Senden und Empfangen) brauchst du davon abgesehen alleine dafür 1024Byte Speicher, also einen Controller mit min. 2KB SRAM. Das hat der Tiny2313 nicht. Es gibt aber andere, die das haben ;)
Code:
#define CHANNEL_TO_RX 3 // number of DMX channels to be received
#define CHANNEL_TO_TX 5 // number of channels to be send

Dann müsste man aber auch Hardwaremässig ein 75179 als Eingang und ein 75179 als Ausgang nehmen.
hast du da einen Schaltplan?
Nein. Der 75176 Kann Senden oder Empfangen, aber nicht beides Zeitgleich. Das ist Praktisch für Stand-Alone fähige Geräte mit Master-Slave, da der Master hier von Empfangen auf Senden umschalten kann.
Der 75179 Kann nicht umschalten, hat dafür aber Sender und Empfänger (zeitgleich). Du brauchst also nur einen davon.
Beschaltung ist recht einfach:
VCC an 5V, GND an Masse/0V. An A-B und X-Y ist das DMX-Signal, A und X sind jeweils Data+. An D die Daten zum Senden (TX) anschliessen, an R kommen die Empfangenen Daten raus (RX). Schaltplan-Beispiel findest die hier, nur das dort Empfänger und Sender durchverbunden sind.

Gerne weiter Fragen!!

Grüße :)

PS:
ich habe auch interesse an diesem Projekt, leider auch keine Kenntnisse im C programmieren.
Löten, AVR Programm daruf schreiben, Schaltplan lesen alles kein Problem.
Hast du AVRs schon in einer anderen Sprache programmiert? Oder wie kommts, dass du Flashen kannst?
 
Hallo just-lights,


Jein. Die beiden Konstanten, die oben gesetzt werden, bestimmen die Anzahl der zu empfangenden Kanäle ab Startadresse bzw. die Anzahl der zu sendenden Kanäle. Dazwischen kann nichts frei sein. Die Konstanten müsstest du also anpassen. Für zweimal 512 Kanäle (Senden und Empfangen) brauchst du davon abgesehen alleine dafür 1024Byte Speicher, also einen Controller mit min. 2KB SRAM. Das hat der Tiny2313 nicht. Es gibt aber andere, die das haben ;)


Hast du AVRs schon in einer anderen Sprache programmiert? Oder wie kommts, dass du Flashen kannst?



Hallo,
danke für die ausführliche Antwort, aber dann kann ich das so nicht gebrauchen.
Ich brauche tatsächlich einen frei konfigurierbaren DMX Adress-Shifter, wie es ihn bei MIDI-Rakete gibt.
Muss ich dort nochmal nachfragen, vielleicht bekomm ich ja mal eine Antwort.

Nein, hab AVRs noch in keiner Sprache programmiert, aber mit fertigem Programm über PonyProg geflasht .
 
danke für die ausführliche Antwort, aber dann kann ich das so nicht gebrauchen.
Ich brauche tatsächlich einen frei konfigurierbaren DMX Adress-Shifter, wie es ihn bei MIDI-Rakete gibt.
Muss ich dort nochmal nachfragen, vielleicht bekomm ich ja mal eine Antwort.
Kann ich gerade nicht ganz nachvollziehen. Ich schrieb ja, dass das möglich ist, wenn du einen entsprechenden Controller nimmst, wie z.B. ATmega8. Den verwendet übrigens auch MIDI-Rakete...
 
*piep*

Wollte mich auch mal wieder melden hier. Ich gestehe: Meine Tendenz geht inzwischen doch zur Fertiglösung....
 
  • Gefällt mir
Reaktionen: 2 Benutzer
midi-rakete meldet sich nicht auf E-Mails ??? Komisch, ich habe jetzt beim Durchsuchen meiner Mails keine Fragen gefunden.
Wie ihr schon richtig entdeckt habt, kann mein DMX-Address-Changer http://www.dmx4you.de/dmxaddresschanger/DMX-Address-Changer.htm problemlos alle Adressen um 1 verschieben. Beim Atmel Mega 8 muss man bedenken, dass man kein Platz hat, um zwei komplette Universes zu Speichern (DMX In und DMX Out). Bei dem Code oben, müsste man entweder die maximale Anzahl von DMX Adressen reduzieren (Bei einer RGB Lampe reichen 128 Adressen aus) oder wie bei meinem Projekt: 512 Bytes für das komplette DMX Out Universe und sobald ein Byte am DMX-In anliegt, wird es sofort an die zugewiesene DMX-Out-Adresse im Speicher gelegt.

Bei meinem DMX-Adress-Changer sind für die Programmierung Tasten und Display angeschlossen aber man kann ihn auch ohne Display und Tasten preisgünstig betreiben. Die Werte für Adressbereich und Offset können im EEPROM gespeichert werden.

wolfgang (midi-rakete)
 
midi-rakete meldet sich nicht auf E-Mails ??? Komisch, ich habe jetzt beim Durchsuchen meiner Mails keine Fragen gefunden.
Danke, dass du trotzdem den Weg hierher gefunden und uns eine Antwort gegeben hast!

Bei dem Code oben, müsste man entweder die maximale Anzahl von DMX Adressen reduzieren (Bei einer RGB Lampe reichen 128 Adressen aus) oder wie bei meinem Projekt: 512 Bytes für das komplette DMX Out Universe und sobald ein Byte am DMX-In anliegt, wird es sofort an die zugewiesene DMX-Out-Adresse im Speicher gelegt.
Dein Weg ist für diesen konkreten Anwendungsfall der bessere. Die oben verwendete Lib ist allerdings allgemein für senden und empfangen geschrieben worden, und daher für diesen Anwendungsfall noch nicht ganz optimal. Man könnte da entweder die Lib als Grundlage für eigene Anpassungen verwenden oder aber - quick&dirty - zu einem mega168 oder mega328 greifen.

Bei meinem DMX-Adress-Changer sind für die Programmierung Tasten und Display angeschlossen aber man kann ihn auch ohne Display und Tasten preisgünstig betreiben. Die Werte für Adressbereich und Offset können im EEPROM gespeichert werden.
Das Speicherabbild für die Konfiguration im EEPROM wird als C-Quellcode mitkompiliert? Oder wie erstellst du es?

Grüße
 

Ähnliche Themen


Unser weiteres Online-Angebot:
Bassic.de · Deejayforum.de · Sequencer.de · Clavio.de · Guitarworld.de · Recording.de

Musiker-Board Logo
Zurück
Oben