Anzeigen mittels Arduino darstellen

  • Projektname: TS & Arduino
    Projekttyp: Programme für Arduino
    Kurzbeschreibung: Anzeigen in einem Eigenbau-Fahrpult mittels einem Arduino darstellen (LEDs, Rundinstrumente etc.)
    Projektform: Open Source


    Projektziele:

    • Kommunikation über TCP/IP - erledigt
    • alternative Kommunikation über Serial (COM) - erledigt
    • variable Zuweisung der ControllerIDs vom TS (ein Sketch für alle Loks)
    • Ansteuerung von:
      • LEDs, - erledigt
      • Drehspulinstrumenten, - erledigt
      • Servos - in Planung
      • oder Schrittmotoren - in Planung

    Seit längerem beschäftige ich mich mit der Idee, mittels Arduino die Anzeigen in einem Fahrpult nachzubauen. Da ein Arduino für mich noch Neuland ist, wollte ich Euch von Anfang an teilhaben lassen. Diese Projekt soll auch als Plattform dienen, dass wir zusammen uns Lösungen erarbeiten. Die erarbeiteten Beispiele (Sketches) werden hier veröffentlicht.



    Die Idee ist, den Arduino über TCP/IP mit der TS-Bridge von @Sillo zu verbinden. TCP direkt über das USB-Kabel abzurufen, wird nicht mehr funktionieren. Ich fand zwar eine SerialIP Bibliothek für den Arduino, aber die nötige SLIP-Verbindung kann man ab Windows 7 wohl nicht mehr aufbauen. Ergänzung im August 2019: Es gäbe ja noch die direkte serielle Kommunikation. Dann greift zwar der Arduino selbst nicht auf den TCP-Server zu, aber man hätte eine "Ein-Kabel-Verbindung". Ich versuche mich also ebenfalls an dem seriellem Gegenpart zum Arduino unter Windows.


    Für TCP/IP wurde ein Ethernet-Shield für den Arduino Mega bestellt und in Betrieb genommen. Der PC und der Arduino sind nun beide am gleichen Router angeschlossen.


    Mit dem folgenden Sketch wird erfolgreich eine Verbindung zur TS-Bridge aufgebaut und es werden einmalig die Werte der ControllerIDs für Treibstoffmenge (Fuel - 402), im Tunnel (403) und Steigung (Gradient - 404) abgefragt und im Serial-Monitor ausgegeben. Ich habe mich für die Multiply-Abfrage entschieden, um nicht jeden Controller-Wert einzeln abzufragen zu müssen. Diese drei Werte sollen ja nur ein Anfang sein. Die Ausgabeweise in einzelnen Bytes irritiert mich etwas. Mit meinen TCP-Client für Windows habe ich immer eine komplette Zeichenkette als Antwort erhalten. Aber wir werden schon einen Weg finden, wie man die Antwort vom Server verarbeiten kann. ;)


  • Inzwischen erhalte ich von der TS-Bridge einen String (Zeichenfolge) als Antwort. Diese wird in ControllerID (TS_CtrlID) und Variable (TS_data) zerlegt. Beides sind jeweils Arrays. Die Variable ist weiterhin eine Zeichenfolge, die je nach Rückgabewert unterschiedlich weiterverarbeitet werden muss.


    Bei der Steigung muss man den Wert mit toFloat() in eine Dezimalzahl umwandeln und mit 100 multiplizieren. Die Ausgabe erfolgt nur mit einer Kommastelle. Dies sieht dann so aus: Serial.print(TS_data[2].toFloat()*100, 1);


    Bei "im Tunnel" reicht die Umwandlung mit toInt() in eine Ganzzahl und die Abfrage ob diese 1 ist (meine Vermutung für einen Rückgabewert). Leider gab es bei den Tunneln auf der Alaska-Strecke keine Veränderung der Variable bei der ControllerID 403, als ich durch verschiedene Tunnel fuhr. Nichtsdestotrotz habe ich mal die interne LED damit verknüpft. Sollte sich die Variable im Tunnel zu 1 verändern, wird die interne LED aktiviert. Sie wird wieder ausgeschaltet, falls der Rückgabewert ungleich 1 ist.


    Die ControllerIDs speichere ich für die zukünftige Erweiterung ab. Mit der der Arduino sich selbst die entsprechenden ControllerIDs der Lok abholt. Die ControllerID 800 dient mir als Platzhalter, falls eine Lok mal keine Wert liefern kann, welche der Arduino aber verarbeiten könnte. Als Beispiel nehme ich mal den PZB-Würfel. Diesen habt ihr am Arduino angeschlossen, aber die gerade verwendete Lok hat dafür keinen Controller. Dort fragt dann der Arduino die 800 ab. Bei der Datenauswertung wird aber anhand von der ControllerID = 800 entschieden, dass der PZB-Würfel dunkel bleibt.


    Hier nun der aktuelle Sketch:

    Die Ausgabe auf dem Serial Monitor von Arduino 1.8.9 bricht irgendwann immer mit den wiederholten Zeilen "request send" und "Gradient: x%" zusammen. Die Verbindung wird dann unterbrochen. Mit dem Serial Monitor vom Hercules Tool tritt dies eigentlich nicht auf, wenn der TS läuft. Bezüglich der Ursache bin ich etwas überfragt. ?(

  • Ein 78 minütiger Test mit 9 ControllerIDs verlief erfolgreich. Alles sogar mit der Ausgabe auf dem Arduino Serial Monitor. Als Versuchsvariablen mussten Amperemeter, Tachometer und die vier Anzeigen des Bremssystems einer EMD SW1500 herhalten. Plus die drei bisher verwendeten. Einen Tunnel gab es leider nicht. :(


    Die Ansteuerung von einem Drehspulinstrument dauert noch etwas. Ich erarbeite es mir nur langsam.

  • Obwohl es hier keine direkte Resonanz gibt :( , wollte ich Euch nicht vorenthalten, dass es wohl auch eine Lösung für eine direkte Kommunikation über USB gibt. Genauer gesagt eine serielle Kommunikation (COM).


    Ich selbst habe mir das Programm RailDriverToCom von @JachyHm noch nicht angeschaut. Es gibt aber User, welche es erfolgreich einsetzen. Die Links zum Programm und zu Arduino-Beispielen sind in einem Antwort-Kommentar des Videos versteckt.


    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    the English version of my text:
    Although there is no direct resonance here :( , I didn't want to deny you that there is a solution for direct communication via USB. More precisely a serial communication (COM).


    I myself haven't looked at the program RailDriverToCom from @JachyHm yet. But there are users who use it successfully. The links to the program and to Arduino examples are hidden in a reply comment of the video.

  • Hier nun der Schnipsel Code für die Ausgabe eines TS-Wertes auf einem Drehspulinstrument.

    In dem Sketch in meinem 2. Posting muss noch dessen Zeile 166 angepasst werden.

    C: TS-TCP-Client.ino
    for (i = 0; i < 4; i++) {  // i is the index number of the array = number of the TS ControllerIDs


    Ich habe mir ein 270° Drehspulinstrument mit einem Messbereich von 0-500µA gekauft. Mit mit einem Vorwiderstand von rund 9,2kOhm in Reihe funktioniert es nun wie ein Voltmeter mit einem Bereich von 0-5V. Angeschlossen ist es an GND und den Pin 9 vom Arduino. Mit max 0,5mA wird der Ausgang kaum belastet. Jetzt muss nur noch eine neue Skala erstellt werden.


    map(TS-Wert, Min-TS-Wert, Max-TS-Wert, Min-Output, Max-Output)


    Da die Funktion map() nur Ganzzahlen kennt, multipliziere ich für eine höhere Genauigkeit den Wert vom TS mit 10. Das gilt dann ebenfalls für die Min- und Max-Werte. Die Ausgabe erfolgt als PWM mit einer Spannung von 0 bis 5 Volt (0 bis 242). 242 weil mit 255 mehr als 5 Volt von meinem Arduino ausgegeben werden. Der Max-Wert ist vorerst nur 500. Weil es besser zur Skala passt. Somit lasse ich nur max 50 anzeigen.


    Die Ausgabe auf dem Serial Monitor von Arduino oder vom Hercules Tool bricht immer öfters, nach einer Hand voll Anfragen, zusammen. Die Verbindung wird dann unterbrochen. Bezüglich der Ursache bin ich weiterhin überfragt. ?(


    EDIT: nach mehrfacher Benutzung des Arduino-Reset-Buttons, lief es irgendwann ohne Probleme.

  • Das Problem mit dem Verbindungsabbruch konnte ich leider noch nicht eingrenzen. Irgendwie ist es nicht nachvollziehbar. Es passiert, aber ich weiß nicht warum.


    Hier mal ein Screenshot vom Serial Monitor, wenn der Fehler auftritt.



    Edit am 04.08.2019: Das Programm von Jáchym bekomme ich nicht zum Laufen. Es will bei mir nicht so recht. Auch ist der Beispiel-Sketch für den Arduino sehr lang, in tschechisch und unkommentiert, so dass ich ihn nicht verstehe. Weil mir eigentlich die Lösung mit nur einem Kabel gefällt, habe ich mir mal eine einfache serielle Kommunikation zwischen Windows und Arduino angeschaut. Eine LED kann ich schon mal ansteuern. Jetzt gilt es, das Ganze noch mit dem TS zu verbinden. *teetrink*

    Grüße Mirko


    TS-Fireman - mit 6 Joystickachsen und 32 -tasten, oder mehr, die TS-Lok steuern
    TS-Verbindung zu Arduino - Ausgabe von Daten mit LED und Rundinstrumenten

    Einmal editiert, zuletzt von MacG () aus folgendem Grund: Erweiterung

  • Ich habe mir ein kleines Programm geschrieben, welches den Wert vom TS für die Geschwindigkeit einer bestimmten Lokomotive überträgt. Die gesendeten Daten haben eine Länge von 6 Bytes. Leider bekomme ich sie nicht richtig verarbeitet. Auch nach Stunden finde ich den Fehler nicht.


    Hier sind meine Zeilen für den Arduino:


    Edit: gelöscht, da fehlerhaft


    Vielleicht hat einer von Euch einen Tipp. Der Sketch kontrolliert nicht die Länge der Nachricht, muss er das? Die serielle Ausgabe vom Arduino des verarbeiteten Wertes zeigt auch manchmal zwei Punkte (gleich dem Komma in der Maschinensprache), also z.Bsp. .0049. bei einem gesendeten Wert von 39.139 ?(


    Mein Programm mit einstellbaren COM-Port und wählbarer TS-ControllerID kann ich dafür zur Verfügung stellen. Diese beide Funktionen muss ich aber noch einbauen. ;)

  • Problem gelöst. :D Ich bin dazu übergegangen einen vorhandenen Sketch anzupassen. Dieser sucht nun nach Start- und End-Markern im Datenpaket.
    Der Sketch zeigt auf meinen Drehspulinstrument die Geschwindigkeit bis 50 an.

    Anbei noch mein Programm welches mit 115200 Baud nur die Geschwindigkeit über USB überträgt. Als IP ist für die TS-Bridge fest 127.0.0.1 eingestellt. Der Port ist 47811. Ihr müsst nur noch Euren COMPort vom Arduino eintragen. Die Voreinstellung ist COM5. Darunter werden die ControllerIDs von der gewünschten Lokomotive eingetragen. Die Werte von Throttle und Dynamische Bremse sind nicht unbedingt notwendig. Das sind nur Überbleibsel, da ich das Programm ursprünglich für Versuche zur Berechnung von Beschleunigung und Wegstrecke geschrieben habe. Die Tasten funktionieren, bei laufender TCP-Verbindung, nicht immer sofort. Ihr könnt mit "Connect to server" die Controller-Liste der aktiven Lok abrufen und dann mit "Stop connection" die Verbindung trennen. Danach kann man die IDs raus suchen und eintragen. Ein erneuter Klick auf "Connect to server" nutzt dann Eure Werte. Viel Spaß damit!


    Bei Gelegenheit werde ich es anpassen, dass eine kleine Liste von Daten übertragen werden kann. Ich weiß noch nicht, ob ich die COM-Verbindung in den TS-Fireman einbaue oder ein extra Programm dafür schreibe.

  • Hi Mirko!


    Erst einmal ein großes Lob für deine Bemühungen, auch wenn diese hier wohl nicht allzuviel Anklang finden!


    Ich bin momentan auch wieder einmal dabei, einen Führerstand elektrisch auszurüsten, und möchte diesmal auch TS - fähig sein. Meine bisherigen Erfahrungen beschränkein sich auf ZUSI 2 (Habe seinerzeit ein Fahrpult für die ÖBB 1042 gebaut)
    Ein Arduino- Programm, dass mir Anzeigen mittels PWM, Meldelampen und Servos ansteuern kann, hätte ich also schon und würde dies nun gerne mit deinem Code verbinden, sofern das von dir aus in Ordnung ist.
    Damals hatte ich noch ein Programm zwischen TCP - Server und Arduino am laufen, das mir die Werte "übersetzt" hatte, und auch die Tastendrücke an Zusi sendete (ging nicht anders).


    Leider kann ich gerade nichts ausprobieren, aber sehe ich das richtig, dass dein Arduino- Programm auch mittels COM direkt alle Werte von der TSBridge abfragen könnte? Und gibt's auch eine Möglichkeit, Werte vom Arduino aus dorthin zu schreiben, oder sollte ich da besser den Umweg über einen Joystick nehmen?
    Da du dich ja schon eingehend mit dem Thema beschäftigt hast, wäre ich dir sehr dankbar über ein wenig Hilfe, ehe ich meine Zeit damit verschwende, etwas zu versuchen was ohnehin so nicht funktioniert.


    Danke und Viele Grüße,
    Sebastian

  • Hallo Sebastian,


    so ist es gedacht. Nimm Dir hier, was Du benötigst oder ergänze, was Du schon programmiert hast. ;)


    Ja, meine letzten beiden Postings beziehen sich auf eine Kommunikation via COM. Noch schickt mein kleines Programm nur einen Wert an den Arduino, aber das werde ich weiter ausbauen. Wie man aber jetzt schon sieht, hängt mein Programm mit der Anzeige dem TS etwas hinterher. Bei der Uhr ist es gut eine Sekunde. Deshalb denke ich, ist es nicht ratsam, diesen Weg auch für die Weitergabe von Werten an den TS zu nutzen. Da wäre die von Dir angesprochene Lösung mit dem Joystick schneller. Ich kann jedenfalls keine Verzögerung feststellen. Gut, ich habe einen Arcaze anstelle vom Arduino für die Eingaben, aber dies sollte kein Unterschied machen. Zwei Arduinos unterstützen ja HID. Werden also mit dem entsprechenden Sketch als Joystick erkannt.


    Es gibt auch noch die Möglichkeit via TCP. Dann wäre neben der TS-Bridge kein weiteres Programm unter Windows notwendig. Mit mehreren Clients läuft die TS-Bridge auch ohne Probleme. Für eine Hand voll Loks wären die ControllerIDs auch überschaubar und im Arduino speicherbar. Die Auswahl der zu verwendeten ControllerIDs könnte dann anhand der Antwort auf GetLocoName() erfolgen.

  • So wünscht man sich das :)


    Mittlerweile konnte ich mit den 3 Programmen (Conductor, Fireman TS-Bridge und TS_TCP/COM) eine Verbindung mit dem Arduino Micro herstellen, die gleichzeitig für Datenausgaben UND Eingaben über die Joystickemulatorfunktionalität (was für ein Wort ;) ) sorgt. Die Ausgabe über COM und Eingabe via Joysticklibrary und Fireman können also gleichzeitig laufen ohne sich gegenseitig zu beeinflussen.


    Wenn du also deine COM - Software noch um ein paar IDs erweitern könntest (oder auch hier selbstlos den Quellcode teiltest), wäre das natürlich ein Hit. (Ich persönlich brauche zumindest 7 Werte)


    Und nochmals, VIELEN Dank für deine Bemühungen auf dem Gebiet. Ohne deine Vorarbeit hätte ich mich nicht an den TS gewagt, was das betrifft.


    Grüße,
    Sebastian

    Einmal editiert, zuletzt von Seppo () aus folgendem Grund: Falsche Software erwähnt

  • Schön, dass es funktioniert! Ich kann mir zwar nicht vorstellen, dass Du den TSConductor verwendest. Denn der kann eigentlich auf meine Multi-Abfrage nicht antworten.


    Ich werde ein Programm für COM zusammenstellen. Fast alle notwendigen Unterprogramme sind im TS-Fireman und in meinem Testtool vorhanden. Das kann aber noch etwas dauern. Die Ferienzeit ist zu Ende und auf Arbeit brummt es gerade wieder.

  • Natürlich meinte ich die TS Bridge, ja. Komm schon mit den ganzen Namen durcheinander :whistling:


    Perfekt! Verstehe ich natürlich vollends, nimm dir nur die nötige Zeit. Dauert bei uns ja auch noch etwas, bis der Rest des Führerstandsprojektes soweit ist, im schlimmsten Fall muss eben erst einmal der Tacho allein reichen ;)


    Auch wenn ich jetzt vielleicht kleinlich werde, aber wünschen darf man sich ja immer was: Ich möchte die verschiedenen Tools am Liebsten automatisiert starten lassen, es wäre daher optimal wenn es in den settings eine Option gäbe, die es dem COM- Tool (ggf. auch dem Fireman) erlaubt gleich einen automatisierten Verbindungsversuch nach dem Öffnen machen zu unternehmen (bzw. die Lok auch direkt zu übernehmen).

  • Der Einbau eines direkten Starts sollte bei beiden möglich sein.


    Mit meinem Testtool kannst Du auch andere Controllerwerte übertragen. Einfach anstatt der Speed eine andere ControllerID nehmen. Das sollte funktionieren. Nur bei einem negativen Wert bin ich mir da nicht sicher. Der einzige Nachteil ist, es zeigt im eigenen Fenster dann nicht die Geschwindigkeit an und die daraus berechneten Werte sind auch Quatsch.

  • With the right library, every Ethernet shield should work. The shield only has to fit at the Arduino board.


    I have an Arduino Mega with a W5100 Ethernet shield. Both are cheap China versions.


    At posting #8 is a way for the COM-port. It's a project at the beginning. It can only transfer the data for speed over COM. I'm writing a program for Windows, that can handle up to 10 TS controller Ids and communicate with the TCP-server. Be patient.



    Mit der richtigen Bibliothek sollte jeder Ethernet-Shield funktionieren. Das Shield muss nur zum Arduino Board passen.


    Ich habe einen Arduino Mega mit einem W5100 Ethernet Shield. Beides sind billige China-Versionen.


    Im Posting Nr. 8 steht ein Weg für den COM-Port. Es ist ein Projekt am Anfang. Es können nur die Daten für die Geschwindigkeit über COM übertragen werden. Ich schreibe ein Programm für Windows, das bis zu 10 TS-Controller-IDs verarbeiten und mit dem TCP-Server kommunizieren kann. Seid geduldig.

  • I haven't found a way to get more data from the TS. Only those which the locomotive provides and the fixed IDs. That's why I calculate some data. Different locomotives have an indicator for the next signal. The controller IDs have corresponding names.


    fixed ID - Purpose
    400 - Latitude of Train
    401 - Longitude of Train
    402 - Fuel Level
    403 - Is in a Tunnel?
    404 - Gradient
    405 - Heading
    406 - Time of day hours
    407 - Time of day minutes
    408 - Time of day seconds



    Ich habe keine Möglichkeit gefunden, mehr Daten vom TS zu erhalten. Nur die, welche eine Lokomotive bereit stellt und die festen IDs. Deshalb berechne ich einige Daten. Verschiedene Lokomotiven haben eine Anzeige für das nächste Signal. Die Controller-IDs haben entsprechende Namen.


    Feste ID - Zweck
    400 - Breitengrad des Zuges
    401 - Längengrad des Zuges
    402 - Kraftstoffstand
    403 - Ist in einem Tunnel?
    404 - Gefälle/Steigung
    405 - Steuerkurs
    406 - Tageszeit Stunden
    407 - Tageszeit Minuten
    408 - Tageszeit Sekunden

  • My program is just a pretty simple version. Only one variable can be sent. Please be patient with publishing a program with more variables.


    The only workaround is: Choose your preferred ID, write it behind Speed and see what the Arduino gets. I think it's possible to run multiple instances of TS-TCP-COM. But only with different COM ports.



    Mein Programm ist nur eine ziemlich einfache Version. Es kann nur eine Variable gesendet werden. Bitte habt etwas Geduld mit der Veröffentlichung eines Programms mit mehr Variablen.


    Die einzige Möglichkeit wäre: wähle deine bevorzugte ID, trage sie bei Speed ein und sieh, was der Arduino erhält. Ich denke, es ist möglich, mehrere Instanzen von TS-TCP-COM auszuführen. Aber nur mit unterschiedlichen COM-Ports.