OpenDCC OneDMX
- Vorbemerkung: Diese Seite deckt mehr die technischen Aspekte der Baugruppe ab, für den Anwender finden sich
wichtige Informationen auf www.fichtelbahn.de.
Überblick, Entstehung
-
OneDMX ist eine DMX-Ansteuerung für übliche DMX512-Dimmer. Zur Benutzung wird eine Hardware, bestehend aus
- BiDiBOne (BiDiB-Einsteckmodul)
- OneIF (Interface-Grundboard)
- OneTaster (Tastatur-Platine, optional) benötigt.
Auf dem OneIF werden die RJ45-Buchsen für die Hub-Funktion nicht bestückt, statt dessen kann entweder direkt eine XLR-Buchse von Neutrik montiert werden oder alternativ der DMX-Anschluß per Schraubklemmen erstellt werden.
|
Download
- Siehe Downloadseite des BiDiBOne.
Beschreibung
- An dieser Stelle werden die prinzipiellen Eigenschaften beschrieben. Wie man aus den hier beschriebenen
Eigenschaften und Möglichkeiten dann am elegantesten eine Raumlichtsteuerung macht, ist auf .... beschrieben.
OneDMX ermöglicht die Steuerung des Raumlichtes über BiDiB und DMX. Die über DMX ansteuerbaren Dimmer, Leuchtmodule und Scheinwerfer werden dabei ähnlich wie Beleuchtungen auf der Modellbahn über die entsprechenden BiDiB-Befehle gesteuert. Dabei wurde folgende Abbildung gewählt, welche maximale Flexibilität in der Anwendung ermöglicht:
Graphik fehlt noch
Es gibt 64 Lichtausgänge (LIGHTPORTs) und 16 Hintergrundausgänge (BACKLIGHTs) (ab Firmware 3.0: 64 Backlights). Diese Ausgänge sind aber nicht real, sondern nur virtuell angelegt, d.h. es ist noch keinerlei physikalische Aktion damit festgelegt. Jeder dieser Ausgänge beherrscht Operationen (das sind Aktionen wie z.B. Aufdimmen, Abdimmen, Blinken, Einschalten) und wendet diese Operationen dann auf einem DMX-Kanal an, welcher diesem Ausgang zugeordnet ist. Es ist möglich, verschiedene Ausgänge auf den gleichen DMX-Kanal wirken zu lassen, bis zu 64 DMX-Kanäle (Kanalnummer 1 ..64, so wie am DMX-Gerät eingestellt) können verwendet werden.
Diese Ausgänge können dann entweder direkt oder über eine zwischengeschobene Ablaufsteuerung (Makro) in das Modellbahnprogramm eingebunden werden.
Bei Ausgängen muß man prinzipiell zwischen Aktion und Konfiguration unterscheiden. Konfiguration wird benutzt, um einmalig bestimmte Eigenschaften des Ausgangs festzulegen. Aktion wird benutzt, um während des Betriebes den Ausgang anzusteuern.
Eigenschaften von Ausgängen | ||
---|---|---|
Ausgangstyp | Operation | Konfiguration |
LIGHTPORT | TURN_OFF, TURN_ON, DIMM_OFF, DIMM_ON | 'Aus'-Helligkeit, 'Ein'-Helligkeit, Andimmzeit, Abdimmzeit, DMX-Kanal |
BACKLIGHT | Zielhelligkeit (zwischen '0' und 'Max') | Andimmzeit, Abdimmzeit, DMX-Kanal |
Aufbau
- Text fehlt ...
Wenn der DMX-Anschluß per Schraubklemme erstellt wird, so muß man wie folgt verdrahten: ....
Inbetriebnahme
Text fehlt ...
Firmware
Tastenfunktionen
-
Am Interfaceboard, welches für OneDMX verwendet wird, sind 8 Eingänge vorhanden. Diese lassen sich wie folgt nutzen:
- Abfrage innerhalb eines Makros:
Innerhalb von Makros können mit den entsprechenden Befehlen Zustände von Eingängen abgefragt werden, z.B. kann man ein Makro verzögern, bis der gewählte Eingang einen bestimmten Zustand hat. - Start von Makros:
Durch Freigabe des Features FEATURE_CTRL_MAC_START_MAN (z.B. mit dem Monitor) kann ein Eingang zum Start eines Makros benutzt werden. Beispiel: Makro 3 enthalte die Befehle für 'Es werde Tag', z.B. einen kompletten Dämmerungsübergang. Betätigen eines Taster, welcher an Eingang 3 angeschlossen ist, starten dann dieses Makro. Der Taster 3 ist damit der Auslöser für 'Es werde Tag'. - Direktes Steuern von DMX-Ausgängen:
Eingänge (genauer: an den Eingängen angeschlossene Taster) können direkt die DMX-Kanäle steuern. Dabei ist folgende Bedienlogik implementiert:- Aufdimmen: Lang Drücken. Die Helligkeit wird ausgehend von der aktuellen Helligkeit nach oben gedimmt, solange die Taste gedrückt ist. Sobald man die Taste losläßt, bleibt die Helligkeit.
- Abdimmen: Kurz Drücken. Die Helligkeit wird ausgehend von der aktuellen Helligkeit nach unten gedimmt. Drückt man während es Abdimmens erneut auf den Taster, bleibt die Helligkeit.
CVs für die manuelle Steuerung. Die Zeiten für die Schrittdauer beeinflussen die Aufdimm- bzw. Abdimmgeschwindigkeit. Für die gesamte Helligkeit sind 256 Schritte erforderlich, eine Einstellung von 10 bedeutet also 10*256 = 2,56s Dimmdauer.
DMX-Ansteuerung
- Es können bis zu 64 DMX-Kanäle angesteuert werden, diese werden wie bei der
LightControl mittels einer Makromaschine zu Abläufen kombiniert.
Durch das zusätzliches Feature FEATURE_CTRL_STRETCH_DIMM ist eine zeitliche Streckung von
Dimmaktionen möglich, es sind Helligkeitsübergänge
bis 10min Dauer realisierbar.
Des weiteren gibt 8 es Eingänge, um z.B. Makros direkt zu starten. Als vordefnierte Makros stehen zur Verfügung: Alles AN, Alles AUS, TAG, NACHT, usw.
DMX-Erzeugung
- Das DMX-Protokoll ist recht einfach, es werden ausgehend von einen Framestart die Daten 'as is' gesendet, eine Prüfsumme
oder CRC fehlt.
- Man ändert die Baudrate auf 57000 Baud und schickt als Daten 0xC0. Die Daten werden LSB-first übertragen, so dass zusammen mit dem Startbit insgesamt 7 Bits gleich 0 sind. Bei 57k dauert ein Bit 17.5us, d.h. man erzeugt auf diesem Weg 122us Low und 70us High.
- Dieses erste Byte wird vollständig ausgegeben und erzeugt Break und folgenden Space. In der Interruptroutine für TX-Complete wird dann die Baudrate auf 250kBaud umgeschaltet und eine 0x00 ausgeben.
- Alle folgenden Bytes des DMX-Datenarray werden dann einfach mit dem TX Data Ready-Interrupt ausgegeben.
DMX-Protokoll | |
---|---|
Datenformat | 8N2 = 1 Startbit, 8 Databit, 2 Stopbits |
Baudrate | 250 kBaud |
Framestart | Break (d.h. 0) für mind. 88us Space (d.h. 1) für mind. 8us Ein Byte 0x00 |

