Also mein PC für den TS wird dieses Jahr 10. Er hat aber auch 6GB RAM, Win7 64bit und eine GTX 750Ti. Es läuft gut, nur auf hohe Grafikeinstellungen muss ich teils verzichten. Bei dem PC-Alter auch vollkommen logisch. So schlecht schaut es beim Fahren nicht aus, Screenshots findest Du hier und hier. Der nächste PC ist auch schon ein paar Jahre alt, aber mit einem i7 und 16GB RAM Onboard wohl besser geeignet.
Beiträge von MacG
-
-
Wie wäre es mit den beiden Konfigurationen? Selbst erstellen wäre auch möglich. Ich kann es nicht. Mir fehlt der Railjet.
-
Besser spät als nie.
Hier ein paar Bilder vom Tag der offenen Tür bei Captrain/ITL in Pirna am 15.06.2019.Falls noch Bedarf an weiteren Bildern besteht, ich habe noch ein paar von diesen Motiven geschossen.

-
-
@Jogibär Danke! Die alten Autos und Werbetafeln gefallen mir nämlich. Und ich dachte, es wäre Sherman Hill Vintage. Gerade erst wieder entdeckt. Leider habe ich dafür nicht alle erforderlichen Strecken. Ich wusste, es gab einen Haken

Die SW1500 nochmals am Marias Pass. Genauer gesagt in Kalispell, Montana.
-
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.
-
@Jogibär die alte Version von Sherman Hill fehlt mir noch. Muss man den Mod über die vorhandene Stecke installieren?
Ich habe mal der SW1500 auf Marias Pass Auslauf gegeben. Es hieß einsammeln von Waggons an zwei Punkten und, teils mit Run 8 (Vollgas), mit max. 25 MPH über die Main donnern. Viel mehr war bei dem schweren Zug auch kaum drin.
-
-
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: TS-TCP-Client.ino
Alles anzeigen/* TCP client for TrainSimulator TCP Server TS-Bridge This sketch connects to a TCP server using an Arduino Wiznet Ethernet shield. You'll need the TCP server TS-Bridge to communicate with this. Circuit: * Ethernet shield attached to pins 10, 11, 12, 13 based on a the TelnetClient from Tom Igoe 2010-2012 modified by MacG (www.rail-sim.de) 2019 */ #include <SPI.h> #include <Ethernet.h> // TS ControllerID List // fixed IDs - 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 String ContrlIDList = "402:403:404"; // temporary - will be changed to automatic receive of list // Program variables String recvString; String oldString = "x"; int TS_ctrlID[3]; // 3 is for the number of TS ControllerIDs String TS_data[3]; String StringPart[3]; // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network // For a second Arduino at you network change his last 0xED to 0xEE byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 1, 100); // Enter the IP address and port of the server TS-Bridge IPAddress server(192, 168, 1, 23); unsigned int port = 47811; // Initialize the Ethernet client library EthernetClient client; void setup() { // You can use Ethernet.init(pin) to configure the CS pin //Ethernet.init(10); // Most Arduino shields //Ethernet.init(5); // MKR ETH shield //Ethernet.init(0); // Teensy 2.0 //Ethernet.init(20); // Teensy++ 2.0 //Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet //Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet // Start the Ethernet connection Ethernet.begin(mac, ip); // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // Check for Ethernet hardware present if (Ethernet.hardwareStatus() == EthernetNoHardware) { Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); while (true) { delay(1); // do nothing, no point running without Ethernet hardware } } while (Ethernet.linkStatus() == LinkOFF) { Serial.println("Ethernet cable is not connected."); delay(500); } // Give the Ethernet shield a second to initialize delay(1000); Serial.println("connecting..."); // If you get a connection, report back via serial if (client.connect(server, port)) { Serial.println("connected"); } else { // If you didn't get a connection to the server Serial.println("connection failed"); } // Initialize digital pin LED_BUILTIN as an output pinMode(LED_BUILTIN, OUTPUT); } void loop() { // Make a request if (oldString != recvString) { client.print(String("GetControllerValueMultiplyRaw(" + ContrlIDList + ")<END>")); //client.write("GetControllerValueMultiplyRaw(402:403:404)<END>"); Serial.println("request send"); delay(100); } // If there are incoming bytes available // from the server, read them and print them if (client.available()) { recvString = client.readString(); oldString = recvString; Serial.println(recvString); } // If the server is disconnected, stop the client if (!client.connected()) { Serial.println(); Serial.println("disconnecting."); client.stop(); // Do nothing while (true) { delay(1); } } if (recvString == oldString) { _SplitMultiplyData(); } // BEGIN OF OUTPUTS // Light up LED_BUILTIN at a tunnel // the index number of the TS_data array is 1 for TS ControllerId number 2 if (TS_data[1].toInt() == 1 && TS_ctrlID[1] != 800) { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) Serial.println("We are in a tunnel"); } else { digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW } // Serial ouput of Gradient // the index number of the TS_data array is 2 for TS ControllerId number 3 if (TS_ctrlID[2] != 800) { Serial.print("Gradient: "); Serial.print(TS_data[2].toFloat()*100, 1); Serial.println("%"); } } void _SplitMultiplyData() { int f = 0, i = 0; for (int t = 0; t < recvString.length(); t++) { if ((recvString.charAt(t) == ':') && (recvString.charAt((t+1)) == ':')) { StringPart[i] = recvString.substring(f, t); // Substring from f to t // Serial.print("Teil "); // Serial.print(i); // Serial.print(" mit Inhalt: "); // Serial.println(StringPart[i]); f = (t+2); i++; } } for (i = 0; i < 3; i++) { // i is the index number of the array = number of the TS ControllerIDs for (int f = 0; f < 5; f++) { if (StringPart[i].charAt(f) == ':') { TS_ctrlID[i] = StringPart[i].substring(0, f).toInt(); // Substring from begin to f and convert to Integer (Ganzzahl) TS_data[i] = StringPart[i].substring(f+1); // Substring from f to end Serial.print("Index "); Serial.print(i); Serial.print(" ControllerID "); Serial.print(TS_ctrlID[i]); Serial.print(" mit Zeichenfolge: "); Serial.println(TS_data[i]); } } } recvString = " "; }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.

