- Introduzione alla CAN
- Confronto di CAN su SPI e I2C
- Applicazioni protocollo CAN
- Come utilizzare il protocollo CAN in Arduino
- Componenti richiesti
- Schema elettrico
- Collegamento tra due moduli CAN MCP2515
- Programmazione di Arduino per la comunicazione CAN
- Spiegazione del codice laterale del trasmettitore CAN (Arduino Nano)
- Spiegazione del codice laterale del ricevitore CAN (Arduino UNO)
- Funzionamento della comunicazione CAN in Arduino
Oggi ogni automobile media è composta da circa 60-100 unità di sensori per il rilevamento e lo scambio di informazioni. Con le case automobilistiche che rendono costantemente le loro auto più intelligenti con funzioni come la guida autonoma, il sistema airbag, il monitoraggio della pressione dei pneumatici, il sistema di controllo della velocità ecc., Questo numero dovrebbe solo aumentare. A differenza di altri sensori, questi sensori elaborano informazioni critiche e quindi i dati di questi sensori devono essere comunicati utilizzando protocolli di comunicazione automobilistici standard. Ad esempio, i dati del sistema di controllo della velocità come velocità, posizione dell'acceleratore ecc.Sono valori vitali che vengono inviati all'unità di controllo elettronica (ECU)per decidere il livello di accelerazione dell'auto, una cattiva comunicazione o la perdita di dati qui potrebbe portare a guasti critici. Quindi, a differenza dei protocolli di comunicazione standard come UART, SPI o I2C, i progettisti utilizzano protocolli di comunicazione automobilistici molto affidabili come LIN, CAN, FlexRay ecc.
Tra tutti i protocolli disponibili, CAN è prevalentemente utilizzato e popolare. Abbiamo già discusso cosa è CAN e come funziona CAN. Quindi, in questo articolo esamineremo di nuovo le basi e poi finalmente scambieremo anche i dati tra due Arduino utilizzando la comunicazione CAN. Sembra interessante, vero! Quindi iniziamo.
Introduzione alla CAN
CAN aka Controller Area Network è un bus di comunicazione seriale progettato per applicazioni industriali e automobilistiche. È un protocollo basato su messaggi utilizzato per la comunicazione tra più dispositivi. Quando più dispositivi CAN sono collegati insieme come mostrato di seguito, la connessione forma una rete che agisce come il nostro sistema nervoso centrale consentendo a qualsiasi dispositivo di parlare con qualsiasi altro dispositivo nel nodo.
Una rete CAN sarà composta solo da due fili CAN High e CAN Low per la trasmissione dati bidirezionale come mostrato sopra. In genere la velocità di comunicazione per CAN varia da 50 Kbps a 1 Mbps e la distanza può variare da 40 metri a 1 Mbps a 1000 metri a 50 kpbs.
Formato del messaggio CAN:
Nella comunicazione CAN i dati vengono trasmessi in rete come un particolare formato di messaggio. Questo formato di messaggio contiene molti segmenti, ma due segmenti principali sono l' identificatore e i dati che aiutano a inviare e rispondere ai messaggi nel bus CAN.
Identificatore o ID CAN: l'identificatore è noto anche come ID CAN o anche noto come PGN (Numero gruppo di parametri). Viene utilizzato per identificare i dispositivi CAN presenti in una rete CAN. La lunghezza dell'identificatore è di 11 o 29 bit in base al tipo di protocollo CAN utilizzato.
CAN standard: 0-2047 (11 bit)
CAN estesa: 0-2 29 -1 (29-bit)
Dati: sono i dati effettivi del sensore / controllo che devono essere inviati da un dispositivo a un altro. La lunghezza dei dati può variare da 0 a 8 byte.
Data Length Code (DLC): da 0 a 8 per il numero di byte di dati presenti.
Fili utilizzati in CAN:
Il protocollo CAN è costituito da due fili, ovvero CAN_H e CAN_L, per inviare e ricevere informazioni. Entrambi i fili fungono da linea differenziale, il che significa che il segnale CAN (0 o 1) è rappresentato dalla differenza di potenziale tra CAN_L e CAN_H. Se la differenza è positiva e maggiore di una certa tensione minima, allora è 1 e se la differenza è negativa è 0.
Normalmente per la comunicazione CAN viene utilizzato un cavo a doppino intrecciato. Un singolo resistore da 120 ohm viene generalmente utilizzato alle due estremità della rete CAN come mostrato nell'immagine, questo perché la linea deve essere bilanciata e legata allo stesso potenziale.
Confronto di CAN su SPI e I2C
Dato che abbiamo già imparato a usare SPI con Arduino e IIC con Arduino, confrontiamo le caratteristiche di SPI e I2C con CAN
Parametro | SPI | I2C | PUÒ |
Velocità | Da 3 Mbps a 10 Mbps | Standard: 100 Kbps | Da 10KBps a 1MBps Dipende anche dalla lunghezza del cavo utilizzato |
Veloce: 400 Kbps | |||
Alta velocità: 3,4 Mbps | |||
genere | Sincrono | Sincrono | Asincrono |
Numero di fili | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 fili (SDA, SCL) | 2 fili (CAN_H, CAN_L) |
Duplex | Duplex completo | Half Duplex | Half Duplex |
Applicazioni protocollo CAN
- A causa della robustezza e dell'affidabilità del protocollo CAN, vengono utilizzati in settori come automobilistico, macchine industriali, agricoltura, apparecchiature mediche ecc.
- Poiché la complessità del cablaggio è ridotta in CAN, vengono utilizzati principalmente in applicazioni automobilistiche come le automobili.
- Il basso costo di implementazione e anche il prezzo dei componenti hardware è inferiore.
- Facile da aggiungere e rimuovere i dispositivi CAN bus.
Come utilizzare il protocollo CAN in Arduino
Poiché Arduino non contiene alcuna porta CAN integrata, viene utilizzato un modulo CAN chiamato MCP2515. Questo modulo CAN è interfacciato con Arduino utilizzando la comunicazione SPI. Vediamo di più su MCP2515 in dettaglio e su come si interfaccia con Arduino.
Modulo CAN MCP2515:
Il modulo MCP2515 ha un controller CAN MCP2515 che è un ricetrasmettitore CAN ad alta velocità. La connessione tra MCP2515 e MCU avviene tramite SPI. Quindi, è facile interfacciarsi con qualsiasi microcontrollore dotato di interfaccia SPI.
Per i principianti che vogliono imparare CAN Bus, questo modulo fungerà da buon inizio. Questa scheda CAN SPI è ideale per l'automazione industriale, la domotica e altri progetti embedded automobilistici.
Caratteristiche e specifiche di MCP2515:
- Utilizza il ricetrasmettitore CAN ad alta velocità TJA1050
- Dimensioni: 40 × 28 mm
- Controllo SPI per espandere l'interfaccia Multi CAN bus
- Oscillatore a cristallo 8MHZ
- Resistenza terminale 120Ω
- Ha chiave indipendente, indicatore LED, indicatore di alimentazione
- Supporta il funzionamento CAN a 1 Mb / s
- Funzionamento in standby a bassa corrente
- È possibile collegare fino a 112 nodi
Pinout del modulo CAN MCP2515:
Nome pin |
USO |
VCC |
Pin di ingresso alimentazione 5V |
GND |
Perno di terra |
CS |
PIN di selezione SLAVE SPI (attivo basso) |
COSÌ |
Cavo di uscita slave di ingresso master SPI |
SI |
Cavo di ingresso slave di uscita master SPI |
SCLK |
Perno dell'orologio SPI |
INT |
Pin di interruzione MCP2515 |
In questo tutorial vediamo come inviare i dati del sensore di umidità e temperatura (DHT11) da Arduino Nano ad Arduino Uno tramite il modulo bus CAN MCP2515.
Componenti richiesti
- Arduino UNO
- Arduino NANO
- DHT11
- Display LCD 16x2
- Modulo CAN MCP2515 - 2
- Potenziometro 10k
- Breadboard
- Collegamento dei cavi
Schema elettrico
Collegamento sul lato del trasmettitore CAN:
Componente - 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 - OUT |
A0 |
Collegamenti del circuito sul lato del ricevitore CAN:
Componente - 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 |
Al potenziometro 10K PIN centrale |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - E |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
7 |
LCD - D7 |
8 |
LCD - A |
+ 5V |
LCD - K |
GND |
Collegamento tra due moduli CAN MCP2515
H - PU alto
L - CAN Basso
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Una volta effettuati tutti i collegamenti, il mio hardware appariva come questo sotto
Programmazione di Arduino per la comunicazione CAN
Per prima cosa dobbiamo installare una libreria per CAN nell'IDE di Arduino. L'interfacciamento del modulo CAN MCP2515 con Arduino diventa più semplice utilizzando la seguente libreria.
- Scarica il file ZIP della libreria Arduino CAN MCP2515.
- Dall'IDE di Arduino: Sketch -> Include Library -> Add.ZIP Library
In questo tutorial la codifica è divisa in due parti una come codice del trasmettitore CAN (Arduino Nano) e l'altra come codice del ricevitore CAN (Arduino UNO), entrambi disponibili in fondo a questa pagina. La spiegazione per lo stesso è la seguente.
Prima di scrivere il programma per l'invio e la ricezione dei dati assicurarsi di aver installato la libreria seguendo i passaggi precedenti e che il modulo CAN MCP2515 sia inizializzato nel programma come segue.
Inizializza il modulo CAN MCP2515:
Per creare una connessione con MCP2515 seguire i passaggi:
1. Impostare il numero di pin a cui è collegato SPI CS (10 per impostazione predefinita)
MCP2515 mcp2515 (10);
2. Impostare la velocità di trasmissione e la frequenza dell'oscillatore
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Velocità in baud disponibili:
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_250_150KBPS, CAN_250
Velocità di clock disponibili:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Impostare le modalità.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Spiegazione del codice laterale del trasmettitore CAN (Arduino Nano)
Nella sezione trasmettitore, Arduino Nano si interfaccia con il modulo CAN MCP2515 tramite pin SPI e DHT11 invia i dati di temperatura e umidità al bus CAN.
Innanzitutto sono incluse le librerie richieste, libreria SPI per l'utilizzo della comunicazione SPI, libreria MCP2515 per l'utilizzo della comunicazione CAN e libreria DHT per l'utilizzo del sensore DHT con Arduino . In precedenza abbiamo interfacciato DHT11 con Arduino.
#includere
Ora è definito il nome del pin di DHT11 (pin OUT) che è collegato con l'A0 di Arduino Nano
#define DHTPIN A0
Inoltre, il DHTTYPE è definito come DHT11.
#define DHTTYPE DHT11
Un tipo di dati struct canMsg per memorizzare il formato del messaggio CAN.
struct can_frame canMsg;
Imposta il numero di pin a cui è collegato SPI CS (10 per impostazione predefinita)
MCP2515 mcp2515 (10);
Inoltre, l'oggetto dht per la classe DHT con pin DHT con Arduino Nano e il tipo DHT come DHT11 viene inizializzato.
DHT dht (DHTPIN, DHTTYPE);
Avanti in void setup ():
Inizia la comunicazione SPI utilizzando la seguente dichiarazione
SPI.begin ();
Quindi utilizzare la dichiarazione seguente per iniziare a ricevere i valori di temperatura e umidità dal sensore DHT11.
dht.begin ();
Successivamente l'MCP2515 verrà RESET utilizzando il seguente comando
mcp2515.reset ();
Ora l'MCP2515 ha una velocità impostata di 500KBPS e 8MHZ come orologio
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
E l'MCP2525 è impostato in modalità normale
mcp2515.setNormalMode ();
Nel void loop ():
La seguente istruzione ottiene il valore di umidità e temperatura e memorizza in una variabile intera he t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Successivamente l'ID CAN viene dato come 0x036 (come da scelta) e DLC come 8 e diamo i dati he t ai dati e ai dati e riposizioniamo tutti i dati con 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Aggiorna il valore di umidità in canMsg.data = t; // Aggiorna il valore della temperatura in canMsg.data = 0x00; // Riposa tutto con 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Dopo tutto, per inviare il messaggio a CAN BUS usiamo la seguente dichiarazione.
mcp2515.sendMessage (& canMsg);
Quindi ora i dati di temperatura e umidità vengono inviati come messaggio al bus CAN.
Spiegazione del codice laterale del ricevitore CAN (Arduino UNO)
Nella sezione ricevitore, Arduino UNO si interfaccia con il display LCD MCP2515 e 16x2. Qui Arduino UNO riceve la temperatura e l'umidità dal bus CAN e visualizza i dati ricevuti in LCD.
Innanzitutto sono incluse le librerie richieste, libreria SPI per l'utilizzo della comunicazione SPI, libreria MCP2515 per l'utilizzo della comunicazione CAN e libreria LiquidCrsytal per l'utilizzo di LCD 16x2 con Arduino .
#includere
Successivamente vengono definiti i pin LCD utilizzati per il collegamento con Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Un tipo di dati struct viene dichiarato per memorizzare il formato del messaggio CAN.
struct can_frame canMsg;
Imposta il numero di pin a cui è collegato SPI CS (10 per impostazione predefinita)
MCP2515 mcp2515 (10);
In void setup ():
Per prima cosa l'LCD è impostato in modalità 16x2 e viene visualizzato un messaggio di benvenuto.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); ritardo (3000); lcd.clear ();
Inizia la comunicazione SPI utilizzando la seguente dichiarazione.
SPI.begin ();
Successivamente l'MCP2515 verrà RESET utilizzando il seguente comando.
mcp2515.reset ();
Ora l'MCP2515 ha una velocità impostata di 500KBPS e 8MHZ come orologio.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
E l'MCP2525 è impostato in modalità normale.
mcp2515.setNormalMode ();
Avanti in void loop ():
La seguente istruzione viene utilizzata per ricevere il messaggio dal bus CAN. Se il messaggio viene ricevuto, entra nella condizione if .
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
Nella condizione if i dati vengono ricevuti e memorizzati in c anMsg , i dati che hanno valore di umidità e i dati che hanno valore di temperatura. Entrambi i valori sono memorizzati in un numero intero x e y.
int x = canMsg.data; int y = canMsg.data;
Dopo aver ricevuto i valori, i valori di temperatura e umidità vengono visualizzati nel display LCD 16x2 utilizzando la seguente dichiarazione.
lcd.setCursor (0,0); lcd.print ("Umidità:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); ritardo (1000); lcd.clear ();
Funzionamento della comunicazione CAN in Arduino
Una volta che l'hardware è pronto, caricare il programma per il trasmettitore CAN e il ricevitore CAN (i programmi completi sono riportati di seguito) nelle rispettive schede Arduino. All'accensione dovresti notare che il valore di temperatura letto da DHT11 verrà inviato ad un altro Arduino tramite comunicazione CAN e visualizzato sul display LCD del 2 ° Arduino come puoi vedere nell'immagine sottostante. Ho anche usato il mio telecomando AC per verificare se la temperatura visualizzata sul display LCD è vicina alla temperatura ambiente effettiva.
La lavorazione completa si trova nel video linkato di seguito. Se hai domande, lasciale nella sezione commenti o usa i nostri forum per altre domande tecniche.