Comprendre et utiliser le protocole CAN de Marklin

Bonjour à tous,

Eh bien je suis heureux que vous soyez si nombreux à vous intéresser au sujet. C’est très motivant pour moi.

C’est vrai que c’est assez agréable de comprendre comment tout cela fonctionne mais aussi de réaliser soi-même toutes les commandes imaginables, ou tout au moins celle qui existent déjà. En particulier pour ceux qui disposent d’une MS2, de voir que l’on peut réaliser autant qu’une CSx. Juster la puissance qui est limitée à 1,9 A !!!

Comme certain arrivent un peu plus tard que les autres et que le principe du forum pour retrouver des informations, par exemple du code, n’est pas l’idéal, je vais regrouper tous les programmes au fur et à mesure de l’apprentissage sur mon GitHub. Ce sera beaucoup plus facile pour y accéder et avoir les versions à jour.

Je vais également rédiger un mode d’emploi à l’instar de ce que Alain à fait, mais peut être sera t’il d’accord pour que nous le réalisions à deux pour se répartir le travail.

Le faire sous forme de pdf peut être une bonne solution, mais j’ai une préférence sous forme d’article sur le site de Locoduino. Un article par grand chapitre.

Dans tous les cas, toutes les communications qui sont faites sont très précieuses car elles permettent de mieux cerner les difficultés et d’apporter des réponses plus détaillées.

Je suis en déplacement pendant une dizaine de jour, ça va me laisser du temps pour la rédaction.

Des nouvelles très vite.

Christophe

1 « J'aime »

Bonjour Christophe,

Je viens tout à l’heure de créer:

Car je me faisais la même réflexion.

A bientôt
Alain

Bonsoir,
en l’absence de CS2, serait’il possible de me tester ce petit programme afin de savoir si ça marche ou pas.
Affichage de la loco et de la vitesse sur ecran LCD I2C et sur moniteur série.
Merci.
BusCAN_V3.pdf (1,3 Ko)

Impossible de lire ce fichier.

Peux-tu copier-coller le code ? Tu peux le mettre entre les balises </> pour qu’il soit plus lisible.

Christophe

Bonjour JiPé,

J’ai compris suite à un autre de tes post qu’il fallait changer l’extension du fichier de pdf à ino.

Je ne suis pas chez moi et don pas moyen de tester le code mais déjà, quelques remarques

1° - Il faut que tu filtres les messages CAN sur les seuls qui concerne les commandes de vitesse sinon, tu va être inondé de messages.

Pour cela, tu peux modifier ta condition

 if (frame.ext && frame.len >= 5)

Tu peux enlever frame.ext car cette condition est toujours à vrai dans le protocole Marklin. Tu peux effectivement garder frame.len >= 5 pour ne garder que les message qui contiennent la vitesse.

Pour ne garder que les messages concernant la vitesse

uint32_t commande = (frame.id & 0x1FE0000) >> 17;

Puis, if (commande == 4 && frame.len == 6)

Attention également pour l’adresse de la loco, elle est contenue dans les 4 premiers octes de data. Plus précisément, je n’ai pas vu que data[0] et data[1] ne soient jamais différents de 0, donc peuvent être ignorés.

Le protocole est contenu dans data[2] dont la valeur sera en MFX 0x40 et l’adresse elle dans data[3]. Ceci est exact quand on a moins de 256 locomotives ce qui est généralement le cas.

Donc si tu n’utilises que du MFX, uint16_t AdresseLoco = frame.data[3]; // lecture adresse loco

Ou sur 8 bits uint8_t AdresseLoco = frame.data[3];

Par contre, la vitesse est sur 16 bits comme on peut le voir dans le tableau ci-dessus. Donc
uint16_t Vitesse = frame.data[4] << 8 | frame.data[5]; // lecture vitesse loco

Mieux encore, la biobliothèque ACAN autorise ceci
uint16_t Vitesse = frame.data16[4]; // lecture vitesse loco

Précision concernant les valeurs pour la vitesse dans le protocole Marklin. Les vitesses sont codées sur 10 bits de 0 à 1023 mais les vitesses supérieures à 1000 sont ignorées et toujours égales à 1000.

Cela veut donc dire que pour connaitre la vitesse réelle en pourcentage de la vitesse max, il faut diviser la valeur lue par 10.

Ainsi uint16_t Vitesse = frame.data16[4] / 10; // lecture vitesse loco en % de la vitesse maxi

Je sais, c’est un peu compliqué mais c’est le protocole de Marklin.

Enfin, une dernière précision importante concernant la vitesse, pour le MFX comme pour le DCC, la vitesse = 1 est l’arrêt d’urgence. La loco va stopper net. vitesse = 0, la loco va ralentir puis s’arrêter.

Christophe

1 « J'aime »

Bonjour à tous,

Pour ceux qui souhaitent mieux connaitre le CAN, j’ai trouvé cet article qui est à la fois très complet mais aussi très compréhensible même pour un néophyte.

Enjoy

Christophe

4 « J'aime »

Merci Christophe pour l’information.
Bonne journée.
Alain