Railuino : La bibliothèque pour commander son réseau en DIY avec le protocole CAN de Marklin

Bonjour à toutes et à tous,

Railuino est la bibliothèque de référence pour qui s’intéresse au pilotage de son réseau en DIY (Do It Yourself) avec le protocole CAN de Marklin. Il en a été plusieurs fois question sur quelques fils du forum (sans que certains ne sache d’ailleurs de quoi il s’agissait exactement).

A quoi peut servir cette bibliothèque et pour qui ?

Si l’on veut par exemple piloter des locomotives avec un Arduino sans se palucher à la main tout le code nécessaire, la bibliothèque Railuino est faite pour cela.

Voici un exemple qui, même si vous n’êtes pas un expert du code, vous laissera comprendre de quoi il s’agit.

void setup() {
  Serial.begin(115200);
  while (!Serial);
  
  ctrl.begin();
  Serial.println("Power on");
  ctrl.setPower(true);
  Serial.println("Headlights on");
  ctrl.setLocoFunction(LOCO, 0, 1);
}

void loop() {
  byte b;
  
  Serial.println("Direction forward");
  ctrl.setLocoDirection(LOCO, DIR_FORWARD);
  if (ctrl.getLocoDirection(LOCO, &b)) {
    Serial.print("(Direction is ");
    Serial.println(b == DIR_FORWARD ? "forward)" : "reverse)");
  }
  
  delay(TIME);
  
  Serial.println("Direction reverse");
  ctrl.setLocoDirection(LOCO, DIR_REVERSE);
  if (ctrl.getLocoDirection(LOCO, &b)) {
    Serial.print("(Direction is ");
    Serial.println(b == DIR_FORWARD ? "forward)" : "reverse)");
  }
  
  delay(TIME);
}

Tout ce qui commence par “Serial.print » n’est pas du code de commande mais de debug. On voit donc qu’avec des commandes assez simples, on demande à la centrale de se mettre en route, d’allumer les feux de la locomotive, on commande la direction de la locomotive et l’on devrait alors voir les feux de la loco commuter. On ne la fait pas rouler, mais la commande n’est pas plus compliquée.

Alors, que peut-on en faire ? Des applications simples comme un va-et vient automatique où l’on mettrait des tempos dans le code ou des actions « sous » événements liés à l’état de capteurs sur la voie…

Et l’on peut s’en servir pour des choses beaucoup plus complexes comme fabriquer son propre gestionnaire de réseau. D’ailleurs, DestopStation, le logiciel dont nous a parlé récemment Alain3R repose sur le moteur Railuino. Lien vers le site Desktop Station - Railuino preparation mais je vous préviens, là aussi tout est viellot !

Alors qui ça intéresse ? Bien sûr les modélistes qui ont un peu d’appétence pour l’Arduino et l’envie de réaliser leurs propres applications. La compétence s’acquière facilement, c’est ce qui à fait la popularité d’Arduino.

J’avais tenté de mettre en œuvre cette bibliothèque mais à presque chaque fonction, je me trouvais confronté à l’âge du logiciel. Ecrit en 2013 et jamais mis à jour, il est considérablement bridé et ne fonctionne pas sur les OS modernes (ESP32 en particulier), ne permet pas de se connecter en WiFi par exemple. Et ne parlons pas d’héberger des applications comme le pilotage de locomotives au travers d’un smartphone par exemple.

Pour toutes ces raison, j’ai entrepris une réécriture profonde du programme. Comme celui-ci est particulièrement bien écrit, en programmation orientée objets du c++, le travail de réécriture est vraiment facilité. En deux jours à peine, j’ai déjà réécrit 25 à 30% du code mais ce qui correspond à au moins 50 à 70% des commandes utilisées. Celles qui reste sont plutôt marginales.

Le nouveau code est ici : GitHub - BOBILLEChristophe/Railuino: Rewrite of version 0.9.0 of Joerg Pleumann's Railuino library

Ça m’intéresse de savoir s’il y en a parmi vous qui utilisent cette bibliothèque ou envisagent de le faire.

Comme je l’ai toujours proposé, je répondrai volontiers à toutes vos questions, ou du moins j’essayerais.

Christophe

3 « J'aime »

Bonjour à toutes et à tous,

Voilà, j’ai terminé la réécriture de cette bibliothèque Railuino et profité pour corriger au passage quelques bugs.

Le code est en c++ entièrement sous forme de classes et donc facile à mettre en œuvre et à adapter pour les plus téméraires avec un logiciel Arduino par exemple.

