Présentation
Ce module ajoute une liaison bus CAN à n’importe quelle carte à microcontrôleur. Il réunit sur une même carte deux circuits complémentaires : le contrôleur CAN MCP2515 de Microchip, qui prend en charge les trames, les filtres et les acquittements, et l’émetteur-récepteur TJA1050, qui adapte les signaux au bus filaire CANH / CANL. Le microcontrôleur dialogue avec le MCP2515 par une simple liaison SPI, comme avec n’importe quel autre circuit périphérique.
Le quartz de 8 MHz est soudé sur la carte : aucun composant externe n’est nécessaire pour fixer le débit, qui se choisit dans le programme parmi 125 kbit/s, 250 kbit/s, 500 kbit/s ou 1 Mbit/s. Les repères du connecteur SPI et du bornier de bus sont imprimés sur la carte, ce qui évite toute erreur de câblage.
Caractéristiques techniques
| Élément | Caractéristique |
|---|---|
| Contrôleur CAN | MCP2515 (Microchip), spécification CAN 2.0B, trames standard et étendues, débit jusqu’à 1 Mbit/s |
| Émetteur-récepteur | TJA1050 (NXP), CAN haute vitesse conforme ISO 11898-2 |
| Horloge | Quartz 8 MHz soudé sur la carte, aucun quartz externe à câbler |
| Interface microcontrôleur | SPI jusqu’à 10 MHz |
| Mémoire de trames | 3 tampons d’émission, 2 tampons de réception, 6 filtres et 2 masques d’acceptation |
| Alimentation | 5 V. Le MCP2515 accepte de 2,7 à 5,5 V, le TJA1050 est spécifié de 4,75 à 5,25 V |
| Connecteur de bus | Bornier à vis 2 pôles, repères H (CANH) et L (CANL) |
| En-tête SPI | 7 broches : VCC, GND, CS, SO, SI, SCK, INT |
| Signalisation | Voyant de mise sous tension |
Brochage et raccordement
En-tête SPI
| Repère du module | Rôle | Arduino Uno |
|---|---|---|
| VCC | Alimentation de la carte | 5V |
| GND | Masse commune avec le microcontrôleur | GND |
| CS | Sélection du circuit sur le bus SPI | D10 |
| SO | Sortie de données du MCP2515 vers le microcontrôleur | D12 |
| SI | Entrée de données du MCP2515 depuis le microcontrôleur | D11 |
| SCK | Horloge SPI | D13 |
| INT | Signal d’interruption, sortie du MCP2515 | D2 (facultatif) |
Bornier du bus CAN
Le bornier à deux positions relie la carte au bus : H pour CANH et L pour CANL. Ces deux fils portent le même signal en opposition de phase et doivent cheminer en paire torsadée, courte de préférence. La masse des deux cartes est reliée en plus des deux fils de bus.
Alimentation et niveaux logiques
La carte se branche en 5 V, ce qui correspond directement à une carte Arduino Uno alimentée par son câble USB. Une alimentation externe stabilisée évite de tirer sur le régulateur de la carte quand le montage comporte plusieurs modules : une alimentation 5 V convient sur une maquette, et un convertisseur DC-DC réglable permet de partir d’une batterie 12 V dans un montage embarqué.
Attention avec un microcontrôleur alimenté en 3,3 V. Les seuils d’entrée du MCP2515 valent 0,7 fois la tension d’alimentation : à 5 V, cela fait 3,5 V, au-dessus de ce qu’une sortie 3,3 V peut fournir. Sur une carte ESP32 en 3,3 V, alimenter le module en 5 V et intercaler un adaptateur de niveau logique sur SCK, SI et CS (et sur SO si la sortie du module tire sur la ligne).
Terminaison du bus
Un bus CAN se termine par une résistance de 120 ohms à chacune de ses deux extrémités. Suivant les modèles, cette résistance est soudée d’origine sur la carte ou laissée à la charge du montage : contrôler la carte avant de câbler, puis mesurer au multimètre entre CANH et CANL, bus hors tension. On lit environ 120 ohms sur un bus doté d’une seule terminaison, 60 ohms lorsque les deux extrémités sont terminées, et une valeur beaucoup plus élevée si aucune résistance n’est en place. Ajouter une terminaison supplémentaire sur un bus déjà terminé divise la résistance et finit par empêcher toute communication.
Applications courantes
- Lecture de trames sur un véhicule : calculateurs, capteurs, prise de diagnostic.
- Liaison entre plusieurs automates ou cartes d’une même machine, sur quelques mètres de câble.
- Bancs industriels où plusieurs nœuds doivent s’échanger des mesures à cadence fixe.
- Domotique et robotique : commande de moteurs, de capteurs ou de modules d’entrée-sortie distants.
- Apprentissage du protocole CAN, depuis le câblage jusqu’à la trame complète.
Mini-projet : deux cartes qui échangent des trames
Matériel
- deux modules CAN MCP2515 + TJA1050 ;
- deux cartes Arduino : une Uno R3 et une Nano conviennent parfaitement ;
- des câbles Dupont mâle-femelle pour les liaisons SPI ;
- une plaque d’essai 830 points pour la distribution du 5 V et de la masse ;
- deux résistances de 120 ohms si les cartes n’en portent pas.
Câblage
- Relier chaque module à sa carte : VCC sur 5V, GND sur GND, CS sur D10, SO sur D12, SI sur D11, SCK sur D13.
- Relier les deux borniers entre eux : H sur H, L sur L, en paire torsadée courte.
- Relier les masses des deux cartes.
- Placer une résistance de 120 ohms entre H et L à chaque extrémité du bus, si les cartes n’en portent pas déjà une.
- Téléverser le programme ci-dessous dans les deux cartes, en changeant la constante MON_ID sur la seconde.
Programme, identique sur les deux cartes
/* Nœud de bus CAN sur module MCP2515 + TJA1050
* Composants, brochage et fiche complete : www.marocproduits.com
* Televerser ce meme programme dans les deux cartes du bus :
* chacune emet sa propre trame et affiche celles qu'elle recoit.
*/
#include "mcp_can.h"
#include "SPI.h"
const int PIN_CS = 10; // CS du module relie a D10
const unsigned long MON_ID = 0x123; // 0x123 sur la premiere carte, 0x456 sur la seconde
MCP_CAN CAN0(PIN_CS);
byte compteur = 0;
unsigned int numero = 0;
void setup() {
Serial.begin(9600);
while (CAN_OK != CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ)) {
Serial.println("Module muet : verifier CS, SCK, SI, SO et l'alimentation 5 V");
delay(500);
}
CAN0.setMode(MCP_NORMAL); // mode normal : la carte participe au bus
pinMode(2, INPUT); // broche INT du module, non utilisee pour une lecture par scrutation
Serial.print("Noeud pret, identifiant emis 0x");
Serial.println(MON_ID, HEX);
}
void loop() {
compteur = compteur + 1;
if (compteur == 10) { // une emission toutes les 10 boucles, soit environ 500 ms
compteur = 0;
numero = numero + 1;
byte donnees[2];
donnees[0] = (byte)MON_ID;
donnees[1] = (byte)numero;
CAN0.sendMsgBuf(MON_ID, 0, 2, donnees); // 0 = trame de donnees standard
}
if (CAN_MSGAVAIL == CAN0.checkReceive()) {
unsigned long id = 0;
byte longueur = 0;
byte recues[8];
CAN0.readMsgBuf(&id, &longueur, recues);
if (id != MON_ID) {
Serial.print("Recu 0x");
Serial.print(id, HEX);
Serial.print(" numero ");
Serial.println(recues[1]);
}
}
delay(50);
}Ce que l’on observe
Chaque carte affiche dans le moniteur série, toutes les demi-secondes environ, la trame émise par l’autre et son numéro croissant. Si rien n’apparaît, contrôler dans l’ordre : la vitesse du bus, identique sur les deux cartes, la masse commune, l’inversion éventuelle de H et L, puis la terminaison. Une carte seule sur le bus ne reçoit jamais d’acquittement : son compteur d’erreurs monte et elle finit par passer en état d’erreur. Il faut au moins deux nœuds pour qu’un dialogue s’établisse, même pour un essai de quelques minutes.
Questions fréquentes
Peut-on le relier à une carte en 3,3 V ?
Oui, avec une précaution de niveau logique : alimenter le module en 5 V et adapter les signaux SPI venant de la carte 3,3 V, comme expliqué plus haut. Alimenter le module directement en 3,3 V fonctionne souvent en laboratoire, mais fait travailler le TJA1050 hors de sa plage spécifiée.
Faut-il deux modules pour essayer ?
Oui pour un vrai dialogue, car le protocole CAN repose sur un acquittement émis par les autres nœuds. Pour un premier essai, le MCP2515 dispose d’un mode boucle interne qui renvoie la trame à l’émetteur sans passer par le bus : pratique pour valider le câblage SPI avant d’installer le second nœud.
Quelle vitesse choisir ?
Cela dépend du bus auquel la carte se raccorde, et non du module, qui monte jusqu’à 1 Mbit/s. Dans un véhicule, 500 kbit/s est la valeur la plus répandue ; sur une ligne longue et peu bruitée, 125 ou 250 kbit/s portent plus loin. Tous les nœuds d’un même bus doivent utiliser la même vitesse et le même quartz, d’où l’intérêt du quartz 8 MHz soudé sur la carte.
Combien de trames le module peut-il suivre ?
Le MCP2515 gère 3 tampons d’émission et 2 tampons de réception, avec 6 filtres et 2 masques d’acceptation. Il traite donc en priorité les identifiants déclarés dans les filtres et laisse passer le reste sans solliciter le microcontrôleur, ce qui suffit largement à un banc d’essai ou à une lecture de diagnostic.
Le module chauffe-t-il ?
Non. Le TJA1050 est un transceiver de faible consommation, sans dissipateur. Une chaleur notable signale un court-circuit sur le bornier ou une alimentation hors plage : couper l’alimentation et vérifier le câblage avant de poursuivre.
À combiner avec
Pour constituer un nœud complet, prévoir la carte qui pilote le module, les fils de liaison et la plaque de montage. La carte de prototypage pour Uno simplifie le câblage SPI quand le montage reste sur la carte. Un bus se construit toujours à deux nœuds minimum : deux modules, deux cartes et un peu de fil suffisent à reproduire chez soi ce qui se passe dans un véhicule.











