- Uvod u CAN
- Usporedba CAN-a s SPI i I2C
- Primjene CAN protokola
- Kako koristiti CAN protokol u Arduinu
- Komponente potrebne
- Kružni dijagram
- Veza između dva MCP2515 CAN modula
- Programiranje Arduina za CAN komunikaciju
- Objašnjenje bočnog koda CAN odašiljača (Arduino Nano)
- Objašnjenje boka CAN prijemnika (Arduino UNO)
- Rad CAN komunikacije u Arduinu
Danas se svaki prosječni automobil u njemu sastoji od oko 60 do 100 senzorskih jedinica za otkrivanje i razmjenu informacija. Budući da proizvođači automobila neprestano čine njihov automobil pametnijim, sa značajkama poput autonomne vožnje, sustavom zračnih jastuka, nadzorom tlaka u gumama, sustavom tempomata itd., Očekuje se da će ovaj broj biti visok. Za razliku od ostalih senzora, ti senzori obrađuju kritične informacije pa bi se podaci s tih senzora trebali prenositi pomoću standardnih automobilskih komunikacijskih protokola. Na primjer, podaci sustava tempomata poput brzine, položaja leptira za gas itd. Vitalne su vrijednosti koje se šalju elektroničkoj upravljačkoj jedinici (ECU)da bi se odlučila razina ubrzanja automobila, pogrešna komunikacija ili gubitak podataka ovdje mogli bi dovesti do kritičnih kvarova. Stoga za razliku od standardnih komunikacijskih protokola poput UART, SPI ili I2C, dizajneri koriste mnogo pouzdane automobilske komunikacijske protokole poput LIN, CAN, FlexRay itd.
Od svih dostupnih protokola CAN je pretežito korišten i popularniji. Već smo razgovarali o tome što je CAN i kako CAN djeluje. Dakle, u ovom ćemo članku ponovno proučiti osnove, a zatim ćemo na kraju razmijeniti podatke između dva Arduinosa koristeći CAN komunikaciju. Zvuči zanimljivo, zar ne! Dakle, krenimo.
Uvod u CAN
CAN aka Controller Area Network je serijska komunikacijska sabirnica dizajnirana za industrijske i automobilske primjene. To je protokol zasnovan na porukama koji se koristi za komunikaciju između više uređaja. Kad je više CAN uređaja povezano zajedno, kao što je prikazano dolje, veza tvori mrežu koja djeluje poput našeg središnjeg živčanog sustava omogućavajući bilo kojem uređaju da razgovara s bilo kojim drugim uređajem u čvoru.

