LOCODUINO

Forum de discussion
Dépôt GIT Locoduino
Flux RSS

samedi 18 novembre 2017

48 visiteurs en ce moment

Mise en oeuvre du Bus CAN entre modules Arduino (2)

2ème partie : la programmation

. Par : Dominique, Jean-Luc

Pour se fixer les idées, on va commencer par décrire les éléments logiciels qui font partie d’une carte de commande d’aiguilles, par exemple à base d’un Mega2560, sans entrer dans le détail de la façon de commander les moteurs d’aiguille (juste un petit peu), par les échanges CAN. Ces éléments sont présentés dans l’ordre logique d’un programme Arduino. (...)

Retourner à l'article

Vous répondez à :

Mise en oeuvre du Bus CAN entre modules Arduino (2) 14 mai 2016 08:31, par Jean-Luc

Certe ce n’est pas lié directement au ferroviaire mais la question va se poser dès que l’on veut transmettre des données qui ne sont pas des octets. Je parie là dessus :

vous declarez votre trame CAN comme un tableau de byte ou de char :

byte message[8];

Ensuite, comme vous voulez envoyer des int qui sur les Arduino à base d’AVR occupe deux octets, vous écrivez :

  1. int a,b,c;
  2.  
  3. message[0] = a;
  4. message[1] = b;
  5. message[2] = c;

C’est à ce moment que vous perdez l’octet de poids fort de vos entiers qui nécessitent 6 octets de stockage.

Première solution : Il faut que vous décomposiez vos données en octets pour les stocker dans les éléments du tableau message :

  1. message[0] = a >> 8;
  2. message[1] = a & 0x00FF;
  3. message[2] = b >> 8;
  4. message[3] = b & 0x00FF;
  5. message[4] = c >> 8;
  6. message[5] = c & 0x00FF;

Mais rien n’oblige à déclarer un tableau d’octets. On peut déclarer un tableau d’entiers de 4 éléments :

  1. int message[4];

Lors de l’émission, il faudra se rappeler que c’est bien le nombre d’octets que l’on indique. Le mieux est d’utiliser sizeof : si on transmet 3 entiers comme ci-dessus, la taille du message sera de 3 * sizeof(int).

Attention toutefois. En procédant de cette manière, on se retrouve confronté au problème de l’endianess. En effet il se peut que les deux octets qui composent un entier ne soient pas stockés en memoire dans le même ordre sur le microcontroleur émetteur et le microcontroleur récepteur. Ceci dépend du matériel sur une architecture 16 ou 32 bits et du compilateur sur une architecture 8 bits. Le résultat serait l’inversion des octets de poids fort et de poids faible des entiers. Entre 2 AVR pas de problème, ce sont des microcontroleurs de la même famille. Le compilateur avr-gcc utilisé dans l’IDE Arduino manipule des entiers little endian. Pas de soucis pour faire communiquer de cette façon un Arduino AVR et un Arduino ARM car l’ARM est little endian également. Mais attention à la taille : un int occupe 2 octets sur AVR et 4 sur ARM. 

On peut également declarer son message comme étant tout autre chose :

  1. typedef struct {
  2. word vitesse; // 2 octets
  3. byte feu; // 1 octet
  4. bool sens; // 1 octet
  5. } trame_can;
  6.  
  7. trame_can message;
  8.  
  9. message.vitesse = 10;
  10. message.feu = 4;
  11. message.sens = true;

La taille en octet étant donnée par sizeof(trame_can) et le pointeur passé à la fonction d’envoi étant &message

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

59 Messages

Rubrique Projets

Un chenillard de DEL

Enseigne de magasin

Feux tricolores

Multi-animations lumineuses

L’Arduino et le système de commande numérique DCC

Un décodeur d’accessoire DCC versatile basé sur Arduino

Un moniteur de signaux DCC

Une barrière infrarouge

Un capteur RFID

Un TCO xpressnet

