OneStep/StepControl: eine Drehscheibensteuerung für BiDiB

Hintergrund-Infos zur Entwicklung

    Im folgenden ist eine (mehr oder minder schlecht gegliederte) Gedankensammlung zum Thema Drehscheibensteuerung. Ich wollte eine Drehscheibensteuerung bauen, die auch für Gruben ohne fest vorgegebene Abgänge (Lasercut) und Segmentbühnen brauchbar.
    Am Anfang stand daher eine Analyse der mechanischen Gegebenheiten vorhandener Bühnen und eine Sammlung der Wünsche an eine Steuerung.

    Beginnen wir mit den Voraussetzungen und sehen uns zuerst mal die Bühne an: Problempunkte sind hier der Einbauplatz und die beschränkte Leitungszahl von der Bühne zur Grube.
  • Einbauplatz:

    Hier lassen sich folgende Platinengrößen unterbringen:
    Blau (freier Platz): L = 110, B = 27, H = 7
    Gelb (Motor und Stopper): L = 60, B = 27, H = 14
    Rot (Häuschen): L = 40, B = 45, H = 14

    Bei einer Hapo-Scheibe sind zwei schlanke Platinenplätze unter der Bühne möglich. Allerdings bietet es sich dort an, auch die Schleifer zu integrieren.
  • Schleifkontakte:
    Obige Bühne hat 5 Schleifbahnen, eine Hapo nur 2 bzw 4 Schleifbahnen. Alternativ könnte man auch mit Folienkabelwickel arbeiten, dann kann man aber die Bühne nicht mehr endlos durchdrehen. (hat aber die Probleme mit mangelnder Kontaktgabe nicht mehr). Bei Schleifkontakten muß man sich also in der Leitungszahl beschränken und zudem muß die Datenübertragung so abgesichert sein, dass keine falschen Daten empfangen werden.