CAN Mreža će se sastojati od samo dvije žice CAN High i CAN-Low za dvosmjerno prijenos podataka kao što je prikazano gore. Obično se brzina komunikacije za CAN kreće od 50 Kbps do 1Mbps, a udaljenost može biti od 40 metara pri 1Mbps do 1000 metara pri 50kbbs.
Format CAN poruke:
U CAN komunikaciji podaci se prenose u mreži kao određeni format poruke. Ovaj format poruke sadrži mnogo segmenata, ali dva glavna segmenta su identifikator i podaci koji pomažu u slanju i odgovoru na poruke u CAN sabirnici.
Identifikator ili CAN ID: Identifikator je također poznat kao CAN ID ili također poznat kao PGN (broj grupe parametara). Koristi se za prepoznavanje CAN uređaja prisutnih u CAN mreži. Duljina identifikatora je 11 ili 29 bitova ovisno o vrsti korištenog CAN protokola.
Standardni CAN: 0-2047 (11-bitni)
Prošireni CAN: 0-2 29 -1 (29-bit)
Podaci: Ovo su stvarni podaci senzora / upravljanja koji se moraju slati s jednog uređaja na drugi. Podaci o veličini mogu biti od 0 do 8 bajtova.
Kôd duljine podataka (DLC): 0 do 8 za broj prisutnih bajtova podataka.
Žice koje se koriste u CAN-u:
CAN protokol sastoji se od dvije žice, naime CAN_H i CAN_L za slanje i primanje informacija. Obje žice djeluju kao diferencijalna linija, što znači da je signal CAN (0 ili 1) predstavljen potencijalnom razlikom između CAN_L i CAN_H. Ako je razlika pozitivna i veća je od određenog minimalnog napona, onda je 1, a ako je razlika negativna 0.
Obično se za CAN komunikaciju koristi kabel s upletenom parom. Pojedinačni otpor od 120 oma obično se koristi na dva kraja mreže CAN, kao što je prikazano na slici, to je zato što vod mora biti uravnotežen i povezan s istim potencijalom.
Usporedba CAN-a s SPI i I2C
Budući da smo već naučili kako koristiti SPI s Arduinom i IIC s Arduinom, usporedimo značajke SPI i I2C s CAN-om
| Parametar | SPI | I2C | LIMENKA | 
| Ubrzati | 3Mbps do 10Mbps | Standardno: 100Kbps | 10KBps do 1MBps Također ovisi o duljini korištene žice | 
| Brzo: 400 Kbps | |||
| Velika brzina: 3,4 Mb / s | |||
| Tip | Sinkroni | Sinkroni | Asinkroni | 
| Broj žica | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 žice (SDA, SCL) | 2 žice (CAN_H, CAN_L) | 
| Dvostrani | Puni dupleks | Poludupleks | Poludupleks | 
Primjene CAN protokola
- Zbog robusnosti i pouzdanosti CAN protokola, koriste se u industrijama poput automobilske, industrijskih strojeva, poljoprivrede, medicinske opreme itd.
- Kako se u CAN-u smanjuje složenost ožičenja, oni se uglavnom koriste u automobilskim aplikacijama poput automobila.
- Niska cijena za implementaciju, a također i cijena hardverskih komponenata, također je manja.
- Jednostavno dodavanje i uklanjanje uređaja sabirnice CAN.
Kako koristiti CAN protokol u Arduinu
Kako Arduino ne sadrži ugrađeni CAN priključak, koristi se CAN modul nazvan MCP2515. Ovaj CAN modul povezan je s Arduinom pomoću SPI komunikacije. Pogledajmo više o MCP2515 u detalje i kako je povezan s Arduinom.
MCP2515 CAN modul:

MCP2515 modul ima CAN kontroler MCP2515 koji je brzi CAN primopredajnik. Veza između MCP2515 i MCU-a je putem SPI-a. Dakle, lako je povezati se s bilo kojim mikrokontrolerom koji ima SPI sučelje.
Za početnike koji žele naučiti CAN Bus, ovaj će modul biti dobar početak. Ova CAN SPI ploča idealna je za industrijsku automatizaciju, kućnu automatizaciju i druge automobile ugrađene projekte.
Značajke i specifikacije MCP2515:
- Koristi brzi CAN primopredajnik TJA1050
- Dimenzija: 40 × 28mm
- SPI kontrola za proširenje sučelja sabirnice Multi CAN
- Oscilator kristala od 8 MHz
- Otpor stezaljke 120Ω
- Ima neovisnu tipku, LED indikator, indikator napajanja
- Podržava 1 Mb / s CAN rad
- Slaba struja u stanju pripravnosti
- Može se povezati do 112 čvorova
Isječak modula MCP2515 CAN:
| Naziv pribadače | KORISTITI | 
| VCC | Pin za unos snage 5V | 
| GND | Pribadača za uzemljenje | 
| CS | SPI SLAVE odaberite pin (aktivno nisko) | 
| TAKO | SPI glavni ulazni pomoćni izlazni kabel | 
| SI | SPI glavni izlazni slave ulazni kabel | 
| SCLK | SPI igla za sat | 
| INT | MCP2515 prekidni pin | 
U ovom uputstvu ćemo vidjeti kako poslati podatke osjetnika vlage i temperature (DHT11) s Arduino Nano na Arduino Uno putem modula sabirnice CAN MCP2515.
Komponente potrebne
- Arduino UNO
- Arduino NANO
- DHT11
- LCD zaslon od 16x2
- MCP2515 CAN modul - 2
- 10k potenciometar
- Breadboard
- Spajanje žica
Kružni dijagram

