Comprendre et utiliser le protocole CAN de Marklin

Bonjours à tous,

Je pense qu’il est opportun de créer ce nouveau sujet pour “délester” un autre sujet qui aborde largement cette thématique mais dont ce n’est pas la vocation première.

L’ambition de ce nouveau fil est de montrer comment il est possible de prendre sans trop de difficulté le “pouvoir” sur votre MS2, CSx et autres matériels en apprenant à communiquer avec au travers du protocole CAN de Marklin.

Vous découvrirez que vous pouvez étendre et extérioriser certaines commandes. Vous serez également certainement ravis de découvrir que vous pouvez demander à votre MS2 par exemple, de réaliser des actions qui ne sont simplement pas disponibles par construction comme la rétrosignalisation par exemple.

Je vous invite à venir nombreux car c’est assez passionnant pour ceux qui sont curieux et légèrement inventifs.

Christophe

6 « J'aime »

Je pense qu’il serait bien qu’un administrateur “deleste” le fil Table de commande pour 6 locomotives (ou plus) - #73 par bobyAndCo

de ses messages à partir de Table de commande pour 6 locomotives (ou plus) - #52 par DUPERCHE

Ca permettrait de soulager le fil concerné et ça servirait d’introduction avec ce nouveau sujet.

Christophe

Bonjour à tous,

Le protocole CAN est un système de communication mis au point par la société Bosch dans les années 1980 qui avait pour objectifs de simplifier et de sécuriser les échanges d’informations dans les voitures.

Depuis, les champs d’application se sont beaucoup étendus à l’aviation, à l’industrie et… aux petits trains !

Pour avoir une présentation un peu complète : CAN bus - Wikipedia

Je suis désolé que ce soit une version anglaise mais la version française de Wikipedia est beaucoup trop pauvre.

Je ne cherche pas à vous abreuver de notions techniques. Au contraire, ce que j’aimerais c’est que vous puissiez découvrir de façon très pratique et je l’espère assez simple, comment il est possible de « prendre la main » sur son matériel et en particulier sur sa centrale.

J’ai présenté différents montages au travers du forum dont je n’ai peut-être pas suffisamment démontré l’intérêt ou qui sont noyés parmi d’autres informations.

Je pense par exemple à la passerelle qui permet de commander sa MS2 avec Rocrail et d’étendre considérablement les possibilités de celle-ci. Je n’ai au départ que poursuivi le travail commencé mais suspendu ici Homemade Marklin - création d'un circuit intelligent - #25 par bobyAndCo

J’en ai fait un article exhaustif sur locoduino : LOCODUINO - Commander sa centrale Marklin® MS2 en WiFi à partir de Rocrail®, JMRI®, iTrain® ou autres gestionnaires.

Je reviendrai sans doute sur d’autres montages que j’ai pu réaliser en fonction de l’évolution de ce fil.

Dernièrement, j’ai été assez surpris de l’engouement au sujet de la petite commande que j’ai présentée et qui utilise aussi la communication CAN : Table de commande pour 6 locomotives (ou plus)

J’ai pu me rendre compte qu’il y avait un réel intérêt, mas sans doute concernant des choses assez pratiques et certainement faciles à réaliser.

Je félicite Alain @DUPERCHE qui s’est vraiment démené pour comprendre et faire fonctionner ses systèmes et ça m’a aussi motivé pour m’investir dans ce fil.

N’hésitez pas vous aussi à vous l’approprier et j’essayerai de répondre au mieux, ne doutant pas que Alain cherchera aussi à m’aider car c’est pas mal d’investissement et ça de moins à jouer au train.

Christophe

6 « J'aime »

Bonjour Christophe,
Merci de tes félicitations, cela me va droit au coeur.

Bien sûr, que je vais continuer à faire part de mes expériences sur le sujet du CAN. A commencer par voir si mes Shield sont récupérables ou pas.
Le fil réalisé constitue déjà en soi une documentation sur la découvertre du CAN.
A suivre …
Alain

