Danes je v vsakem povprečnem avtomobilu približno 60 do 100 senzorskih enot za zaznavanje in izmenjavo informacij. Ker avtomobilski proizvajalci nenehno izboljšujejo pametnost svojih avtomobilov s funkcijami, kot so avtonomna vožnja, sistem zračnih blazin, nadzor tlaka v pnevmatikah, sistem tempomata itd., se pričakuje, da bo to število samo še višje.
Avtor: Pramoth Thangavel
2021-300-53
Za razliko od drugih senzorjev, ti senzorji obdelujejo kritične informacije, zato je treba podatke s teh senzorjev sporočiti preko standardnih avtomobilskih komunikacijskih protokolov. Na primer, podatki sistema tempomata, kot so hitrost, položaj plina itd., so vitalne vrednosti, ki se pošljejo elektronski krmilni enoti (ECU) za odločanje o stopnji pospeševanja avtomobila, napačna komunikacija ali izguba podatkov lahko tukaj 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 najbolj uporabljen in priljubljen. Kaj je CAN in kako deluje CAN smo že razpravljali [1]. V tem članku bomo znova preučili osnove, nato pa si bomo končno izmenjali podatke med dvema Arduino z uporabo CAN komunikacije. Sliši se zanimivo, kajne! Torej, začnimo.
Ta vsebina je samo za naročnike
Uvod v CAN
CAN (angl: 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č CAN naprav povezanih skupaj, kot je prikazano spodaj, povezava tvori omrežje, ki deluje kot naš centralni živčni sistem in omogoča kateri koli napravi, da govori s katero koli drugo napravo v vozlišču.
CAN omrežje bo sestavljeno iz samo dveh žic CAN High in CAN Low za dvosmerni prenos podatkov, kot je prikazano zgoraj. Običajno se hitrost CAN komunikacije giblje med 50kbps in 1Mbps, razdalja pa lahko znaša od 40 metrov pri 1Mbps do 1000 metrov pri 50kbbs.
Format CAN sporočila
Pri CAN komunikaciji se podatki v omrežju prenašajo kot določena oblika sporočila. Ta oblika sporočila vsebuje veliko segmentov, vendar sta dva glavna segmenta identifikator in podatki, ki pomagajo pošiljati in odgovarjati na sporočila v CAN vodilu.
Identifikator ali CAN ID: Identifikator je znan tudi kot CAN ID ali PGN (številka skupine parametrov). Uporablja se za prepoznavanje CAN naprav, ki so prisotne v CAN omrežju. Dolžina identifikatorja je 11 ali 29 bitov glede na vrsto uporabljenega CAN protokola.
Standardni CAN: 0-2047 (11-bitna)
Razširjeni CAN: 0-229-1 (29-bit)
Podatki: to so dejanski podatki senzorja / nadzora, ki jih je treba poslati iz ene naprave v drugo. Velikost podatkov je lahko od 0 do 8 bajtov.
Koda dolžine podatkov (DLC): 0 do 8 za število prisotnih bajtov podatkov.
Povezovalne linije, uporabljene v CAN:
- CAN protokol potrebuje dve povezovalni liniji, in sicer CAN_H in CAN_L za pošiljanje in sprejemanje informacij. Obe liniji delujeta kot diferencialna povezava, kar pomeni, da CAN signal (0 ali 1) predstavlja potencialna razlika med CAN_L in CAN_H. Če je razlika pozitivna in večja od določene najnižje napetosti, je enaka 1, če je razlika negativna, pa 0.
Običajno se za komunikacijo CAN uporablja parica. Na obeh koncih CAN omrežja se običajno uporablja en 120-ohmski upor, kot je prikazano na sliki, saj mora biti linija zaključena z ustrezno impedanco in vezana na enak 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, kar vidimo v tabeli.
Aplikacije CAN protokola
Zaradi robustnosti in zanesljivosti CAN protokola, se CAN uporablja v panogah, kot so avtomobilska industrija, industrijski stroji, kmetijstvo, medicinska oprema itd.
Ker je zapletenost ožičenja v CAN-u manjša, se uporablja predvsem v avtomobilskih aplikacijah.
Nizka cena za izvedbo in tudi cena komponent strojne opreme je manjša.
Enostavno dodajanje in odstranjevanje naprav s CAN vodila.
Kako uporabljati CAN protokol v Arduinu
Ker Arduino ne vsebuje vgrajenih CAN vrat, se uporablja CAN modul, imenovan MCP2515. Ta CAN modul je povezan z Arduino s pomočjo SPI komunikacije. Oglejmo si bolj podrobno MCP2515 in kako je povezan z Arduinom.
MCP2515 modula vsebuje CAN krmilnik MCP2515, ki je CAN oddajnik visoke hitrosti. Povezava med MCP2515 in MCU poteka preko SPI. Tako je enostavno povezati kateri koli mikrokontroler s SPI vmesnikom.
Za začetnike, ki se želijo naučiti kako deluje CAN Bus, bo ta modul dober začetek. Ta CAN SPI plošča je idealna za industrijsko avtomatizacijo, avtomatizacijo stanovanj in druge avtomobilske ugnezdene projekte.
Značilnosti in specifikacije MCP2515:
- Uporablja hitri CAN TJA1050 oddajnik
- Mera: 40 × 28 mm
- SPI nadzor za razširitev vmesnika Multi CAN vodila
- 8MHz kristalni oscilator
- 120Ω zaključni upor
- Ima neodvisno tipko, LED indikator, indikator napajanja
- Podpira 1 Mb/s CAN delovanje
- Nizko trenutno stanje pripravljenosti
- Poveže se lahko z do 112 vozlišči
V tej vadnici si oglejmo, kako podatke iz senzorja vlage in temperature (DHT11) pošljemo iz Arduino Nano v Arduino Uno prek MCP2515 modula CAN vodila.
Potrebne komponente.
- Arduino UNO
- Arduino NANO
- DHT11
- 16×2 LCD zaslon
- MCP2515 CAN modul – 2
- 10k potenciometer
- Razvojna plošča
- Povezovalne žice
Programiranje Arduina za CAN komunikacijo
Najprej moramo namestiti knjižnico za CAN v Arduino IDE. Povezava MCP2515 CAN modula z Arduinom postane enostavnejša z uporabo naslednje knjižnice.
Prenesite ZIP datoteko Arduino CAN MCP2515 knjižnice.
Znotraj Arduino IDE: Skica -> Vključi knjižnico -> Dodaj knjižnico .ZIP
V tej vadnici je kodiranje razdeljeno na dva dela, enega kot kodo CAN oddajnika (Arduino Nano) in drugega kot kodo CAN sprejemnika (Arduino UNO), oba pa najdete na strani tega projekta. Razlaga 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 CAN MCP2515 modul v vašem programu inicializiran tako, kot bom prikazal v nadaljevanju.
Inicializacija MCP2515 CAN modula
Če želite vzpostaviti povezavo z MCP2515, sledite korakom.
1. Nastavite številko priključka, kjer je priključen 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_200KBPS, CAN_250KBPS, CAN_500KBPS, CAN_1000KBPS.
Razpoložljive hitrosti ure:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Nastavite načine:
mcp2515.setNormalMode();
mcp2515.setLoopbackMode();
mcp2515.setListenOnlyMode();
Pojasnilo stranske kode CAN oddajnika (Arduino Nano)
V oddajnem odseku je Arduino Nano povezan na MCP2515 CAN modul preko SPI priključkov in DHT11 pošilja podatke o temperaturi in vlažnosti na CAN vodilo.
Najprej so vključene zahtevane knjižnice, SPI knjižnica za uporabo SPI komunikacije, MCP2515 knjižnica za uporabo CAN komunikacije in DHT knjižnica za uporabo DHT senzorja z Arduino. Pred tem smo povezali DHT11 z Arduinom.
#include <SPI.h>
#include <mcp2515.h>
#include <DHT.h>
Zdaj je določeno ime DHT11 (OUT pin) priključka, ki je povezan z A0 na Arduino Nano.
#define DHTPIN A0
Poleg tega je DHTTYPE opredeljen kot DHT11.
#define DHTTYPE DHT11
Tip podatkov canMsg struct za shranjevanje oblike CAN sporočila.
struct can_frame canMsg
Nastavite številko priključka, kjer je priključen SPI CS (privzeto 10)
MCP2515 mcp2515(10);
In tudi objekt dht za razred DHT z DHT priključkom z Arduino Nano in DHT tipom, ko je DHT11 inicializiran.
DHT dht(DHTPIN, DHTTYPE);
Nadaljujemo v void setup ():
SPI komunikacijo začnite z uporabo naslednjega ukaza:
SPI.begin();
Nato uporabite spodnji ukaz, da začnete sprejemati vrednosti temperature in vlažnosti z DHT11 senzorja.
dht.begin();
Nato se MCP2515 ponastavi z naslednjim ukazom:
mcp2515.reset();
Zdaj je MCP2515 nastavljen na hitrost 500kBPS in 8MHz za uro.
mcp2515.setBitrate(CAN_500KBPS,MCP_8MHZ);
In MCP2525 je nastavljen na običajni način dela.
mcp2515.setNormalMode();
V void zanki ():
Naslednji ukaz dobi vrednost vlažnosti in temperature ter jo shrani v celoštevilčnih spremenljivkah h in t.
int h = dht.readHumidity();
int t = dht.readTemperature();
Nato je CAN ID podan kot 0x036 (po izbiri) in DLC kot 8, podatke h in t pa damo podatkom [0] in podatkom [1], vsi podatki pa ostanejo z 0.
canMsg.can_id = 0x036;
canMsg.can_dlc = 8;
canMsg.data[0] = h; //Update humidity value in [0]
canMsg.data[1] = t; //Update temperature value in [1]
canMsg.data[2] = 0x00; //Rest all with 0
canMsg.data[3] = 0x00;
canMsg.data[4] = 0x00;
canMsg.data[5] = 0x00;
canMsg.data[6] = 0x00;
canMsg.data[7] = 0x00;
Na koncu za pošiljanje sporočila na CAN BUS uporabimo naslednji ukaz.
mcp2515.sendMessage(&canMsg);
Tako se zdaj podatki o temperaturi in vlažnosti pošljejo kot sporočilo CAN vodilu.
Pojasnilo stranske kode CAN sprejemnika (Arduino UNO)
V programu sprejemnika je Arduino UNO povezan z LCD 16×2 zaslonom in MCP2515. Tu Arduino UNO sprejme temperaturo in vlago s CAN vodila in prikaže prejete podatke na LCD-prikazovalniku.
Najprej so vključene zahtevane knjižnice, SPI knjižnica za uporabo SPI komunikacije, MCP2515 knjižnica za uporabo CAN komunikacije in LiquidCrystal knjižnica za uporabo LCD 16×2 z Arduino.
#include <SPI.h
#include <mcp2515.h>
#include <LiquidCrystal.h>
Nato so definirani LCD priključki, ki se uporabljajo za povezavo z Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
Za shranjevanje formata CAN sporočila je naveden tip podatkov struct.
struct can_frame canMsg;
Nastavite številko priključka, kjer je priključen SPI CS (privzeto 10)
MCP2515 mcp2515(10);
Znotraj void setup ():
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print(“CIRCUIT DIGEST”);
lcd.setCursor(0,1);
lcd.print(“CAN ARDUINO”);
delay(3000);
lcd.clear();
SPI komunikacijo začnite z uporabo naslednjega ukaza:
SPI.begin();
Nato se MCP2515 ponastavi z naslednjim ukazom.
mcp2515.reset();
Zdaj je na MCP2515 nastavljena hitrost na 500kbps in 8MHz kot takt ure.
mcp2515.setBitrate(CAN_500KBPS,MCP_8MHZ);
In MCP2525 je nastavljen na normalen način delovanja.
mcp2515.setNormalMode();
Nato v void loop():
Naslednji stavek se uporablja za sprejem sporočila s CAN vodila. Če je sporočilo prejeto, preide v if zanko.
if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK)
V if zanki so podatki sprejeti in shranjeni v canMsg, podatki [0], ki vsebujejo vrednost vlage, in podatki [1], ki vsebujejo vrednost temperature. Obe vrednosti sta shranjeni v celih številkah kot x in y.
int x = canMsg.data[0];
int y = canMsg.data[1];
Po sprejemu vrednosti se vrednosti temperature in vlage prikažejo na 16×2 LCD zaslonu z naslednjimi ukazi.
lcd.setCursor(0,0);
lcd.print(“Humidity : “);
lcd.print(x);
lcd.setCursor(0,1);
lcd.print(“Temp : “);
lcd.print(y);
delay(1000);
lcd.clear();
Delovanje CAN komunikacije v Arduinu
Ko je strojna oprema pripravljena, naložite program za CAN oddajnik in CAN sprejemnik (celotni programi so navedeni na koncu članka spodaj) na ustrezne Arduino plošče. Ko vklopite napajanje, bi morali opaziti, da bo vrednost temperature, ki jo prebere DHT11, poslana drugemu Arduinu prek CAN komunikacije in prikazana na LCD-ju drugega Arduina, kot lahko vidite na spodnji sliki. Z daljinskim upravljalnikom sem tudi preveril, ali je temperatura, prikazana na LCD-prikazovalniku, blizu dejanske sobne temperature.
Celotno delovanje najdete na videoposnetku članka. Če imate kakršna koli vprašanja, jih pustite v oddelku za komentarje ali uporabite forum avtorja za druga tehnična vprašanja.