Priključak na strani CAN odašiljača:
| Komponenta - Prikvači | Arduino Nano | 
| MPC2515 - VCC | + 5V | 
| MPC2515 - GND | GND | 
| MPC2515 - CS | D10 (SPI_SS) | 
| MPC2515 - TAKO | D12 (SPI_MISO) | 
| MPC2515 - SI | D11 (SPI_MOSI) | 
| MPC2515 - SCK | D13 (SPI_SCK) | 
| MPC2515 - INT | D2 | 
| DHT11 - VCC | + 5V | 
| DHT11 - GND | GND | 
| DHT11 - VANJ | A0 | 
Spojevi krugova na strani prijemnika CAN:
| Komponenta - Prikvači | Arduino UNO | 
| MPC2515 - VCC | + 5V | 
| MPC2515 - GND | GND | 
| MPC2515 - CS | 10 (SPI_SS) | 
| MPC2515 - TAKO | 12 (SPI_MISO) | 
| MPC2515 - SI | 11 (SPI_MOSI) | 
| MPC2515 - SCK | 13 (SPI_SCK) | 
| MPC2515 - INT | 2 | 
| LCD - VSS | GND | 
| LCD - VDD | + 5V | 
| LCD - V0 | Na PIN centra središnjeg potenciometra 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 | 
Veza između dva MCP2515 CAN modula
H - MOŽE visoko
L - MOŽE nizak
| MCP2515 (Arduino Nano) | MCP2515 (Arduino UNO) | 
| H | H | 
| L | L | 
Nakon što su sve veze uspostavljene, moj je hardver izgledao ovako u nastavku