Vous voulez bien ne pas être trop techniques au départ ?
Comme employer “Shield” etc … s’il vous plaît.
Bref faire “pratique” et accessible au débutant.
Sinon, pour ma part, je vais être largué très vite.
Merci.

1 « J'aime »

Bonjour Pierre,

Bien reçu !

Mais ne pas hésiter bien sûr à interroger au cas où.

En l’occurence, un shield est une carte “fille” qui vient précisement se superposer à une autre, en générale la carte du microcontrolleur, limitant ainsi les fils “volants” et limitant l’encombrement de l’ensemble.

60081264_2

Christophe

Bonjour Christophe

Je suis également très intéressé par ce fils et prêt à m investir dans des experiences afin d approfondir mes connaissances bien maigre en la matière.

Olivier

1 « J'aime »

Doit-on préalablement recueillir son consentement ? :slightly_smiling_face:

2 « J'aime »

Christophe, il faudrait nous faire un truc comme: “CAN de Marklin pour les Nuls” :wink:
En tout cas, belle initiative de ta part car ça demande des heures de boulot. :clap: :+1:

Phil,

2 « J'aime »

Bonjour Phil,

Oui c’est ça l’idée. Et puis ça dépend aussi beaucoup des attentes et des demandes de chacun. Je souhaite d’abord expliquer simplement mais précisément ce qu’il faut faire pour que chacun pusse être rapidement autonome sur des montages simples au départ. Et je ne doute pas qu’ensuite, il peut y avoir des échanges d’expérience.

Christophe

4 « J'aime »

En attente impatiemment…
Excellente idée.
Jp

Tres bonne initiative Christophe, tu peux me compter parmis ceux qui veulent explorer la chose :+1:

Est-il inexact de dire que l’on souhaite justement exploiter le point faible du CAN, à savoir la possibilité d’interférer sur le bus sans avoir à déjouer une sécurité « native » ?

L’article de Wikipedia mentionne :
CAN is a low-level protocol and does not support any security features intrinsically. There is also no encryption in standard CAN implementations, which leaves these networks open to man-in-the-middle frame interception. In most implementations, applications are expected to deploy their own security mechanisms; e.g., to authenticate incoming commands or the presence of certain devices on the network.

J’avoue avoir été très surpris quand j’ai lu tes premier articles sur le CAN, et les passerelles MS2<<->>Rocrail etc. car je pensais que Marklin avait forcément du verrouiller/encrypter le système. Tu as prouvé qu’il n’en était rien du tout !

En passant, j’ai trouvé cet article intéressant, il détaille entre autres sujets - et avec une vulgarisation bienvenue - le role du module MCP2515 dans les montages Arduino:
https://www.moussasoft.com/module-bus-can-mcp2515-avec-arduino/

J’essaye de bien piger la différence entre le MCP2515 et le MCP2542 (CAN bus transceiver) car ces 2 modules sont incontournables dans tous les montages CAN que tu as proposé a ce jour. Certaines descriptions simplistes disent que le MPC2542 est une version upgradée du 2515 avec des volumes de données échangées plus importants et une gestion plus avancée du protocole CAN. Je ne suis pas sur que cela soit exact. Ton montage décodeur PICO inclue bien les 2 composants, donc l’un ne remplace pas l’autre. Si tu as un article a conseiller pour bien comprendre le role de chacun et donc leurs différences, je suis preneur.

Désolé pour cette parenthese “hardware” mais elle me parait importante la compréhension globale de tes montages. :grin:

1 « J'aime »

Comme on dit en mécanique: “Si le moteur ne démarre pas, il faut repartir des fondamentaux”
Encore faut il les connaitre (Allumage, arrivée d’essence, prise d’air, …).
Je pense que c’est ce que veux faire Christophe.

Bonjour Jérôme,

Binvenue au club

