- Introducere în CAN
- Comparația CAN peste SPI și I2C
- Aplicații de protocol CAN
- Cum se utilizează protocolul CAN în Arduino
- Componente necesare
- Diagrama circuitului
- Conexiune între două module CAN MCP2515
- Programarea Arduino pentru comunicarea CAN
- Explicația codului lateral al emițătorului CAN (Arduino Nano)
- Explicație privind codul lateral al receptorului (Arduino UNO)
- Funcționarea comunicării CAN în Arduino
Astăzi, orice mașină medie este formată din aproximativ 60 până la 100 de unități de senzori pentru a detecta și a schimba informații. Cu fabricanții de mașini care își fac în mod constant mașina mai inteligentă, cu funcții precum conducerea autonomă, sistemul Airbag, monitorizarea presiunii în anvelope, sistemul de control al vitezei de croazieră, etc. Spre deosebire de alți senzori, acești senzori procesează informații critice și, prin urmare, datele de la acești senzori trebuie comunicate utilizând protocoale standard de comunicații auto. De exemplu, datele sistemului de control al vitezei de croazieră, cum ar fi viteza, poziția clapetei de accelerație etc. sunt valori vitale care sunt trimise către Unitatea de control electronic (ECU)pentru a decide nivelul de accelerație al mașinii, o comunicare greșită sau pierderea datelor aici ar putea duce la eșecuri critice. Prin urmare, spre deosebire de protocoalele de comunicații standard precum UART, SPI sau I2C, proiectanții folosesc protocoale de comunicații auto foarte fiabile precum LIN, CAN, FlexRay etc.
Dintre toate protocoalele disponibile, CAN este mai popular și mai utilizat. Am discutat deja ce este CAN și cum funcționează CAN. Deci, în acest articol vom analiza din nou elementele de bază și apoi, în cele din urmă, vom face schimb de date și între doi Arduino folosind comunicarea CAN. Sună interesant, nu-i așa! Deci sa începem.
Introducere în CAN
CAN aka Controller Area Network este o magistrală de comunicații serială concepută pentru aplicații industriale și auto. Este un protocol bazat pe mesaje utilizat pentru comunicarea între mai multe dispozitive. Când mai multe dispozitive CAN sunt conectate împreună așa cum se arată mai jos, conexiunea formează o rețea care acționează ca sistemul nostru nervos central, permițând oricărui dispozitiv să vorbească cu orice alt dispozitiv din nod.
O rețea CAN va consta din doar două fire CAN High și CAN Low pentru transmisia bidirecțională a datelor, așa cum se arată mai sus. De obicei, viteza de comunicare pentru CAN variază de la 50 Kbps la 1 Mbps, iar distanța poate varia de la 40 de metri la 1 Mbps până la 1000 de metri la 50 kbps.
Formatul mesajului CAN:
În comunicarea CAN, datele sunt transmise în rețea ca un anumit format de mesaj. Acest format de mesaj conține mai multe segmente, dar două segmente principale sunt identificatorul și datele, care ajută la trimiterea și răspunsul la mesaje în magistrala CAN.
Identificator sau CAN ID: identificatorul este, de asemenea, cunoscut sub numele de CAN ID sau cunoscut și ca PGN (Parameter Group Number). Este folosit pentru a identifica dispozitivele CAN prezente într-o rețea CAN. Lungimea identificatorului este de 11 sau 29 de biți pe baza tipului de protocol CAN utilizat.
CAN standard: 0-2047 (11 biți)
CAN extins: 0-2 29 -1 (29 biți)
Date: Acestea sunt datele reale ale senzorului / controlului care trebuie trimise de la un dispozitiv la altul. Datele despre dimensiune pot avea o lungime cuprinsă între 0 și 8 octeți.
Codul lungimii datelor (DLC): de la 0 la 8 pentru numărul de octeți de date prezenți.
Firele utilizate în CAN:
Protocolul CAN constă din două fire și anume CAN_H și CAN_L pentru a trimite și primi informații. Ambele fire acționează ca o linie diferențială, ceea ce înseamnă că semnalul CAN (0 sau 1) este reprezentat de diferența de potențial între CAN_L și CAN_H. Dacă diferența este pozitivă și mai mare decât o anumită tensiune minimă, atunci este 1 și dacă diferența este negativă, este 0.
În mod normal, pentru comunicarea CAN se folosește un cablu pereche răsucite. Un singur rezistor de 120 ohmi este utilizat în general la cele două capete ale rețelei CAN așa cum se arată în imagine, acest lucru se datorează faptului că linia trebuie să fie echilibrată și legată de același potențial.
Comparația CAN peste SPI și I2C
Deoarece am învățat deja cum să folosim SPI cu Arduino și IIC cu Arduino, să comparăm caracteristicile SPI și I2C cu CAN
Parametru | SPI | I2C | POATE SA |
Viteză | De la 3 Mbps la 10 Mbps | Standard: 100Kbps | 10KBps la 1MBps Depinde, de asemenea, de lungimea firului utilizat |
Rapid: 400 Kbps | |||
Viteză ridicată: 3,4 Mbps | |||
Tip | Sincron | Sincron | Asincron |
Număr de fire | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 fire (SDA, SCL) | 2 fire (CAN_H, CAN_L) |
Duplex | Duplex complet | Jumătate duplex | Jumătate duplex |
Aplicații de protocol CAN
- Datorită robusteții și fiabilității protocolului CAN, acestea sunt utilizate în industrii precum Automobile, Mașini industriale, Agricultură, Echipamente medicale etc.
- Deoarece complexitatea cablajului este redusă în CAN, acestea sunt utilizate în principal în aplicații auto, cum ar fi mașina.
- Costul redus pentru implementare și, de asemenea, prețul componentelor hardware este, de asemenea, mai mic.
- Ușor de adăugat și de eliminat dispozitivele CAN bus.
Cum se utilizează protocolul CAN în Arduino
Deoarece Arduino nu conține niciun port CAN încorporat, este utilizat un modul CAN numit MCP2515. Acest modul CAN este interfațat cu Arduino utilizând comunicația SPI. Să vedem mai multe despre MCP2515 în detaliu și cum este interfațat cu Arduino.
Modul CAN MCP2515:
Modulul MCP2515 are un controler CAN MCP2515 care este un transceiver CAN de mare viteză. Conexiunea dintre MCP2515 și MCU se face prin SPI. Deci, este ușor de interfațat cu orice microcontroler care are interfață SPI.
Pentru începătorii care doresc să învețe CAN Bus, acest modul va acționa ca un bun început. Această placă CAN SPI este ideală pentru automatizarea industrială, automatizarea locuințelor și alte proiecte încorporate auto.
Caracteristici și specificații ale MCP2515:
- Utilizează transmițător CAN de mare viteză TJA1050
- Dimensiune: 40 × 28mm
- Control SPI pentru extinderea interfeței magistralei CAN multiple
- Oscilator cu cristal de 8 MHz
- Rezistența terminalului 120Ω
- Are cheie independentă, indicator LED, indicator de alimentare
- Suportă funcționarea CAN de 1 Mb / s
- Funcționare de așteptare cu curent redus
- Pot fi conectate până la 112 noduri
Pinout al modulului CAN MCP2515:
Nume PIN |
UTILIZARE |
VCC |
Pin de intrare de alimentare 5V |
GND |
Știftul de la sol |
CS |
Pin de selectare SPI SLAVE (activ scăzut) |
ASA DE |
Cablu de ieșire slave de intrare master SPI |
SI |
Cablu de intrare slave de ieșire master SPI |
SCLK |
Știft de ceas SPI |
INT |
PIN de întrerupere MCP2515 |
În acest tutorial să vedem cum să trimitem datele senzorului de umiditate și temperatură (DHT11) de la Arduino Nano la Arduino Uno prin modulul de magistrală CAN MCP2515.
Componente necesare
- Arduino UNO
- Arduino NANO
- DHT11
- Afișaj LCD 16x2
- MCP2515 Modul CAN - 2
- Potențiometru 10k
- Breadboard
- Conectarea firelor
Diagrama circuitului
Conexiune pe partea transmițătorului CAN:
Componentă - 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 |
Conexiuni de circuit la partea receptorului CAN:
Componentă - 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 |
Până la codul PIN de 10K al centrului potențiometrului |
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 |
Conexiune între două module CAN MCP2515
H - POATE ridicat
L - CAN Low
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
După ce s-au făcut toate conexiunile, hardware-ul meu arăta așa mai jos
Programarea Arduino pentru comunicarea CAN
Mai întâi trebuie să instalăm o bibliotecă pentru CAN în Arduino IDE. Interfațarea modulului CAN MCP2515 cu Arduino devine mai ușoară utilizând următoarea bibliotecă.
- Descărcați fișierul ZIP al bibliotecii Arduino CAN MCP2515.
- Din IDE Arduino: Sketch -> Include Library -> Add.ZIP Library
În acest tutorial, codificarea este împărțită în două părți, una ca cod transmițător CAN (Arduino Nano) și alta ca cod receptor CAN (Arduino UNO), ambele fiind găsite în partea de jos a acestei pagini. Explicația pentru același lucru este următoarea.
Înainte de a scrie programul pentru trimiterea și primirea datelor, asigurați-vă că ați instalat biblioteca urmând pașii de mai sus și că modulul CAN MCP2515 este inițializat în programul dvs. după cum urmează.
Inițializați modulul CAN MCP2515:
Pentru a crea conexiunea cu MCP2515 urmați pașii:
1. Setați numărul pinului la care SPI CS este conectat (10 în mod implicit)
MCP2515 mcp2515 (10);
2. Setați rata de transmisie și frecvența oscilatorului
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Tarife Baud disponibile:
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_200KBKPS, CAN_50, CAN_50, CAN_50
Viteze de ceas disponibile:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Setați modurile.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Explicația codului lateral al emițătorului CAN (Arduino Nano)
În secțiunea transmițător, Arduino Nano a fost interfațat cu modulul CAN MCP2515 prin pinii SPI și DHT11 trimite date de temperatură și umiditate la magistrala CAN.
Mai întâi sunt incluse bibliotecile necesare, Biblioteca SPI pentru utilizarea comunicării SPI, Biblioteca MCP2515 pentru utilizarea comunicării CAN și Biblioteca DHT pentru utilizarea senzorului DHT cu Arduino . Am interfațat anterior DHT11 cu Arduino.
#include
Acum este definit numele pinului DHT11 (pin OUT) care este conectat cu A0 al Arduino Nano
#define DHTPIN A0
Și, de asemenea, DHTTYPE este definit ca DHT11.
#define DHTTYPE DHT11
Un tip de date struct canMsg pentru stocarea formatului mesajului CAN.
struct can_frame canMsg;
Setați numărul pinului la care SPI CS este conectat (10 în mod implicit)
MCP2515 mcp2515 (10);
Și, de asemenea, obiectul dht pentru clasa DHT cu pin DHT cu tip Arduino Nano și DHT, deoarece DHT11 este inițializat.
DHT dht (DHTPIN, DHTTYPE);
Următorul în setarea nulă ():
Începeți comunicarea SPI utilizând următoarea declarație
SPI.begin ();
Și apoi utilizați declarația de mai jos pentru a începe să primiți valori de temperatură și umiditate de la senzorul DHT11.
dht.begin ();
În continuare, MCP2515 este RESETAT utilizând următoarea comandă
mcp2515.reset ();
Acum, MCP2515 este setat la o viteză de 500KBPS și 8MHZ ca ceas
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Iar MCP2525 este setat în modul normal
mcp2515.setNormalMode ();
În bucla de gol ():
Următoarea afirmație obține valoarea Umiditate și Temperatură și stochează într-o variabilă întreagă h și t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Apoi, ID-ul CAN este dat ca 0x036 (după alegere) și DLC ca 8 și le oferim datele h și t pentru date și date și restăm toate datele cu 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Actualizați valoarea umidității în canMsg.data = t; // Actualizați valoarea temperaturii în canMsg.data = 0x00; // Odihnește-le pe toate cu 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
La urma urmei, pentru a trimite mesajul către CAN BUS folosim următoarea declarație.
mcp2515.sendMessage (& canMsg);
Așadar, acum datele despre temperatură și umiditate sunt trimise ca mesaj către magistrala CAN.
Explicație privind codul lateral al receptorului (Arduino UNO)
În secțiunea receptorului, Arduino UNO a fost interfațat cu afișajul LCD MCP2515 și 16x2. Aici Arduino UNO primește temperatura și umiditatea de la magistrala CAN și afișează datele primite în LCD.
Mai întâi sunt incluse bibliotecile necesare, Biblioteca SPI pentru utilizarea comunicării SPI, Biblioteca MCP2515 pentru utilizarea comunicării CAN și Biblioteca LiquidCrsytal pentru utilizarea LCD 16x2 cu Arduino .
#include
Apoi sunt definite pinii LCD care sunt utilizați pentru conectarea cu 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 tip de date struct este declarat pentru stocarea formatului de mesaj CAN.
struct can_frame canMsg;
Setați numărul pinului la care SPI CS este conectat (10 în mod implicit)
MCP2515 mcp2515 (10);
În configurarea nulă ():
Mai întâi, ecranul LCD este setat în modul 16x2 și se afișează un mesaj de întâmpinare.
lcd.inceput (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); întârziere (3000); lcd.clear ();
Începeți comunicarea SPI utilizând următoarea declarație.
SPI.begin ();
În continuare, MCP2515 este RESETAT utilizând următoarea comandă.
mcp2515.reset ();
Acum, MCP2515 este setat la o viteză de 500KBPS și 8MHZ ca ceas.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Iar MCP2525 este setat în modul normal.
mcp2515.setNormalMode ();
Următorul în bucla nulă ():
Următoarea declarație este utilizată pentru a primi mesajul de la magistrala CAN. Dacă mesajul este primit, acesta intră în condiția if .
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
În condiția if , datele sunt primite și stocate în c anMsg , datele care au valoare de umiditate și datele care au valoare de temperatură. Ambele valori sunt stocate într-un număr întreg x și y.
int x = canMsg.data; int y = canMsg.data;
După primirea valorilor, valorile de temperatură și umiditate sunt afișate pe afișajul LCD 16x2 folosind următoarea declarație.
lcd.setCursor (0,0); lcd.print ("Umiditate:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); întârziere (1000); lcd.clear ();
Funcționarea comunicării CAN în Arduino
Odată ce hardware-ul este gata, încărcați programul pentru emițătorul CAN și receptorul CAN (programele complete sunt prezentate mai jos) pe plăcile Arduino respective. Când este alimentat, ar trebui să observați că temperatura citită de DHT11 va fi trimisă către un alt Arduino prin comunicare CAN și afișată pe ecranul LCD al celui de-al doilea Arduino, după cum puteți vedea în imaginea de mai jos. De asemenea, am folosit telecomanda AC pentru a verifica dacă temperatura afișată pe ecranul LCD este aproape de temperatura camerei reale.
Lucrarea completă poate fi găsită la videoclipul legat mai jos. Dacă aveți întrebări, lăsați-le în secțiunea de comentarii sau folosiți forumurile noastre pentru alte întrebări tehnice.