Programiranje Arduina za CAN komunikaciju
Prvo moramo instalirati knjižnicu za CAN u Arduino IDE. Povezivanje MCP2515 CAN modula s Arduinom postaje jednostavnije korištenjem sljedeće biblioteke.
- Preuzmite ZIP datoteku biblioteke Arduino CAN MCP2515.
- Iz Arduino IDE-a: Skica -> Uključi biblioteku -> Dodaj.ZIP biblioteku
U ovom je priručniku kodiranje podijeljeno u dva dijela, jedan kao CAN kod odašiljača (Arduino Nano), a drugi kao CAN prijemnik (Arduino UNO), a oba se nalaze na dnu ove stranice. Objašnjenje istog je sljedeće.
Prije pisanja programa za slanje i primanje podataka provjerite jeste li instalirali knjižnicu slijedeći gornje korake i je li CAN modul MCP2515 inicijaliziran u vašem programu na sljedeći način.
Inicijalizirajte MCP2515 CAN modul:
Da biste uspostavili vezu s MCP2515, slijedite korake:
1. Postavite pin broj na koji je spojen SPI CS (10 prema zadanim postavkama)
MCP2515 mcp2515 (10);
2. Postavite brzinu prijenosa i frekvenciju oscilatora
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Dostupne brzine prijenosa:
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_125KBPS CAN_125KBPS_1
Dostupne brzine sata:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Postavite načine rada.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Objašnjenje bočnog koda CAN odašiljača (Arduino Nano)
U odjeljku odašiljača, Arduino Nano povezan s modulom MCP2515 CAN putem SPI pinova i DHT11 šalje podatke o temperaturi i vlažnosti na CAN sabirnicu.
Prvo su uključene potrebne knjižnice, SPI knjižnica za upotrebu SPI komunikacije, MCP2515 knjižnica za upotrebu CAN komunikacije i DHT knjižnica za upotrebu DHT senzora s Arduinom . Prethodno smo povezali DHT11 s Arduinom.
#include
Sada je definirano ime pina DHT11 (OUT pin) koje je povezano s A0 Arduino Nano-a
#define DHTPIN A0
Također, DHTTYPE je definiran kao DHT11.
#define DHTTYPE DHT11
A canMsg vrsta podataka struct za pohranu format može poruka.
struct can_frame canMsg;
Postavite pin broj na koji je spojen SPI CS (10 prema zadanim postavkama)
MCP2515 mcp2515 (10);
Također, objekt dht za klasu DHT s DHT pinom s Arduino Nano i DHT tipom kao DHT11 je inicijaliziran.
DHT dht (DHTPIN, DHTTIP);
Sljedeće u void postavljanju ():
Započnite SPI komunikaciju pomoću sljedeće izjave
SPI.begin ();
A zatim upotrijebite donju izjavu da biste počeli primati vrijednosti temperature i vlažnosti s DHT11 osjetnika.
dht.begin ();
Dalje se MCP2515 PONAVLJA pomoću sljedeće naredbe
mcp2515.reset ();
Sada je MCP2515 postavljena brzina od 500KBPS i 8MHZ kao sat
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
A MCP2525 je postavljen u normalni način rada
mcp2515.setNormalMode ();
U petlji void ():
Sljedeća izjava dobiva vrijednost vlažnosti i temperature i pohranjuje u cjelobrojnu varijablu h i t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Dalje se CAN ID daje kao 0x036 (prema odabiru), a DLC kao 8, a mi dajemo h i t podatke podacima i podacima, a sve podatke odmaramo s 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Ažuriranje vrijednosti vlažnosti u canMsg.data = t; // Ažuriranje vrijednosti temperature u canMsg.data = 0x00; // Odmor sve s 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Uostalom, za slanje poruke na CAN BUS koristimo sljedeću izjavu.
mcp2515.sendMessage (& canMsg);
Dakle, sada se podaci o temperaturi i vlažnosti šalju kao poruka CAN sabirnici.
Objašnjenje boka CAN prijemnika (Arduino UNO)
U odjeljku prijemnika, Arduino UNO povezao se s MCP2515 i LCD zaslonom 16x2. Ovdje Arduino UNO prima temperaturu i vlažnost sa CAN sabirnice i prikazuje podatke primljene na LCD-u.
Prvo su uključene potrebne knjižnice, SPI knjižnica za upotrebu SPI komunikacije, MCP2515 knjižnica za upotrebu CAN komunikacije i LiquidCrsytal knjižnica za upotrebu LCD-a 16x2 s Arduinom .
#include
Sljedeće su definirane LCD igle koje se koriste za povezivanje s Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LCD LiquidCrystal (rs, en, d4, d5, d6, d7);
Struct vrsta podataka je proglašen za pohranu format može poruke.
struct can_frame canMsg;
Postavite pin broj na koji je spojen SPI CS (10 prema zadanim postavkama)
MCP2515 mcp2515 (10);
U void postavljanju ():
Prvo se LCD postavi u način rada 16x2 i prikazuje se poruka dobrodošlice.
lcd.početak (16,2); lcd.setCursor (0,0); lcd.print ("DIGEST CIRCUIT"); lcd.setCursor (0,1); lcd.print ("MOŽE ARDUINO"); kašnjenje (3000); lcd.clear ();
Započnite SPI komunikaciju pomoću sljedeće izjave.
SPI.begin ();
Dalje se MCP2515 PONAVLJA pomoću sljedeće naredbe.
mcp2515.reset ();
Sada je MCP2515 postavljena brzina od 500KBPS i 8MHZ kao sat.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
A MCP2525 je postavljen u normalni način rada.
mcp2515.setNormalMode ();
Sljedeća u void petlji ():
Sljedeća izjava koristi se za primanje poruke sa CAN sabirnice. Ako je poruka primljena, ona prelazi u stanje if .
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
U stanju if podaci se primaju i pohranjuju u c anMsg , podaci koji imaju vrijednost vlažnosti i podaci koji imaju vrijednost temperature. Obje su vrijednosti pohranjene u cijeli broj x i y.
int x = canMsg.data; int y = canMsg.data;
Nakon primanja vrijednosti, vrijednosti temperature i vlažnosti prikazuju se na LCD zaslonu 16x2 pomoću sljedeće izjave.
lcd.setCursor (0,0); lcd.print ("Vlaga:"); lcd.ispis (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.ispis (y); kašnjenje (1000); lcd.clear ();
Rad CAN komunikacije u Arduinu
Kada je hardver spreman, prenesite program za CAN odašiljač i CAN prijamnik (cjeloviti programi dati su u nastavku) na odgovarajuće Arduino ploče. Kada se napajate, primijetili biste da će vrijednost temperature koju očitava DHT11 biti poslana drugom Arduinu putem CAN komunikacije i prikazana na LCD-u 2. Arduina, kao što možete vidjeti na donjoj slici. Također sam koristio daljinski upravljač za izmjeničnu struju da provjerim je li temperatura prikazana na LCD-u blizu stvarne sobne temperature.

Kompletni rad možete pronaći na video linku ispod. Ako imate pitanja, ostavite ih u odjeljku za komentare ili upotrijebite naše forume za druga tehnička pitanja.