Bon tu parts fort. Concernant la sécurité et un éventuel cryptage. Pour la sécurité, le CAN étant un réseau filaire, il est évidement moins vulnérable qu’un WIFI.

Maintenant, si Marklin avait voulu protéger ses systèmes et interdire de les hacker, il suffisait de ne pas publier le protocole.

Pour la suite, je préfère ne pas te répondre ici pour ne pas rendre les choses trop compiquées dès le départ, mais promis, je le ferai soit off line soit plus tard.

Christophe

Bonjour à tous,

Je voudrais commencer par expliquer de quoi se compose un message CAN et ce que l’on peut faire avec.

Voici l’ensemble du protocole Marklin

cs2can-protokoll-2_0 fr.pdf (982,0 Ko)

Je n’aborde pas du tout pour l’instant l’aspect matériel et réglages du matériel. C’est une procédure qui, quand on l’a faite une fois, relève du copié-collé.

Un message CAN peut être compris comme un ordre, une commande. C’est une succession de bits envoyés à n’importe quel équipement mais pour Marklin, il s’agit essentiellement des centrales, MS2 ou CSx.

Un message CAN est toujours composé d’un identifiant qui est envoyé en premier (bits de poids fort du message à gauche). Dans le protocole de Marklin, l’identifiant est toujours de 29 bits. Voici par exemple comment est constitué une trame CAN pour envoyer une commande de traction à une locomotive. C’est le § 3.4 page 43 de la documentation jointe.

Sur la partie gauche, nous avons la priorité du message sur 4 bits. J’ai toujours vu jusqu’ici que les priorités pour Marklin sont toujours à 0 (priorité la plus élevée).

A suivre, le type de commande à exécuter. On trouve dans la documentation de Marklin que la commande de traction est 4 (0x04 en Hexadécimal). Cette commande occupant 8 bits, en mode binaire, cela s’écrit 00001000

Le bit suivant vers la droite distingue si le message est une commande (bit à 0), ce qui sera toujours le cas surtout au début ou la réponse (confirmation de réception d’une commande) auquel cas le bit sera positionné à 1

Donc l’identifiant (ID) de notre message de commande de traction commence à avoir cette tête : 0000 00001000 0

Pour l’identifiant, il ne nous reste plus qu’à renseigner ce que Marklin appelle le Hash, c’est-à-dire l’identifiant unique de l’appareil qui envoie le message. Marklin a prévu une plage d’identifiants pour le DIY qui ne viendra pas en « collision » avec des appareils de la marque. Cette plage va de 0x1800 à 0x1BFF. Pour simplifier les choses nous allons prendre le premier disponible soit en binaire

Notre identifiant de 29 bits est donc celui-ci : 0000 00001000 0 1100000000000.

Ca peut paraitre un peu compliqué au début mais on s’y fait assez vite. D’autant que l’on va plutôt utiliser une présentation décimale : 137216
Ou mieux si on est un peu à l’aise, Hexadécimale 0x21800

Voila pour l’ID du message qui contient la commande que l’on souhaite voir se réaliser.

Les 4 bits suivant du message sont le nombre de datas sous forme d’octets (8 bits) seront envoyés dans la suite du message. Comme l’on souhaite envoyer l’adresse de la locomotive + la vitesse de la locomotive, cela correspond à la ligne basse du tableau soit 6 octets (6 X 8 bits).

Les 4 premiers octets contiennent l’adresse locale (Loc-ID) c’est-à-dire l’adresse attribuée après reconnaissance MFX. Bien souvent, le compteur commence à 1 et s’incrémente de 1 en 1. Si donc vous avez 6 locomotives, il y a de grandes chances que les adresses soient 1, 2, 3 etc… Cette valeur, prenons 3 par exemple, sera placée dans l’octets D3, c’est-à-dire le 4° octet de data en partant de la gauche. Dans l’octets D2, le 3° octet de data en partant de la gauche, on entre le code du protocole utilisé. Pour le MFX, c’est 0x40, pour le DCC 0xC0 et pour le SX 0x08.

