Homemade Marklin - création d'un circuit intelligent

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

Merci Christophe.
Le processeur est un M1, mais c’est à peu prés pareil. Je vais poser la question sur tout le forum.

Encore merci et à bientôt.

Olivier

Bonsoir Christophe.

Comme tu as peut être pu le voir, je ne suis pas parvenu à faire fonctionner mon système avec le Mac. Du coup j’ai essayé avec un PC mais ce n’est pas mieux.
Sur le forum RocRail la personne avec qui j’ai communiqué pense à un dysfonctionnement du CC-Schnitte.
Donc si tu es toujours d’accord, ton aide peut m’être précieuse.
Merci.
Olivier

Bonjour bobyAndCo,
Je reviens sur le sujet après avoir pas mal ramé sur le sujet.
J’utilise donc a présent un pilotage via Arduino+CAN+Gleisbox.
Je n’ai par contre pas trouver d’autre moyen pour piloter cela depuis un Ordi que d’utiliser la solution “DesktopStation” ==> Desktop Station - DOWNLOAD
Le fonctionnement serait parfait si je n’avais pas de temps à autre une espèce de figeage comme si l’arduino ou le CAN attendait une réponse de la Gleisbox …

Quel logiciel utilises tu avec la solution arduino/can ?

Je n’ai pas réussi a coupler avec Rocrail.

J’ai vu que tu parlais d’une solution avec CC-Schnitte, que je ne connaissais pas. Est ce fiable ?
Je suis prêt à mettre les 150 euros si cela me procure la fiabilité attendue.

Dans l’attente de ta réponse.

Cordialement.

Bonsoir à tous,

Désolé de ne pas été plus réactif sur ce sujet qui m’intéresse pourtant.

Concernant le Mac, CC-Schnitte et RocRail, j’ai fait le test de connexion par USB sur mon M2 (Ventura) et ça fonctionne parfaitement comme on peut le voir sur la copie d’écran jointe.

Il semble que vous soyez au moins deux à vous intéresser à ce sujet en ce moment. Êtes-vous tous les deux en Mac ?

Reprenez pas à pas la démarche que je donnais ici : Homemade Marklin - création d'un circuit intelligent - #25 par bobyAndCo

Elle fonctionne sans drivers à installer (sur Mac). On voit bien sur l’image que le driver /dev/tty.usbserial-A702RCPJ est présent.

N’hésitez pas à me solliciter, j’essayerai de me rendre disponible.

Bonne chance

Christophe

Bonjour Christophe.

Merci pour ta réponse et cela confirme encore mes craintes. Voilà ce que je viens d’écrire à Olivier sur un autre post de ce forum;

Bonjour et merci Olivier pour ces très claires explications.

Malheureusement elles semblent confirmer mes craintes. Mon problème se situe au niveau de la boite de dialogue “Equipement”. Je n’ai pas comme toi le port COM3 (ou 1, ou 2…) qui apparait. Sous Win7 je n’ai rien et sous Mac OS j’ai deux ports mais pas le port série qu’il faut.
On peut en conclure que ;
1/ soit le boitier CC-Schnitte est défectueux et ne communique pas vers l’ordinateur.
2/ soit je n’ai pas les pilotes qu’il faut sur mes ordinateurs (mais là j’ai de gros doutes)

L’idéal serait de pouvoir tester la CC-Schnitte pour en avoir le coeur net.

Merci encore et bonne journée.
Olivier

Le mauvais fonctionnement du boitier est peu probable, il ne s’agit que d’une interface série/can. Il n’est soumis à aucune tension qui pourrait le détériorer ou à court-circuit.

Comme je l’ai déjà dit, sous Mac, il n’y a aucune installation de driver à faire pour CC-Schnitte, ce n’est pas non plus dans cette direction qu’il faut chercher.

Puisque tu es sur un M1, tu utilises peut être un adaptateur pour passer du port USB C à USB A, l’une des extrémité du cordon qui entre ensuite dans CC-Schnitte en USB B. Peut-être le problème est ici. J’essayerais un cordon “direct” USB C → USB B !!!

Il existe un utilitaire CoolTrm qui gère les liaisons série (très efficace et très complet). Essaye de voir la liaison série du Mac vers CC-Schnitte au travers de cet utilitaire.

J’ai essayé avec trois cables différents, dont un direct USB C vers B de bonne facture. Le résultat est toujours le même.

Je ne vois que ces ports.

Oui effectivement ! Tu l’as acheté neuf ce boitier ? Il faudrait communiquer avec le fabricant qui identifiera certainement le problème et procédera au remplacement si défectueux.

C’est dommage car CC-Schnitte est une solution intéressante, en particulier avec RocRail et facile à mettre en œuvre “habituellement” !