- Uvod v CAN
- Primerjava CAN s SPI in I2C
- Aplikacije protokola CAN
- Kako uporabljati protokol CAN v Arduinu
- Potrebne komponente
- Shema vezja
- Povezava med dvema moduloma MCP2515 CAN
- Programiranje Arduina za komunikacijo CAN
- Pojasnilo stranske kode oddajnika CAN (Arduino Nano)
- Pojasnilo stranske kode sprejemnika CAN (Arduino UNO)
- Delovanje komunikacije CAN v Arduinu
Danes je vsak povprečen avtomobil v njem od približno 60 do 100 senzorskih enot za zaznavanje in izmenjavo informacij. Z avtomobilskimi proizvajalci nenehno izboljšujejo pametnost svojih avtomobilov s funkcijami, kot so avtonomna vožnja, sistem zračnih blazin, nadzor tlaka v pnevmatikah, sistem tempomatov itd. Za razliko od drugih senzorjev ti senzorji obdelujejo kritične informacije, zato je treba podatke s teh senzorjev sporočiti s standardnimi avtomobilskimi komunikacijskimi protokoli. Na primer, podatki sistema tempomata, kot so hitrost, položaj plina itd., So ključne vrednosti, ki se pošljejo elektronski krmilni enoti (ECU)Če se odločite za stopnjo pospeševanja avtomobila, lahko napačna komunikacija ali izguba podatkov privede do kritičnih napak. Za razliko od standardnih komunikacijskih protokolov, kot so UART, SPI ali I2C, oblikovalci uporabljajo precej zanesljive avtomobilske komunikacijske protokole, kot so LIN, CAN, FlexRay itd.
Od vseh razpoložljivih protokolov je CAN bolj uporabljen in priljubljen. Smo že razpravljali o tem, kaj je CAN in kako deluje CAN. Torej, v tem članku bomo znova preučili osnove, nato pa si bomo končno izmenjali podatke med dvema Arduinosoma prek komunikacije CAN. Sliši se zanimivo, kajne! Torej, začnimo.
Uvod v CAN
CAN aka Controller Area Network je serijsko komunikacijsko vodilo, zasnovano za industrijske in avtomobilske namene. To je protokol, ki temelji na sporočilih in se uporablja za komunikacijo med več napravami. Ko je več naprav CAN povezanih skupaj, kot je prikazano spodaj, povezava tvori omrežje, ki deluje kot naš centralni živčni sistem, kar omogoča kateri koli napravi, da govori z drugo napravo v vozlišču.
Lahko omrežni bo sestavljen iz samo dveh žic lahko visoke in lahko nizke za dvosmerno posredovanje podatkov, kot je prikazano zgoraj. Običajno se hitrost komunikacije za CAN giblje med 50 Kbps in 1Mbps, razdalja pa lahko znaša od 40 metrov pri 1Mbps do 1000 metrov pri 50kbbs.
Oblika sporočila CAN:
Pri komunikaciji CAN se podatki v omrežju prenašajo kot določena oblika sporočila. Ta oblika sporočil vsebuje veliko segmentov, vendar sta dva glavna segmenta identifikator in podatki, ki pomagajo pošiljati in odgovarjati na sporočila v vodilu CAN.
Identifikator ali CAN ID: Identifikator je znan tudi kot CAN ID ali PGN (številka skupine parametrov). Uporablja se za prepoznavanje naprav CAN, ki so prisotne v omrežju CAN. Dolžina identifikatorja je 11 ali 29 bitov glede na vrsto uporabljenega protokola CAN.
Standardna CAN: 0-2047 (11-bitna)
Razširjeni CAN: 0-2 29 -1 (29-bit)
Podatki: to so dejanski podatki senzorja / nadzora, ki jih je treba poslati iz ene naprave v drugo. Podatki o velikosti so lahko od 0 do 8 bajtov.
Koda dolžine podatkov (DLC): od 0 do 8 za število prisotnih bajtov podatkov.
Žice, uporabljene v CAN:
Protokol CAN je sestavljen iz dveh žic, in sicer CAN_H in CAN_L za pošiljanje in sprejemanje informacij. Obe žici delujeta kot diferencialna črta, kar pomeni, da signal CAN (0 ali 1) predstavlja potencialna razlika med CAN_L in CAN_H. Če je razlika pozitivna in večja od določene minimalne napetosti, je enaka 1, če je razlika negativna, pa 0.
Običajno se za komunikacijo CAN uporablja kabel zvit par. Na obeh koncih omrežja CAN se običajno uporablja en 120-ohmski upor, kot je prikazano na sliki, saj mora biti linija uravnotežena in vezana na isti potencial.
Primerjava CAN s SPI in I2C
Ker smo se že naučili, kako uporabljati SPI z Arduino in IIC z Arduino, primerjajmo funkcije SPI in I2C s CAN
Parameter | SPI | I2C | LAHKO |
Hitrost | 3Mbps do 10Mbps | Standardno: 100Kbps | 10KBps do 1MBps Odvisno tudi od dolžine uporabljene žice |
Hitro: 400 Kbps | |||
Visoka hitrost: 3,4 Mb / s | |||
Tip | Sinhrono | Sinhrono | Asinhrono |
Število žic | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 žici (SDA, SCL) | 2 žici (CAN_H, CAN_L) |
Dupleks | Full Duplex | Pol dupleks | Pol dupleks |
Aplikacije protokola CAN
- Zaradi robustnosti in zanesljivosti protokola CAN se uporabljajo v panogah, kot so avtomobilska industrija, industrijski stroji, kmetijstvo, medicinska oprema itd.
- Ker je v CAN zapletenost ožičenja manjša, se uporabljajo predvsem v avtomobilskih aplikacijah, kot so avtomobili.
- Nizka cena za izvedbo in tudi cena komponent strojne opreme je manjša.
- Enostavno dodajanje in odstranjevanje naprav vodila CAN.
Kako uporabljati protokol CAN v Arduinu
Ker Arduino ne vsebuje vgrajenih vrat CAN, se uporablja modul CAN, imenovan MCP2515. Ta modul CAN je povezan s sistemom Arduino s pomočjo komunikacije SPI. Oglejmo si več o MCP2515 podrobno in kako je povezan z Arduinom.
MCP2515 CAN modul:
Modul MCP2515 ima CAN krmilnik MCP2515, ki je oddajnik CAN visoke hitrosti. Povezava med MCP2515 in MCU je prek SPI. Tako je enostavno povezati kateri koli mikrokrmilnik s SPI vmesnikom.
Za začetnike, ki se želijo naučiti CAN Bus, bo ta modul dober začetek. Ta plošča CAN SPI je idealna za industrijsko avtomatizacijo, avtomatizacijo stanovanj in druge avtomobilske projekte.
Značilnosti in specifikacije MCP2515:
- Uporablja hitri oddajnik CAN TJA1050
- Mera: 40 × 28 mm
- Nadzor SPI za razširitev vmesnika vodila Multi CAN
- 8MHZ kristalni oscilator
- 120Ω upor terminala
- Ima neodvisno tipko, LED indikator, indikator napajanja
- Podpira 1 Mb / s CAN delovanje
- Nizko trenutno stanje pripravljenosti
- Poveže se lahko do 112 vozlišč
Izrez modula MCP2515 CAN:
Pripnite ime |
UPORABA |
VCC |
5V vhodni zatič |
GND |
Ozemljitveni zatič |
CS |
SPI SLAVE izbirni zatič (aktivno nizko) |
Torej |
SPI glavni vhodni pomožni izhodni kabel |
SI |
Vhodni vodnik pomožnega izhoda SPI |
SCLK |
Zatič za uro SPI |
INT |
Prekinitveni zatič MCP2515 |
V tej vadnici si oglejmo, kako pošiljati podatke senzorja vlažnosti in temperature (DHT11) iz Arduino Nano na Arduino Uno prek modula vodila CAN MCP2515.
Potrebne komponente
- Arduino UNO
- Arduino NANO
- DHT11
- LCD zaslon 16x2
- MCP2515 CAN modul - 2
- 10k potenciometer
- Breadboard
- Povezovanje žic
Shema vezja
Povezava na strani oddajnika CAN:
Komponenta - 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 - IZHOD |
A0 |
Vezja na strani sprejemnika CAN:
Komponenta - 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 |
Na 10K središčni PIN potenciometra |
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 |
Povezava med dvema moduloma MCP2515 CAN
H - CAN visoko
L - CAN Nizka
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Ko so bile vzpostavljene vse povezave, je bila moja strojna oprema videti spodaj tako
Programiranje Arduina za komunikacijo CAN
Najprej moramo namestiti knjižnico za CAN v Arduino IDE. Povezava modula MCP2515 CAN z Arduinom postane enostavnejša z uporabo naslednje knjižnice.
- Prenesite ZIP datoteko knjižnice Arduino CAN MCP2515.
- Iz IDE Arduino: Skica -> Vključi knjižnico -> Dodaj knjižnico.ZIP
V tej vadnici je kodiranje razdeljeno na dva dela, enega kot kodo oddajnika CAN (Arduino Nano) in drugega kot kodo sprejemnika CAN (Arduino UNO), oba pa najdete na dnu te strani. Razlaga istega je naslednja.
Pred pisanjem programa za pošiljanje in prejemanje podatkov se prepričajte, da ste namestili knjižnico po zgornjih korakih in da je modul CAN MCP2515 v vašem programu inicializiran na naslednji način.
Inicializirajte modul MCP2515 CAN:
Če želite vzpostaviti povezavo z MCP2515, sledite korakom:
1. Nastavite številko zatiča, kjer je povezan SPI CS (privzeto 10)
MCP2515 mcp2515 (10);
2. Nastavite hitrost prenosa in frekvenco oscilatorja
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Razpoložljive hitrosti prenosa:
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_2
Razpoložljive hitrosti ure:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Nastavite načine.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Pojasnilo stranske kode oddajnika CAN (Arduino Nano)
V oddajnem odseku je Arduino Nano povezal modul MCP2515 CAN prek zatičev SPI in DHT11 pošilja podatke o temperaturi in vlažnosti na vodilo CAN.
Najprej so vključene zahtevane knjižnice, SPI knjižnica za uporabo komunikacije SPI, knjižnica MCP2515 za uporabo komunikacije CAN in knjižnica DHT za uporabo senzorja DHT z Arduino . Pred tem smo povezali DHT11 z Arduinom.
#include
Zdaj je določeno ime pin DHT11 (OUT pin), ki je povezan z A0 Arduino Nano
#define DHTPIN A0
Poleg tega je DHTTYPE opredeljen kot DHT11.
#define DHTTYPE DHT11
A canMsg struct vrsto podatkov za shranjevanje format CAN sporočilo.
struct can_frame canMsg;
Nastavite številko zatiča, kjer je priključen SPI CS (privzeto 10)
MCP2515 mcp2515 (10);
In tudi objekt dht za razred DHT z DHT zatičem z Arduino Nano in DHT tipom, ko je DHT11 inicializiran.
DHT dht (DHTPIN, DHTTIP);
Naprej v void setup ():
Komunikacijo SPI začnite z uporabo naslednje izjave
SPI.begin ();
Nato uporabite spodnjo izjavo, da začnete prejemati vrednosti temperature in vlažnosti s senzorja DHT11.
dht.begin ();
Nato se MCP2515 PONASTAVI z naslednjim ukazom
mcp2515.reset ();
Zdaj je MCP2515 nastavljena na hitrost 500KBPS in 8MHZ kot uro
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
In MCP2525 je nastavljen na običajni način
mcp2515.setNormalMode ();
V void zanki ():
Naslednji stavek dobi vrednost vlažnosti in temperature ter shrani v celoštevilčni spremenljivki h in t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Nato je ID CAN podan kot 0x036 (po izbiri) in DLC kot 8, podatke h in t pa damo podatkom in podatkom in vse podatke počivamo z 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Posodobi vrednost vlažnosti v canMsg.data = t; // Posodobi vrednost temperature v canMsg.data = 0x00; // Počivaj vse z 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Konec koncev za pošiljanje sporočila na CAN BUS uporabimo naslednjo izjavo.
mcp2515.sendMessage (& canMsg);
Tako se zdaj podatki o temperaturi in vlažnosti pošljejo kot sporočilo vodilu CAN.
Pojasnilo stranske kode sprejemnika CAN (Arduino UNO)
V oddelku sprejemnika je Arduino UNO povezan z zaslonom MCP2515 in LCD 16x2. Tu Arduino UNO prejme temperaturo in vlago z vodila CAN in prikaže podatke, prejete na LCD-prikazovalniku.
Najprej so vključene zahtevane knjižnice, SPI knjižnica za uporabo komunikacije SPI, knjižnica MCP2515 za uporabo komunikacije CAN in knjižnica LiquidCrsytal za uporabo LCD 16x2 z Arduino .
#include
Nato so definirani zatiči LCD, ki se uporabljajo za povezavo z Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LCD LiquidCrystal (rs, en, d4, d5, d6, d7);
Za shranjevanje formata sporočila CAN je naveden tip podatkov struct .
struct can_frame canMsg;
Nastavite številko zatiča, kjer je priključen SPI CS (privzeto 10)
MCP2515 mcp2515 (10);
V void setup ():
Najprej se LCD nastavi na način 16x2 in prikaže se pozdravno sporočilo.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("DIGEST CIRCUIT"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); zamuda (3000); lcd.clear ();
Komunikacijo SPI začnite z uporabo naslednje izjave.
SPI.begin ();
Nato se MCP2515 PONASTAVI z naslednjim ukazom.
mcp2515.reset ();
Zdaj je MCP2515 nastavljena na hitrost 500KBPS in 8MHZ kot uro.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
In MCP2525 je nastavljen na običajni način.
mcp2515.setNormalMode ();
Naslednja void zanka ():
Naslednji stavek se uporablja za sprejem sporočila z vodila CAN. Če je sporočilo prejeto, preide v stanje if .
če (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
V stanju if so podatki sprejeti in shranjeni v c anMsg , podatki, ki imajo vrednost vlažnosti, in podatki, ki imajo vrednost temperature. Obe vrednosti sta shranjeni v celih številkah x in y.
int x = canMsg.data; int y = canMsg.data;
Po prejemu vrednosti so vrednosti temperature in vlažnosti prikazane na LCD zaslonu 16x2 z naslednjo izjavo.
lcd.setCursor (0,0); lcd.print ("Vlažnost:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); zamuda (1000); lcd.clear ();
Delovanje komunikacije CAN v Arduinu
Ko je strojna oprema pripravljena, naložite program za oddajnik CAN in sprejemnik CAN (celotni programi so navedeni spodaj) na ustrezne plošče Arduino. Ko se napaja, morate opaziti, da bo vrednost temperature, ki jo prebere DHT11, poslana drugemu Arduinu prek komunikacije CAN in prikazana na LCD-ju 2. Arduina, kot vidite na spodnji sliki. Z daljinskim upravljalnikom sem tudi preveril, ali je temperatura, prikazana na LCD-zaslonu, blizu dejanske sobne temperature.
Celotno delo najdete na spodnjem videoposnetku. Če imate kakršna koli vprašanja, jih pustite v oddelku za komentarje ali uporabite naša forum za druga tehnična vprašanja.