- Introducció a CAN
- Comparació de CAN sobre SPI i I2C
- Aplicacions de protocol CAN
- Com s'utilitza el protocol CAN a Arduino
- Components necessaris
- Esquema de connexions
- Connexió entre dos mòduls CAN MCP2515
- Programació d'Arduino per a la comunicació CAN
- Explicació del codi lateral del transmissor CAN (Arduino Nano)
- Explicació del codi lateral del receptor CAN (Arduino UNO)
- Funcionament de la comunicació CAN en Arduino
Avui en dia qualsevol cotxe mitjà consta d’entre 60 i 100 unitats de sensors per detectar i intercanviar informació. Amb les fabricacions d'automòbils que fan que el seu cotxe sigui més intel·ligent constantment amb funcions com la conducció autònoma, el sistema de coixins de seguretat, el control de la pressió dels pneumàtics, el sistema de control de velocitat, etc., aquest nombre només s'espera que sigui elevat. A diferència d'altres sensors, aquests sensors processen informació crítica i, per tant, les dades d'aquests sensors s'han de comunicar mitjançant protocols de comunicació estàndard de l' automòbil. Per exemple, les dades del sistema de control de velocitat de creixement, com ara la velocitat, la posició de l’accelerador, etc., són valors vitals que s’envien a la unitat de control electrònic (ECU)per decidir el nivell d’acceleració del cotxe, una mala comunicació o pèrdua de dades aquí podria provocar fallades crítiques. Per tant, a diferència dels protocols de comunicació estàndard com UART, SPI o I2C, els dissenyadors utilitzen protocols de comunicació d’automòbils molt fiables com LIN, CAN, FlexRay, etc.
De tots els protocols disponibles, CAN és més popular i utilitzat predominantment. Ja hem comentat què és CAN i com funciona CAN. Per tant, en aquest article tornarem a examinar els conceptes bàsics i, finalment, també intercanviarem dades entre dos Arduinos mitjançant la comunicació CAN. Sona interessant oi! Comencem, doncs.
Introducció a CAN
CAN aka Controller Area Network és un bus de comunicació en sèrie dissenyat per a aplicacions industrials i automobilístiques. És un protocol basat en missatges utilitzat per a la comunicació entre diversos dispositius. Quan diversos dispositius CAN es connecten junts com es mostra a continuació, la connexió forma una xarxa que actua com el nostre sistema nerviós central permetent que qualsevol dispositiu parli amb qualsevol altre dispositiu del node.

Una xarxa CAN estarà formada només per dos cables CAN High i CAN Low per a la transmissió de dades bidireccional, tal com es mostra més amunt. Normalment, la velocitat de comunicació per a CAN oscil·la entre 50 Kbps i 1 Mbps i la distància pot oscil·lar entre 40 metres a 1 Mbps i 1000 metres a 50 kbps.
Format del missatge CAN:
A la comunicació CAN les dades es transmeten a la xarxa com un format de missatge concret. Aquest format de missatge conté molts segments, però dos segments principals són l’ identificador i les dades que ajuden a enviar i respondre missatges al bus CAN.
Identificador o identificador CAN: l'identificador també es coneix com a identificador CAN o també es coneix com a PGN (Parameter Group Number). S'utilitza per identificar els dispositius CAN presents a una xarxa CAN. La longitud de l’identificador és d’11 o 29 bits segons el tipus de protocol CAN utilitzat.
CAN estàndard: 0-2047 (11 bits)
CAN ampliat: 0-2 29 -1 (29 bits)
Dades: són les dades reals del sensor / control que s’han d’enviar d’un dispositiu a un altre. Les dades de mida poden tenir entre 0 i 8 bytes de longitud.
Codi de longitud de dades (DLC): de 0 a 8 per al nombre de bytes de dades presents.
Filferros utilitzats a CAN:
El protocol CAN consta de dos cables, és a dir, CAN_H i CAN_L per enviar i rebre informació. Tots dos cables actuen com una línia diferencial, és a dir, el senyal CAN (0 o 1) està representat per la diferència de potencial entre CAN_L i CAN_H. Si la diferència és positiva i és superior a una tensió mínima determinada, és 1 i si la diferència és negativa, és 0.
Normalment, s’utilitza un cable de parell trenat per a la comunicació CAN. Generalment s’utilitza una sola resistència de 120 ohm als dos extrems de la xarxa CAN, tal com es mostra a la imatge, perquè la línia ha d’estar equilibrada i lligada al mateix potencial.
Comparació de CAN sobre SPI i I2C
Com que ja hem après a utilitzar SPI amb Arduino i IIC amb Arduino, comparem les funcions de SPI i I2C amb CAN
| Paràmetre | SPI | I2C | LLAUNA |
| Velocitat | De 3 Mbps a 10 Mbps | Estàndard: 100 Kbps | De 10 KB a 1 Mbps També depèn de la longitud del cable utilitzat |
| Ràpid: 400 Kbps | |||
| Velocitat alta: 3,4 Mbps | |||
| Tipus | Síncrona | Síncrona | Asíncron |
| Nombre de cables | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 cables (SDA, SCL) | 2 cables (CAN_H, CAN_L) |
| Dúplex | Dúplex complet | Mig dúplex | Mig dúplex |
Aplicacions de protocol CAN
- A causa de la robustesa i fiabilitat del protocol CAN, s’utilitzen en indústries com ara automoció, màquines industrials, agricultura, equipament mèdic, etc.
- Com que la complexitat del cablejat es redueix a CAN, s’utilitzen principalment en aplicacions d’automoció com el cotxe.
- El cost baix d’implementació i el preu dels components de maquinari també és menor.
- Fàcil d'afegir i eliminar els dispositius de bus CAN.
Com s'utilitza el protocol CAN a Arduino
Com que Arduino no conté cap port CAN incorporat, s’utilitza un mòdul CAN anomenat MCP2515. Aquest mòdul CAN es relaciona amb Arduino mitjançant la comunicació SPI. Vegem més detalls sobre l’MCP2515 i com s’interface amb Arduino.
Mòdul CAN MCP2515:

El mòdul MCP2515 té un controlador CAN MCP2515 que és un transceptor CAN d'alta velocitat. La connexió entre MCP2515 i MCU es fa mitjançant SPI. Per tant, és fàcil connectar-se amb qualsevol microcontrolador que tingui interfície SPI.
Per als principiants que vulguin aprendre CAN Bus, aquest mòdul actuarà com un bon començament. Aquesta placa CAN SPI és ideal per a automatismes industrials, domòtics i altres projectes incrustats en automoció.
Característiques i especificacions de MCP2515:
- Utilitza un transceptor CAN d'alta velocitat TJA1050
- Dimensió: 40 × 28 mm
- Control SPI per ampliar la interfície de bus Multi CAN
- Oscil·lador de cristall de 8 MHz
- Resistència del terminal de 120Ω
- Té clau independent, indicador LED, indicador d'alimentació
- Admet l'operació CAN d'1 Mb / s
- Funcionament en espera de baixa intensitat
- Es poden connectar fins a 112 nodes
Pinout del mòdul CAN MCP2515:
|
Nom del pin |
ÚS |
|
VCC |
Pin d'entrada d'alimentació de 5V |
|
GND |
Pas de terra |
|
CS |
Pin de selecció SPI SLAVE (actiu baix) |
|
TAN |
Conductor de sortida esclau d'entrada mestre SPI |
|
SI |
Conductor d’entrada esclau de sortida mestre SPI |
|
SCLK |
Pin de rellotge SPI |
|
INT |
Pin d'interrupció MCP2515 |
En aquest tutorial veurem com enviar dades del sensor d’humitat i temperatura (DHT11) des d’Arduino Nano a Arduino Uno mitjançant el mòdul de bus CAN MCP2515.
Components necessaris
- Arduino UNO
- Arduino NANO
- DHT11
- Pantalla LCD de 16x2
- Mòdul CAN MCP2515 - 2
- Potenciòmetre de 10 k
- Taula de pa
- Connexió de cables
Esquema de connexions

Connexió al costat del transmissor 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 |
Connexions de circuits al costat del receptor 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 |
Al PIN del centre del potenciòmetre de 10K |
|
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 |
Connexió entre dos mòduls CAN MCP2515
H - CAN alt
L - CAN Baix
|
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
|
H |
H |
|
L |
L |
Un cop fetes totes les connexions, el meu maquinari semblava a continuació

