Anzeigen mittels Arduino darstellen

    • WiP
    • 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:
        1. LEDs, - erledigt
        2. Drehspulinstrumenten, - erledigt
        3. Servos - in Planung
        4. 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. ;)

      C Source Code: TS-TCP-Client.ino

      1. /*
      2. TCP client for TrainSimulator TCP Server TS-Bridge
      3. This sketch connects to a TCP server using an Arduino Wiznet Ethernet shield.
      4. You'll need the TCP server TS-Bridge to communicate with this.
      5. Circuit:
      6. * Ethernet shield attached to pins 10, 11, 12, 13
      7. based on a the TelnetClient from Tom Igoe 2010-2012
      8. modified by MacG (www.rail-sim.de) 2019
      9. */
      10. #include <SPI.h>
      11. #include <Ethernet.h>
      12. // TS ControllerID List
      13. // fixed IDs - Purpose
      14. // 400 - Latitude of Train
      15. // 401 - Longitude of Train
      16. // 402 - Fuel Level
      17. // 403 - Is in a Tunnel?
      18. // 404 - Gradient
      19. // 405 - Heading
      20. // 406 - Time of day hours
      21. // 407 - Time of day minutes
      22. // 408 - Time of day seconds
      23. String ContrlIDList = "402:403:404";
      24. // Program variables
      25. byte readByte;
      26. byte oldByte = 1;
      27. // Enter a MAC address and IP address for your controller below.
      28. // The IP address will be dependent on your local network
      29. // For a second Arduino at you network change his last 0xED to 0xEE
      30. byte mac[] = {
      31. 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
      32. };
      33. IPAddress ip(192, 168, 1, 100);
      34. // Enter the IP address and port of the server TS-Bridge
      35. IPAddress server(192, 168, 1, 23);
      36. unsigned int port = 47811;
      37. // Initialize the Ethernet client library
      38. EthernetClient client;
      39. void setup() {
      40. // You can use Ethernet.init(pin) to configure the CS pin
      41. //Ethernet.init(10); // Most Arduino shields
      42. //Ethernet.init(5); // MKR ETH shield
      43. //Ethernet.init(0); // Teensy 2.0
      44. //Ethernet.init(20); // Teensy++ 2.0
      45. //Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet
      46. //Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet
      47. // Start the Ethernet connection
      48. Ethernet.begin(mac, ip);
      49. // Open serial communications and wait for port to open:
      50. Serial.begin(9600);
      51. while (!Serial) {
      52. ; // wait for serial port to connect. Needed for native USB port only
      53. }
      54. // Check for Ethernet hardware present
      55. if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      56. Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :(");
      57. while (true) {
      58. delay(1); // do nothing, no point running without Ethernet hardware
      59. }
      60. }
      61. while (Ethernet.linkStatus() == LinkOFF) {
      62. Serial.println("Ethernet cable is not connected.");
      63. delay(500);
      64. }
      65. // Give the Ethernet shield a second to initialize
      66. delay(1000);
      67. Serial.println("connecting...");
      68. // If you get a connection, report back via serial
      69. if (client.connect(server, port)) {
      70. Serial.println("connected");
      71. } else {
      72. // If you didn't get a connection to the server
      73. Serial.println("connection failed");
      74. }
      75. }
      76. void loop() {
      77. // Make a request
      78. if (oldByte != readByte) {
      79. client.print(String("GetControllerValueMultiplyRaw(" + ContrlIDList + ")<END>"));
      80. //client.write("GetControllerValueMultiplyRaw(402:403:404)<END>");
      81. Serial.println("request send");
      82. delay(100);
      83. }
      84. // If there are incoming bytes available
      85. // from the server, read them and print them
      86. if (client.available()) {
      87. readByte = client.read();
      88. oldByte = readByte;
      89. Serial.write(readByte);
      90. Serial.println();
      91. }
      92. // If the server is disconnected, stop the client
      93. if (!client.connected()) {
      94. Serial.println();
      95. Serial.println("disconnecting.");
      96. client.stop();
      97. // Do nothing
      98. while (true) {
      99. delay(1);
      100. }
      101. }
      102. }
      Show All
      Grüße Mirko

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

      The post was edited 6 times, last by MacG ().

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

      C Source Code: TS-TCP-Client.ino

      1. /*
      2. TCP client for TrainSimulator TCP Server TS-Bridge
      3. This sketch connects to a TCP server using an Arduino Wiznet Ethernet shield.
      4. You'll need the TCP server TS-Bridge to communicate with this.
      5. Circuit:
      6. * Ethernet shield attached to pins 10, 11, 12, 13
      7. based on a the TelnetClient from Tom Igoe 2010-2012
      8. modified by MacG (www.rail-sim.de) 2019
      9. */
      10. #include <SPI.h>
      11. #include <Ethernet.h>
      12. // TS ControllerID List
      13. // fixed IDs - Purpose
      14. // 400 - Latitude of Train
      15. // 401 - Longitude of Train
      16. // 402 - Fuel Level
      17. // 403 - Is in a Tunnel?
      18. // 404 - Gradient
      19. // 405 - Heading
      20. // 406 - Time of day hours
      21. // 407 - Time of day minutes
      22. // 408 - Time of day seconds
      23. String ContrlIDList = "402:403:404"; // temporary - will be changed to automatic receive of list
      24. // Program variables
      25. String recvString;
      26. String oldString = "x";
      27. int TS_ctrlID[3]; // 3 is for the number of TS ControllerIDs
      28. String TS_data[3];
      29. String StringPart[3];
      30. // Enter a MAC address and IP address for your controller below.
      31. // The IP address will be dependent on your local network
      32. // For a second Arduino at you network change his last 0xED to 0xEE
      33. byte mac[] = {
      34. 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
      35. };
      36. IPAddress ip(192, 168, 1, 100);
      37. // Enter the IP address and port of the server TS-Bridge
      38. IPAddress server(192, 168, 1, 23);
      39. unsigned int port = 47811;
      40. // Initialize the Ethernet client library
      41. EthernetClient client;
      42. void setup() {
      43. // You can use Ethernet.init(pin) to configure the CS pin
      44. //Ethernet.init(10); // Most Arduino shields
      45. //Ethernet.init(5); // MKR ETH shield
      46. //Ethernet.init(0); // Teensy 2.0
      47. //Ethernet.init(20); // Teensy++ 2.0
      48. //Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet
      49. //Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet
      50. // Start the Ethernet connection
      51. Ethernet.begin(mac, ip);
      52. // Open serial communications and wait for port to open:
      53. Serial.begin(9600);
      54. while (!Serial) {
      55. ; // wait for serial port to connect. Needed for native USB port only
      56. }
      57. // Check for Ethernet hardware present
      58. if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      59. Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :(");
      60. while (true) {
      61. delay(1); // do nothing, no point running without Ethernet hardware
      62. }
      63. }
      64. while (Ethernet.linkStatus() == LinkOFF) {
      65. Serial.println("Ethernet cable is not connected.");
      66. delay(500);
      67. }
      68. // Give the Ethernet shield a second to initialize
      69. delay(1000);
      70. Serial.println("connecting...");
      71. // If you get a connection, report back via serial
      72. if (client.connect(server, port)) {
      73. Serial.println("connected");
      74. } else {
      75. // If you didn't get a connection to the server
      76. Serial.println("connection failed");
      77. }
      78. // Initialize digital pin LED_BUILTIN as an output
      79. pinMode(LED_BUILTIN, OUTPUT);
      80. }
      81. void loop() {
      82. // Make a request
      83. if (oldString != recvString) {
      84. client.print(String("GetControllerValueMultiplyRaw(" + ContrlIDList + ")<END>"));
      85. //client.write("GetControllerValueMultiplyRaw(402:403:404)<END>");
      86. Serial.println("request send");
      87. delay(100);
      88. }
      89. // If there are incoming bytes available
      90. // from the server, read them and print them
      91. if (client.available()) {
      92. recvString = client.readString();
      93. oldString = recvString;
      94. Serial.println(recvString);
      95. }
      96. // If the server is disconnected, stop the client
      97. if (!client.connected()) {
      98. Serial.println();
      99. Serial.println("disconnecting.");
      100. client.stop();
      101. // Do nothing
      102. while (true) {
      103. delay(1);
      104. }
      105. }
      106. if (recvString == oldString) {
      107. _SplitMultiplyData();
      108. }
      109. // BEGIN OF OUTPUTS
      110. // Light up LED_BUILTIN at a tunnel
      111. // the index number of the TS_data array is 1 for TS ControllerId number 2
      112. if (TS_data[1].toInt() == 1 && TS_ctrlID[1] != 800) {
      113. digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
      114. Serial.println("We are in a tunnel");
      115. } else {
      116. digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
      117. }
      118. // Serial ouput of Gradient
      119. // the index number of the TS_data array is 2 for TS ControllerId number 3
      120. if (TS_ctrlID[2] != 800) {
      121. Serial.print("Gradient: ");
      122. Serial.print(TS_data[2].toFloat()*100, 1);
      123. Serial.println("%");
      124. }
      125. }
      126. void _SplitMultiplyData() {
      127. int f = 0, i = 0;
      128. for (int t = 0; t < recvString.length(); t++) {
      129. if ((recvString.charAt(t) == ':') && (recvString.charAt((t+1)) == ':')) {
      130. StringPart[i] = recvString.substring(f, t); // Substring from f to t
      131. // Serial.print("Teil ");
      132. // Serial.print(i);
      133. // Serial.print(" mit Inhalt: ");
      134. // Serial.println(StringPart[i]);
      135. f = (t+2);
      136. i++;
      137. }
      138. }
      139. for (i = 0; i < 3; i++) { // i is the index number of the array = number of the TS ControllerIDs
      140. for (int f = 0; f < 5; f++) {
      141. if (StringPart[i].charAt(f) == ':') {
      142. TS_ctrlID[i] = StringPart[i].substring(0, f).toInt(); // Substring from begin to f and convert to Integer (Ganzzahl)
      143. TS_data[i] = StringPart[i].substring(f+1); // Substring from f to end
      144. Serial.print("Index ");
      145. Serial.print(i);
      146. Serial.print(" ControllerID ");
      147. Serial.print(TS_ctrlID[i]);
      148. Serial.print(" mit Zeichenfolge: ");
      149. Serial.println(TS_data[i]);
      150. }
      151. }
      152. }
      153. recvString = " ";
      154. }
      Show All
      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. ?(
      Grüße Mirko

      TS-Fireman - mit 6 Joystickachsen und 32 -tasten, oder mehr, die Lok steuern
      TS-Verbindung zu Arduino - Ausgabe von Daten mit LED und Rundinstrumenten
    • 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.
      Grüße Mirko

      TS-Fireman - mit 6 Joystickachsen und 32 -tasten, oder mehr, die Lok steuern
      TS-Verbindung zu Arduino - Ausgabe von Daten mit LED und Rundinstrumenten
    • 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.



      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.
      Grüße Mirko

      TS-Fireman - mit 6 Joystickachsen und 32 -tasten, oder mehr, die Lok steuern
      TS-Verbindung zu Arduino - Ausgabe von Daten mit LED und Rundinstrumenten
    • Hier nun der Schnipsel Code für die Ausgabe eines TS-Wertes auf einem Drehspulinstrument.

      C Source Code: Teilscript für Drehspulinstrument

      1. String ContrlIDList = "402:403:404:7"; // temporary - will be changed to automatic receive of list
      2. // Program variables
      3. int TS_ctrlID[4]; // 4 is for the number of TS ControllerIDs
      4. String TS_data[4];
      5. String StringPart[4];
      6. void setup() {
      7. // Initialize digital pin 9 as an output (PWM Speed)
      8. pinMode(9, OUTPUT);
      9. }
      10. void loop() {
      11. // Analog PWM ouput of Speed
      12. // the index number of the TS_data array is 3 for TS ControllerId number 4
      13. if (TS_ctrlID[3] != 800) {
      14. byte val;
      15. val = map((TS_data[3].toFloat()*10), 0, 500, 0, 242);
      16. analogWrite(9, val);
      17. Serial.print("Speed: ");
      18. Serial.print(TS_data[3].toFloat(), 1);
      19. Serial.print(" - Speed PWM: ");
      20. Serial.println(val);
      21. }
      22. }
      Show All
      In dem Sketch in meinem 2. Posting muss noch dessen Zeile 166 angepasst werden.

      C Source Code: TS-TCP-Client.ino

      1. 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.
      Images
      • TS-TCP-Client_ino.jpg

        934.02 kB, 1,920×1,280, viewed 247 times
      Grüße Mirko

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

      The post was edited 2 times, last by MacG: ein Foto hinzugefügt ().

    • 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 Lok steuern
      TS-Verbindung zu Arduino - Ausgabe von Daten mit LED und Rundinstrumenten

      The post was edited 1 time, last by MacG: 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. ;)
      Grüße Mirko

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

      The post was edited 1 time, last by MacG ().

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

      C Source Code: TS-COM-Client.ino

      1. /*
      2. COM client for TrainSimulator COM Server
      3. This sketch connects to a COM server
      4. You'll need a COM server to communicate with this.
      5. based on the Serial Input Basics - Example 3 by Robin2
      6. found at https://forum.arduino.cc/index.php?topic=288234.0
      7. modified by MacG (www.rail-sim.de) 2019
      8. */
      9. const byte numChars = 12;
      10. char receivedChars[numChars];
      11. boolean newData = false;
      12. void setup() {
      13. Serial.begin(115200);
      14. // Initialize digital pin 9 as an output (PWM Speed)
      15. pinMode(9, OUTPUT);
      16. }
      17. void loop() {
      18. _recvWithStartEndMarkers();
      19. _showNewData();
      20. }
      21. void _recvWithStartEndMarkers() {
      22. static boolean recvInProgress = false;
      23. static byte ndx = 0;
      24. char startMarker = '<';
      25. char endMarker = '>';
      26. char rc;
      27. while (Serial.available() > 0 && newData == false) {
      28. rc = Serial.read();
      29. if (recvInProgress == true) {
      30. if (rc != endMarker) {
      31. receivedChars[ndx] = rc;
      32. ndx++;
      33. if (ndx >= numChars) {
      34. ndx = numChars - 1;
      35. }
      36. } else {
      37. receivedChars[ndx] = '\0'; // terminate the string
      38. recvInProgress = false;
      39. ndx = 0;
      40. newData = true;
      41. }
      42. } else if (rc == startMarker) {
      43. recvInProgress = true;
      44. }
      45. }
      46. }
      47. void _showNewData() {
      48. if (newData == true) {
      49. //Serial.print("Speed is set to: ");
      50. newData = false;
      51. // Analog PWM ouput of Speed
      52. float TS_speed = atof(receivedChars);
      53. byte val;
      54. val = map((TS_speed*10), 0, 500, 0, 242);
      55. analogWrite(9, val);
      56. //Serial.print(TS_speed);
      57. //Serial.flush();
      58. }
      59. }
      Show All
      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.
      Files
      Grüße Mirko

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

      The post was edited 1 time, last by MacG: Korrektur ().

    • 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.
      Grüße Mirko

      TS-Fireman - mit 6 Joystickachsen und 32 -tasten, oder mehr, die Lok steuern
      TS-Verbindung zu Arduino - Ausgabe von Daten mit LED und Rundinstrumenten
    • 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

      The post was edited 1 time, last by Seppo: 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.
      Grüße Mirko

      TS-Fireman - mit 6 Joystickachsen und 32 -tasten, oder mehr, die Lok steuern
      TS-Verbindung zu Arduino - Ausgabe von Daten mit LED und Rundinstrumenten
    • 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.
      Grüße Mirko

      TS-Fireman - mit 6 Joystickachsen und 32 -tasten, oder mehr, die Lok steuern
      TS-Verbindung zu Arduino - Ausgabe von Daten mit LED und Rundinstrumenten
    • 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.
      Grüße Mirko

      TS-Fireman - mit 6 Joystickachsen und 32 -tasten, oder mehr, die Lok steuern
      TS-Verbindung zu Arduino - Ausgabe von Daten mit LED und Rundinstrumenten
    • 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
      Grüße Mirko

      TS-Fireman - mit 6 Joystickachsen und 32 -tasten, oder mehr, die Lok steuern
      TS-Verbindung zu Arduino - Ausgabe von Daten mit LED und Rundinstrumenten
    • 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.
      Grüße Mirko

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