Communication CAN Arduino / MS2 Kdfi and Co.

Modérateur : Team Modo

Répondre
tr450
Messages : 3
Enregistré le : mar. 12 janv. 2016 21:56
A été remercié : 4 fois

Communication CAN Arduino / MS2 Kdfi and Co.

Message par tr450 » dim. 7 avr. 2019 16:12

Salut à tout le monde !!
Bon par où commencer :langue3: J’ai décidé de créer ce post afin de partager sur tout ce qui attrait à la communication CAN sur les gestions prog. type Megasquirt (j’inclus K-Data and co.) tournant avec un firmware MS2extra. Voulant de mon côté palier au manque d’entrés sur ma Kdfi 1.4 j’ai décidé de me faire un petit projet CAN pour pouvoir avoir la température et la pression d’huile sur mon dash. Et comme j’ai pas mal galéré car très peu d’infos pour faire tourner ça sur une MS2 ou similaire, je me suis dit que ça serait sympa de partager tout ça, pour aider ceux qui auraient les mêmes idées que moi ::d .
Du coup je voulais vous montrer comment proprement rédiger l’identificateur et envoyer une trame avec une arduino, mais je pense que je vais vous le faire en plusieurs fois car rien que pour l’identificateur j’en suis déjà à 7 pages au moment où je vous rédige cette intro :gene: .
PS : Je ne suis pas le meilleur du monde en orthographe mais j’essai de faire attention. Ne soyez pas trop méchant si il en reste encore qui traines ^^. Et comme je n’ai pas la science infuse si par malheur j’ai balancé une connerie hésitez pas à en faire part on est là pour partager :gene: .



Bon après cette belle petites intro on saute direct dans le vif du sujet.


Pour commencer le message CAN, car je pense que c’est le point le plus difficile à cerner pour réussir à communiquer avec une megasquirt (ça a été lui le plus bloquant pour moi en tout cas X| ). Je ne vais pas vous faire un grand descriptif du message CAN en général, de bonne définitions existe déjà sur google. Ce qu’il faut juste retenir c’est que le message CAN est en gros divisée en 2 parties la partie identification et le package de donnés. Ici on va s’intéresser à l’identification. C’est elle que la gestion va lire pour savoir de qui vient le message, qui en est le destinataire et où il doit aller. Les systèmes avec un firmware Megasquirt vont tous utiliser « l’identification étendu » en 29Bit. C'est-à-dire un enchainement de 29 0 et 1 stockés dans plusieurs Bytes (je vais dire octet pour la suite pour éviter de mélanger avec les « Bits » :cote: ). C’est le format le plus répandu dans le secteur automobile à l’heure actuelle. Donc notre identificateur 29Bits c’est bien beau mais on met quoi dedans et comment . C’est très simple, pour chaque système utilisant de la communication CAN si les gens derrière sont professionnels ils vont fournir une spec. décrivant comment construire sont identificateur. C’est le cas pour les gestions MS et je vais le détaillé car je ne l’ai pas trouvé très clair au première abord, surtout quand on découvre la communication par CAN.
Donc le beau document s’appel « Megasquirt 29Bit Can protocol » (facilement trouvable en tapant le titre sur google) Pour ceux qui ne parle pas du tout anglais pas de problème, on va repasser en détail ce qui nous intéresse dans ce post.

Donc la forme de notre identificateur va se trouver dans la section 3.1 du document.

Image

Bon j’ai fais exprès de mettre les deux formats de message qu’ils présentent histoire de vous détailler mes boulettes, que personne ne les reproduise :gene: . Donc bien retenir le premier format CE N’EST PAS LE BON ! :nonon: Ne sachant pas je me suis servi d’un petit projet arduino sur Github permettant d’analyser une trame CAN au format du protocole MS et bien sûr il ma orienté dans un mic-mac de ces deux formats me faisant galérer pendant un bon moment =b. Donc nous ce qu’on doit utiliser c’est ce qu’ils appellent le « standard 29Bit identifier ».
Deuxième point à faire attention c’est le sens d’écriture. Comme on peut le voir les bits sont numérotés de droite à gauche et les octets de bas en haut. Du coup gros mélange mental pour le pauvre néophyte que j’étais. Quand on rédige le message on doit le faire de bas en haut, de Haut en bas ? On écrit tout l’octet de haut en bas et on inverse le tout à la fin (un miroir du message en gros) ou on inverse par bloc (chaque morceau se lit bien de gauche à droite mais le message final commence par les blocs d’en bas). Enfin bref plein de question sans explications. ^^
Du coup je me suis pris la tête pour vous et voilà la fameuse réponse.