Enfin, on renseigne dans D4 et D5 la vitesse souhaitée. Dans le protocole Marklin, la vitesse s’écrit sur 10 bits, les valeurs vont de 0 à 1000 soit de 0 à 100%. Pour l’exemple ici, nous allons pour simplifier nous limiter à une vitesse de 25% de telle manière que la valeur à envoyer 250 tienne dans un octet. Nous verrons plus tard comment entrer des valeurs supérieures.

Pour les datas, nous allons donc avoir ceci ;

Data[0] = 0 ;
Data[1] = 0 ;
Data[2] = 0x40 ; // protocole MFX
Data[3] = 0x03 ; // loc-ID de la locomotive
Data[4] = 0 ;       // Octets de poids fort pour la vitesse non utilisé
Data[5] = 250 ;   // Octets de poids faible pour  la vitesse

Vous constatez que je peux saisir indistinctement des valeurs décimales ou Hexadécimales voire binaire.

Ceci est le principe qu’il est bien de connaitre, mais rassurez-vous, « dans la vraie vie », on ne saisit pas cela à la main. La vitesse par exemple est renseignée par le programme en fonction de la valeur lue à la sortie du potentiomètre.

Pour ne pas faire trop long, je vais terminer ici en vous montrant maintenant comment ces valeurs sont écrite dans le programme de l’Arduino.

    frame.id = 0x21800;
    frame.ext = true; // C’est un identifiant long sur 29 bits
    frame.len = 5;    // Nombre de champs de datas
    frame.data[0] = 0x00; // Rien
    frame.data[1] = 0x00; // Rien
    frame.data[2] = 0x40; // Protocole MFX
    frame.data[3] = 0x03; // Adresse loc-id de la loco
    frame.data[4] = 250; // Vitesse 250 sur 1000 crans = 25%

Il ne reste plus qu’à envoyer le message sur le bus CAN.

can.tryToSend(frame);

Voilà pour ce premier jet, j’espère que ce n’est pas trop compliqué, mais ceci sert essentiellement à comprendre, A l’usage, c’est moins rébarbatif.

N’hésitez pas à me faire des retours sincères et je verrais ce que je peux faire.

Sinon, j’embraye sur la suite !

Christophe

4 « J'aime »

Bonjour Pierre,
Excuse le vocabulaire spécifique; j’en prends bonne note pour la suite.
Alain

Merci Christophe.
Je relirais ton post demain après une bonne nuit. Surement simple, mais en fin de soirée, Pfuuuu, j’y comprends rien, MAIS je n’ai pas étudier ce que tu nous présente.

Bonne nuit et ad’main… :sleeping:

Je souhaite vraiment être abordable mais je ne veux pas passer sous silence des choses utiles à la compréhension du système. Je suis certain qu’une fois le principe de la trame compris les choses iront beaucoup mieux car quelques soient les commandes, on retrouve exactement les mêmes mécanismes.

Quand on a compris comment était composé l’identifiant de 29 bits

0000 00001000 0 1100000000000. = 0x21800

Priorité, les 4 bits à gauche, commande les 8 bits à suivre vers la droite, réponse, 1 bit ici à 0 (ce n’est pas une réponse) puis les 16 bits de droite, l’ID de l’appareil expéditeur, on a déjà bien avancé.

Et qu’enfin, pour chaque message envoyé, on doit remplir ces champs, id, ext, len et data de 0 à nombre d’octets de data pour la réponse.

N’hésite pas à revenir vers moi au besoin.

2 « J'aime »

je regarde ça demain, à tête reposée… :sleeping:

Ouf ! Le camion qu’on se prend de face !
Un bit = 8 bytes ou octets c’est bien cela ?
La connaissance de l’hexadécimal est-elle indispensable pour ne pas se noyer ?
Si je vois bien, on n’est pas loin, en similitude d’un dessin d’enregistrement informatique . Exact ?
En tous cas, merci pour ce qui précède.