- Introduction à CAN
- Comparaison de CAN sur SPI et I2C
- Applications de protocole CAN
- Comment utiliser le protocole CAN dans Arduino
- Composants requis
- Schéma
- Connexion entre deux modules CAN MCP2515
- Programmation Arduino pour la communication CAN
- Explication du code côté émetteur CAN (Arduino Nano)
- Explication du code côté récepteur CAN (Arduino UNO)
- Fonctionnement de la communication CAN dans Arduino
Aujourd'hui, toute voiture moyenne se compose d'environ 60 à 100 unités de capteurs pour la détection et l'échange d'informations. Les constructeurs automobiles rendant constamment leur voiture plus intelligente avec des fonctionnalités telles que la conduite autonome, le système d'airbag, la surveillance de la pression des pneus, le système de régulateur de vitesse, etc., ce nombre ne devrait augmenter. Contrairement à d'autres capteurs, ces capteurs traitent les informations critiques et, par conséquent, les données de ces capteurs doivent être communiquées à l'aide de protocoles de communication automobile standard. Par exemple, les données du système de régulation de vitesse telles que la vitesse, la position de l'accélérateur, etc. sont des valeurs vitales qui sont envoyées à l' unité de commande électronique (ECU)pour décider du niveau d'accélération de la voiture, une mauvaise communication ou une perte de données pourrait entraîner des pannes critiques. Par conséquent, contrairement aux protocoles de communication standard tels que UART, SPI ou I2C, les concepteurs utilisent des protocoles de communication automobile très fiables tels que LIN, CAN, FlexRay, etc.
Parmi tous les protocoles disponibles, CAN est le plus utilisé et le plus populaire. Nous avons déjà discuté de ce qu'est CAN et comment fonctionne CAN. Donc, dans cet article, nous reviendrons sur les bases et enfin, nous échangerons également des données entre deux Arduinos en utilisant la communication CAN. Cela semble intéressant, non! Alors, commençons.
Introduction à CAN
CAN aka Controller Area Network est un bus de communication série conçu pour les applications industrielles et automobiles. Il s'agit d'un protocole basé sur les messages utilisé pour la communication entre plusieurs appareils. Lorsque plusieurs appareils CAN sont connectés ensemble comme indiqué ci-dessous, la connexion forme un réseau agissant comme notre système nerveux central permettant à n'importe quel appareil de parler avec n'importe quel autre appareil du nœud.
Un réseau CAN comprendra seulement deux fils CAN High et CAN Low pour la transmission bidirectionnelle des données comme indiqué ci-dessus. En règle générale, la vitesse de communication pour CAN varie de 50 Kbps à 1 Mbps et la distance peut aller de 40 mètres à 1 Mbps à 1000 mètres à 50 kpbs.
Format du message CAN:
Dans la communication CAN, les données sont transmises dans le réseau sous un format de message particulier. Ce format de message contient de nombreux segments, mais deux segments principaux sont l' identifiant et les données qui aident à envoyer et à répondre aux messages dans le bus CAN.
Identificateur ou ID CAN: L'identifiant est également connu sous le nom d'ID CAN ou également connu sous le nom de PGN (numéro de groupe de paramètres). Il permet d'identifier les équipements CAN présents dans un réseau CAN. La longueur de l'identifiant est de 11 ou 29 bits selon le type de protocole CAN utilisé.
CAN standard: 0-2047 (11 bits)
Extended CAN: 0-2 29 1 (29 bits)
Données: Il s'agit des données réelles du capteur / contrôle qui doivent être envoyées d'un appareil à un autre. Les données de taille peuvent avoir une longueur comprise entre 0 et 8 octets.
Data Length Code (DLC): 0 à 8 pour le nombre d'octets de données présents.
Fils utilisés dans CAN:
Le protocole CAN se compose de deux fils à savoir CAN_H et CAN_L pour envoyer et recevoir des informations. Les deux fils agissent comme une ligne différentielle, ce qui signifie que le signal CAN (0 ou 1) est représenté par la différence de potentiel entre CAN_L et CAN_H. Si la différence est positive et supérieure à une certaine tension minimale, elle vaut 1 et si la différence est négative, elle vaut 0.
Normalement, un câble à paire torsadée est utilisé pour la communication CAN. Une seule résistance de 120 ohms est généralement utilisée aux deux extrémités du réseau CAN comme indiqué sur l'image, c'est parce que la ligne doit être équilibrée et liée au même potentiel.
Comparaison de CAN sur SPI et I2C
Puisque nous avons déjà appris à utiliser SPI avec Arduino et IIC avec Arduino, comparons les fonctionnalités de SPI et I2C avec CAN
Paramètre | SPI | I2C | POUVEZ |
La vitesse | 3Mbps à 10Mbps | Standard: 100 Kbits / s | 10KBps à 1MBps Dépend également de la longueur du fil utilisé |
Rapide: 400 Kbps | |||
Haut débit: 3,4 Mbps | |||
Type | Synchrone | Synchrone | Asynchrone |
Nombre de fils | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 fils (SDA, SCL) | 2 fils (CAN_H, CAN_L) |
Duplex | Un duplex plein | Semi-duplex | Semi-duplex |
Applications de protocole CAN
- En raison de la robustesse et de la fiabilité du protocole CAN, ils sont utilisés dans des industries telles que l'automobile, les machines industrielles, l'agriculture, l'équipement médical, etc.
- Comme la complexité du câblage est réduite dans CAN, ils sont principalement utilisés dans les applications automobiles comme la voiture.
- Le faible coût de mise en œuvre et le prix des composants matériels sont également inférieurs.
- Facile à ajouter et supprimer les périphériques de bus CAN.
Comment utiliser le protocole CAN dans Arduino
Comme Arduino ne contient aucun port CAN intégré, un module CAN appelé MCP2515 est utilisé. Ce module CAN est interfacé avec Arduino en utilisant la communication SPI. Voyons plus en détail sur MCP2515 et comment il est interfacé avec Arduino.
Module CAN MCP2515:
Le module MCP2515 a un contrôleur CAN MCP2515 qui est un émetteur-récepteur CAN haute vitesse. La connexion entre MCP2515 et MCU se fait via SPI. Ainsi, il est facile de s'interfacer avec n'importe quel microcontrôleur ayant une interface SPI.
Pour les débutants qui souhaitent apprendre le bus CAN, ce module constituera un bon début. Cette carte CAN SPI est idéale pour l'automatisation industrielle, la domotique et d'autres projets embarqués automobiles.
Caractéristiques et spécifications du MCP2515:
- Utilise l'émetteur-récepteur CAN haute vitesse TJA1050
- Dimension: 40 × 28mm
- Contrôle SPI pour l'extension de l'interface multi-bus CAN
- Oscillateur à cristal 8MHZ
- Résistance terminale 120Ω
- A clé indépendante, indicateur LED, indicateur d'alimentation
- Prend en charge le fonctionnement CAN 1 Mb / s
- Fonctionnement en veille à faible courant
- Jusqu'à 112 nœuds peuvent être connectés
Brochage du module CAN MCP2515:
Nom de la broche |
UTILISATION |
VCC |
Broche d'entrée d'alimentation 5 V |
GND |
Broche de masse |
CS |
Broche de sélection SPI SLAVE (Active low) |
ALORS |
Câble de sortie esclave d'entrée maître SPI |
SI |
Câble d'entrée esclave de sortie maître SPI |
SCLK |
Broche d'horloge SPI |
INT |
Broche d'interruption MCP2515 |
Dans ce tutoriel, voyons comment envoyer des données de capteur d'humidité et de température (DHT11) d'Arduino Nano à Arduino Uno via le module de bus CAN MCP2515.
Composants requis
- Arduino UNO
- Arduino NANO
- DHT11
- Écran LCD 16x2
- Module CAN MCP2515 - 2
- Potentiomètre 10k
- Planche à pain
- Connexion des fils
Schéma
Connexion côté émetteur CAN:
Composant - Pin |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - SO |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5V |
DHT11 - GND |
GND |
DHT11 - SORTIE |
A0 |
Connexions du circuit côté récepteur CAN:
Composant - Pin |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - SO |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
Au PIN du centre du potentiomètre 10K |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - E |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
sept |
LCD - D7 |
8 |
LCD - A |
+ 5V |
LCD - K |
GND |
Connexion entre deux modules CAN MCP2515
H - CAN haut
L - CAN faible
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Une fois toutes les connexions effectuées, mon matériel ressemblait à ceci ci-dessous
Programmation Arduino pour la communication CAN
Nous devons d'abord installer une bibliothèque pour CAN dans Arduino IDE. L'interfaçage du module CAN MCP2515 avec l'Arduino devient plus facile en utilisant la bibliothèque suivante.
- Téléchargez le fichier ZIP de la bibliothèque Arduino CAN MCP2515.
- À partir de l'IDE Arduino: Sketch -> Inclure la bibliothèque -> Ajouter une bibliothèque.ZIP
Dans ce didacticiel, le codage est divisé en deux parties, l'une en tant que code d'émetteur CAN (Arduino Nano) et l'autre en tant que code de récepteur CAN (Arduino UNO), toutes deux disponibles au bas de cette page. L'explication de la même chose est la suivante.
Avant d'écrire le programme pour l'envoi et la réception de données, assurez-vous d'avoir installé la bibliothèque en suivant les étapes ci-dessus et que le module CAN MCP2515 est initialisé dans votre programme comme suit.
Initialisez le module CAN MCP2515:
Afin de créer une connexion avec MCP2515, suivez les étapes:
1. Définissez le numéro de broche où SPI CS est connecté (10 par défaut)
MCP2515 mcp2515 (10);
2. Réglez la vitesse de transmission et la fréquence de l'oscillateur
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Taux de Baud disponibles:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBPS, CAN_125KBPS, CAN_200KBPS, CAN_125KBPS, CAN_200KBPS.
Vitesses d'horloge disponibles:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Définissez les modes.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Explication du code côté émetteur CAN (Arduino Nano)
Dans la section émetteur, Arduino Nano s'est interfacé avec le module CAN MCP2515 via des broches SPI et DHT11 envoie des données de température et d'humidité au bus CAN.
Les bibliothèques requises sont d'abord incluses, la bibliothèque SPI pour l'utilisation de la communication SPI, la bibliothèque MCP2515 pour l'utilisation de la communication CAN et la bibliothèque DHT pour l'utilisation du capteur DHT avec Arduino . Nous avons précédemment interfacé DHT11 avec Arduino.
#comprendre
Maintenant, le nom de broche de DHT11 (broche OUT) qui est connecté à l'A0 d'Arduino Nano est défini
#define DHTPIN A0
Et aussi, le DHTTYPE est défini comme DHT11.
#define DHTTYPE DHT11
Un type de données canMsg struct pour stocker le format de message CAN.
struct can_frame canMsg;
Définissez le numéro de broche auquel SPI CS est connecté (10 par défaut)
MCP2515 mcp2515 (10);
Et aussi, l'objet dht pour la classe DHT avec broche DHT avec Arduino Nano et le type DHT comme DHT11 est initialisé.
DHT DHT (DHTPIN, DHTTYPE);
Suivant dans void setup ():
Commencez la communication SPI en utilisant l'instruction suivante
SPI.begin ();
Et puis utilisez l'instruction ci-dessous pour commencer à recevoir les valeurs de température et d'humidité du capteur DHT11.
dht.begin ();
Ensuite, le MCP2515 est en cours de réinitialisation à l'aide de la commande suivante
mcp2515.reset ();
Maintenant, le MCP2515 est réglé à une vitesse de 500KBPS et 8MHZ comme horloge
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Et le MCP2525 est réglé en mode normal
mcp2515.setNormalMode ();
Dans la boucle void ():
L'instruction suivante obtient la valeur d'humidité et de température et les stocke dans une variable entière h et t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Ensuite, l'ID CAN est donné comme 0x036 (selon le choix) et DLC comme 8 et nous donnons les données h et t aux données et aux données et mettons toutes les données à 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Mettre à jour la valeur d'humidité dans canMsg.data = t; // Mettre à jour la valeur de température dans canMsg.data = 0x00; // Reste tout avec 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Après tout, pour envoyer le message à CAN BUS, nous utilisons l'instruction suivante.
mcp2515.sendMessage (& canMsg);
Alors maintenant, les données de température et d'humidité sont envoyées sous forme de message au bus CAN.
Explication du code côté récepteur CAN (Arduino UNO)
Dans la section récepteur, Arduino UNO s'est interfacé avec le MCP2515 et l'écran LCD 16x2. Ici, l'Arduino UNO reçoit la température et l'humidité du bus CAN et affiche les données reçues sur l'écran LCD.
Les bibliothèques requises sont d'abord incluses, la bibliothèque SPI pour l'utilisation de la communication SPI, la bibliothèque MCP2515 pour l'utilisation de la communication CAN et la bibliothèque LiquidCrsytal pour l'utilisation d'un écran LCD 16x2 avec Arduino .
#comprendre
Ensuite, les broches LCD qui sont utilisées pour se connecter à l'Arduino UNO sont définies.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal LCD (rs, en, d4, d5, d6, d7);
Un type de données struct est déclaré pour stocker le format de message CAN.
struct can_frame canMsg;
Définissez le numéro de broche auquel SPI CS est connecté (10 par défaut)
MCP2515 mcp2515 (10);
Dans void setup ():
Tout d'abord, l'écran LCD est réglé sur le mode 16x2 et un message de bienvenue s'affiche.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); retard (3000); lcd.clear ();
Commencez la communication SPI en utilisant l'instruction suivante.
SPI.begin ();
Ensuite, le MCP2515 est en cours de réinitialisation à l'aide de la commande suivante.
mcp2515.reset ();
Maintenant, le MCP2515 a une vitesse de 500KBPS et 8MHZ comme horloge.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Et le MCP2525 est réglé en mode normal.
mcp2515.setNormalMode ();
Suivant dans la boucle vide ():
L'instruction suivante est utilisée pour recevoir le message du bus CAN. Si un message est reçu, il entre dans la condition if .
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
Dans la condition if , les données sont reçues et stockées dans c anMsg , les données qui ont une valeur d'humidité et les données qui ont une valeur de température. Les deux valeurs sont stockées dans un entier x et y.
int x = canMsg.data; int y = canMsg.data;
Après avoir reçu les valeurs, les valeurs de température et d'humidité sont affichées sur l'écran LCD 16x2 en utilisant l'instruction suivante.
lcd.setCursor (0,0); lcd.print ("Humidité:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); retard (1000); lcd.clear ();
Fonctionnement de la communication CAN dans Arduino
Une fois que le matériel est prêt, téléchargez le programme pour l'émetteur CAN et le récepteur CAN (les programmes complets sont donnés ci-dessous) dans les cartes Arduino respectives. Lorsqu'il est alimenté, vous devriez remarquer que la valeur de température lue par DHT11 sera envoyée à un autre Arduino via la communication CAN et affichée sur l'écran LCD du 2 ème Arduino comme vous pouvez le voir dans l'image ci-dessous. J'ai également utilisé ma télécommande CA pour vérifier si la température affichée sur l'écran LCD est proche de la température ambiante réelle.
Le travail complet peut être trouvé dans la vidéo ci-dessous. Si vous avez des questions, laissez-les dans la section des commentaires ou utilisez nos forums pour d'autres questions techniques.