00001101000010000100000111000

Donc déjà on lit de haut en bas et de gauche à droite, même si les bits sont numérotés dans l’autre sens.
Ensuite pourquoi je me suis pris la tête avec cette histoire « inverser par bloques » ou de faire un « miroir » (comme si j’écrivais un mot à l’envers mots => stom). C’est la partie Table qui m’a mis ça en tête. Comme on peut le voir ils ont remis le bit 4 de la Table de l’autre côté des bits 0 à 3. Donc forcément en fonction de si je considérais mon message 5bits écrit en numérotant les Bits 01234 ou 43210, le Bit que j’allais mettre en position 4 allait changer, ce qui me flinguerait le message. Donc la réponse en exemple. (En relisant ça et en se posant moins de questions je me rends compte que la photo donne déjà le sens :gene: , mais pour ceux qui réfléchissent trop comme moi je donne un exemple)
Je veux la table 7
En binaire ça donne 00111 (en réalité c’est juste 111 mais comme on a 5Bits d’espace pour écrire la table il faut compléter avec des 0).

Et on numérote dans l’ordre suivant :

7 en binaire 00111
n° des Bits 43210
Donc pour pousser l’exemple de la Table jusqu’au bout, dans notre trame CAN notre 7 en binaire sera écrit comme ça 01110 avec le Bit numéro 4 rebalancé tout à droite.
C’est bon j’ai perdu personne ? Bon on s’accroche c’est bientôt fini.
Maintenant qu’on sait dans quel sens on doit écrire notre message passons à ce qu’on doit réellement mettre dedans. (Je commence par les plus simple et fini avec les plus compliqués)

-Spare

Ces deux Bits là restent vide. On va donc toujours mettre « 00 ».

-From ID et To ID

Ces deux groupes de 4 Bits vont dire de qui le message vient et à qui il va aller. L’ID attribué a une certaine importance car il permet de prioriser les messages si plusieurs appareils communiquent en même temps. L’appareil Master sera notre gestion prog. Et donc sera toujours ID 0. Comme on ne fait pas de système trop compliqué et qu’on va avoir une seule extension (pour l’instant ^^) notre carte (arduino) prendra en général l’ID 1. Le protocol CAN détail plusieurs ID pour certaines cartes dont « 2 » pour une « GPIO board », dans la façon dont on enverra des messages ca nous importera peu que notre extension est un ID 2 ou autre. J’en détaillerai la raison un peu plus tard quand je parlerai de l’interface CAN dans tunerstudio. S’il faut retenir une seule chose ici c’est que l’ID 0 doit TOUJOURS être attribué à la gestion prog. Comme ici on cherche à envoyer un message vers la gestion le To ID sera 0000 (0) et le From ID sera 0001 (1).

-message type

Ces 3 Bits là vont décrire le type de message qu’on envoi. Le protocol CAN les décrit bien et ils sont les suivants.

Image
Comme on est des débutants et qu’on veut simplement envoyer des data en continu à la MS pour un mano par exemple, le message type utilisé sera le 0 ou le 2. Le 0 comme il est dit vient déposer des data dans la MS sans qu’elle ne demande rien. Le 2 lui indique que c’est un message en réponse à une demande de data émise par la MS. Dans notre cas l’un ou l’autre convient, même si la MS n’envoi pas de demande de data, envoyer une trame avec un msg type 2 sera traité comme une trame avec un msg type 0.
0=>000
2=>010
(Dans mon cas j’ai utilisé le 2 car j’en avais marre de mettre des 0 partout :langue2: )

-Table

La table, elle, est principalement compliquée dans la façon de la rédiger au sein de l’identificateur (Cf. mes explications sur l’écriture de l’identificateur).
La liste des tables utilisable est également disponible dans le protocol CAN. Ce coup si je ne fais pas de capture d’écran car elle va prendre beaucoup de place. Ce qu’il faut retenir c’est que pour envoyer et stocker des data dans la MS on va toujours utiliser la table 7.
7=>00111 (avec la petite subtilité du Bit n°4 qui revient tout à droite on obtient 01110)

-Offset

