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

2 « 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

3 « J'aime »