-
Projektname: TS & Arduino
Projekttyp: Programme für Arduino
Kurzbeschreibung: Anzeigen in einem Eigenbau-Fahrpult mittels einem Arduino darstellen (LEDs, Rundinstrumente etc.)
Projektform: Open SourceProjektziele:
- 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.
C: TS-TCP-Client.ino
Alles anzeigen/* TCP client for TrainSimulator TCP Server TS-Bridge This sketch connects to a TCP server using an Arduino Wiznet Ethernet shield. You'll need the TCP server TS-Bridge to communicate with this. Circuit: * Ethernet shield attached to pins 10, 11, 12, 13 based on a the TelnetClient from Tom Igoe 2010-2012 modified by MacG (www.rail-sim.de) 2019 */ #include <SPI.h> #include <Ethernet.h> // TS ControllerID List // fixed IDs - 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 String ContrlIDList = "402:403:404"; // Program variables byte readByte; byte oldByte = 1; // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network // For a second Arduino at you network change his last 0xED to 0xEE byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 1, 100); // Enter the IP address and port of the server TS-Bridge IPAddress server(192, 168, 1, 23); unsigned int port = 47811; // Initialize the Ethernet client library EthernetClient client; void setup() { // You can use Ethernet.init(pin) to configure the CS pin //Ethernet.init(10); // Most Arduino shields //Ethernet.init(5); // MKR ETH shield //Ethernet.init(0); // Teensy 2.0 //Ethernet.init(20); // Teensy++ 2.0 //Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet //Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet // Start the Ethernet connection Ethernet.begin(mac, ip); // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // Check for Ethernet hardware present if (Ethernet.hardwareStatus() == EthernetNoHardware) { Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); while (true) { delay(1); // do nothing, no point running without Ethernet hardware } } while (Ethernet.linkStatus() == LinkOFF) { Serial.println("Ethernet cable is not connected."); delay(500); } // Give the Ethernet shield a second to initialize delay(1000); Serial.println("connecting..."); // If you get a connection, report back via serial if (client.connect(server, port)) { Serial.println("connected"); } else { // If you didn't get a connection to the server Serial.println("connection failed"); } } void loop() { // Make a request if (oldByte != readByte) { client.print(String("GetControllerValueMultiplyRaw(" + ContrlIDList + ")<END>")); //client.write("GetControllerValueMultiplyRaw(402:403:404)<END>"); Serial.println("request send"); delay(100); } // If there are incoming bytes available // from the server, read them and print them if (client.available()) { readByte = client.read(); oldByte = readByte; Serial.write(readByte); Serial.println(); } // If the server is disconnected, stop the client if (!client.connected()) { Serial.println(); Serial.println("disconnecting."); client.stop(); // Do nothing while (true) { delay(1); } } } -
Nach über einem Jahr gibt es mal wieder ein Update.