La bibliothèque inclus d’origine un sniffer de trames CAN pour visualiser les échanges sur le bus mais je vais le réécrire car je ne le trouve pas ergonomique. Mais au moins pour l’instant il existe.

J’ai aussi introduit une fonctionnalité qui permet d’envoyer des commandes au réseau en saisissant simplement les infos dans un moniteur série comme celui de l’IDE d’Arduino du type – « power » 1 ou « power 0 » ou encore « speed 16391 200 » pour vitesse de la loco locID 16391 à 200 (sur 1000 chez Marklin) !!!

Ce n’est pas là non plus très ergonomique mais ça rend des services. Associé avec le sniffer, ça peut par exemple permettre de comprendre pourquoi une loco ne veut désespérément pas avancer.

Mais comme je le disais, Railuino, c’est surtout pour réaliser des automatisations de réseau et de pilotage des locomotives, et là, à ma connaissance, il n’existe pas d’autres programmes pour Arduino/ESP32.

Surtout que je vais rapidement compléter cette bibliothèque par l’implantation du WiFi pour commencer puis l’hébergement d’applications comme des manettes WiFi de pilotages, des TCO interactifs etc… Le moteur étant là, chacun met ensuite la carrosserie qui lui convient.

Avec la bibliothèque, j’ai mis à jour pour l’instant 6 ou 7 sketches Arduino pour tester des choses simples :

  • Lecture des CV et affichage des valeurs
  • Power, speed, direction
  • Et comme dit ci-dessus une serial_commande pour envoyer des ordres « à la mano »

Voici par exemple une partie du code pour lire les CV’s et afficher les valeurs.

void setup()
{
  Serial.begin(115200);
  while (!Serial)
    ;

  ctrl.begin();
  Serial.println("Power on");
  ctrl.setPower(true);

  showRegister(1, "Address");
  showRegister(2, "Min. Voltage");
  showRegister(3, "Accel. time");
  showRegister(4, "Decel. time");
  showRegister(5, "Max. speed");
  showRegister(6, "Avg. speed");
  showRegister(7, "Version");
  showRegister(8, "Manufacturer");

  Serial.println("\n\nSystem stopped. Need to reset.");
}

void loop() 
{
}// Nothing to do

void showRegister(uint16_t i, String label)
{
  uint8_t b = 0;

  if (ctrl.readConfig(LOCO, i, &b))
    Serial.printf("Register %d - %s : %d \n", i, label, b);
}

Je vous redonne le lien sur le Github :

A votre disposition pour répondre à vos questions ou suggestions.

PS : Ah j’allais oublier. J’ai traduit à moitié la doc de Marklin sur son protocole CAN. Si ça intéresse quelqu’un ! : marklin_can_protokoll.pdf (593,3 Ko)

Christophe

4 « J'aime »

Qui n’a jamais eu envie de piloter sa MS2 et ses locomotives en WiFi avec un smartphone ou une tablette ?

Voici une application concrète suite à la réécriture de Railuino qui intègre maintenant des fonctionnalité de communication en TCP et en WiFi avec des requêtes basées sur les derniers développements en JavaScript.

Je n’ai pas fait d’efforts particuliers pour le design j’en convient, mais c’est surtout le principe qui est intéressant.

Et pour ceux qui ont besoin de voir de leurs yeux pour le croire, cliquez sur l’image pour visionner la vidéo youtube :

Allez, voilà ce sera sans doute tout pour aujourd’hui. L’interface web n’était quand même pas très belles et il manquait surtout diverses choses comme l’affichage de la vitesse et les boutons pour les fonctions.

Précision importante, l’affichage sur la MS2 est mis à jour en temps réel que ce soit pour les données de vitesse ou les fonctions activées. Les deux manettes cohabitent sans problème.

Bonne soirée à tous

PS : @Julaye Si je n’arrive pas avec ça à te faire oublier CC-Schnitte, je ne sais plus vraiment quoi faire alors :joy:

Christophe

1 « J'aime »

Lol ! C’est promis je vais utiliser ta carte mais pas le temps avant octobre (… aout et septembre sous l’eau …). Je te recontacte début septembre sans faute.

Bon je n’ai pas pu résister, j’ai ajouté une petite fenêtre de log. J’aime bien les fenêtres de log pour que la machine me parle et me dise ce qu’elle fait !

Mais c’est promis demain j’arrête.

Bonne soirée à tous.

Christophe

1 « J'aime »