Une animation sonore

L’Arduino au coeur des systèmes de pilotage analogiques ou numériques

Calcul de la vitesse d’un train miniature avec l’Arduino

La génèse d’un réseau 100% Arduino

Une horloge à échelle H0

Simulateur de soudure à arc

Un automatisme de Passage à Niveau

La rétro-signalisation sur Arduino

Décodeur pour aiguillage à solénoïdes sur Arduino

Un décodeur DCC pour les signaux à deux ou trois feux sur Arduino NANO/UNO

Etude d’un passage à niveau universel

Réalisation pratique d’un système de mesure de vitesse à l’échelle N

Une Passerelle entre le bus S88 et le bus CAN pour la rétro signalisation

Un décodeur DCC pour 16 feux tricolores

Block Automatique Lumineux avec la carte shield "Arduino 4 relays"

Réalisation d’un affichage de gare ARRIVEE DEPART

Ménage à trois (Ordinateur, Arduino, réseau)

Comment piloter trains et accessoires en DCC avec un Arduino (1)

Comment piloter trains et accessoires en DCC avec un Arduino (2)

Comment piloter trains et accessoires en DCC avec un Arduino (3)

Comment piloter trains et accessoires en DCC avec un Arduino (4)

SGDD : Système de Gestion DD (1)

SGDD : Système de Gestion DD (2)

SGDD : Système de Gestion DD (3)

La PWM : Qu’est-ce que c’est ? (1)

La PWM : Qu’est-ce que c’est ? (2)

La PWM : Qu’est ce que c’est ? (3)

La PWM : Qu’est ce que c’est ? (4)

Mise en oeuvre du Bus CAN entre modules Arduino (1)

Mise en oeuvre du Bus CAN entre modules Arduino (2)

Un gestionnaire en C++ pour votre réseau (1)

Un gestionnaire en C++ pour votre réseau (2)

Un gestionnaire en C++ pour votre réseau (3)

Un gestionnaire en C++ pour votre réseau (4)

Réalisation de centrales DCC avec le logiciel libre DCC++ (1)

Réalisation de centrales DCC avec le logiciel libre DCC++ (2)

Réalisation de centrales DCC avec le logiciel libre DCC++ (3)

Contrôleur à télécommande infrarouge pour centrale DCC++

Gestion d’une gare cachée (1)

Gestion d’une gare cachée (2)

Gestion d’une gare cachée (3)

Les derniers articles

Ménage à trois (Ordinateur, Arduino, réseau)


Christian

La PWM : Qu’est ce que c’est ? (4)


Jean-Luc

Block Automatique Lumineux avec la carte shield "Arduino 4 relays"


Christian

Réalisation d’un affichage de gare ARRIVEE DEPART


Gilbert

Contrôleur à télécommande infrarouge pour centrale DCC++


Daniel

La PWM : Qu’est ce que c’est ? (3)


Jean-Luc

Réalisation de centrales DCC avec le logiciel libre DCC++ (3)


bobyAndCo

Un gestionnaire en C++ pour votre réseau (4)


Pierre59

Un décodeur DCC pour 16 feux tricolores


Dominique, JPClaude, Thierry

Réalisation de centrales DCC avec le logiciel libre DCC++ (2)


bobyAndCo

Les articles les plus lus

La PWM : Qu’est-ce que c’est ? (1)

Réalisation d’un affichage de gare ARRIVEE DEPART

L’Arduino au coeur des systèmes de pilotage analogiques ou numériques

Comment piloter trains et accessoires en DCC avec un Arduino (1)

Ménage à trois (Ordinateur, Arduino, réseau)

Block Automatique Lumineux avec la carte shield "Arduino 4 relays"

La rétro-signalisation sur Arduino

Mise en oeuvre du Bus CAN entre modules Arduino (2)

Comment piloter trains et accessoires en DCC avec un Arduino (3)

L’Arduino et le système de commande numérique DCC