LOCODUINO
Parlons Arduino => Modélisation, Architectures logicielles et matérielles => Discussion démarrée par: bobyAndCo le mai 11, 2025, 09:27:18 am
-
Bonjour à tous,
Ce fil est principalement une réponse à Jean-Baptiste à sa question posée sur un autre fil.
Retour Railcom ou RFID ou IR dans Rocrail.
Faire remonter à Rocrail une information de détection à partir du réseau est assez simple. Mais on parle ici d’identification, on ne parle plus de données binaires comme dans le cas d’un capteur (HIGH – LOW) mais de plusieurs bits pouvant former 1 ou 2 octets dans le cas de l’adresse d’une locomotive. Car c’est bien l’adresse d’une locomotive que retourne le détecteur Railcom.
Dans Rocrail, on commence par créer un nouveau contrôleur
(https://www.locoduino.org/IMG/png/rocrail1.png)
On choisit le protocole lan
(https://www.locoduino.org/IMG/png/rocrail2.png)
Dans les réglages du protocole, on choisit un port ou on laisse le port proposé par défaut 8051,
(https://www.locoduino.org/IMG/png/rocrail3.png)
Il faut redémarrer Rocrail pour qu’il prenne en compte la création de ce contrôleur
C’est tout côté Rocrail.
Le protocole lan de Rocrail est un peu verbeux et à mon sens un peu vieillot, mais bon ! Il utilise une syntaxe xml.
Voici un programme testé sur ESP32 (mais qui doit aussi fonctionner avec un Raspberry Pi WiFi ou un Arduino + Ethernet ou WiFi).
/*
Programme de test pour envoi d'une adresse Railcom à Rocrail
christophe.bobille 05/2025 - LOCODUINO - www.locoduino.org
*/
#include <WiFi.h>
#include <WiFiClient.h>
// === Configuration Wi-Fi ===
const char* ssid = "SSID";
const char* password = "PASSWORD";
// Adresse de Rocrail
const char* serverIP = "192.168.xxx.xxx"; // IP du PC avec Rocrail
const uint16_t serverPort = 8051; // Port LAN configuré dans Rocrail
WiFiClient client;
void sendFB(const char* fbMsg) {
String header = String("<xmlh><xml size="") + String(strlen(fbMsg)) + ""/></xmlh>";
String fullMessage = header + String(fbMsg);
client.print(fullMessage);
Serial.println("Message envoyé :");
Serial.println(fullMessage);
}
void setup() {
Serial.begin(115200);
delay(500);
// === Connexion Wi-Fi ===
Serial.print("Connexion à : ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi connecté !");
Serial.print("Adresse IP : ");
Serial.println(WiFi.localIP());
// === Connexion à Rocrail ===
Serial.print("Connexion à Rocrail : ");
Serial.print(serverIP);
Serial.print(":");
Serial.println(serverPort);
if (client.connect(serverIP, serverPort)) {
Serial.println("Connexion TCP OK");
// Activation du capteur avec RailCom
const char* msgOn = "<fb id="sb2e" identifier="78" state="true" bididir="1" actor="user"/>";
sendFB(msgOn);
delay(2000); // 2 secondes
// Désactivation du capteur
const char* msgOff = "<fb id="sb1e" identifier="0" state="false"/>";
sendFB(msgOff);
client.stop();
Serial.println("Connexion fermée");
} else {
Serial.println("Connexion échouée");
}
}
void loop() {}
Au début du programme, on renseignera les infos pour se connecter à notre box internet
// === Configuration Wi-Fi ===
const char* ssid = "SSID";
const char* password = "PASSWORD";
puis l’adresse IP de l’ordinateur qui héberge Rocrail puis le port d’écoute renseigné plus haut : 8051
const char* serverIP = "192.168.yyy.yyy"; // IP du PC avec Rocrail
const uint16_t serverPort = 8051; // Port LAN configuré dans Rocrail
Ligne 59 du programme, c’est ici qu’il faut renseigner l’identifiant que l’on veut communiquer à Railcom
const char* msgOn = "<fb id="sb1e" identifier="78" state="true" bididir="1" actor="user"/>";
id est l’identifiant du capteur sur le tracé Rocrail
identifier l’adresse de la locomotive.
state indique bien sûr que le capteur est actif
Une fois le programme lancé, il doit se connecter au serveur lan de Rocrail et l’on doit voir apparaitre sur le plan le nom de la locomotive dans le block à droite l’identifiant du block dans la partie gauche juste après l’adresse de la locomotive.
(https://www.locoduino.org/IMG/png/rocrail5.png)
N'hésitez pas pour toutes questions.
Christophe
-
Bonjour,
Merci beaucoup pour les informations.
J'imagine qu'il faut reprendre le schéma de l'article "Détection RailCom© avec ESP32 (ou Arduino)" ?
On peut intégrer directement un ESP32 sur la carte (1 ESP32 correspond à 1 détecteur avec ce sketch) ?
Sur quelle broche UART doit être connectée la sortie Railcom avec ce sketch ?
-
Euuuh, là il faut me parler plus clair car je n'ai rien compris à ta question.
J'imagine qu'il faut reprendre le schéma de l'article "Détection RailCom© avec ESP32 (ou Arduino)" ?
De quel schéma parle t'on ? le schéma de la carte de détection Railcom ? Si tu souhaites réaliser des décodeurs Railcom, oui c'est mieux de repartir sur ce schéma en effet.
On peut intégrer directement un ESP32 sur la carte (1 ESP32 correspond à 1 détecteur avec ce sketch) ?
Une fois encore, de quelle carte parles tu ? De la carte de détection Railcom ? Si c'est le cas, ce n'est pas vraiment le bon principe. Sachant qu'un ESP32 peut collecter les données de 3 détecteurs, il faudrait alors redessiner une carte à 3 détecteurs et 1 ESP pour le traitement.
Pour moi, le meilleur concept est de considérer le détecteur Railcom comme un détecteur comme un autre, IR, effet Hall, etc.. et d'utiliser les satellites comme organe central de collecte de toutes les infos. C'est le cas sur les satellites autonome qui font plein d'autres choses que de collecter Railcom. https://www.locoduino.org/spip.php?article348
Sur quelle broche UART doit être connectée la sortie Railcom avec ce sketch ?
Comme dit sur le tableau ci-dessous, l'un ou l'autre des 3 UART peuvent être utilisés, ce pourquoi j dis qu'il est possible d'implanter jusqu'à 3 détecteurs Railcom sur un seul ESP. Voici le programme qui permet cela : https://github.com/BOBILLEChristophe/Railcom-detector-freeRtos-inClass/blob/main/railcom_freeRtos_inClass.ino
UART Port TX RX Remarks
UART0 GPIO 1 GPIO 3 Used for Serial Monitor and uploading code; Can be assigned to other GPIOs;
UART1 GPIO 10 GPIO 9 Must be assigned to other GPIOs
UART2 GPIO 17 GPIO 16 Can be assigned to other GPIOs
Christophe