- Úvod do CAN
- Porovnání CAN přes SPI & I2C
- Aplikace protokolu CAN
- Jak používat protokol CAN v Arduinu
- Požadované komponenty
- Kruhový diagram
- Propojení mezi dvěma moduly CAN MCP2515
- Programování Arduina pro komunikaci CAN
- Vysvětlení bočního kódu vysílače CAN (Arduino Nano)
- Vysvětlení kódu CAN přijímače (Arduino UNO)
- Práce na CAN komunikaci v Arduinu
Dnes se každé průměrné auto skládá z přibližně 60 až 100 senzorových jednotek pro snímání a výměnu informací. Vzhledem k tomu, že výrobci automobilů neustále vylepšují své auto díky funkcím, jako je autonomní jízda, systém airbagů, monitorování tlaku v pneumatikách, tempomat atd., Očekává se, že toto číslo bude vysoké. Na rozdíl od jiných senzorů tyto senzory zpracovávají důležité informace, a proto by data z těchto senzorů měla být komunikována pomocí standardních automobilových komunikačních protokolů. Například data systému tempomatu, jako je rychlost, poloha škrticí klapky atd., Jsou zásadní hodnoty, které se odesílají do elektronické řídicí jednotky (ECU)k rozhodnutí o úrovni zrychlení vozu by nesprávná komunikace nebo ztráta dat zde mohly vést ke kritickým poruchám. Na rozdíl od standardních komunikačních protokolů jako UART, SPI nebo I2C proto konstruktéři používají mnohem spolehlivější automobilové komunikační protokoly jako LIN, CAN, FlexRay atd.
Ze všech dostupných protokolů je CAN převážně používán a populární. Již jsme diskutovali o tom, co je CAN a jak CAN funguje. V tomto článku se tedy znovu podíváme na základy a nakonec si také vyměníme data mezi dvěma Arduiny pomocí komunikace CAN. Zní to zajímavě správně! Pojďme tedy začít.
Úvod do CAN
CAN aka Controller Area Network je sériová komunikační sběrnice určená pro průmyslové a automobilové aplikace. Jedná se o protokol založený na zprávách používaný pro komunikaci mezi více zařízeními. Když je více zařízení CAN připojeno dohromady, jak je znázorněno níže, spojení tvoří síť, která funguje jako náš centrální nervový systém a umožňuje kterémukoli zařízení mluvit s jakýmkoli jiným zařízením v uzlu.
CAN Síť se bude skládat pouze ze dvou vodičů CAN High a CAN Low pro obousměrný přenos dat, jak je uvedeno výše. Typicky se komunikační rychlost pro CAN pohybuje od 50 Kbps do 1Mbps a vzdálenost se může pohybovat od 40 metrů při 1Mbps do 1000 metrů při 50kpbs.
Formát zprávy CAN:
V komunikaci CAN jsou data přenášena v síti jako konkrétní formát zprávy. Tento formát zprávy obsahuje mnoho segmentů, ale dva hlavní segmenty jsou identifikátor a data, která pomáhají odesílat a reagovat na zprávy na sběrnici CAN.
Identifikátor nebo CAN ID: Identifikátor je také známý jako CAN ID nebo také známý jako PGN (číslo skupiny parametrů). Slouží k identifikaci zařízení CAN přítomných v síti CAN. Délka identifikátoru je buď 11 nebo 29 bitů na základě typu použitého protokolu CAN.
Standardní CAN: 0-2047 (11 bitů)
Rozšířená CAN: 0-2 29 -1 (29 bitů)
Data: Toto jsou skutečná data senzoru / ovládání, která musí být odeslána z jednoho zařízení do druhého. Data velikosti mohou být kdekoli od 0 do 8 bajtů.
Kód délky dat (DLC): 0 až 8 pro počet přítomných datových bajtů.
Dráty používané v CAN:
Protokol CAN se skládá ze dvou vodičů, konkrétně CAN_H a CAN_L pro odesílání a přijímání informací. Oba vodiče fungují jako diferenciální vedení, což znamená, že signál CAN (0 nebo 1) je představován rozdílem potenciálů mezi CAN_L a CAN_H. Pokud je rozdíl kladný a větší než určité minimální napětí, pak je to 1 a pokud je rozdíl záporný, je to 0.
Normálně se pro komunikaci CAN používá kroucená dvoulinka. Jeden 120-ohmový rezistor se obvykle používá na obou koncích sítě CAN, jak je znázorněno na obrázku, je to proto, že vedení musí být vyvážené a vázané na stejný potenciál.
Porovnání CAN přes SPI & I2C
Protože jsme se již naučili používat SPI s Arduinem a IIC s Arduinem, porovnejme si vlastnosti SPI a I2C s CAN
Parametr | SPI | I2C | UMĚT |
Rychlost | 3 Mb / s až 10 Mb / s | Standardní: 100 kb / s | 10 kB / s až 1 MB / s Také záleží na délce použitého drátu |
Rychlé: 400 kb / s | |||
Vysoká rychlost: 3,4 Mb / s | |||
Typ | Synchronní | Synchronní | Asynchronní |
Počet drátů | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 vodiče (SDA, SCL) | 2 vodiče (CAN_H, CAN_L) |
Duplex | Plny Duplex | Half Duplex | Half Duplex |
Aplikace protokolu CAN
- Vzhledem k robustnosti a spolehlivosti protokolu CAN se používají v průmyslových odvětvích, jako je automobilový průmysl, průmyslové stroje, zemědělství, zdravotnická zařízení atd.
- Protože v CAN je složitost kabeláže snížena, používají se hlavně v automobilových aplikacích, jako je auto.
- Nízké náklady na implementaci a také cena hardwarových komponent je také nižší.
- Snadné přidávání a odebírání zařízení CAN bus.
Jak používat protokol CAN v Arduinu
Protože Arduino neobsahuje žádný vestavěný port CAN, používá se modul CAN s názvem MCP2515. Tento modul CAN je propojen s Arduino pomocí komunikace SPI. Podívejme se podrobněji na MCP2515 a na to, jak je propojen s Arduino.
CAN modul MCP2515:
Modul MCP2515 má řadič CAN MCP2515, což je vysokorychlostní vysílač / přijímač CAN. Spojení mezi MCP2515 a MCU probíhá prostřednictvím SPI. Je tedy snadné rozhraní s jakýmkoli mikrokontrolérem, který má rozhraní SPI.
Pro začátečníky, kteří se chtějí naučit CAN Bus, bude tento modul fungovat jako dobrý začátek. Tato deska CAN SPI je ideální pro průmyslovou automatizaci, domácí automatizaci a další automobilové vestavěné projekty.
Vlastnosti a specifikace MCP2515:
- Používá vysokorychlostní CAN transceiver TJA1050
- Rozměr: 40 × 28 mm
- Ovládání SPI pro rozšíření rozhraní Multi CAN bus
- 8MHZ krystalový oscilátor
- Odpor svorky 120Ω
- Má nezávislý klíč, LED indikátor, indikátor napájení
- Podporuje provoz CAN 1 Mb / s
- Nízký proud v pohotovostním režimu
- Lze připojit až 112 uzlů
Pinout modulu CAN MCP2515:
Název PIN |
POUŽITÍ |
VCC |
5V napájecí vstup |
GND |
Uzemňovací kolík |
CS |
SPI SLAVE select pin (aktivní nízká) |
TAK |
SPI hlavní vstupní podřízený výstupní vodič |
SI |
SPI hlavní výstupní podřízený vstupní vodič |
SCLK |
SPI hodinový kolík |
INT |
Přerušovací kolík MCP2515 |
V tomto tutoriálu se podívejme, jak odesílat data snímače vlhkosti a teploty (DHT11) z Arduino Nano do Arduino Uno přes modul sběrnice CAN MCP2515.
Požadované komponenty
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD displej
- CAN modul MCP2515 - 2
- 10k potenciometr
- Nepájivá deska
- Připojení vodičů
Kruhový diagram
Připojení na straně vysílače CAN:
Součást - 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 |
Zapojení obvodu na straně přijímače CAN:
Součást - 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 středový PIN potenciometru 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 |
Propojení mezi dvěma moduly CAN MCP2515
H - MŮŽE být vysoký
L - CAN Low
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Jakmile byla provedena všechna připojení, můj hardware vypadal níže
Programování Arduina pro komunikaci CAN
Nejprve musíme nainstalovat knihovnu pro CAN v Arduino IDE. Propojení modulu CAN MCP2515 s modulem Arduino je snazší pomocí následující knihovny.
- Stáhněte si soubor ZIP knihovny Arduino CAN MCP2515.
- Z IDE Arduino: Skica -> Zahrnout knihovnu -> Přidat knihovnu.ZIP
V tomto výukovém programu je kódování rozděleno na dvě části, jednu jako kód vysílače CAN (Arduino Nano) a druhou jako kód CAN přijímače (Arduino UNO), obě najdete ve spodní části této stránky. Vysvětlení pro totéž je následující.
Před zápisem programu pro odesílání a přijímání dat se ujistěte, že jste nainstalovali knihovnu podle výše uvedených kroků a modul CAN MCP2515 je ve vašem programu inicializován následujícím způsobem.
Inicializovat modul CAN MCP2515:
Chcete-li vytvořit spojení s MCP2515, postupujte takto:
1. Nastavte číslo pinu, kde je připojen SPI CS (standardně 10)
MCP2515 mcp2515 (10);
2. Nastavte přenosovou rychlost a frekvenci oscilátoru
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Dostupné přenosové rychlosti:
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é rychlosti hodin:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Nastavte režimy.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Vysvětlení bočního kódu vysílače CAN (Arduino Nano)
V sekci vysílače propojilo Arduino Nano s CAN modulem MCP2515 prostřednictvím pinů SPI a DHT11 odesílá data teploty a vlhkosti na sběrnici CAN.
Nejprve jsou zahrnuty požadované knihovny, knihovna SPI pro použití komunikace SPI, knihovna MCP2515 pro použití komunikace CAN a knihovna DHT pro použití snímače DHT s Arduino . Dříve jsme propojili DHT11 s Arduino.
#zahrnout
Nyní je definován název kolíku DHT11 (kolík OUT), který je spojen s A0 Arduino Nano
#define DHTPIN A0
A také DHTTYPE je definován jako DHT11.
#define DHTTYPE DHT11
A canMsg struct datový typ pro ukládání formátu CAN zprávy.
struktura can_frame canMsg;
Nastavte číslo pinu, kde je připojen SPI CS (standardně 10)
MCP2515 mcp2515 (10);
A také objekt dht pro třídu DHT s kolíkem DHT s Arduino Nano a typ DHT při inicializaci DHT11.
DHT dht (DHTPIN, DHTTYPE);
Další v nastavení neplatnosti ():
Spusťte komunikaci SPI pomocí následujícího příkazu
SPI.begin ();
Poté pomocí níže uvedeného prohlášení začněte přijímat hodnoty teploty a vlhkosti ze snímače DHT11.
dht.begin ();
Dále se MCP2515 resetuje pomocí následujícího příkazu
mcp2515.reset ();
Nyní je na MCP2515 nastavena rychlost 500KBPS a 8MHZ jako hodiny
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
A MCP2525 je nastaven na normální režim
mcp2515.setNormalMode ();
V neplatné smyčce ():
Následující příkaz získá hodnotu vlhkosti a teploty a uloží ji do celočíselné proměnné h a t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Dále je CAN ID zadáno jako 0x036 (dle volby) a DLC jako 8 a datům h a t dáme data a data a všechna data uložíme na 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Aktualizace hodnoty vlhkosti v canMsg.data = t; // Aktualizace hodnoty teploty v canMsg.data = 0x00; // Zbytek vše s 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Koneckonců, k odeslání zprávy na CAN BUS použijeme následující prohlášení.
mcp2515.sendMessage (& canMsg);
Takže nyní jsou data o teplotě a vlhkosti odeslána na CAN sběrnici.
Vysvětlení kódu CAN přijímače (Arduino UNO)
V sekci přijímače Arduino UNO propojilo rozhraní s MCP2515 a 16x2 LCD displejem. Zde Arduino UNO přijímá teplotu a vlhkost ze sběrnice CAN a zobrazuje data přijatá na LCD.
Nejprve jsou zahrnuty požadované knihovny, knihovna SPI pro použití komunikace SPI, knihovna MCP2515 pro použití komunikace CAN a knihovna LiquidCrsytal pro použití 16x2 LCD s Arduino .
#zahrnout
Dále jsou definovány LCD piny, které se používají při připojení k Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Struct datový typ je deklarován pro ukládání formátu CAN zpráv.
struktura can_frame canMsg;
Nastavte číslo pinu, kde je připojen SPI CS (standardně 10)
MCP2515 mcp2515 (10);
V neplatném nastavení ():
Nejprve se LCD nastaví na režim 16x2 a zobrazí se uvítací zpráva.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("OKRUH DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); zpoždění (3000); lcd.clear ();
Spusťte komunikaci SPI pomocí následujícího příkazu.
SPI.begin ();
Dále se MCP2515 resetuje pomocí následujícího příkazu.
mcp2515.reset ();
Nyní je na MCP2515 nastavena rychlost 500KBPS a 8MHZ jako hodiny.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
A MCP2525 je nastaven na normální režim.
mcp2515.setNormalMode ();
Další v neplatné smyčce ():
Následující příkaz se používá k přijetí zprávy ze sběrnice CAN. Pokud je zpráva přijata, dostane se do stavu if .
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
V případě podmínky jsou data přijata a uložena v c anMsg , data s hodnotou vlhkosti a data s hodnotou teploty. Obě hodnoty jsou uloženy v celých číslech x a y.
int x = canMsg.data; int y = canMsg.data;
Po obdržení hodnot se hodnoty teploty a vlhkosti zobrazí na 16x2 LCD displeji pomocí následujícího prohlášení.
lcd.setCursor (0,0); lcd.print ("Vlhkost:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Teplota:"); lcd.print (y); zpoždění (1000); lcd.clear ();
Práce na CAN komunikaci v Arduinu
Jakmile je hardware připraven, nahrajte program pro vysílač CAN a přijímač CAN (kompletní programy jsou uvedeny níže) na příslušné desky Arduino. Když je napájen, měli byste si všimnout, že hodnota teploty načtená DHT11 bude odeslána do jiného Arduina prostřednictvím komunikace CAN a zobrazena na LCD 2. Arduina, jak vidíte na následujícím obrázku. Také jsem pomocí dálkového ovladače AC zkontroloval, zda se teplota zobrazená na LCD displeji blíží skutečné pokojové teplotě.
Kompletní práci najdete na videu, na které odkazujete níže. Pokud máte nějaké dotazy, nechte je v sekci komentářů nebo použijte naše fóra pro další technické dotazy.