Jetzt sind zwei der Schaltergruppen zusammengebaut. Wobei den silbernen Kippschaltern noch die beschrifteten Blenden fehlen. Diese haben dann auch eine Nase als Verdrehschutz für die Schalter. Beim Vorbild ist zwar meist der Sicherheitskippschalter (für das zusätzliche Entlüften der Hauptluftleitung am Zugenende) auch in solch einem schwarzem Panel verbaut. Da ich es aber verkleinert nachbilde, passt er nicht rein. Er kommt einzeln.
Mit aus diesem Grund wird das Design des Fahrpultes wohl an eine GE Dash-9-40CW angelehnt, wie diese hier. Hoch aufgelöste Bilder fehlen mir davon noch. Worauf man erkennt, welcher Schalter wo ist.
Nebenbei zeichne ich mittels CAD einige Bauteile für Fahrhebel, dyn. Bremse und Richtungswender (die blauen Teile im verlinkten Bild). Auch um mir ein Bild über die gesamte Anordnung zu machen.
-
Leider nur für den TSW. Gäb´ es das schöne Ding auch für den TS19, würde ich mir ihn glatt holen.
Es gibt eine SW1200 auf der Seite http://dickyjim.com/diesel.html Repaints dazu findest Du bei http://railworksamerica.com
Ich finde die Lok im TSW auch nicht gerade passend. Besonders, wenn man sie nur für den NEC bekommt.
-
Im ersten Posting gibt es ein kleines Update. Vorerst wieder nur die exe-Datei, weil es nur kleinere Veränderungen sind. Wer will kann damit die Version 0.9.9.0 bzw. die bisherige EXE im Programmverzeichnis ersetzen.
Changelog
- Unterstützung für TS 64bit, mit der TS-Bridge x64 von @Sillo <== Dafür vielen Dank!
- direktes Öffnen der Windows-Einstellungen Gamecontroller
- die Liste der ControllerIDs vom TS bei "Add a new locomotive" oder "Modify a locomotive" kann nach Spalten sortiert werden
- wählt man eine Zeile in der Liste aus, werden mit Klick auf die Achse (z.Bsp. "Throttle and Brake") die nötigen Werte übernommen
- Felder mit Standardwerten bleiben leer, diese sind im TS-Fireman verankert
- bei "Modify a locomotive" werden nun Standardwerte aus der locomotives.ini entfernt und die Einträge sortiert
- kleinere Anpassungen
Wishlist
- die Auswertung der Achsen anpassen, damit das "Zittern" der Potentiometer abgefangen wird. Dies wird aber bei stufenlosen Fahrhebeln (100 Steps) kaum eine Verbesserung bewirken.
- Daten an "Irregular Notched Lever" senden, also mit unregelmäßig verteilten Raststufen
- eine Schnittstelle für Arduino, um Kontrollleuchten am Fahrpult aufleuchten zu lassen bzw. die ControllerIDs an den Arduino zu übermitteln <== in ein weiteres Projekt ausgelagert
- ein automatischer Verbindungsaufbau nach dem Start
-
Der VT 18.16 "Görlitz" soll auch wieder rollen.
MDR "Auf schmaler Spur" - Zuglegende "SVT" soll zurückkehren
-
Bezüglich gebrauchter PCs kann ich Pollin.de empfehlen. Es sind zwar meist Office-PCs ohne gesteckter Grafikkarte, aber man bekommt einen i3 oder i5.
-
Hier mal eine Frage an Euch. Weil ich mich mit einem kleinen Update vom TS-Fireman beschäftige, wollte ich noch den lang bestehenden Wunsch nach unregelmäßig verteilten Raststufen umsetzen. Also das Senden von Daten an einen "Irregular Notched Lever". Ich gehe dabei hauptsächlich von einem Kombi-Fahrhebel aus und würde es wie folgt lösen. Man muss einen Min- und Max-Wert angeben und zusätzlich einen Zwischenwert. Wobei dieser die Mitte sein kann, aber nicht muss. Für den Bereich vor und nach dem Mittelwert werden jeweils die Steps (Schaltstufen) angegeben.
Am Beispiel eines amerikanischen Kombi-Fahrhebels sehe dies dann so aus:
Min: -1 | Zwischenwert: 0 | Max: 1 | Steps von -1 bis 0 (dyn. Bremse): 16 | Steps von 0 bis 1 (Fahrhebel): 8
|||||||||||||||||||||||||
Noch ein weiteres Beispiel für einen dyn. Bremshebel mit Startbereich (Set Up):Min: 0 | Zwischenwert: 0.1 | Max: 1 | Steps von 0 bis 0.1 (Set Up): 1 | Steps von 0.1 bis 1 (Bremsbereich): 30
||||||||||||||||||||||||||||||||
Entspricht dies Euren Vorstellungen? -
Im Hintergrund wurde an einem 64-Bit Update gearbeitet. Da ich keine Zeit habe, hat @Sillo seine TS-Bridge modifiziert. Vielen Dank!
Damit diese mit dem TS-Fireman kommunizieren kann. Ein Weg den @gazz letztes Jahr vorgeschlagen hat.Hier gibt es die BETA: https://www.ts-mfd.de/index.ph…shot/4-ts-bridge-x64-beta (für die 32-Bit Version vom TS gibt es eine eigene TS-Bridge x86)
Wie beim TSConductor einfach die IP auswählen, den Port einstellen. Das kann beides vom TSConductor übernommen werden. Nur sollten dann nicht beide Programme (TSConductor und TS-Bridge) gleichzeitig laufen. Die Railworks.exe im Steam-Verzeichnis auswählen und nach dem Start des Servers kann sich TS-Fireman mit der TS-Bridge verbinden. Oder eben die neuen Parameter für IP und Port in den Settings vom TS-Fireman eintragen.
Die 32-Bit Version habe ich getestet und sie funktioniert ohne Probleme. Für 64-Bit fehlt mir noch das Update auf TS2019.
Es wäre schön, wenn wir von Euch zur TS-Bridge 64-Bit BETA ein Feedback bekommen könnten. Danke!

-
Hier mal mein kleiner Fortschritt bei der Programmierung für mein Display einer amerikanischen Lok. Ganz ohne grafischen Schnickschnack. Den gibt es aber auch schon

-
Das ist er (noch) nicht. Laut einem Posting von Dovetail Games auf Steam steht es mit auf der Aufgabenliste.
... im Moment haben andere Dinge Vorrang vor einer API für Controller-Hardware, die von vergleichsweise wenigen Personen verwendet wird.
Wir wollen weiterhin die Unterstützung für RailDriver implementieren, sie ist im Moment einfach nicht die oberste Priorität im Vergleich, zum Beispiel, zu den Editor Tools.
Auf der Seite vom RailDriver sieht man die unterstützen Simulatoren. http://raildriver.com/products/raildriver.php -
Man muss es wohl mögen. Mein Fall ist es nicht. Die Zusammenstellung des AddOns macht es nicht besser.
Hier mal drei Artikel auf dovetail Live mit Screenshots:
Frontier Spirit!
Salt Flats, Saloons, and Steam!
Journey to Promontory!