Ah si, j’oubliais. J’ai une question pour ceux qui connaissent bien les commandes de locos Marklin.

J’ai remplacé la commande Emergency par System Halt car dans le protocole Marklin, Emergency ne concerne qu’une locomotive (Arrêt immédiat sans inertie) Systeme Halt elle concerne toutes les locomotives. En cas d’urgence , je préfère arreter tout le réseau.

Qu’en pensez-vous ?

Mais peut-être aussi que je me trompe ou je ne vois pas une subtilité. Je suis preneur de vos remarques.

Christophe

Ce qui correspond sur les CS et MS à l’appuie de la molette. au cas ou un problème ou danger imminent concernant cette locomotive et nécessitant une action immédiate d’arrêt. mais ne nécessite pas d’interrompre la circulation d’un autre train. C’est souvent utilisé quand on anticipe mal l’inertie d’une machine et que l’on vient à dépassé la zone d’arrêt. bien souvent on appuie sur le bouton de la molette pour éviter que la machine finisse sur l’aiguille.

qui correspond au bouton STOP sur les CS et MS. Effectivement cela concernant toute les locomotives ainsi qu’en principe les accessoires.
C’est bien utiles dans le cas de figures ou une erreur d’aiguillages est sur le point d’entrainer le choc frontale entre deux machines qui circulent.

Merci pour cette réponse. Je vois bien maintenant à quelles commandes tu fais référence.

Mais j’avoue avoir un peu de mal avec la doc Marklin (je joins les seules pages aux quelles je fais référence)

Il y a en 2.1 Commande : Arrêt du système

Ca semble correspondre au bouton STOP sur la MS2. D’autant que la section 2.2 fait référence à son pendant

2.2 Commande : Démarrage du système, j’imagine le nouvel appui sur le bouton stop.

2.3 Commande : System Halt : Toutes les locomotives reçoivent l’ordre de s’arrêter (vitesse 0), y compris l’inertie de freinage. Le signal numérique reste sur les rails, mais aucune autre commande n’est envoyée sur les rails. L’énergie électrique reste disponible. Utile pour un arrêt contrôlé de l’installation.

Donc cela correspond bien (aussi) à l’action sur le bouton stop !!!

Et ce n’est pas l’emergency non plus puisque c’est la section 2.4.

Description : Arrêt d’urgence ou arrêt immédiat de la locomotive, selon le protocole de voie. Il faut spécifier une locomotive déjà ciblée par une commande. Si cette locomotive n’est pas déjà dans le cycle, elle ne sera pas prise en compte par cette commande.

Et il est bien précisé que l’emergency ne concerne qu’une locomotive. Donc comme tu le dis appui sur le bouton de la mollette.

Du coup, system halt n’est pas exposé à l’utilisateur sur une MS2 par exemple, non ? C’est a commande 2.1 Arrêt qui fait le job de façon similaire mais coupe le jus contrairement à Systeme Halt.

Est-ce que je dis des c***ries ?

Bien cordialement

Christophe

marklin_can_protokoll_20_28.pdf (141,5 Ko)

Bonjour Christophe,

Mon installation de base est basée sur Arduino R3 + CAN (kit McHobby) comme proposé à l’époque par Railuino et le tout piloté par DesktopStation.

Le nouvel Arduino R4 dispose a priori du CAN intégré (également ESP32 et WIFI) , penses tu qu’il est possible de le substitué (avec modif code ?) au kit McHobby sans risques ?

Bruno.

Bonjour Bruno,

Si je comprends bien, tu n’as pas de Arduino R4. Alors n’en achète surtout pas.

Ton équipement actuel, Arduino R3 + CAN est toujours d’actualité mais pas nécessaire ici. Tu trouveras facilement à le replacer sur ton réseau quand tu vas commencer à implanter les communications par bus CAN.

Avec l’ESP32, la communication directe entre Rocrail, iTrain, JMRI etc… et la MS2+Gleisbox fait que tu n’as plus besoin de cet équipement ni de la bibliothèque Railuino. Rocrail intègre l’equivalent de DesktopStation (partie graphique) et de Railuino (commandes). Et beaucoup plus encore. Donc la liaison de Rocrail et de la Gleisbox au travers de la passerelle font que tu disposeras de toute la puissance de Rocrail avec la rapidité de transfert de la passerelle (beaucoup supérieure à Railuino).

