OpenDCC OneDMX

Ü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.
      Eigenschaften OneDMX
      64 DMX Kanäle ansteuerbar.
      frei definierbare Makroabfolgen (32 Makro mit je 30 Schritten)
      frei definierbare Helligkeitsrampen bis zu 10min Dauer
      Anschluß von bis zu 8 Tastern für direkte Kontrolle des Lichtes.
      Ansteuerung und bequeme Konfiguration über BiDiB.
      Bootloader, automatische Anmeldung am Bus, FW-Update über Bus (kein Programmer erforderlich)

Download

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 128 Lichtausgänge (LPORTs) und 16 Hintergrundausgänge (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
    AusgangOperationKonfiguration
    LPORTTURN_OFF, TURN_ON, DIMM_OFF, DIMM_ON 'Aus'-Helligkeit, 'Ein'-Helligkeit, Andimmzeit, Abdimmzeit, DMX-Kanal
    BACKLIGHTZielhelligkeit (zwischen '0' und 'Max') Andimmzeit, Abdimmzeit, DMX-Kanal
    Die Operation ist innerhalb eines Makros aufrufbar, d.h. man kann Kombinationen von Ausgängen mit entsprechender Zeitverzögerung lokal zu Abläufen zusammen fassen. Mehr Informationen über Makros und deren Leistungsfähigkeit ist der Beschreibung der LightControl zu entnehmen. Auch OneDMX unterstützt Makrolevel 2.

Aufbau

    Text fehlt ...

    Wenn der DMX-Anschluß per Schraubklemme erstellt wird, so muß man wie folgt verdrahten: ....

Inbetriebnahme



    Text fehlt ...

Firmware

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.
    DMX-Protokoll
    Datenformat8N2 = 1 Startbit, 8 Databit, 2 Stopbits
    Baudrate250 kBaud
    FramestartBreak (d.h. 0) für mind. 88us
    Space (d.h. 1) für mind. 8us
    Ein Byte 0x00
    Bedingt durch das einfache Format kann man DMX-Daten ohne großen Aufwand mittels Interrupt direkt aus dem Datenarray abspielen. Einzig die Erzeugung des Framestarts erfordert eine Abweichung von dieser Technik.


    Zur Erzeugung des Framestart kann man sich folgenden Tricks bedienen:
  • 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.


  • 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
          }
      }