Programació d'Arduino per a la comunicació CAN
Primer hem d’instal·lar una biblioteca per a CAN a Arduino IDE. La interfície del mòdul CAN MCP2515 amb l'Arduino es fa més fàcil mitjançant la següent biblioteca.
- Descarregueu el fitxer ZIP de la biblioteca CAN MCP2515 d'Arduino.
- Des de l’IDE Arduino: Sketch -> Include Library -> Add.ZIP Library
En aquest tutorial, la codificació es divideix en dues parts, una com a codi de transmissor CAN (Arduino Nano) i una altra com a codi de receptor CAN (Arduino UNO), que es troben a la part inferior d'aquesta pàgina. L’explicació del mateix és la següent.
Abans d'escriure el programa per enviar i rebre dades, assegureu-vos que heu instal·lat la biblioteca seguint els passos anteriors i que el mòdul CAN MCP2515 s'inicialitza al programa de la manera següent.
Inicialitzeu el mòdul CAN MCP2515:
Per crear connexió amb MCP2515, seguiu els passos següents:
1. Definiu el número de pin on està connectat SPI CS (10 per defecte)
MCP2515 mcp2515 (10);
2. Estableix la velocitat de transmissió i la freqüència de l’oscil·lador
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Tarifes 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_200KBKPS, CAN_50, CAN_50, CAN_50
Velocitats de rellotge disponibles:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Establir modes.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Explicació del codi lateral del transmissor CAN (Arduino Nano)
A la secció del transmissor, Arduino Nano s’ha connectat amb el mòdul CAN MCP2515 mitjançant pins SPI i DHT11 envia dades de temperatura i humitat al bus CAN.
Primer s’inclouen les biblioteques necessàries, Biblioteca SPI per utilitzar la comunicació SPI, Biblioteca MCP2515 per utilitzar la comunicació CAN i Biblioteca DHT per utilitzar el sensor DHT amb Arduino . Prèviament hem interfaçat DHT11 amb Arduino.
#incloure
Ara es defineix el nom del pin de DHT11 (pin OUT) que està connectat amb l'A0 d'Arduino Nano
#defineix DHTPIN A0
I també, el DHTTYPE es defineix com DHT11.
#define DHTTYPE DHT11
Un tipus de dades d’estructura canMsg per emmagatzemar el format de missatge CAN.
struct can_frame canMsg;
Definiu el número de PIN on està connectat SPI CS (10 per defecte)
MCP2515 mcp2515 (10);
I també, objecte dht per a la classe DHT amb pin DHT amb Arduino Nano i tipus DHT com DHT11 s’inicialitza.
DHT dht (DHTPIN, DHTTYPE);
Següent a la configuració nul·la ():
Comenceu la comunicació SPI mitjançant la següent declaració
SPI.begin ();
A continuació, utilitzeu la sentència següent per començar a rebre valors de temperatura i humitat del sensor DHT11.
dht.begin ();
A continuació, el MCP2515 s'està RESET mitjançant l'ordre següent
mcp2515.reset ();
Ara l'MCP2515 té una velocitat de 500 KBPS i 8 MHz com a rellotge
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
I el MCP2525 està configurat en mode normal
mcp2515.setNormalMode ();
Al bucle buit ():
La següent afirmació obté el valor Humitat i temperatura i s’emmagatzema en una variable sencera h i t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
A continuació, l'ID CAN es dóna com a 0x036 (a elecció) i DLC com 8 i ens donen les dades HYT als dades i les dades i la resta de dades amb tots 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Actualitza el valor de la humitat a canMsg.data = t; // Actualitza el valor de la temperatura a canMsg.data = 0x00; // Descanseu-ho tot amb 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Al cap i a la fi, per enviar el missatge a CAN BUS utilitzem la següent afirmació.
mcp2515.sendMessage (& canMsg);
Ara les dades de temperatura i humitat s’envien com a missatge al bus CAN.
Explicació del codi lateral del receptor CAN (Arduino UNO)
A la secció del receptor, Arduino UNO es va connectar amb la pantalla LCD MCP2515 i 16x2. Aquí Arduino UNO rep la temperatura i la humitat del bus CAN i mostra les dades rebudes en pantalla LCD.
Primer s’inclouen les biblioteques necessàries, la biblioteca SPI per utilitzar la comunicació SPI, la biblioteca MCP2515 per utilitzar la comunicació CAN i la biblioteca LiquidCrsytal per utilitzar la pantalla LCD 16x2 amb Arduino .
#incloure
A continuació, es defineixen els pins LCD que s'utilitzen per connectar-se amb l'Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Es declara un tipus de dades estruct per emmagatzemar el format de missatge CAN.
struct can_frame canMsg;
Definiu el número de PIN on està connectat SPI CS (10 per defecte)
MCP2515 mcp2515 (10);
En configuració nul·la ():
Primer, la pantalla LCD es configura en mode 16x2 i es mostra un missatge de benvinguda.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); retard (3000); lcd.clear ();
Comenceu la comunicació SPI mitjançant la següent declaració.
SPI.begin ();
A continuació, el MCP2515 s'està RESET mitjançant l'ordre següent.
mcp2515.reset ();
Ara l'MCP2515 té una velocitat de 500 KBPS i 8 MHz com a rellotge.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
I el MCP2525 està configurat en mode normal.
mcp2515.setNormalMode ();
Següent en bucle buit ():
La següent declaració s’utilitza per rebre el missatge del bus CAN. Si es rep un missatge, entra a la condició if .
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
En la condició if , les dades es reben i s'emmagatzemen en c anMsg , les dades que tenen un valor d'humitat i les dades que tenen un valor de temperatura. Els dos valors s’emmagatzemen en un enter x i y.
int x = canMsg.data; int y = canMsg.data;
Després de rebre els valors, els valors de temperatura i humitat es mostren a la pantalla LCD de 16x2 mitjançant la següent afirmació.
lcd.setCursor (0,0); lcd.print ("Humitat:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); retard (1000); lcd.clear ();
Funcionament de la comunicació CAN en Arduino
Un cop el maquinari estigui a punt, pengeu el programa per al transmissor CAN i el receptor CAN (els programes complets es donen a continuació) a les respectives plaques Arduino. Quan estigueu alimentat, heu de notar que el valor de temperatura llegit per DHT11 s'enviarà a un altre Arduino mitjançant la comunicació CAN i es mostrarà a la pantalla LCD del segon Arduino, tal com es pot veure a la imatge següent. També he utilitzat el comandament a distància per comprovar si la temperatura que es mostra a la pantalla LCD s’acosta a la temperatura real.

El treball complet es pot trobar al vídeo enllaçat a continuació. Si teniu alguna pregunta, deixeu-los a la secció de comentaris o utilitzeu els nostres fòrums per a altres qüestions tècniques.