Je te suggère de “coller” au montage que j’ai proposé pour de multiples raisons. En particulier parce qu’il est éprouver et que la maintenance est assurée. Je ne ferai pas de maintenance sur d’autres solutions d’autant que les principes de codage que j’ai retenu (bi-cœur, task freeRtos ne sont pas compatibles sur Arduino…). Le R4 a pour procésseur un RA4M1 qui ne se programme pas du tout comme un ESP32 et il faudra tout de même, je crois, que tu ajoutes un transceiver CAN (comme l’ESP32).

Mais tu peux aussi essayer de réécrire le code, il n’est somme toute pas très compliqué.

Chriistophe

Bonjour Christophe,

Du coup, lorsque tu auras fini tes tests avec mon module S88 (pas d’urgence), on profiterait peut être du colis de retour pour y glisser une de tes platines ESP32, j’ai cru comprendre que tu en vendait. Tiens moi au courant. Ça te ferait un testeur de plus :wink:

Bruno.

Bonjour Bruno,

Pas de problème, je t’adresserai une carte pour faire la passerelle de Rocrail vers la MS2+Gleisbox.

J’ai terminé ce week-end l’adaptation de la carte pour communiquer en Ethernet (RJ45). Non pas que la version en WiFi ne fonctionne pas bien, mais pour moi, moins il y a de wifi sur nos réseaux mieux c’est.

En Ethernet, cela oblige à avoir une prise à proximité, mais bon.

Quoi qu’il en soit, la carte permet de commuter d’un mode à l’autre très facilement par un simple choix en début de programme. Donc les deux modes cohabitent et peuvent être modifiés facilement

Ici on voit que c’est le mode Ethernet qui est choisi.

Pour la rétro signalisation, j’ai suivi avec un grand intérêt les échanges de ce week-end à ce sujet et cela me conforte dans ma conviction d’abandonner totalement le bus S88 au profit d’un bus CAN spécifique.

J’avais pensé au départ utiliser des Arduino Nano pour faire les décodeurs mais je choisi finalement de mettre des Raspberry PI Pico.

Pas plus cher (5 à 6€ environ), ils sont plus puissants, ont plus de mémoire et plus de broches. Il est donc possible d’avoir 16 entrées pour les détections comme un décodeur S88 plus quelques autres pour la communication CAN par exemple.

Cela va permettre aussi une communication très rapide, de 1MB/s dans le cas d’un bus CAN de 30 mètres de long et de 500Kb/s jusqu’à 100 mètres. Pour info, le bus CAN de Marklin est à 250 Kb/s autorisant une longueur de bus de 250 mètres !!!

La passerelle entre ce bus CAN de rétro signalisation et Rocrail sera réalisé par exactement la même carte que pour la MS2 : Ethernet ou WiFi.

Je vais commencer les tests avec le RP Pico cette semaine. Je ferai alors réaliser des PCB pour que l’ensemble soit propre et sécurisé.

Tu me précises si tu souhaites une version Ethernet / WiFi ou WiFi seul pour la passerelle Rocrail et je te retourne ton décodeur S88 avec.

Merci encore pour ton aide.

Christophe

2 « J'aime »

Bonjour Christophe,

Je suis pas grand fan du WiFi, donc je veux bien une version Ethernet /Wifi.

Pour le montage pas de soucis, je soude sans problème, par contre j’aurai peut être besoin de toi pour la mise en œuvre, je ne maitrise pas du tout les ESP32.

Tu penseras à me fournir ton Paypal pour le paiement de la carte (et le montant dû).

Merci à toi,

Amicalement,

Bruno.

Réponse en MP. C’est parti en début d’AM !

Chez moi le système pourri fonctionne à merveille :sunglasses: alors votre système doit anticiper l’arrivée des rames ! :smiley:
André

1 « J'aime »

Désolé, je coyais que l’on était en MP !

Puisqu’il y a 2 sujets connexes ouverts, je me permets de répéter.

2 « J'aime »

En fait, ce fil est destiné à la bibliothèque Railuino et a “dérapé” un moment donné mais ce n’est pas très grave, il va reprendre son cours normal quand ce sera le moment.

Dans tous les cas, je te remercie Jérôme pour ce témoignage. Chacun aura compris j’espère que je n’ai aucun intérêt personnel à publier ces montages. A l’inverse, je m’expose à la critique ou aux réprimandes quand ça ne fonctionne pas (ou mal), ce qui est pourtant inhérent au DIY.

Donc les témoignages comme le tien font toujours plaisir et je me dis alors que, sans doute, je ne travaille pas pour rien.

Christophe

1 « J'aime »

OK Christophe,
Je vais regarder cela de plus près.
Alain