Anforderungen, Wünsche

    Wenden wir uns den Anforderungen zu, hier gibt es folgendes zu berücksichtigen:
  • Drehen
    Es gibt rastende Bühnen (mit 24 / 48 Raststellungen) und frei drehende Bühnen, z.B. Hapo oder Selbstbaulösungen. Rastende Bühnen gleichen Spiel und Unsicherheiten im Antrieb dadurch aus, dass sie in der Zielposition einen Formschluß zwischen Bühne und Grube herstellen. Die Hapo-Bühne wird 'analog' positioniert.
    1. Nullpunktsbestimmung
      Hier gibt es verschiedene Möglichkeiten:
       - wird per Knopfdruck gesetzt
       - Absolutgeber auf der Bühnenachse
       - Referenzschalter / Lichtschranke / Hallsensor; hierbei ist die Anfahrrichtung und Reproduzierbarkeit wichtig.
    2. Zielvorgabe
      Diese kann entweder durch die Rastposition oder direkt durch die Winkelstellung der Bühne erfolgen. Zusammen mit dem Ziel ist dann auch ein Vorgabe sinnvoll, wie bei diesem Zielgleis das Kehrschleifenrelais stehen soll.
    3. Positionsmeldung
      'Sie haben Ihr Ziel erreicht': solange man manuell fährt, sieht man das, aber für einen PC-Betrieb braucht es eine Rückmeldung, dass die Brücke in Position ist. Erst dann darf die Ausfahrt oder Einfahrt erfolgen.
  • Ansteuerungen auf der Bühne
    1. Beleuchtung
      Zumeist wird man das Häuschen mit einem Licht ausstatten.
    2. Signale
      Denkbar sind sowohl Lichtsignale als auch Formsignale (via Mikro-Servo). Des weiteren gibt es oft ein Blinklicht, wenn die Bühne fährt.
  • Rückmeldung Fahrweg auf der Bühne
    Die Position von Lokmotiven muß gemeldet werden. Rocrail kennt z.B. Events beim Betreten eines Block und wenn das Fahrzeug 'drin' ist. Auch TC benötigt zum genauem Halt einen physikalischen Haltmelder. Es gibt also typischerweise 3 Meldesignale: Bühne belegt, Lok ist komplett auf der Bühne (d.h. je nach Richtung Melder beim Häuschen, Melder gegenüber des Häuschens) . Das können elektrische Abschnitte sein, sinnvoll sind auch (Reflex-)lichtschranken für die Endmelder.
    Die Ereignisse dieser Melder müssen mit geeigneter Kodierung über den (leitungszahlbeschränkten) Drehring übertragen werden.
  • Zusatzfunktionen
    1. Sound
      Drehscheiben-Sound via SUSI (Doku: http://www.d-i-e-t-z.de/7_5.htm)
    2. integrierte Kehrschleifen-Funktion
      Zusammen mit der Zielwinkelstellung wird die Stellung des Kehrschleifenrelais gespeichert.

Lösungsansatz

    Von den Anforderungen her hat sich eine Aufteilung der Steuerung in einen Bühnenteil (welcher sich mitdreht) und einen stationären Teil (=Grube) angeboten. Diese beiden Teil sollen über möglichst wenig Leitungen miteinander verbunden sein (Schleifringe).
  • Drehen
    Hier kommt ein revolutionärer Ansatz zum Tragen: Anstelle der spielbehafteten Mechanik mit Getriebe kommt ein Direktantrieb mit Schrittmotor zum Einsatz. Schrittmotoren gibt es mit einer Auflösung von 200 oder 400 Schritten/U etwa in der Größenordnung 10-20€ (42mm x 42mm).
    200 Schritte würde eine Schrittauflösung (bei einer 26cm-Scheibe) von 260mm * Pi /200 = 4mm ergeben. Die Positionsgenauigkeit wäre davon die Hälfte, ist aber mit 2mm immer noch viel zu groß. Man kann aber die Schrittauflösung eines Steppers durch Microstepping elektrisch verfeinern: es gibt Schrittmotorcontroller, welche 32-faches Microstepping realisieren können: damit kommt man rechnerisch auf 0,06mm!
    Ein solcher Motor kann dann direkt auf die Drehachse montiert werden und mit ein Schlitzkupplung verbunden werden.
  • Grubenplatine, StepControl
    Mit diesem Ansatz ist die Motorsteuerung Bestandteil der 'Grube' (also stationär), auch die Rückmeldung der Bühnenposition und der Sound wird über diese Baugruppe StepControl gelöst. Die Platine StepControl hat folgende Eigenschaften:
    1. DCC Eingang inkl. railcom (für 'legacy' Ansteuerung)
    2. BiDiB-Inferface: Ansteuerung, Belegtmeldung, FW-Update
    3. zwei serielle Inferfaces (für zusätzliches Handbedienpult bzw. PC)
    4. Stepperansteuerung für bipolaren Schrittmotor bis 1A
    5. integrierte Kehrschleifenautomatik für die Bühne
    6. Zwei Eingänge für Hallsensoren, je 3-polig (Home-Position)
    7. Susi-Schnittstelle (Sound)
    8. Optokopplerinterface zur Bühne für Befehle und Belegtmeldung (serielle Ein-Drahtschnittstelle)
  • Bühnenplatine
    Die Bühnenplatine ist mit der Grube über Schleifringe verbunden, die Zahl der Leitungen zwischen Bühne und Grube muß daher möglichst minimal sein.
      Vorüberlegungen: Zwingend muß der Gleisstrom auf die Bühne geführt werden, des weiteren braucht es einen Kanal für Schaltinformationen (Servo, Licht) und einen Rückkanal für die Belegungsmeldungen.
      Man könnte Schaltinformation und Belegungsmeldung in das Gleissignal einmultiplexen, nur fehlt es an geeigneten railcom-Nachrichten für eine Belegungsmeldung, des weiteren ist railcom von der Struktur her relativ schlecht geeignet, ein Polling der Belegung durchzuführen (das zu Grunde liegende System ist broadcast-orientiert).
    Daher habe ich mich für einen separaten Rückkanal (Stromschleife auf RS232-Basis) entschieden. Dieser hängt einseitig am DCC des Bühnengleises und wird in der Grubenplatine über einen Optokoppler empfangen. Für die Gegenrichtung wird in der Grube der Ausgangstransitor eines OC geschaltet - dieser zieht dann die Leitung auf Low. Die Übertragung erfolgt als Stromschleife mit 5mA im Halbduplexbetrieb mit 19200 Baud, 8N1. Durch ein gut abgesichertes Protokoll mit CRC und Sequenzkontrolle werden ev. Kontaktprobleme adressiert.

    Die Platine 'Bühne' hat folgende Eigenschaften:
    1. DCC Eingang (für railcom-Erkennung, optional auch für Schaltaktionen)
    2. 4 * Servoausgang
    3. 4 * Lichtausgänge für Signale und Häuschen
    4. 4 * Belegtmeldung über Stromsensor (mit railcom)
    5. SUSI-Schnittstelle (optional)
  • Bedienung
    Die StepControl soll über mehrere verschiedene Wege bedient werden:
    • BiDiB: Bei BiDiB erfolgt die Ansteuerung über ein einzelnes Accessory-Objekt, welches dann für jeden Abgang einen Begriff hat. Die Bühne wird als einfach durch Aktivieren dieses Begriffes in die passende Position gesteuert. Wann und ob die Bühne die Zielposition erreicht hat, wird bei BiDiB ja einfach mit dem Accessory-Status gemeldet.
      Der Zugriff auf die Konfiguration erfolgt einfach menugeführt mit dem BiDiB-Monitor.
    • DCC: Bei DCC wird i.d.R. eine Abbildung auf einzelne Weichenbefehl vorgenommen, die Drehscheibe belegt dabei einen ganzen Block an Weichenadressen.
    • Debug-IF: Hier kann ein übliches FTDI-Kabel mit 115200 8N1 angeschlossen werden und mittels eines Terminalprogrammes sind Einstellungen der StepControl möglich.
    • Handpult: Ja, sowas wünschen wir uns auch :-)

