Nach dem im Begrüßungsforum der Vorschlag kam, erstelle ich hiermit einen eigenen Thread zu meiner bzw. unserer Diplomarbeit „Train Control Center & Utilities“, kurz „TCCU“.
Kurzer Überblick über folgendem Text:
1. Vorwort
2. Ziel der Diplomarbeit
3. Entstehung
4. Ablauf/Arbeitsfortschritt während der Arbeit
5. Technischer Teil
6. Blockschaltbild: Erklärung + Projekt Inbetriebnahme
Es ist ziemlich viel Text, vieles neu aus den Erinnerungen geschrieben aber auch vieles aus dem Diplomarbeitsbuch genommen. Bin für Fragen offen, hätte auch noch einige Bilder, die ich bei Interesse hochladen kann (genauere Ablaufdiagramme sowie Bilder von den Aufbauten). Aber wollte den Rahmen fürs erste nicht sprengen (falls das nicht ohnehin passiert ist) und hoffe, dass ich verständlich herrübergebracht habe, an was wir gearbeitet haben.
Tippfehler, etwaige grammatische Fehler u.Ä. sind vermutlich enthalten und dürfen ignoriert werden.. Viel Spaß beim Lesen!
1. Vorwort
Zuerst beginne ich mal auf welcher Schule ich war. Ich besuchte das Kolleg für Elektronik und Netzwerktechnik am TGM. Die Dauer belief sich auf vier Semester. Interessant war der Entfall der Zentralmatura, vorgezogene Deutsch/Mathe/Englisch – Reifeprüfung war Anfang drittes Semester (Sept. & Oktober 2017). Die Reifeprüfung nach dem 4. Semester, im Oktober 2018. Nähere Fragen zur Ausbildung kann ich gerne beantworten, aber das soll jetzt nicht das Hauptaugenmerk hier sein.
2. Ziel der Diplomarbeit (entnommen aus dem Pflichtenheft)
Zielbestimmung
Unser Produkt soll das Steuern einer Modelleisenbahn erleichtern. Das Ziel ist es eine zentrale Steuereinheit über eine Benutzeroberfläche bereitzustellen. Die Ansteuerung der Lok wird über einen Arduino erfolgen und der Nutzer kann mittels Kamera auf die Strecke einsehen.
Musskriterien
TCCU muss in der Lage sein, eine Lok zu steuern. Ein Lichtsensor soll bei Dunkelheit eine Bahnhofsbeleuchtung einschalten.
Die Sicht auf die Strecke wird mittels einer Kamera live auf die Webseite (TCCU) übertragen.
Die Funktionen des TCCU werden in einem lokalen Netzwerk realisiert. Dies ist auch bei Einbindung bei Privatnutzern der Fall. Das TCCU wird per IP-Adresse oder URL im Browser geöffnet. Der Webserver befindet auf einen externen Raspberry.
3. Entstehung
Das Diplomarbeitsteam (bestehend aus insgesamt drei Mitgliedern) wurde Ende des zweiten Semesters festgelegt, sowie ein ungefähres Thema. Zu diesem Zeitpunkt wäre geplant gewesen, an der vorhandenen Modellbahn in der Schule weiterzuarbeiten. Dabei handelte es sich um ein zweigleisiges Oval mit Bahnhofsbereich. Die Anlage bestand aus dem Märklin Dreileitersystem. Der Lehrer, der das vorherige Projekt an der Bahn betreute, hat uns angeboten, so gut wie es geht, bei Seite zu stehen.
4. Ablauf
Mit dem dritten Semester begann die Arbeit am Diplomprojekt. Unser Projektbetreuer, der auch Mitarbeiter in der Firma des Lehrers ist, der das vorherige Bahnprojekt betreut hat, teilte uns mit, dass dieser nicht die Zeit findet in die Schule zukommen. Somit hatten wir mal die Aufgabe die vorhandene Modellbahn in Gang zu setzen. Zum Glück hatten wir das Diplomarbeitsbuch des alten Projektes, dieses hatte aber schon mal den falschen Befehl zum Starten des deren eigens entwickeltem Programm (zur Blocksteuerung) auf dem Raspberry Pi eingetragen.
Kurzum: schlau wurden wir nicht daraus, es funktionierte auch nicht wirklich alles so wie es sollte. Nach Rücksprache mit unserem Betreuer kam die Idee, mit dem Abendkolleg zusammenzuarbeiten, da diese an einer Gartenbahn tüftelten. Nach hin und her mit dem Abteilungsvorstand wurde uns dies verwehrt, mit dem Hinweis die vorhandene (H0) Modellbahn zu verwenden. Also auf Anfang. Das kostete natürlich einiges an Zeit. Es hatte keinen Sinn, wir schafften es unseren Betreuer sowie Klassenvorstand zu überreden, an einer eigenen Anlage zu arbeiten. Ab hier konnte endlich mit einer konkreten Planung begonnen werden sowie ein Konzept erstellt werden.
Das Ziel der Arbeit ist oben ohnehin schon erwähnt. Über die Dauer und Recherchen und Tests haben sich etwaige Komponenten bis zum vollständigen Ergebnis geändert, sowie manche durch Lieferengpässe gezwungen wurden, ausgetauscht zu werden.
Unsere eigene Anlage wurde auf einer Holzplatte, kommend aus der Schultischlerei aufgebaut. Das Gleismaterial bestand aus von mir zu Verfügung gestellten Kleinbahngleisen. Es war ein simples Oval mit einem zweigleisigen Bahnhofsbereich, mit dem optionalen Ziel die Weichen zu schalten. Leider haben wir zuerst eine gebrauchte Lok über ebay gekauft, die allerdings zu alt für die Digitalisierung war. Somit stellte ich eine Piko Cat Taurus mit digitaler Schnittstelle zur Verfügung und hierbei musste nur noch der Decoder eingebaut werden.
Nach einigen Anfangsherausforderungen haben wir es dann doch auf die Zielgerade geschafft.
5. Technischer Teil
Die Aufgaben im Team waren wie folgt geteilt:
Mitglied A war für die Website, Datenbank und Router Konfiguration zuständig.
Mitglied B war für den Livestream, die Elektronik und das automatische Licht zuständig.
Zu guter Letzt war ich Projektleiter, Verantwortlich für den Hauptteil der Programmierung (das Steuerprogramm am Arduino & Python Script am Raspberry Pi).
Nun werde ich meinen Bereich näher erläutern, der für dieses Forum wohl am Interessantesten ist. Auszüge aus dem Diplomarbeitsbuch:
Der Arduino fungiert als Gehirn der Modellbahnanlage. Mithilfe des Motorshields und dessen externer Spannungsversorgung wird das DCC-Signal (siehe 10) erzeugt. Es werden ständig Idle-Packets versendet. Speed-Packets werden nur gesendet, wenn dies verlangt wird. Unsere Lösung ist so gewählt, dass die Befehle über die serielle Schnittstelle eingelangen. Dies war auch beim Testen ein Vorteil, da über die Arduino IDE die Befehle getestet werden konnten.
Die Befehle haben eine vordefinierte Formatierung und sind lediglich eine Anweisung, welche Lok wie schnell in welche Richtung fahren soll. Das Format sieht wie folgt aus:
Lokadresse, Richtung, Fahrstufe
Hierbei ist auf die Trennzeichen zu achten, nämlich ein Beistrich. Dieser ist mittels eines Parameters am Anfang des Programmes definiert und kann bequem auf ein anderes Zeichen geändert werden, ohne dass die Funktionalität des Programmes beeinträchtigt wird.
Gelangt nun solch ein Befehl zum Arduino, werden zuerst die einzelnen Werte gespeichert. Weiters wird Protokollbedingt die Lokadresse in binär umgerechnet und ebenso gespeichert. Je nach angegebener Fahrtrichtung wird das Direction-Bit auf 0 oder 1 gesetzt. Zum Abschluss wird die Error-Detection berechnet. Die Fahrstufen und deren zugehörigen Bytes sind vom DCC-Protokoll definiert und sind im gleichnamigen Kapitel zu finden.
Nun ist man bereit, ein DCC-Paket zu senden. Da die Werte alle in binär gespeichert sind, kann man leicht abfragen, ob nun ein „Einser“-Impuls oder ein „Nuller“-Impuls gesendet werden soll. Der Arduino wurde so programmiert, dass nun ein vollständiges DCC-Paket (siehe 10.1) gesendet wird. Dieses wird tatsächlich nur gesendet, wenn ein Input am Serial-Interface bestand. Zudem wurde so programmiert, dass ein Notstop – Lok bleibt sofort stehen – und ein „normaler“ Halt – Lok wird mit vordefinierter Bremskurve im Decoder zum Stillstand gebracht – möglich ist.
Das Python Script:
Um das Script überhaupt ausführen zu können, wurde zunächst Python am Raspberry Pi installiert. Wie unter dem Punkt Arduino als DCC-Zentrale ersichtlich, wurde dieser für Input an der seriellen Schnittstelle programmiert. Somit dient das Python Script, da der Arduino am Raspberry Pi angeschlossen ist, dafür, per USB-Schnittstelle Befehle zu senden.
Da sich die eigentliche Steuerung auf der Webseite befindet, wird das Python Script mittels PHP aufgerufen.
PHP Aufruf:
shell_exec("sudo python2 TCCU_serial.py ".$_GET['lokadresse']." ".$_GET['richtung']." ".$_GET['fahrstufe']);
Wie hier ersichtlich ist, wurde von uns die Version 2 von Python verwendet, da man bei dieser mit übergebenen Werten im Script-Aufruf leichter umgehen kann. Will der User nun die Lok mit der Adresse 3 vorwärts mit der Fahrstufe 5 fahren lassen, sieht der Befehl wie folgt aus:
sudo python2 TCCU_serial.py 3 Vorwärts 5
Das Script speichert nun die drei Werte in einzelne Variablen. Es wird zunächst kontrolliert, ob der serielle Port bereits offen ist, falls nicht, wird die Verbindung geöffnet. Um herauszufinden, welcher Pfad der Arduino hat, muss man sich beim Raspberry das /dev Verzeichnis auflisten lassen. Der einfachste Weg ist dabei, dass man es sich ohne angeschlossenem Arduino auflisten lässt und danach mit. Dann merkt man, dass ein Device dazugekommen ist, dieser Pfad wird im Python Script verwendet. In diesem Fall /dev/ttyACM0.
Dieser Port wird wie oben erwähnt geöffnet und eine Verbindung aufgebaut. Da der Arduino nicht „Vorwärts“, sondern nur „v“ als Befehl benötigt, wird im Script die Variable der Richtung geändert.
Nun wird die Zeichenkette in Form von „3,v,5“ geschrieben bzw. an den Arduino gesendet.