Comment construire un bus CAN avec une planche à pain et Arduino
Le bus CAN (Controller Area Network) est un protocole de communication robuste et fiable largement utilisé dans diverses applications industrielles, automobiles et aérospatiales. Il est conçu pour la transmission de données entre des microcontrôleurs et des appareils sur un réseau de bus CAN. Vous ne le savez peut-être pas encore, mais c’est ce qui se cache derrière les modifications folles du tableau de bord des voitures que vous voyez sur les médias sociaux.
Nous allons vous expliquer comment construire un bus CAN avec le module CAN MCP2515 à l’aide d’un Arduino et d’une planche à pain. Nous passerons également en revue la bibliothèque CAN Arduino et démontrerons comment envoyer et recevoir des données sur le bus CAN.
Qu’est-ce qu’un bus CAN ?
Le bus CAN est un protocole de communication série développé par Bosch dans les années 1980. Il est largement utilisé dans diverses applications en raison de sa grande fiabilité et de sa robustesse. Il permet la transmission de données entre des dispositifs à des vitesses élevées avec une latence minimale sur seulement deux lignes : CAN High et CAN Low.
En 1994, le bus CAN est devenu une norme internationale (ISO 11898) conçue spécifiquement pour l’échange rapide de données en série entre les contrôleurs électroniques dans les applications automobiles. Pour plus de détails, consultez notre guide complet sur ce qu’est un bus CAN et le rôle qu’il joue dans les systèmes automobiles.
L’une des raisons pour lesquelles le bus CAN est si populaire est sa capacité à détecter et à corriger les erreurs. Le protocole peut détecter et corriger les erreurs dans la transmission des données. Il est donc idéal pour les applications où l’intégrité des données est essentielle, comme dans l’automatisation industrielle.
Connaître le module CAN MCP2515
Le module contrôleur de bus CAN MCP2515 est un dispositif qui fournit un support exceptionnel pour le protocole CAN version 2.0B largement utilisé. Ce module est idéal pour la communication à des débits de données élevés allant jusqu’à 1Mbps.
Le circuit intégré MCP2515 est un contrôleur CAN indépendant doté d’une interface SPI qui permet de communiquer avec une large gamme de microcontrôleurs. Le circuit intégré TJA1050, quant à lui, fonctionne comme une interface entre le circuit intégré contrôleur CAN MCP2515 et le bus CAN physique.
Pour plus de commodité, un cavalier vous permet de fixer une terminaison de 120 ohms, ce qui facilite encore plus la connexion de vos fils à l’interface CAN. CAN_H & CAN_L vis pour la communication avec d’autres modules CAN.
Émetteur-récepteur | TJA1050 |
Interface microcontrôleur | SPI (permet l’intégration d’un bus Multi CAN) |
Oscillateur à cristal | 8MHz |
Terminaison | 120Ω |
Vitesse | 1Mbps |
Consommation électrique | Fonctionnement en veille à faible courant |
Dimension | 40 x 28 mm |
Capacité des nœuds | Supporte jusqu’à 112 nœuds |
Vous pouvez obtenir des informations supplémentaires à partir de la page Fiche technique MCP2515 au cas où vous auriez besoin de ce module pour un projet plus avancé.
Structure des messages CAN
La structure du message CAN se compose de plusieurs segments, mais les segments les plus critiques pour ce projet sont l’identifiant et les données. L’identificateur, également connu sous le nom d’ID CAN ou de numéro de groupe de paramètres (PGN), identifie les dispositifs sur le réseau CAN, et la longueur de l’identificateur peut être de 11 ou 29 bits, en fonction du type de protocole CAN utilisé.
Les données, quant à elles, représentent les données réelles du capteur/de la commande qui sont transmises. Les données peuvent avoir une longueur comprise entre 0 et 8 octets, et le code de longueur de données (DLC) indique le nombre d’octets de données présents.
La bibliothèque de bus CAN Arduino MCP2515
Cette bibliothèque met en œuvre le bus CAN CAN V2.0B qui peut fonctionner à des vitesses allant jusqu’à 1Mbps. Elle fournit une interface SPI qui peut fonctionner à des vitesses allant jusqu’à 10 MHz tout en prenant en charge les données standard (11 bits) et étendues (29 bits). De plus, il est livré avec deux tampons de réception, ce qui permet de stocker les messages par ordre de priorité.
Initialisation du bus CAN
Voici le code de configuration dont vous aurez besoin pour initialiser le bus CAN :
Ceci initialise le MCP2515 avec un débit binaire CAN de 500Kbps et une fréquence d’oscillateur de 8MHz.
Modes opérationnels CAN du MCP2515
Trois modes opérationnels sont utilisés avec le contrôleur de bus CAN MCP2515 :
- setNormalMode(): permet au contrôleur d’envoyer et de recevoir des messages.
- setLoopbackMode(): configure le contrôleur pour qu’il envoie et reçoive des messages, mais les messages qu’il envoie seront également reçus par lui-même.
- setListenOnlyMode() : configure le contrôleur pour qu’il ne reçoive que des messages.
Il s’agit d’appels de fonction utilisés pour définir le mode opérationnel du contrôleur de bus CAN MCP2515.
mcp2515.setLoopbackMode() ;
mcp2515.setListenOnlyMode() ;
Envoi de données sur le bus CAN
Pour envoyer un message sur le bus CAN, utilisez la commande sendMsgBuf() pour envoyer un message sur le bus CAN :
Cette méthode envoie un message avec l’ID 0x01 et une charge utile de données de 0x01, 0x02, 0x03, 0x04. Le premier paramètre est l’ID CAN, le deuxième est la priorité du message, le troisième est la longueur de la charge utile de données et le quatrième est la charge utile de données elle-même.
Les sendMsgBuf() renvoie une valeur indiquant si le message a été envoyé avec succès ou non. Vous pouvez vérifier cette valeur en appelant la méthode checkError() pour vérifier cette valeur :
Cette méthode vérifie si une erreur s’est produite lors de la transmission du message et imprime un message d’erreur si nécessaire.
Réception de données du bus CAN
Pour recevoir un message sur le bus CAN, vous pouvez utiliser la fonction readMsgBuf() méthode :
Cette opération vérifie si un message est disponible sur le bus CAN et lit ensuite le message dans le fichier buf dans le tableau buf . La longueur du message est stockée dans le tableau len et l’identifiant du message est stocké dans la variable canID .
Une fois que vous avez reçu un message, vous pouvez traiter les données utiles comme vous le souhaitez. Par exemple, vous pouvez imprimer la charge utile de données sur le moniteur série :
Ceci imprime l’ID du message reçu et les données utiles sur le moniteur série.
Comment connecter un émetteur-récepteur de bus CAN à une planche à pain ?
Pour construire un bus CAN afin de connecter deux appareils dans cet exemple de projet, vous aurez besoin de :
- Deux microcontrôleurs (deux cartes Arduino Nano pour cet exemple).
- Deux modules CAN MCP2515
- Une planche à pain
- Des fils de connexion
- Un module d’écran LCD I2C 16×2
- Un capteur ultrasonique HC-SR04
Pour cet exemple de projet, quatre bibliothèques sont utilisées dans le sketch Arduino. Il y a la bibliothèque NewPing qui fournit une interface facile à utiliser pour le capteur ultrasonique, ainsi que la bibliothèque bibliothèque SPI qui facilite la communication entre la carte Arduino et le contrôleur de bus CAN MCP2515. La bibliothèque LiquidCrystal_I2C est utilisée pour le module d’affichage.
Enfin, il y a la bibliothèque bibliothèque mcp2515 pour s’interfacer avec la puce MCP2515, ce qui nous permet de transmettre facilement des données sur le réseau de bus CAN.
Configuration du matériel (exemple HC-SR04)
Dans ce projet utilisant un capteur HC-SR04 et un écran LCD, une carte Arduino Nano agira en tant que récepteur, tandis que l’autre Arduino agira en tant qu’émetteur. Connectez les composants de votre émetteur conformément au schéma de câblage ci-dessous :
Voici le schéma du circuit du récepteur :
Enfin, connectez les deux nœuds ensemble à l’aide du câble CAN_H et CAN_L comme indiqué :
Lors du branchement des modules, il est important de s’assurer que la tension d’alimentation se situe dans la plage spécifiée et que les lignes CAN H et CAN L sont correctement connectées au bus.
Programmation du module de bus CAN MCP2515
Notez que lors de la programmation du module MCP2515, il est important d’utiliser le débit binaire correct pour assurer une communication réussie avec les autres dispositifs CAN sur le réseau.
Code de l’expéditeur :
Code récepteur :
Faites passer vos projets Arduino au niveau supérieur
La combinaison du bus CAN et d’Arduino constitue une plateforme puissante pour construire ou apprendre des réseaux de communication sophistiqués utilisés dans diverses applications. Bien que la courbe d’apprentissage puisse sembler raide, avoir votre propre configuration sur une planche à pain est un moyen assez pratique d’apprendre les ficelles de l’utilisation d’un réseau de bus CAN dans des projets de bricolage complexes.
S’abonner à notre lettre d’information
Arduino supporte-t-il le protocole CAN ?
L’Arduino Portenta Machine Control dispose de l’émetteur-récepteur CAN TJA1049T qui permet d’utiliser le protocole de communication Controller Area Network (CAN).
L’ESP32 dispose-t-il d’un bus CAN ?
Le microcontrôleur ESP32 d’Espressif dispose également d’un contrôleur de bus CAN intégré.
Comment connecter le MCP2515 à Arduino ?
Conception du circuit Connectez donc les broches SPI, c’est-à-dire SCK, MOSI (SI), MISO (SO) et CS du module MCP2515 aux broches SPI correspondantes de l’Arduino (voir le schéma du circuit). Réalisez deux connexions de ce type : une paire sert d’émetteur et l’autre de récepteur.