Schrittmotoransteuerung

    Kernthema der Bewegung war die Schrittmotor-Ansteerung mittels Mikrostepping.
    Der erste Versuch mit dem TI DRV8825 / DRV8824, laut Datenblatt für Microstepping bis 1/32 geeignet. Nur: mit diesem Chip gelang speziell bei sehr langsamen Bewegung nicht eine wirklich saubere Fahrt. Hier habe ich dann auch viele verschiedene Motoren erprobt, keiner war mit direktem Antrieb nicht befriedigend.

    Die nächsten Versuche gingen dann Richtung Getriebe - entweder an den Motor angeflanschtes Planetengetriebe oder separater Riemenantrieb. Damit ließ sich eine saubere Bewegung erzielen (etwa ab Untersetzungen 5:1), nur wird die mechanische Lösung teuer und aufwändig: man braucht einfach das Getriebe samt entsprechender Zusatzachsen und Lagerung.

    Die Lösung kam dann in Gestalt des TMC2130 von Trinamic (digikey), mit passender Konfiguration und Ansteuerung via SPI kann man die Treiber perfekt für einen sehr langsamen Motorlauf einstellen.

    Zusätzlich zur Konfiguration des Treiber werden auch die Schrittpulse fein aufgelöst und damit wird der Motor sanft beschleunigt und abgebremst. Hierzu habe ich den Algorithmus von D.Austin verwendet, welcher auf der embedded 2005 publiziert wurde.

Die Mathematik zur Stepperansteuerung

    Die Zusammenhänge zwischen den einzelnen Parametern der Ansteuerung und die jeweiligen Grenzen sind auf den ersten Blick nicht leicht zu durchblicken. Die Grenzen der Ansteuerung sind im wesentlichen durch die verfügbaren Intervalle für die Schrittweite vorgegeben. Der Timer für die Schritterzeugung läuft mit 500kHz, damit kann die Schrittweite der Ansteuerhardware einen Bereich von 40µs bis 100ms überdecken.

    Es gibt zwei wichtige Parameter, welche die Motoransteuerung beschreiben: Microstepping und Schrittzahl. Diese beiden Parameter haben wesentlichen Einfluß auf die erzielbare Drehgeschwindigkeit bei vorgebener Schrittweite.
    Auf der anderen Seite gibt es drei Parameter, welche die vom Anwender gewünschte Begwegung beschreiben:
  • accel (accelerate = Beschleunigen),
  • decel (decelerate = Bremsen) und
  • max. Speed.


  • Diese 5 Parameter sind über Formeln verbunden: Aus Geschwindigkeit und Beschleunigung ergeben sich Ansteuerpulse - deren Dichte ist aber von Microstepping und Schrittzahl abhängig. Zur Berechnung verwende ich im Folgenden SPR, das ist das Produkt aus Schritte_Motor / Microstepping:
         SPR = Schritte_Motor / Microstepping
    SPR ist also die Zahl der Schritte je kompletter Umdrehung.