Ah l’offset le truc qui n’est pas dans le protocol CAN et qu’on te dit pas où ça se trouve :nono:
Du coup l’offset c’est quoi ? Si on considère les Tables comme des tiroirs, les Offset eux seront toutes les petites boites qu’on retrouvera à l’intérieur d’un tiroir. La faut pas se gourer ! Si on met la data de la température d’huile dans la boite qui sert à modifier l’avance à l’allumage KABOOOMM !!!
Après la mise en garde, le bon offset où le trouver ? Dans le fichier de config. de calculateur tout simplement.
Comme on a une gestion sur base Megasquirt on va retrouver ce fichier dans Document/TunerstudioProjects/nom du projet/ ProjectCfg/mainController

Image

On va ouvrir ce fichier avec bloc-Notes ou wordPad.
Une fois ouvert on va faire un Ctrl+F et rechercher « OutputChannels ».
Si les fichiers de config ne bougent pas, ce qui nous intéresse se trouve juste en dessous du 11ième « output channel ».

Image

Ce qu’on voit c’est qu’il y a une liste avec tout plein de nom de donné, leur type de valeur, leur format/taille, et surtout leur offset (entouré en rouge). C’est cette valeur qu’il faut récupérer.

Image

Voici les 8 offset qui vont nous intéresser le plus dans le cas d’un transfert de data simple.
Exemple, si je veux envoyer quelque chose sur le gpioadc0 je vais utiliser l’offset 104.
104 => (0000)1101000 pour les 0 entre parenthèse c’est comme j’ai dis plus haut. Pour l’offset on a 11Bits d’espace pour l’écrire donc on doit combler l’espace non utilisé avec des 0 pour rédiger notre identificateur final.
Point intéressant à noter. Le package de data pourra faire plusieurs octets. Chaque octet correspondra à un offset+1. Dans l’exemple du gpio0 le premier octet de data correspondra au 104 le deuxième au 105 et ainsi de suite. Ca nous permet d’envoyer plusieurs donnés différentes dans un même message. A noter aussi, je dis offset 105 mais quand on regarde il n’y a pas de 105. On passe directement au 106. C’est normal ! Si vous regardez le gpio0 ça dit « U16 » ce qui nous indique que cette data s’écrit sous 16Bits ou 2 octets et la data à l’offset 104 englobe donc avec elle l’octet à l’offset 105. Je pense que ça fait un peu chinois là mais on verra ça en détail plus tard quand on programmera notre arduino.

Bon pour résumer avec tous les exemples précédents, on obtient tout les morceaux suivants

offsetmsg TypeFrom IDTo IDtable 3-0table 4spare
00001101000010000100000111000
Ce qui nous fais au final notre identificateur 29Bits qui va nous permettre d’envoyer une data de l’ID 1 à l’ID 0 dans la table 7 et l’offset 104 correspondant à la zone de stockage de data pour le GPIO 0. Arrivé là le plus dur est fais. J’espère que mon petit cours vous aura plus ::d . Je détaillerai une prochaine fois comment utiliser cette identificateur avec une arduino et un module de communication CAN pour envoyer de la data à la MS (un peu de pratique c’est important :langue2: ).
Modifié en dernier par tr450 le lun. 8 avr. 2019 18:03, modifié 2 fois.

Avatar du membre
dydy77
Webmaster
Messages : 1862
Enregistré le : sam. 19 mai 2012 20:58
Localisation : 77 IDF
A remercié : 29 fois
A été remercié : 9 fois
Contact :

Re: Communication CAN Arduino / MS2 Kdfi and Co.

Message par dydy77 » dim. 7 avr. 2019 23:27

Alors j'ai pas pris le temps de tout bien lire et examiné, mais j'ai survolé.

Merci vraiment pour ce partage, de la pure info que l'on trouve quasi que sur JSO ! Bravo.
Continu la suite, c'est genial franchement !!!
306 XSI PH1 2.0 TCT
Ma présentation => ICI
Image

tr450
Messages : 3
Enregistré le : mar. 12 janv. 2016 21:56
A été remercié : 4 fois

Re: Communication CAN Arduino / MS2 Kdfi and Co.

Message par tr450 » lun. 8 avr. 2019 18:01

Merci ^^
Bon ça va mettre un peu de temps comme j'écris des pavés, mais d'ici une petite semaine la suite devrait tomber.

Avatar du membre
BaTmadZ
Moderateur
Messages : 11966
Enregistré le : sam. 26 févr. 2011 18:23
A remercié : 3 fois
A été remercié : 3 fois

Re: Communication CAN Arduino / MS2 Kdfi and Co.

Message par BaTmadZ » mer. 3 juil. 2019 07:36

@tr450

Vivement la suite
Car ça peut bien être utile
Par contre effectivement c'est pas évident a bien comprendre

Répondre