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.
/*
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);
}
}
}
Alles anzeigen