Lycée Gustave Eiffel STI2D – SIN
STI2D – Enseignement de spécialité SIN
SIN
SHIELD BUS CAN
1 – PRESENTATION DE LA CARTE SHIELD
La carte shield « CAN-BUS » permet de mettre en œuvre une
interface de communication via un bus CAN. Cette carte intègre un
contrôleur CAN MCP2515 et un émetteur/récepteur CAN
MCP2551.
Cette carte permet d’implémenter un bus CAN standard (2.0A) ou
bus CAN étendu (2.0B) avec une vitesse de fonctionnement allant
jusqu’à 1 Mbits/s.
Cette carte a été conçue pour s’enficher sur une carte Arduino UNO
ou compatible. Elle dispose d’un connecteur DB9 qui permet via un - Câble DBG-OBD -
câble DBG-OBD, de se connecter sur les connecteurs de diagnostics
OBD II (On Board Diagnostic).
- Prise OBD II automobile -
Elle dispose également de deux borniers à vis permettant d’accéder aux lignes CAN-H et CAN-L.eux
connecteurs (liaison série asynchrone et bus I2C) au format « Grove » permettent la connexion de
capteurs directement sur le shield.
Document Ressource : Shield Bus CAN Page n°1/8
Lycée Gustave Eiffel STI2D – SIN
1 Port DB9
Commutateur permettant d’alimenter la carte via le
2
connecteur DB9 donc via la prise OBD II.
Indicateurs Dels :
PWR : Allumée lorsque la carte est sous tension
3 TX : Clignotante lorsqu’une donnée est émise
RX : Clignotante lorsqu’une donnée est reçue
INT : Allumée si une donnée d’interruption est reçue
4 Bornes de connexion lignes CAN-H et CAN-L
5 Broches de connexion à une carte Arduino
6 Connecteur Grove « Liaison série Asynchrone »
7 Connecteur Grove « Liaison I2C »
8 Connecteur ICSP
9 Emetteur/Récepteur CAN MCP2551
A Contrôleur CAN à interface SPI MCP2515
2 – INTERCONNEXION DU SHIELD AVEC LA CARTE ARDUINO
La communication entre le shield « Bus CAN » et la carte Arduino est réalisée au moyen de la liaison SPI.
Les signaux SCK, MISO, MOSI sont par défaut transmis à la carte shield via le connecteur ICSP. Le signal
CS est quant à lui disponible par défaut sur la broche numérique D9.
Document Ressource : Shield Bus CAN Page n°2/8
Lycée Gustave Eiffel STI2D – SIN
Il est possible de modifier ces connexions à partir des contacts situés sous la carte. Pour cela il suffit de
couper la piste entre le contact du milieu et le contact 9 ou A et de connecter au moyen d’une soudure
entre le contact du milieu et le contact 9 ou A.
Soudure entre le contact du milieu et le contact
Signal 9 ou A 10 ou B
Signal disponible sur Signal disponible sur
CS Broche D9 Broche D10
MOSI Connecteur ICSP Broche D11
MISO Connecteur ICSP Broche D12
SCK Connecteur ICSP Broche D13
Le schéma de câblage par défaut entre la carte Arduino et le shield est le suivant :
Le brochage du connecteur DB9 est le suivant :
Document Ressource : Shield Bus CAN Page n°3/8
Lycée Gustave Eiffel STI2D – SIN
3 – CONNEXION DU SHIELD
Pour utiliser le shield « Bus CAN », il est nécessaire d’enficher le
shield sur une carte Arduino. Ensuite il faut connecter les lignes
CAN_H et CAN_L du shield au bus CAN via les borniers à vis ou via le
connecteur DB9.
L’exemple ci-dessous montre l’interconnexion de deux shields « Bus CAN ».
4 – LIBRAIRIE « MCP-CAN »
La librairie « MCP_CAN » contient des fonctions permettant de gérer le shield CAN.
4.1 – Création de la liaison CAN
Pour déclarer une nouvelle liaison CAN, il faut utiliser la fonction suivante avec « SPI_CS_PIN »
représentant la broche numérique utilisée pour le signal CS.
MCP_CAN CAN(SPI_CS_PIN) ;
Exemple :
const int SPI_CS_PIN = 9;
MCP_CAN CAN(SPI_CS_PIN) ;
Document Ressource : Shield Bus CAN Page n°4/8
Lycée Gustave Eiffel STI2D – SIN
4.2 – Initialisation du Bus CAN :
Vitesse Mot-clé
5 kbits/s CAN_5KBPS
10 kbits/s CAN_10KBPS
20 kbits/s CAN_20KBPS
25 kbits/s CAN_25KBPS
Pour initialiser le bus CAN, il faut utiliser la fonction suivante en 31,25 kbits/s CAN_31K25BPS
indiquant la vitesse de fonctionnement. 33 kbits/s CAN_33KBPS
40 kbits/s CAN_40KBPS
CAN.begin(“Vitesse”) ; 50 kbits/s CAN_50KBPS
80 kbits/s CAN_80KBPS
La vitesse de communication doit être choisie parmi les valeurs 83,3 kbits/s CAN_83K3BPS
ci-contre. CAN_95KBPS
95 kbits/s
125 CAN_100KBPS
50 kbits/s CAN_125KBPS
200 kbits/s CAN_200KBPS
250 kbits/s CAN_250KBPS
500 kbits/s CAN_500KBPS
666 kbits/s CAN_666KBPS
1 Gbits/s CAN_1000KBPS
Exemple :
CAN.begin(CAN_500KBPS) ; // Initialisation du bus CAN à 500 kbit/s
4.3 – Configuration des masques et des filtres de réception
Pour qu’un message arrive dans votre buffer de réception, il faut qu’il soit accepté. Pour cela
l’identifiant du message est comparé à un filtre. Le masque permet de choisir quels bits de l’identifiant
seront comparés avec le filtre.
Exemple
Masque 1 1 1 0 0 0 0 0 0 0 0 0
Filtre 1 0 1 1 1 0 0 0 0 1 0 1
ID message 1 1 0 0 0 1 0 0 1 1 1 0 0
ID message 2 1 0 1 0 0 0 0 1 0 1 1 1
Le message 1 est rejeté car les 3 premiers bits de l’identifiant sont différents des 3 premiers bits du
filtre. Le message 2 est accepté car les 3 premiers bits de l’identifiant sont identiques à ceux du filtre.
Document Ressource : Shield Bus CAN Page n°5/8
Lycée Gustave Eiffel STI2D – SIN
Le contrôleur CAN MCP2515 utilisé par le shield possède 2 buffers de réception. Il dispose de 2
masques (numérotés 0 et 1) et de 6 filtres (numérotés 0 à 5). Le masque 0 et les filtres 0 et 1 sont
utilisés par le buffer 1. Le masque1 et les filtres 2 à 5 sont utilisés par le buffer 2.
La fonction suivante permet de configurer les masques :
CAN.init_Mask(num,trame,val) ;
Avec :
Paramètre Type Fonction
num byte Numéro du masque à configurer
trame byte Type de trame : 0 trame standard - 1 trame étendue
val unsigned long Valeur du masque
La fonction suivante permet de configurer les filtres :
CAN.init_Filt(num,trame,val) ;
Avec :
Paramètre Type Fonction
num byte Numéro du filtre à configurer
trame byte Type de trame : 0 trame standard - 1 trame étendue
val unsigned long Valeur du filtre
Exemple :
// Masques
CAN.init_Mask(0, 0,0x3FF) ; // Configuration masque 0
CAN.init_Mask(1, 0,0x3FF) ; // Configuration masque 1
// Filtres
CAN.init_Filt(0, 0,0x004) ; // Configuration filtre 0
CAN.init_Mask(0, 0,0x005) ; // Configuration filtre 1
CAN.init_Mask(0, 0,0x006) ; // Configuration filtre 2
CAN.init_Mask(0, 0,0x007) ; // Configuration filtre 3
CAN.init_Mask(0, 0,0x008) ; // Configuration filtre 4
CAN.init_Mask(0, 0,0x009) ; // Configuration filtre 5
CAN.init_Filt(num,trame,val) ;
Document Ressource : Shield Bus CAN Page n°6/8
Lycée Gustave Eiffel STI2D – SIN
4.4 – Détection de réception d’un message
Le contrôleur CAN MCP2515 peut fonctionner en mode « scrutation » (Polled mode) dans lequel le
programme test en permanence la réception d’une trame.
La fonction suivante permet de savoir si une trame a été reçue. Elle retourne 0 si rien n’a été reçu et 1 si
une trame est arrivée.
CAN.checkReceive();
4.5 – Lecture de l’identifiant d’une trame
La fonction suivante permet de connaître l’identifiant d’une trame reçue et acceptée.
CAN.getCanId();
4.5 – Lecture de la donnée d’une trame
La fonction suivante permet de lire et de stockée les données d’une trame stockée dans un buffer de
réception.
CAN.readMsgBuf(taille,var);
Paramètre Type Fonction
taille byte Taille de la donnée lue
var byte Variable dans laquelle sera stockée la donnée lue
Exemple :
byte data[8]; // Tableau permettant de récupérer les données
byte len = 0; // Variable pour récupérer le nombre de données
CAN.readMsgBuf(&len, data); // Lire les données
for(int i = 0; i<len; i++)
{
Serial.print(buf[i], HEX); // Affiche les données
Serial.print("\t"); // Affiche une tabulation
}
Paramètre Type Fonction
len byte Taille de la donnée lue
data byte Tableau contenant les données lues
Document Ressource : Shield Bus CAN Page n°7/8
Lycée Gustave Eiffel STI2D – SIN
4.5 – Envoi d’une trame
La fonction suivante permet d’envoyer une donnée sur le bus CAN.
CAN.sendMsgBuf(id, trame, len, data); // Lire les données
Paramètre Type Fonction
id byte Identifiant du message
trame byte Type de trame : 0 trame standard - 1 trame étendue
len byte Taille de la donnée à envoyer
data byte Tableau contenant les données à envoyer
Document Ressource : Shield Bus CAN Page n°8/8