Homemade Marklin - création d'un circuit intelligent

Bonjour Yann,

J’essaye comme toi de faire communiquer ma MS1 avec ma loco via le CAN. Marche pas ! tu dis avoir résolu tes soucis avec le boitier 60116, mais est ce toujours en utilisant une MS1 ?

Sachant que Railuino utilise une adresse de communication relative à une MS2 (#define ADDR_MM2 ** 0x0000**), n’est ce pas cette adresse qui serait différente pour une MS1 ?

Dans l’attente de tes informations.

Amicalement.

Bruno.

Bonjour Bruno,

Contrairement à ce que j’ai dit dans mon dernier post ici, le projet est en attente pour le moment… A l’heure actuelle (et ce depuis début-septembre), mes locos sont contrôlées uniquement à l’aide d’un arduino (nano) et via une interface Processing imitant celle de la CS3, sans autre moyen natif de Märklin. Je n’ai donc pas (encore) cherché à faire communiquer une MS1 avec le reste du système. Désolé de ne pas pouvoir t’aider plus avant.

Cependant, de souvenir, il n’est pas possible de faire communiquer une MS1 avec un système plus récent sans un adaptateur relativement complexe. Par exemple, la MS1 regroupe la commande et la puissance (équivalent de MS2 et 60116). Et de manière moins intuitive, la protocole CAN utilisé n’est simplement pas le même, c’est comme si une personne âgée tentait de communiquer avec un jeune adolescent; ils ont beau parler la même langue, ils sont incapable de se comprendre. :stuck_out_tongue:
Si mon emploi du temp me le permet, peut-être reviendrais-je à ce projet (je l’espère en tout cas!), arriver à créer un convertisseur d’un protocole CAN à l’autre est dans la liste des choses à faire :wink:

Bien à toi,

Yann.

Hello,

J’ai fini par investir dans une MS-2 et boitier de raccordement 60113. Cela a résolu mon problème de communication avec le montage Arduino CAN-BUS.

Commande des machines et des aiguilles depuis script Arduino OK.

Prochaine étape, développer un script pour une utilisation en mode “console”.

A terme, développer une interface graphique en VISUAL Basic ou C++.

A suivre …

Bruno.

Salut Bruno,

Heureux que tu t’en sortes!
Si tu veux, avant de laisser le projet sur une voie de garage, j’ai écrit un petit programme sous Processing qui imite l’interface de la CS3. Si ça peut t’aider, dis-moi et je poste le tout ici :wink: Processing fonctionne en Java maos c’est relativement proche du C, tu pourrais peut-être t’en inspirer pour ton propre programme.

À bientôt,

Yann.

Bonjour à tous,

J’ai lu ce post avec grand intérêt. Pour son titre séduisant « création d’un circuit intelligent » et aussi par son contenu qui aborde la possibilité de piloter des trains avec des solution totalement ou partiellement à base de DIY.

On parle dans ce fil de deux choses qui sont un peu mélangées mais qui sont très différentes l’une de l’autre :

  • CC-Schnitte, qui est un boitier éléctronique, une passerelle, entre un ordinateur et un logiciel de gestion de réseau (RocRail, Train Controller etc) et une Geiltsbox par exemple.
  • Railuino, qui est une bibliothèque écrite en C++ qui doit être chargée sur une carte équipée d’un microcontrôleur comme un Arduino et disposer d’un contrôleur CAN.

Railuino offre des possibilités très importantes mais nécessite de développer des environnement hard et soft assez complexes. De plus, cette bibliothèque est très bien écrite mais elle est ancienne (2013, c’est beaucoup en programmation), elle n’est pas adaptée aux nouveaux équipements, comporte quelques manques (comme la reconnaissance automatique en MFX) et doit être optimisée par rapport aux normes C++ 11 et suivantes. Je suis actuellement en train de réécrire certaines parties de cette bibliothèque que je teste au fur et à mesure. Un travail assez long mais bien avancé. J’en reparlerai bientôt j’espère.

CC-Schnitte par contre est une solution très simple, facile et rapide à mettre en œuvre si vous souhaitez piloter vos locomotives et votre réseau avec un logiciel tel que Rocrail. J’ai utilisé Rocrail car il m’a semblé qu’il emportait un peu les suffrages sur le forum mais cela fonctionne avec d’autres.

Page de présentation de CC-Schnitte :
https://www.can-digital-bahn.com/modul.php?system=sys5&modul=54#Mod_Top

Il vous faudra un ordinateur + Rocrail + un boitier CC-Schnitte relié à l’un des ports USB d’un bord et à l’une des deux entrées CAN de la Geiltsbox. A l’autre entrée CAN de la Geiltsbox, vous reliez une MS2 mais je vous donnerai une solution plus tard pour vous dispenser de cette dernière si vous le souhaitez.

Vous devez relier l’ensemble comme présenté ici :

Ouvrir Rocrail, ouvrir un projet existant (démo) ou en créer un nouveau.

Dans le menu fichier, vous choisissez « Propriétés de Rocrail »

Cliquez sur le bouton « Centrale » au milieu en haut de la fenêtre, appuyez sur le bouton « Ajouter » et une ligne NEW s’ajoute dans la fenêtre.

Selectionnez le bouton radio « CC-Schnitte » et le port usb de votre ordinateur auquel est reliée CC-Schnitte. Comme nom identifiant de centrale, vous pouvez saisir par exemple CC-Schnitte ou tout autre nom.

RR_03

Vous validez et obtenez maintenant ceci :

Validez à nouveau.

Quittez Rocrail, la MS2 non brancée sur la Gleisbox, relancez Rocrail, choisissez dans => Fichier => Environnement de travail celui que vous venez de créer.

Mettez sous tension.

Branchez la MS2 sur la Gleisbox. Avec la MS2, faite rouler la locomotive pour activer le processus de reconnaissance par Rocrail. Cela peut prendre 10 à 20 secondes.

Une fois la reconnaissance opérée, vous voyez une ligne apparaître avec l’adresse Loc-ID (qui signifie local ID et non locomotive ID). Vous allez ainsi voir apparaître les locomotives, au fur et à mesure que vous allez les poser sur les rails avec Loc-ID qui s’affiche dans Rocrail.

Sélectionnez la ligne puis click droit pour modifier les propriétés.

Et voilà, vous pouvez maintenant piloter vos locomotives.

Voilà pour ceux qui recherche une solution simple et facile à mettre en œuvre mais qui nécessitera tout de même de débourser les quelques 150€ de CC-Schnitte.

Notez qu’il est possible d’activer le processus d’identification automatique MFX sans MS2 ou autres stations. N’importe quel appareil relié au bus CAN et capable d’envoyer un message CAN peut faire l’affaire. Cette commande est documentée dans le protocole Marklin à la rubrique 3.1 Locomotive Discovery.

Je vais maintenant m’attaque à la boite CC-Schnitte et j’ai bon espoir de vous présenter rapidement une solution qui pourrait alors fonctionner sur la même carte CAN que pour le discovery.

1 « J'aime »

Bonjour

Je ne suis pas spécialiste et je me permets une question de débutant

Pour moi :
on relie la voie à une centrale
on peut relier cette centrale à un ordinateur sur lequel on aura téléchargé un logiciel de gestion de réseau ( gratuit - shareware ou payant)

Et ça marche - je l’ai testé avec une vieille IB 650 ( uhlenbrock) et Rocrail

Pourquoi inserer un autre « objet » dans cette configuration et pourquoi faire de plus ?

Merci :pray:
Francis

Bonsoir Francis

Peux-tu préciser de quel objet tu parles quand tu dis “Pourquoi inserer un autre « objet » dans cette configuration et pourquoi faire de plus ?”

Tu fais référence à la carte Arduino (ESP32) que je projette d’ajouter par la suite ?

Merci pour ta réponse

Christophe

Ou alors parles-tu d’une centrale de type CS2 ou CS3 ?

Mais ici, il s’agit d’une MS2 qui ne peut pas être reliée directement aux logiciels de gestion de réseau !

Etait-ce de ça dont tu parlais ?

Christophe

Bonjour

J’ai relu et je crois comprendre

Il faut une MS 2 , une Geiltsbox et une CC Schnitte et on peut se passer d’une centrale type CS ou IB ou ECOS

C’est cela ?

Si oui deux questions complémentaires :

  • J’ai cherché mais j’ai pas trouvé ce qu’était un ou une Geiltsbox ?

  • Et si on additionne le prix des trois on arrive à combien ?

Francis

Oui c’est bien cela. Je ne dis pas que Rocrail remplace une CS2 ou CS3 car je vais m’attirer les foudres de quelques uns.

Mais si utiliser Rocrail vous intéresse pour avoir des fonctionnalités séduisantes sans avoir à investir dans une centrale, c’est en effet une alternative.

Il est même possible de se dispenser d’une MS2, j’ai développé le code sur ESP32 pour le discovery MFX. Il faut que je poursuive les tests mais j’ai déjà de bon résultats que je partagerai bientôt.

J’ai aussi commencé à remplacer cc-schnitte, c’est juste un peu plus compliqué… à suivre !

Ok et merci :pray:.
J’ai testé Rocrail avec une IB 650 uhlenbrock et j’ai trouvé sympa

L’avantage d’une centrale type CS c’est d’avoir deux boutons pour conduire deux locos en simultané , mieux qu’une souris à mon goût en tout cas
Du coup pouvoir utiliser la MS2 c’est bien

Et c’est quoi un ou une Geiltsbox ?

C’est bien pour cela que je n’oppose pas l’une et l’autre. Il y en a pour tous les gouts… et aussi pour tous les budgets.

Un fait c’est Gleisbox. C’est la boite de voie, le booster
Gleisbox

Bonjour à tous,

Voila j’ai terminé le programme qui permet d’activer la reconnaissance MFX pour Rocrail avec CC-Schnitte sans avoir besoin de la MS2.

Comme il n’est pas possible de télécharger un fichier .ino, j’ai copié le code ci-dessous.

J’ai écrit le code pour un ESP32 qui tourne sur une petite carte que j’ai réalisée avec un transceiver CAN MCP2562. Mais cela peut aussi fonctionner sur n’importe quel Arduino avec un module CAN MCP2515 en modifiant également la bibliothèque CAN dans le programme.

Pour ceux qui seraient intéressés, n’hésitez pas à poser toutes vos questions aux quelles j’essayerai de répondre. Je peux aussi fournir les fichiers Gerber de la carte (voir des cartes complètes).


/*
   rocrail_mfx_discovery

    Pogramme permettant la reconnaissance MFX
    et la mise a jour de la liste des locomotives dans Rocrail©


*/

#ifndef ARDUINO_ARCH_ESP32
#error "Select an ESP32 board"
#endif

#define PROJECT "rocrail_mfx_discovery"
#define VERSION "0.1"
#define AUTHOR "Christophe BOBILLE : [email protected]"


#include <ACAN_ESP32.h>  // https://github.com/pierremolinaro/acan-esp32.git

CANMessage frameIn;
CANMessage frameOut;

/* ----- CAN ----------------------*/
#define CAN_RX GPIO_NUM_22
#define CAN_TX GPIO_NUM_23
#define CAN_BITRATE 250UL * 1000UL // Marklin CAN baudrate = 250Kbit/s

uint32_t CAN_Id;
uint8_t  CAN_Len;
uint8_t  CAN_Command;
uint16_t CAN_Hash = 0x2f39;


String decToHex(uint8_t dec)
{
  auto convert = [](uint8_t x) ->char
  {
    char ch;
    if (x >= 10)
      return (char)(x + 55);
    else
      return (char)(x + 48);
  };
  String hex = "";
  hex += convert(dec / 16);
  hex += convert(dec % 16);
  return hex;
}

const byte nbLocos = 40;

class Loco
{
  private:

  public:
    Loco();
    uint8_t index;
    uint8_t locID[2];
    uint8_t UID[4];
    static uint8_t comptLoco;
};

uint8_t Loco::comptLoco = 4;
Loco::Loco() : index(255) {};

Loco* loco = new Loco[nbLocos];

uint8_t canSendDta[8];
bool err;

bool sendMsgCan(uint8_t CAN_Command, uint8_t length, uint8_t *canSendDta)
{

  CAN_Id = CAN_Command << 17 | CAN_Hash;
  frameOut.id = CAN_Id;
  frameOut.ext = 1;
  frameOut.len = length;
  frameOut.data[0] = canSendDta[0];
  frameOut.data[1] = canSendDta[1];
  frameOut.data[2] = canSendDta[2];
  frameOut.data[3] = canSendDta[3];
  frameOut.data[4] = canSendDta[4];
  frameOut.data[5] = canSendDta[5];
  frameOut.data[6] = canSendDta[6];
  frameOut.data[7] = canSendDta[7];
  err = ACAN_ESP32::can.tryToSend (frameOut);
  Serial.print("[ ]=> command 0x");
  Serial.println(decToHex(CAN_Command));
}


void setup()
{
  Serial.begin(115200);
  delay(1000);

  Serial.printf("\nProject   :    %s", PROJECT);
  Serial.printf("\nVersion   :    %s", VERSION);
  Serial.printf("\nAuteur    :    %s", AUTHOR);
  Serial.printf("\nFichier   :    %s", __FILE__);
  Serial.printf("\nCompiled  :    %s", __DATE__);
  Serial.printf(" - %s\n\n", __TIME__);

  //--- Configure ESP32 CAN
  Serial.println("Configure ESP32 CAN");
  ACAN_ESP32_Settings settings(CAN_BITRATE);
  settings.mRxPin = CAN_RX;
  settings.mTxPin = CAN_TX;
  const uint32_t errorCode = ACAN_ESP32::can.begin(settings);
  if (errorCode == 0)
    Serial.println("Can configuration OK !\n");
  else
  {
    Serial.printf("Can configuration error 0x%x\n", errorCode);
    delay(1000);
    return;
  }

  //2.1  Commande : Système Arrêt
  delay(10);
  for (byte i = 0; i < 8; i++)
    canSendDta[i] = 0x00;
  err = sendMsgCan(0x00, 4, canSendDta);
  
  // Bootloader CAN
  delay(10);
  for (byte i = 0; i < 8; i++)
    canSendDta[i] = 0x00;
  canSendDta[4] = 0x11;
  err = sendMsgCan(0x1B, 5, canSendDta);


  //2.10  commande : Système MFX Définir le compteur de nouvelles inscriptions
  delay(10);
  for (byte i = 0; i < 8; i++)
    canSendDta[i] = 0x00;
  canSendDta[4] = 0x09; //Sous-CMD MFX
  canSendDta[5] = Loco::comptLoco & 0xFF00;
  canSendDta[6] = Loco::comptLoco & 0x00FF;
  err = sendMsgCan(0x00, 7, canSendDta);

  // 3.3 commande : MFX Verify (pour provoquer un UnBIND)
  /*
       Si un décodeur MFX lié recoit une combinaison erronee d'UID MFX et de SID MFX,
       un UnBIND est déclenche dans le decodeur de locomotive avec le SID MFX correspondant
  */
  delay(10);
  for (byte i = 0; i < 8; i++)
    canSendDta[i] = 0x00;
  err = sendMsgCan(0x03, 6, canSendDta);

  // 2.2 Commande : Système Go
  delay(10);
  for (byte i = 0; i < 8; i++)
    canSendDta[i] = 0x00;
  canSendDta[4] = 0x01; // Go a tous
  err = sendMsgCan(0x00, 5, canSendDta);

  //3.1  Ordre de mission : Locomotive Discovery
  delay(10);
  for (byte i = 0; i < 8; i++)
    canSendDta[i] = 0x00;
  canSendDta[0] = 0x20; // MFX protocole
  err = sendMsgCan(0x00, 1, canSendDta);

}


void loop()
{
  if (ACAN_ESP32::can.receive (frameIn))
  {
    if (frameIn.id >> 16 == 0x03 && frameIn.len == 5)
    {
      Serial.printf("Frame ID     0x");
      Serial.println(frameIn.id, HEX);
      Serial.printf("Frame length %d\n", frameIn.len);
      for (byte i = 0; i < frameIn.len; i++)
      {
        Serial.printf("  Data [");
        Serial.print(i);
        Serial.print("] = 0x");
        Serial.print(frameIn.data[i], HEX);
      }
      Serial.printf("\n");

      byte i;
      bool stop = false;
      for (i = 0; i < nbLocos; i++)
      {
        if (loco[i].UID[0] == frameIn.data[0]
            && loco[i].UID[1] == frameIn.data[1]
            && loco[i].UID[2] == frameIn.data[2]
            && loco[i].UID[3] == frameIn.data[3])
        {
          byte address0 = loco[i].locID[0];
          byte address1 = loco[i].locID[1];

          // MFX Bind
          delay(10);
          for (byte i = 0; i < 8; i++)
            canSendDta[i] = 0x00;
          canSendDta[0] = loco[i].UID[0];
          canSendDta[1] = loco[i].UID[1];
          canSendDta[2] = loco[i].UID[2];
          canSendDta[3] = loco[i].UID[3];
          canSendDta[4] = loco[i].locID[0];
          canSendDta[5] = loco[i].locID[1];
          err = sendMsgCan(0x02, 6, canSendDta);
          delay(10);
          stop = true;
        }
        if (stop)
          break;
      }

      if (i == nbLocos) // Pas de locos trouve
      {
        for (i = 0; i < nbLocos; i++)
        {
          if (loco[i].index == 255)
          {
            Loco::comptLoco++;
            loco[i].index = i;
            loco[i].UID[0] = frameIn.data[0];
            loco[i].UID[1] = frameIn.data[1];
            loco[i].UID[2] = frameIn.data[2];
            loco[i].UID[3] = frameIn.data[3];
            loco[i].locID[0] = Loco::comptLoco & 0xFF00;
            loco[i].locID[1] = Loco::comptLoco & 0x00FF;
            Serial.printf("Creation dans la liste Loc-ID = %d\n", Loco::comptLoco);

            // MFX Bind
            delay(10);
            for (byte i = 0; i < 8; i++)
              canSendDta[i] = 0x00;
            canSendDta[0] = loco[i].UID[0];
            canSendDta[1] = loco[i].UID[1];
            canSendDta[2] = loco[i].UID[2];
            canSendDta[3] = loco[i].UID[3];
            canSendDta[4] = loco[i].locID[0];
            canSendDta[5] = loco[i].locID[1];
            err = sendMsgCan(0x02, 6, canSendDta);

            // MFX Verify
            delay(10);
            err = sendMsgCan(0x03, 6, canSendDta);
            
            goto end;
          }
        }
end:
        Serial.println("Exit");
      }
    }
  }
}

Bonjour à tous,

J’avance tranquillement sur le sujet dont il est question dans ce fil. J’ai maintenant réussi à piloter des locomotives MFX avec Rocrail sans avoir besoin ni de centrale (MS2, CS2, CS3…), ni de CC-Schnitte qui est tout de même vendue environ 150€ (*).

Comme j’en avais l’intuition, CC-Schnitte n’est qu’une simple passerelle entre la sortie USB d’un ordinateur et le bus CAN de Marklin. Il n’y a aucune autre programmation, même pas le discovery MFX. Elle est donc facilement remplaçable par un Arduino équipé d’un module de communication CAN.

Je pense que cette dernière présentation répond aux interrogations qui étaient posées plus haut dans ce fil.

Je ne publie pas le code car je dois encore y apporter quelques améliorations et je voudrais surtout le porter sur ESP32 ce qui sera plus puissant et ouvert pour de futurs ajouts.

Une fois encore, que ceux d’entre vous qui le souhaitent n’hésitent pas à poster sur ce fil pour plus de précisions ou toutes questions. Cela me ferait aussi plaisir d’échanger avec ceux qui sont à l’initiative du sujet ou qui ont contribué.

(*) Du coup, je vais peut-être avoir du mal à revendre la mienne maintenant sur le forum !

3 « J'aime »

Bonjour. Joli proof of concept ! Quelle puissance peut délivrer le système vs ms et cs ? Peut on reprogrammer la loco comme sur une voie d’essai ? Toutes les fonctions sont elles accessibles ? Merci

Bonjour,

La puissance est celle de la Gleisbox soit 1,9A je crois.

Je ne suis pas entré dans toutes les fonctionnalités de Rocrail. Il faut comprendre que ce que je présente n’est rien d’autre qu’une passerelle entre Rocrail et la Gleisbox. Donc les possibilités et les fonctions accessibles sont ce que permet Rocrail.

Jusqu’ici, il fallait en générale soit une CS2 ou une CS3 pour pouvoir communiquer soit en série (USB) soit en TCP (Ethernet ou WiFi) pour piloter le réseau avec Rocrail. Ici il est possible de le faire avec un simple Gleisbox ce qui était l’ambition posée par l’auteur de ce fil.

Pour la puissance, il est possible d’envisager des boosters de 5 ou 10A. Mais cela pose des problèmes de rapidité et de fiabilité de commutation en cas de court-circuit et l’on ne peut pas se contenter de la qualité de certains composants chinois pour cela ! Mais c’est jouable. Perso sur mon réseau j’ai 15A avec un mélange de protection en soft et hard et une détection logicielle propre pour chaque canton. Je mesure alors les dépassements à partir de 3A.

1 « J'aime »

Bonjour,
Je cherche un lien qui explique comment relier la Gleisbox et l’Arduino. Car sur la Gleisbox c’est un genre de prise DIN ?
Merci.

Pierre

Je crois que CC-Schnitte le vend mais assez cher de ce que j’ai compris.

https://www.can-digital-bahn.com/modul.php?system=sys5&modul=54#Mod_Top

C’est un câble DIN assez classique. Tu dois trouver en cherchant sur internet.

Maintenant, tu as peut-être vu comment j’ai fait, j’ai tout simplement enfiché des Dupont.

N’hésite pas si tu as besoin de plus d’infos.

Christophe

Bonjour BobyAndCo,

Je viens de m’équiper afin de faire la configuration décrite ci-dessus : soit une Geiltsbox + une MS 2 + un boitier CC-Schnitte + un MacBook Air M1 (OS Sonoma) + RocRail.
Après de très nombreux essais force est de constater que je suis dans une impasse. En effet je n’arrive pas à mettre le port USB C (ou Thunderbolt 3) en port série et donc rien ne fonctionne et bloque au niveau de la configuration de la centrale. J’ai essayé de charger un driver D2XX, mais je ne pense pas avoir réussi l’installation complète. J’ai bien cherché de l’aide sur internet, mais le plus souvent c’est en langue allemande et malgré l’aide du traducteur, je reste dans le flou. Existe t il une solution à ma portée?
Merci de m’avoir lu.

Olivier

Il y a peut-être un problème avec le M2. Je vois sur les images que j’ai postées que j’utilise mon ancien portable (Intel) ce n’est peut-être pas par hasard. Bon souvent c’est aussi parce que je me méfie des “retours de flamme” par le port USB.

Je ne suis pas chez moi pendant deux jours, je ne peux pas faire de tests.

Comme le problème se situe entre RocRail et le port série, il y a surement du monde sur le forum qui utilise Rocrail avec un M2 par le port série. Ou alors pose la question sur le forum de Rocrail. Et n’hésite pas à utiliser Google traduction, ça marche bien.

Sinon, je regarderai dimanche et te redirai ce qu’il en est !

Christophe