- Úvod do CAN
- Porovnanie CAN cez SPI a I2C
- Aplikácie protokolu CAN
- Ako používať protokol CAN v Arduine
- Súčasti sú povinné
- Schéma zapojenia
- Prepojenie medzi dvoma modulmi CAN MCP2515
- Programovanie Arduina pre komunikáciu CAN
- Vysvetlenie bočného kódu vysielača CAN (Arduino Nano)
- Vysvetlenie kódu strany prijímača CAN (Arduino UNO)
- Fungovanie CAN komunikácie v Arduine
Dnes každé priemerné auto obsahuje asi 60 až 100 senzorových jednotiek, ktoré slúžia na snímanie a výmenu informácií. Vďaka tomu, že výrobcovia automobilov neustále zdokonaľujú svoje vozidlá pomocou funkcií ako autonómna jazda, systém airbagov, kontrola tlaku v pneumatikách, tempomat atď., Sa očakáva iba vysoké zvýšenie tohto počtu. Na rozdiel od iných snímačov tieto snímače spracúvajú dôležité informácie, a preto by sa údaje z týchto snímačov mali komunikovať pomocou štandardných komunikačných protokolov pre automobily. Napríklad údaje systému tempomatu, ako je rýchlosť, poloha škrtiacej klapky atď., Sú zásadné hodnoty, ktoré sa odosielajú do elektronickej riadiacej jednotky (ECU).pri rozhodovaní o úrovni akcelerácie automobilu môže nesprávna komunikácia alebo strata údajov viesť k kritickým poruchám. Preto na rozdiel od štandardných komunikačných protokolov ako UART, SPI alebo I2C používajú dizajnéri oveľa spoľahlivejšie automobilové komunikačné protokoly ako LIN, CAN, FlexRay atď.
Zo všetkých dostupných protokolov je CAN hlavne používaný a populárny. Už sme hovorili o tom, čo je CAN a ako CAN funguje. V tomto článku sa teda pozrieme opäť na základné informácie a potom si konečne prostredníctvom CAN komunikácie vymeníme aj údaje medzi dvoma Arduinos. Znie to zaujímavo, dobre! Takže poďme na to.
Úvod do CAN
CAN aka Controller Area Network je sériová komunikačná zbernica určená pre priemyselné a automobilové aplikácie. Je to protokol založený na správach používaný na komunikáciu medzi viacerými zariadeniami. Keď je spolu pripojených viac zariadení CAN, ako je to znázornené nižšie, spojenie vytvára sieť fungujúcu ako náš centrálny nervový systém, ktorá umožňuje každému zariadeniu hovoriť s akýmkoľvek iným zariadením v uzle.
CAN Sieť sa bude skladať iba z dvoch vodičov CAN High a CAN Low pre obojsmerný prenos dát, ako je uvedené vyššie. Typicky sa komunikačná rýchlosť pre CAN pohybuje od 50 kb / s do 1 Mb / s a vzdialenosť sa môže pohybovať od 40 metrov pri 1 Mb / s do 1 000 metrov pri 50 kb / s.
Formát správy CAN:
V komunikácii CAN sa údaje prenášajú v sieti ako konkrétny formát správy. Tento formát správy obsahuje veľa segmentov, ale dva hlavné segmenty sú identifikátor a dáta, ktoré pomáhajú odosielať a odpovedať na správy na zbernici CAN.
Identifikátor alebo CAN ID: Identifikátor je tiež známy ako CAN ID alebo tiež PGN (číslo skupiny parametrov). Používa sa na identifikáciu zariadení CAN nachádzajúcich sa v sieti CAN. Dĺžka identifikátora je buď 11 alebo 29 bitov na základe použitého typu protokolu CAN.
Štandardné CAN: 0-2047 (11-bit)
Rozšírené CAN: 0-2 29 -1 (29-bit)
Údaje: Toto sú skutočné údaje snímača / riadenia, ktoré sa musia odoslať z jedného zariadenia do druhého. Údaje o veľkosti môžu mať dĺžku od 0 do 8 bajtov.
Kód dĺžky údajov (DLC): 0 až 8 pre počet prítomných dátových bajtov.
Drôty použité v CAN:
Protokol CAN sa skladá z dvoch vodičov, a to CAN_H a CAN_L na odosielanie a prijímanie informácií. Oba vodiče fungujú ako diferenciálna linka, čo znamená, že signál CAN (0 alebo 1) je predstavovaný rozdielom potenciálov medzi CAN_L a CAN_H. Ak je rozdiel kladný a väčší ako určité minimálne napätie, potom je to 1 a ak je rozdiel záporný, je to 0.
Na komunikáciu CAN sa zvyčajne používa kábel s krútenými pármi. Jeden 120-ohmový rezistor sa zvyčajne používa na dvoch koncoch siete CAN, ako je to znázornené na obrázku, je to preto, lebo linka musí byť vyvážená a viazaná na rovnaký potenciál.
Porovnanie CAN cez SPI a I2C
Pretože sme sa už naučili používať SPI s Arduinom a IIC s Arduinom, porovnajme si vlastnosti SPI a I2C s CAN
Parameter | SPI | I2C | MÔCŤ |
Rýchlosť | 3 Mb / s až 10 Mb / s | Štandard: 100 kb / s | 10 kB / s až 1 MB / s Tiež záleží na dĺžke použitého drôtu |
Rýchle: 400 kb / s | |||
Vysoká rýchlosť: 3,4 Mb / s | |||
Typ | Synchrónne | Synchrónne | Asynchrónne |
Počet drôtov | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 vodiče (SDA, SCL) | 2 vodiče (CAN_H, CAN_L) |
Duplex | Plný duplex | Polovičný duplex | Polovičný duplex |
Aplikácie protokolu CAN
- Kvôli robustnosti a spoľahlivosti protokolu CAN sa používajú v priemyselných odvetviach ako automobilový priemysel, priemyselné stroje, poľnohospodárstvo, zdravotnícke vybavenie atď.
- Pretože v CAN je zložitosť kabeláže znížená, používajú sa hlavne v automobilových aplikáciách, ako je napríklad auto.
- Nízke náklady na implementáciu a tiež cena hardvérových komponentov je tiež nižšia.
- Ľahko sa pridávajú a odoberajú zariadenia zbernice CAN.
Ako používať protokol CAN v Arduine
Pretože Arduino neobsahuje žiadny zabudovaný port CAN, používa sa modul CAN s názvom MCP2515. Tento modul CAN je prepojený s Arduino pomocou komunikácie SPI. Pozrime sa podrobnejšie na MCP2515 a na to, ako je prepojený s Arduino.
CAN modul MCP2515:
Modul MCP2515 má radič CAN MCP2515, čo je vysokorýchlostný vysielač / prijímač CAN. Spojenie medzi MCP2515 a MCU je cez SPI. Je teda ľahké prepojiť ho s akýmkoľvek mikrokontrolérom s rozhraním SPI.
Pre začiatočníkov, ktorí sa chcú naučiť CAN Bus, bude tento modul slúžiť ako dobrý štart. Táto doska CAN SPI je ideálna pre priemyselnú automatizáciu, domácu automatizáciu a ďalšie automobilové projekty.
Vlastnosti a špecifikácie MCP2515:
- Používa vysokorýchlostný vysielač / prijímač CAN TJA1050
- Rozmer: 40 × 28 mm
- Ovládanie SPI pre rozšírenie rozhrania Multi CAN bus
- 8MHZ kryštálový oscilátor
- Odpor svorky 120Ω
- Má nezávislý kľúč, LED indikátor, indikátor napájania
- Podporuje prevádzku CAN 1 Mb / s
- Nízkoprúdový pohotovostný režim
- Môže byť pripojených až 112 uzlov
Pinout modulu CAN MCP2515:
Názov špendlíka |
POUŽITIE |
VCC |
5V vstupný kolík napájania |
GND |
Uzemňovací kolík |
CS |
SPI SLAVE výberový kolík (aktívny nízky) |
TAK |
SPI hlavný vstup podriadený výstupný vodič |
SI |
SPI hlavný výstup podradený vstupný vodič |
SCLK |
SPI Hodinový špendlík |
INT |
MCP2515 prerušovací kolík |
V tomto návode sa pozrieme na to, ako posielať údaje snímača vlhkosti a teploty (DHT11) z Arduino Nano do Arduino Uno cez modul zbernice CAN MCP2515.
Súčasti sú povinné
- Arduino UNO
- Arduino NANO
- DHT11
- 16 x 2 LCD displej
- Modul CAN MCP2515 - 2
- 10k potenciometer
- Nepál
- Pripojenie drôtov
Schéma zapojenia
Pripojenie na strane vysielača CAN:
Komponent - 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 - VÝSTUP |
A0 |
Pripojenie obvodu na strane prijímača CAN:
Komponent - 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 stredový PIN 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 |
Prepojenie medzi dvoma modulmi CAN MCP2515
H - MÔŽE byť vysoký
L - CAN nízka
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
Ľ |
Ľ |
Po vykonaní všetkých pripojení vyzeral môj hardvér nižšie
Programovanie Arduina pre komunikáciu CAN
Najprv musíme nainštalovať knižnicu pre CAN v Arduino IDE. Prepojenie modulu CAN MCP2515 s modulom Arduino je jednoduchšie pomocou nasledujúcej knižnice.
- Stiahnite si ZIP súbor knižnice Arduino CAN MCP2515.
- Z IDE Arduino: Skica -> Zahrnúť knižnicu -> Pridať knižnicu.ZIP
V tomto návode je kódovanie rozdelené na dve časti, jednu ako kód vysielača CAN (Arduino Nano) a druhú ako kód prijímača CAN (Arduino UNO), ktoré nájdete v dolnej časti tejto stránky. Vysvetlenie toho istého je nasledujúce.
Pred písaním programu na odosielanie a prijímanie údajov sa uistite, že ste nainštalovali knižnicu podľa vyššie uvedených krokov a modul CAN MCP2515 je vo vašom programe inicializovaný nasledovne.
Inicializujte modul CAN MCP2515:
Ak chcete vytvoriť spojenie s MCP2515, postupujte podľa pokynov:
1. Nastavte číslo kolíka, kde je pripojený SPI CS (predvolene 10)
MCP2515 mcp2515 (10);
2. Nastavte prenosovú rýchlosť a frekvenciu oscilátora
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Dostupné prenosové rýchlosti:
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_50KBPS, CAN_250KBPS, CAN_250KBPS
Dostupné rýchlosti hodín:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Nastavte režimy.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Vysvetlenie bočného kódu vysielača CAN (Arduino Nano)
V časti vysielača prepojilo Arduino Nano s CAN modulom MCP2515 prostredníctvom pinov SPI a DHT11 odosiela údaje o teplote a vlhkosti na zbernicu CAN.
Najprv sú zahrnuté požadované knižnice, SPI Library pre použitie SPI komunikácie, MCP2515 Library pre použitie CAN komunikácie a DHT Library pre použitie DHT senzora s Arduino . Predtým sme prepojili DHT11 s Arduinom.
#include
Teraz je definovaný názov kolíka DHT11 (kolík OUT), ktorý je pripojený k A0 Arduino Nano
#define DHTPIN A0
A tiež je DHTTYPE definovaný ako DHT11.
#define DHTTYPE DHT11
A canMsg struct dátový typ pre ukladanie formátu CAN správy.
struct can_frame canMsg;
Nastavte číslo kolíka, kde je pripojený SPI CS (predvolene 10)
MCP2515 mcp2515 (10);
A tiež je inicializovaný objekt dht pre triedu DHT s kolíkom DHT s Arduino Nano a typ DHT ako DHT11.
DHT dht (DHTPIN, DHTTYPE);
Ďalej v zrušení nastavenia ():
Komunikáciu SPI začnite pomocou nasledujúceho príkazu
SPI.begin ();
Potom pomocou príkazu nižšie začnite dostávať hodnoty teploty a vlhkosti zo snímača DHT11.
dht.begin ();
Ďalej sa MCP2515 resetuje pomocou nasledujúceho príkazu
mcp2515.reset ();
Teraz je MCP2515 nastavená na rýchlosť 500 kBps a 8 MHz ako hodiny
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
A MCP2525 je nastavený na normálny režim
mcp2515.setNormalMode ();
V neplatnej slučke ():
Nasledujúci príkaz získa hodnotu vlhkosti a teploty a uloží sa do celočíselnej premennej h a t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Ďalej je CAN ID dané ako 0x036 (podľa výberu) a DLC ako 8 a dátam h a t dáme dáta a dáta a všetky dáta odpočítame číslom 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Aktualizácia hodnoty vlhkosti v canMsg.data = t; // Aktualizácia hodnoty teploty v canMsg.data = 0x00; // Všetky odpočívajte s 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Nakoniec, na odoslanie správy na CAN BUS použijeme nasledujúce vyhlásenie.
mcp2515.sendMessage (& canMsg);
Takže teraz sú údaje o teplote a vlhkosti odoslané ako správa na zbernicu CAN.
Vysvetlenie kódu strany prijímača CAN (Arduino UNO)
V časti s prijímačom sa Arduino UNO prepojilo s displejom MCP2515 a 16x2 LCD. Arduino UNO tu prijíma teplotu a vlhkosť zo zbernice CAN a zobrazuje prijaté údaje na LCD displeji.
Najprv sú zahrnuté požadované knižnice, SPI Library pre použitie SPI komunikácie, MCP2515 Library pre použitie CAN Communication a LiquidCrsytal Library pre použitie 16x2 LCD s Arduino .
#include
Ďalej sú definované kolíky LCD, ktoré sa používajú pri spojení s Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Na ukladanie formátu správy CAN je deklarovaný dátový typ struct .
struct can_frame canMsg;
Nastavte číslo kolíka, kde je pripojený SPI CS (predvolene 10)
MCP2515 mcp2515 (10);
V neplatnom nastavení ():
Najskôr sa LCD nastaví na režim 16x2 a zobrazí sa uvítacia správa.
lcd.začiatok (16,2); lcd.setCursor (0,0); lcd.print ("OKRUH DIGEST"); lcd.setCursor (0,1); lcd.print („MOŽNO ARDUINO“); oneskorenie (3 000); lcd.clear ();
Komunikáciu SPI začnite pomocou nasledujúceho príkazu.
SPI.begin ();
Ďalej sa MCP2515 resetuje pomocou nasledujúceho príkazu.
mcp2515.reset ();
Teraz je MCP2515 nastavená na rýchlosť 500 KBPS a 8 MHz ako hodiny.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
A MCP2525 je nastavený na normálny režim.
mcp2515.setNormalMode ();
Ďalej v neplatnej slučke ():
Nasledujúci príkaz sa používa na príjem správy zo zbernice CAN. Ak je správa prijatá, dostane sa do stavu if .
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
V prípade podmienky sú údaje prijaté a uložené v c anMsg , údaje s hodnotou vlhkosti a údaje s hodnotou teploty. Obe hodnoty sú uložené v celých číslach x a y.
int x = canMsg.data; int y = canMsg.data;
Po prijatí hodnôt sa hodnoty teploty a vlhkosti zobrazia na 16x2 LCD displeji pomocou nasledujúceho výpisu.
lcd.setCursor (0,0); lcd.print ("Vlhkosť:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Teplota:"); lcd.tlač (y); oneskorenie (1 000); lcd.clear ();
Fungovanie CAN komunikácie v Arduine
Keď je hardvér pripravený, nahrajte program pre vysielač CAN a prijímač CAN (kompletné programy sú uvedené nižšie) na príslušné dosky Arduino. Keď je napájaný, mali by ste si všimnúť, že hodnota teploty načítaná z DHT11 bude odoslaná do iného Arduina prostredníctvom komunikácie CAN a zobrazená na LCD displeji druhého Arduina, ako vidíte na obrázku nižšie. Taktiež som pomocou svojho diaľkového ovládača skontroloval, či sa teplota zobrazená na LCD displeji blíži skutočnej teplote v miestnosti.
Kompletné fungovanie nájdete na videu, na ktoré odkazujete nižšie. Ak máte akékoľvek otázky, nechajte ich v sekcii komentárov alebo použite naše fóra pre ďalšie technické otázky.