OpenDCC - Eine Lowcost-Zentrale für DCC - Betrieb mit Linux und Rocrail

    Linuxteil geschrieben von Norbert Martsch, MAC-Teil geschrieben von Olaf Krömeke

Linux

    Dieses kleine Howto beschäftigt sich mit dem Betrieb der OpenDCC-Zentrale unter openSUSE 10.2, Linux Kernel 2.6.18.xx und RocRail. Ich denke, dass sich meine beschriebenen Schritte ebenfalls auf andere Distributionen übertragen lassen, ggf. Verzeichnisse für die Dateien anpassen. Ab Kernel 2.6.22 wird OpenDCC (USB-Version) offiziell unterstützt, ab Version 2.6.31.2 sind auch Sniffer, Gateway und Handregler als bekannte Devices enthalten. damit werden diese Geräte ohne manuelle Einstellungen als serielle Schnittstelle erkannt.

    Mein Vorgehen orientierte sich an der Beschreibung von Guido Scholz in der Newsgroup de.rec.modelle.bahn (http://groups.google.de/group/de.rec.modelle.bahn/browse_thread/thread/58a6464772622da3?hl=de). Als Software zum Steuern der Modellbahn verwende ich RocRail.

Schritt 1: Linux vorbereiten


    OpenDCC vom System trennen, falls noch verbunden! Erste Voraussetzung ist, dass die verwendete Distribution udev unterstützt. Bei openSUSE 10.2 ist dies der Fall. Als nächstes sollte man als root angemeldet sein und ins Verzeichnis

      /etc/udev/rules.d/

    wechseln. Dort wird eine Datei mit dem Namen

      10-opendcc.rules

    angelegt und anschließend mit einem Editor bearbeitet. Als Inhalt trägt man (ohne Zeilenumbruch)

      SYSFS{idVendor}=="0403", SYSFS{idProduct}=="bfd8", RUN+="/sbin/modprobe -q ftdi_sio vendor=0x0403 product=0xbfd8"

    ein und speichert und schließt die Datei.

    Rainer Keller hat folgende Änderung vorgeschlagen: Die Datei 10-opendcc.rules sollte folgenden Inhalt haben:

      KERNEL=="ttyUSB*" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bfd8", SYMLINK+="opendcc/opendcc"
      KERNEL=="ttyUSB*" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bfd9", SYMLINK+="opendcc/schnueffel"
      KERNEL=="ttyUSB*" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bfda", SYMLINK+="opendcc/throttle"
      KERNEL=="ttyUSB*" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bfdb", SYMLINK+="opendcc/basestation"   KERNEL=="ttyUSB*" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bfdc", SYMLINK+="opendcc/gbm"

    Damit wird beim Einstecken eines der Geräte ein Unterordner namens "opendcc" angelegt in dem sich die Hardwareknoten sammeln. Ich habe auch gleich lesbare Namen vergeben(opendcc, throttle ...) . Sonst heißen die immer nur ttyUSBX mit einer Nummer in der Reihenfolge wie die Geräte angesteckt wurden. Da kommt man schnell mal durcheinander. Besonders beim Update der Software per USB sollte man hier nicht auf die falsche Schnittstelle schreiben.

Schritt 2: OpenDCC verbinden

    Nun OpenDCC mit dem System verbinden und einen Moment warten. Mit dem Befehl

      lsusb

    kann der Erfolg überprüft werden. Sollte alles geklappt haben, taucht nach Eingabe von lsusb OpenDCC in der Übersicht auf. Als Schnittstelle wird /dev/ttyUSB0 erzeugt, über die OpenDCC ansprechbar ist.
    Mit der Änderung von Rainer Keller wird nicht mehr /dev/ttyUSB0 sondern /dev/opendcc/opendcc erzeugt

Schritt 3: RocRail konfigurieren

    In der Konfigurationsdatei von RocRail rocrail.ini wird nun diese Schnittstelle eingetragen und schon sollte RocRail beim nächsten Start die OpenDCC-Zentrale finden.
    <rocrail planfile="plan.xml" libpath=".">
      <trace file="rocrail" debug="false" byte="false" parse="false" automatic="false" monitor="true"/>
      <clock divider="1" hour="24" minute="60"/>
      <ctrl swtimeout="250" minbklc="20" ignevt="5" initfieldpause="500"/>
      <http port="0" refresh="0">
        <webclient port="0" refresh="0"/>
      </http>
      <digint iid="OpenDCC" lib="p50x" ptsupport="true" device="/dev/ttyUSB0" bps="19200"/>
      <ctrl loccnfg="true"/>
    </rocrail>


    Mit der Änderung von Rainer Keller sieht das jetzt so aus:
    <rocrail planfile="plan.xml" libpath=".">
      <trace file="rocrail" debug="false" byte="false" parse="false" automatic="false" monitor="true"/>
      <clock divider="1" hour="24" minute="60"/>
      <ctrl swtimeout="250" minbklc="20" ignevt="5" initfieldpause="500"/>
      <http port="0" refresh="0">
        <webclient port="0" refresh="0"/>
      </http>
      <digint iid="OpenDCC" lib="p50x" ptsupport="true" device="/dev/opendcc/opendcc" bps="19200"/>
      <ctrl loccnfg="true"/>
    </rocrail>
    Das hat den Vorteil, dass man die Rocrailconfig nicht immer ändern muss, wenn man den Regler oder einen anderen USB-Seriell-Wandler vor der Zentrale einsteckt.

MAC

    Diese Seite wurde von einem Anwender beigesteuert und beschreibt das Zusammenspiel OpenDCC mit Rocrail auf dem MAC. Vielleicht hilft es dem einen oder anderen, ich kann hierzu mangels eigenen MAC allerdings keine weitere Hilfe geben.

Vorraussetzungen:

  • eine funktionierende OpenDCC-Zentrale - natürlich mit USB.
    (Da von FTDI kein Mac Programm zur Einspielung der Parameter für den FTDI USB/R232-Chip vorgehalten wird, muß dies gemäß der Beschreibung mit Windows oder Linux erfolgen.)
  • Rocrail auf dem Mac installiert (bei mir unter Leopard 10.5)
    ( Rocrail wird als fertiges DMG zum Download von Rocrail angeboten. Eigene Complilierungsversuche sind meinerseits nach stundenlangem frustranem Durchforsten der Library-trees mit zickigem Compiler und Linker ala „lib xyz.a-z.gsg9.gti.v12 not found“ etc etc etc. genervt abgebrochen und subito ins null-Device geschickt worden.)

Schritt 1: Treiber laden

    Nun wird die OpenDCC-Zentrale erstmals mit dem Mac verbunden, sie muß im System-Profiler unter den USB Geräten angezeigt werden, was somit zeigt, daß die Zentrale erkannt wurde: USB-IF OpenDCC V1.2 muß dort erscheinen.

    Danach wird der FTDI-Treiber (download COM-Port Emulation oder D2XX-Treiber (den habe ich nicht ausprobiert)) installiert, bitte Intel und PPC-Treiber unterscheiden.

    Jetzt beginnt es, etwas kniffelig zu werden. Dazu folgende Vorbemerkungen:

    Die Treiber externer Geräte werden als K(ernel) ext(ensions) =KEXT automatisch (mehr oder weniger) hinzugeladen, wenn das externe Gerät erkannt wird und ihm der Treiber zugeordnet werden kann. Das ist vergleichbar den Linux Kernelmodulen. Beim MAC liegen die KEXT im Verzeichnis /System/Library/Extensions.
    Dann wird nämlich - genau wie unter Linux - vom System ein file im "/dev" Verzeichnis erstellt, unter welchem dann die OpenDCC-Zentrale ansprechbar ist.

    Hierzu wie folgt vorgehen:
       -> mit dem MacOS-Finder nach /System/Library/Extensions gehen und "FTDIUSBSerialDriver.kext" aufsuchen.
        (Das ist eigentlich ein Verzeichnis, wird vom Finder aber als Paket deklariert.

       -> FTDIUSBSerialDriver.kext anklicken, rechte Maustaste: Paketinhalt anzeigen
        Es öffnet sich ein Fenster: Contents -> Es interessiert die Info.plist Datei

    In dieser (eigentlichen XML-Datei) stehen die Geräte aufgelistet, für die der Treiber genutzt werden soll. Hier muß nun USB-IF OpenDCC V1.2 mit VID (1027 = 0x403) und PID (49112 = 0xbfd8) bekannt gemacht werden, indem der untenstehende rote XML-Text eingefügt wird.

    Jetzt tauchen zwei bis drei (in ihrer Gesamtheit) unnötige Probleme auf:

       (1) Die Datei ist nur als root beschreibbar, was ja noch absolut okay ist.
       (2) Die Datei muß dem System =root gehören und der Gruppe "wheel" zugeordnet sein, sonst verweigert Mac OS das Laden des KEXT
       (3) Die Besitzeränderung insbesondere auf einen apersonalen User (root, ftp, ....) unter MacOS ist nur unter Hilfe externer Programme möglich

Schritt 2: Systemdateien anpassen

    Wegen dieser Einschränkungen (es soll ja nicht jeder einfach am MAC rumschrauben können) muß man nun als root aus dem Terminal einen Editor starten:
       
        sudo su
        password:

        sh-3.2# mein_super_lieblings_editor /System/Library/Extensions/FTDIUSBSerialDriver.kext/Contents/Info.plist

        und fügt folgenden roten Text zwischen zwei anderen grünen Gerätbeschreibungen mit copy-paste ein:

           vorangehende Gerätbeschreibung </dict>

          <key>USB-IF OpenDCC V1.2</key>
            <dict>
                <key>CFBundleIdentifier</key>
                <string>com.FTDI.driver.FTDIUSBSerialDriver</string>
                <key>IOClass</key>
                <string>FTDIUSBSerialDriver</string>
                <key>IOProviderClass</key>
                <string>IOUSBInterface</string>
                <key>bConfigurationValue</key>
                <integer>1</integer>
                <key>bInterfaceNumber</key>
                <integer>0</integer>
                <key>idProduct</key>
                <integer>49112</integer>
                <key>idVendor</key>
                <integer>1027</integer>
            </dict>
           
            <key>nachfolgende Gerätebeschreibung </key>

        und speichert die Datei wieder ab.
        Fertig.


    Alternativ kann man über "Information" (= apfel-I Taste) die Schreibrechte der Info.plist Datei freigeben (auf das kleine Vorhängeschloss klicken und Administratorpasswort eingeben) und die Datei mit der XML-Code Ergänzung wie oben (Problem 1 gelöst) editieren und wieder abspeichern.

        Achtung, Kontrolle: wer ist jetzt der Eigentümer dieser Datei (Problem2)?
        Sind es nicht mehr "System" und "wheel", muß dieser Status wiederhergestellt werden

        Wenn sie es also nicht mehr sind (Problem 3), hilft beispielsweise das Programm Batchmod aus dem Internetz. Dieses herunterladen, installieren, starten.
        Die Info.plist Datei anwählen und Eigentümer und Gruppe entsprechend ändern.
    Fertig

    Jetzt manuelles Laden des Treibers (Die Zentrale muß natürlich angeschlossen sein). Im Terminal eingeben

    sudo kextload -t /System/Library/Extensions/FTDIUSBSerialDriver.kext

    (Der Parameter "-t" zeigt u.U. eine Fehlerursache an z.B. Fehler bei den Eigentumsrechten).

    Wurde die KEXT ohne Murren geladen, Kontrolle, ob ein Device angelegt wurde. Dazu:

    ls /dev/*usb*

    Ausgabe (bei meinem Mac, die Device-Namen könnten unterschiedlich sein!!) zweier neuer Devices:

    /dev/cu.usbserial-FTS5TCVV    /dev/tty.usbserial-FTS5TCVV


    Glückwunsch, dann wurde OpenDCC erkannt und kann bei mir unter dem /dev/tty.usbserial-FTS5TCVV angesprochen werden.

    Jetzt im Rocview unter Zentrale->Eigenschaften OpenDCC einrichten: Am besten mit dem /dev/tty.usb-xyz Device einstellen (das cu.usb-Device habe ich nicht getestet) und Baud 19200 nicht vergessen.

    Alternativ rocrail.ini ändern, falls diese Datei schon besteht (wurde bei mir erst nach erstem Starten des rocrail-servers erzeugt):

    <digint iid="OpenDCC" lib="p50x" ptsupport="true" device="/dev/tty.usb-mein_gefundenes_device" bps="19200"/>

Schritt 3: Treiber automatisch laden lassen

    Fehlt noch, daß der Treiber nach jedem Neustart automatisch geladen wird, wenn die OpenDCC-Zentrale angeschlossen wird.
    Dazu muß - leider unterschiedlich nach Betriebssystem-Subversion - eine oder zwei Cache-Dateien gelöscht werden, damit das Mac OS die veränderte Treiberliste aktuell aufnimmt.

    Bei mir waren diese:
    /System/Library/Extensions/Caches/com.apple.kext.info
    /System/Library/Extensions.mkext

    Dateien löschen (oder sicherheitshalber erstmal nur woandershin verschieben, wenn man Angst hat). Mac neu starten. OpenDCC-Zentrale in USB-Port. Rocrail starten und digital los fahren.....

Warenkörbe

  • OpenDCC mit USB:
    https://secure.reichelt.de/?;ACTION=20;LA=4000;AWKID=14794;PROVID=2084
  • OpenDecoder2:
    https://secure.reichelt.de/?;ACTION=20;LA=5000;AWKID=20809;PROVID=2084
  • Hinweis zu den Warenkörben:
    Die Warenkörbe sind nicht von mir und ich bekomme von Reichelt auch keine Provision.
    Die angebotenen Warenkörbe müssen unbedingt kontrolliert werden. Ist der hinterlegte Artikel beim Aufruf des Warenkorbes bei Reichelt nicht vorhanden oder ersetzt worden, gibt es keinerlei Hinweise und der Artikel wird fehlen.
    Wenn man bei Reichelt mehrere Warenkörbe zusammen bestellen will, muss man die einzelnen Postionen von der Menge her vergleichen. Reichelt addiert gleiche Artikel nicht und hängt sie auch nicht an.
    Die Ausführung der Bauelemente ist manchmal anders wie von mir vorgesehen, speziell Kondensatoren scheinen hier problematisch zu sein.