Zur Erzeugung des Framestart kann man sich folgenden Tricks bedienen:
Codebeispiel für ATXmega
signed char cur_dmx_chan; t_cr_task dmx_autoupdate(void) { // Start of DMX-Frame // DMX_UART.BAUDCTRLA = 135; // create Break by using 57600 Baud DMX_UART.BAUDCTRLB = (-2 << USART_BSCALE_gp); cur_dmx_chan = -1; DMX_UART.DATA = 0xC0; // create Break and Mark // interrupt levels, possible: OFF, LO, MED, HI DMX_UART.CTRLA = USART_RXCINTLVL_OFF_gc // Receive Complete Interrupt level | USART_TXCINTLVL_LO_gc // Transmit Complete Interrupt level | USART_DREINTLVL_OFF_gc; // Data Register Empty Level return(DMX_UPDATE_PERIOD / SYSTICK_PERIOD); // sleep for DMX_UPDATE_PERIOD } ISR(DMX_TXC_vect) { if (cur_dmx_chan < 0) { DMX_UART.BAUDCTRLA = 3; // change to 250kBaud DMX_UART.BAUDCTRLB = (1 << USART_BSCALE_gp); cur_dmx_chan = 0; DMX_UART.DATA = 0; // send the initial 0x0 DMX_UART.CTRLA = USART_RXCINTLVL_OFF_gc // Receive Complete Interrupt level | USART_TXCINTLVL_OFF_gc // Transmit Complete Interrupt level | USART_DREINTLVL_LO_gc; // Data Register Empty Level } else { // stop everything // interrupt levels, possible: OFF, LO, MED, HI DMX_UART.CTRLA = USART_RXCINTLVL_OFF_gc // Receive Complete Interrupt level | USART_TXCINTLVL_OFF_gc // Transmit Complete Interrupt level | USART_DREINTLVL_OFF_gc; // Data Register Empty Level // change to 57600 Baud -> prepare for Break and Mark DMX_UART.BAUDCTRLA = 135; DMX_UART.BAUDCTRLB = (-2 << USART_BSCALE_gp); } } ISR(DMX_DRE_vect) { DMX_UART.DATA = dmx_value[cur_dmx_chan]; cur_dmx_chan++; if (cur_dmx_chan == sizeof(dmx_value) / sizeof(dmx_value[0])) { // all dmx done // stop DRE Interrupts DMX_UART.CTRLA = USART_RXCINTLVL_OFF_gc // Receive Complete Interrupt level | USART_TXCINTLVL_LO_gc // Transmit Complete Interrupt level | USART_DREINTLVL_OFF_gc; // Data Register Empty Level } }