Geschwindigkeit

    Die (Dreh-)Geschwindigkeit ergibt sich zu:
         v=phi/t wobei phi in ° angegeben wird.
    Die (Dreh-)Geschwindigkeit darf nicht so schnell gewählt werden, dass die Mindestschrittweite von 40us unterschritten wird. Setzt man in v=phi/t die Mindestschrittweite ein, so ergibt sich:
         v=360°/SPR/40us = 9000000 / SPR.
    Es ergeben sich folgende zulässigen maximalen Geschwindigkeiten:
    SPRMotor/Microv_max
    51200(400/128)175 deg/s
    25600(400/64)351 deg/s
    12800(200/64)703 deg/s
    6400(200/32) 1406 deg/s

Beschleunigung

    Die StepControl bildet eine Beschleunigung durch eine rekursiven Berechnung ausgehend von einer initialen Schrittweite C0 ab. Dieser Startwert der Beschleunigungsrampe (C0) darf die max. Pulsbreite des Schrittgenerators nicht überschreiten. C0 errechnet sich zu:
         C0 = f(timer) * 0,676 * sqrt(720 / SPR / Acceleration)
    Daraus ergibt sich, dass das Produkt aus SPR * Acceleration nicht kleiner als 19150 sein darf, weil sonst der Startwert der Beschleunigungsrampe nicht mehr in der Hardware darstellbar ist. Es ergeben sich folgende zulässigen maximalen minimalen Beschleunigungen:
    SPRMotor/Microaccel min
    25600(400/64)0,75 deg/s²
    51200(400/128)0,38 deg/s²

Darstellung für den Anwender

    Abhängig von der Einbausituation (Direktantrieb, Getriebe, Spindelantrieb) ergeben sich recht unterschiedliche gewünschte Einstellbereiche. Da das CV-System nur eine Integer-Darstellung zuläßt, muß eine geeignete Skalierung gewählt werden. Die Eingabe erfolgen als deg (=°), d.h. 360 ist ein Vollkreis. (° wird statt rad verwendet, um eine bessere Lesbarkeit zu erhalten).
         Speed: mögliche Darstellung der maxspeed in [°/s] oder [0,1°/s].
         Beschleunigung: mögliche Darstellung der Beschleunigung in [°/s²] oder [0,1°/s²].
    Vor dem Einsetzen der CV-Werte in obige Grenzformeln ist also deren Skalierung zu berücksichtigen. Leider würde eine Berücksichtigung der Skalierung auf Controllerebene _etwas_ Laufzeit fordern, so dass diese z.Z. nur als Compile-Option verfügbar ist. Wenn die Skalierung 0,1 ist, ist der Wert von dem Einsetzen in die Formeln mit 10 zu dividieren.

Interne Softwareorganisation

    Die Firmware ist in folgende Module aufgeteilt:
  • Stepper_Controller: Dieses Modul verwaltet den Schrittmotor und führt die Bewegung aus. Die wesentlichen Aufrufe:
    • stepper_do_it() Bewegt den Schrittmotor auf die neue Position (ausgehend von Stillstand).
    • stepper_break(void) bremst dem Motor in der aktuellen Bewegung, anschließend ist die Position in der 'Pampa', d.h. nicht an einem Zielpunkt.
    • stepper_estop(void) hält hart und sofort an, Schrittverluste sind dabei nicht ausgeschlossen. Also Nothalt.
    Je nach Bewegungsphase (Beschleunigen, konstante Fahrt, Bremsen, Stillstand) stellt dieses Modul auch den Referenzstrom des Schrittmotors ein.
  • Move_Controller: Dieses Modul kontrolliert die Bewegung aus. Die wesentlichen Aufrufe:
    • move_stepper_to(unsigned int newposition) Bewegt die (Schiebe-)Bühne auf die neue Position (ausgehend von Stillstand).
    • rotate_stepper_to(unsigned int new_pos) Bewegt die Drehbühne auf die neue Position, wobei der zu durchfahrende Winkel optimiert wird.
    Der Move_Controller kümmert sich auch um die entsprechende Benachrichtigung der angeschlossen Bedieninterfaces.