Použite tento robustný sériový komunikačný protokol na prepojenie dvoch Arduino dosiek a vzájomné posielanie dát.
Zbernica Controller Area Network (CAN) je robustný a spoľahlivý komunikačný protokol, ktorý je široko používaný v rôznych priemyselných, automobilových a leteckých aplikáciách. Je určený na prenos dát medzi mikrokontrolérmi a zariadeniami cez sieť zbernice CAN. Možno to ešte neviete, ale je to vec, ktorá stojí za tými šialenými úpravami palubnej dosky auta, ktoré vidíte na sociálnych médiách.
Prevedieme vás, ako zostaviť zbernicu CAN s modulom CAN MCP2515 pomocou Arduina a kontaktnej dosky. Prejdeme si aj knižnicu Arduino CAN a ukážeme, ako odosielať a prijímať dáta cez zbernicu CAN.
Čo je zbernica CAN?
Zbernica CAN je sériový komunikačný protokol, ktorý vyvinula spoločnosť Bosch v 80. rokoch minulého storočia. Je široko používaný v rôznych aplikáciách kvôli svojej vysokej spoľahlivosti a robustnosti. Umožňuje prenos dát medzi zariadeniami vysokou rýchlosťou s minimálnou latenciou iba cez dve linky: CAN High a CAN Low.
V roku 1994 sa zbernica CAN stala medzinárodným štandardom (ISO 11898), ktorý bol navrhnutý špeciálne pre rýchlu sériovú výmenu dát medzi elektronickými ovládačmi v automobilových aplikáciách. Pozrite si nášho komplexného sprievodcu na čo je zbernica CAN a akú úlohu zohráva v automobilových systémoch pre viac podrobností.
Jedným z dôvodov, prečo je zbernica CAN taká populárna, je jej detekcia a oprava chýb. Protokol dokáže odhaliť a opraviť chyby pri prenose údajov. Vďaka tomu je ideálny pre aplikácie, kde je kritická integrita údajov, ako napríklad v priemyselnej automatizácii.
Zoznámenie sa s modulom CAN MCP2515
Modul MCP2515 CAN Bus Controller je zariadenie, ktoré poskytuje výnimočnú podporu pre široko používaný CAN protokol verzie 2.0B. Tento modul je ideálny pre komunikáciu s vysokou prenosovou rýchlosťou až 1 Mbps.
MCP2515 IC je nezávislý CAN radič s rozhraním SPI, ktorý umožňuje komunikáciu so širokou škálou mikrokontrolérov. TJA1050 IC na druhej strane funguje ako rozhranie medzi IC radiča CAN MCP2515 a fyzickou zbernicou CAN.
Pre väčšie pohodlie je k dispozícii prepojka, ktorá vám umožní pripojiť 120 ohmovú koncovku, čím je ešte jednoduchšie pripojiť vaše káble k CAN_H & CAN_L skrutky pre komunikáciu s ostatnými modulmi CAN.
Funkcia |
Špecifikácia |
---|---|
Transceiver |
TJA1050 |
Rozhranie mikrokontroléra |
SPI (umožňuje integráciu zbernice Multi CAN) |
Kryštálový oscilátor |
8 MHz |
Ukončenie |
120Ω |
Rýchlosť |
1 Mbps |
Spotreba energie |
Nízkoprúdová pohotovostná prevádzka |
Rozmer |
Rozmer 40 x 28 mm |
Kapacita uzla |
Podporuje až 112 uzlov |
Ďalšie informácie môžete získať z Technický list MCP2515 v prípade, že potrebujete tento modul pre pokročilejší projekt.
Štruktúra správy CAN
Štruktúra správy CAN pozostáva z viacerých segmentov, ale najkritickejšími segmentmi pre tento projekt sú identifikátor a dáta. Identifikátor, tiež známy ako CAN ID alebo Parameter Group Number (PGN), identifikuje zariadenia na CAN siete a dĺžka identifikátora môže byť buď 11 alebo 29 bitov, v závislosti od typu protokolu CAN použité.
Údaje medzitým predstavujú aktuálne prenášané údaje snímača/riadenia. Údaje môžu mať dĺžku od 0 do 8 bajtov a kód dĺžky údajov (DLC) označuje počet prítomných údajových bajtov.
Knižnica zbernice CAN Arduino MCP2515
Táto knižnica implementuje Protokol CAN V2.0B, ktorý dokáže pracovať rýchlosťou až 1 Mbps. Poskytuje rozhranie SPI, ktoré môže pracovať rýchlosťou až 10 MHz, pričom podporuje štandardné (11-bitové) aj rozšírené (29-bitové) dáta. Navyše prichádza s dvomi prijímacími vyrovnávacími pamäťami, ktoré umožňujú ukladanie správ podľa priority.
Inicializácia zbernice CAN
Tu je kód nastavenia, ktorý budete potrebovať na inicializáciu zbernice CAN:
#zahŕňajú
#zahŕňajúMCP2515 mcp2515(10); // Nastavte kód CS
neplatnénastaviť(){
zatiaľ čo (!Serial);
Serial.začať(9600);
SPI.začať(); //Spustí komunikáciu SPI
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}
Toto inicializuje MCP2515 s bitovou rýchlosťou CAN 500 kbps a frekvenciou oscilátora 8 MHz.
Prevádzkové režimy MCP2515 CAN
S radičom zbernice CAN MCP2515 sa používajú tri prevádzkové režimy:
- setNormalMode(): nastaví ovládač na odosielanie a prijímanie správ.
- setLoopbackMode(): nastaví ovládač tak, aby odosielal a prijímal správy, ale správy, ktoré odosiela, bude prijímať aj sám.
- setListenOnlyMode(): nastaví ovládač tak, aby iba prijímal správy.
Toto sú volania funkcií používané na nastavenie prevádzkového režimu ovládača zbernice CAN MCP2515.
mcp2515.setNormalMode();
mcp2515.setLoopbackMode();
mcp2515.setListenOnlyMode();
Odosielanie údajov cez zbernicu CAN
Ak chcete odoslať správu cez zbernicu CAN, použite sendMsgBuf() metóda:
nepodpísanéchar údaje[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, údaje);
Tým sa odošle správa s ID 0x01 a užitočné zaťaženie dát {0x01, 0x02, 0x03, 0x04}. Prvým parametrom je CAN ID, druhým je priorita správy, tretím je dĺžka užitočného zaťaženia dát a štvrtým je samotné užitočné zaťaženie dát.
The sendMsgBuf() metóda vráti hodnotu, ktorá indikuje, či bola správa odoslaná úspešne alebo nie. Túto hodnotu môžete skontrolovať zavolaním na checkError() metóda:
ak (CAN.checkError()) {
Serial.println("Chyba pri odosielaní správy.");
}
Tým sa skontroluje, či sa počas prenosu správy nevyskytla chyba, av prípade potreby sa vytlačí chybové hlásenie.
Príjem dát zo zbernice CAN
Ak chcete prijať správu cez zbernicu CAN, môžete použiť readMsgBuf() metóda:
nepodpísanéchar len = 0;
nepodpísanéchar buf[8];
nepodpísanéchar canID = 0;
ak (CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId();
}
Toto skontroluje, či je správa dostupná na zbernici CAN, a potom ju prečíta do buf pole. Dĺžka správy je uložená v len premennej a ID správy je uložené v canID premenlivý.
Po prijatí správy môžete spracovať užitočné zaťaženie údajov podľa potreby. Môžete napríklad vytlačiť užitočné zaťaženie údajov na sériový monitor:
Serial.vytlačiť("Prijatá správa s ID");
Serial.vytlačiť(canID, HEX);
Serial.vytlačiť(" a údaje: ");pre (int i = 0; i < len; i++) {
Serial.vytlačiť(buf[i], HEX);
Serial.vytlačiť(" ");
}
Serial.println();
Toto vytlačí ID prijatej správy a užitočné zaťaženie dát na sériový monitor.
Ako pripojiť CAN Bus Transceiver k Breadboardu
Na zostavenie zbernice CAN na pripojenie dvoch zariadení v tomto príklade projektu budete potrebovať:
- Dva mikrokontroléry (pre tento príklad dve dosky Arduino Nano)
- Dva moduly MCP2515 CAN
- Doska na chlieb
- Štartovacie káble
- Modul obrazovky I2C 16x2 LCD
- Ultrazvukový snímač HC-SR04
Pre tento príklad projektu sa v náčrte Arduina používajú štyri knižnice. Je tam NewPing knižnica, ktorá poskytuje ľahko použiteľné rozhranie pre ultrazvukový senzor, ako aj pre Knižnica SPI, ktorý uľahčuje komunikáciu medzi doskou Arduino a radičom zbernice MCP2515 CAN. The LiquidCrystal_I2C pre zobrazovací modul sa používa knižnica.
Nakoniec je tu knižnica mcp2515 na rozhranie s čipom MCP2515, čo nám umožňuje jednoduchý prenos dát cez sieť zbernice CAN.
Nastavenie hardvéru (príklad HC-SR04)
V tomto projekte s použitím snímača HC-SR04 a LCD bude jedna Arduino Nano doska fungovať ako prijímač, zatiaľ čo druhá Arduino bude pôsobiť ako odosielateľ. Pripojte komponenty vášho vysielača podľa schémy zapojenia nižšie:
Tu je schéma obvodu prijímača:
Nakoniec spojte dva uzly pomocou CAN_H a CAN_L riadky, ako je znázornené:
Pri pripájaní modulov je dôležité zabezpečiť, aby napájacie napätie bolo v špecifikovanom rozsahu a aby CAN H a CAN L kolíky sú správne pripojené k zbernici.
Programovanie modulu zbernice CAN MCP2515
Upozorňujeme, že pri programovaní modulu MCP2515 je dôležité použiť správnu bitovú rýchlosť, aby sa zabezpečila úspešná komunikácia s ostatnými zariadeniami CAN v sieti.
Kód odosielateľa:
#zahŕňajú
#zahŕňajú
#zahŕňajúMCP2515 mcp2515(10);
konštbyte trigPin = 3;
konštbyte echoPin = 4;
NewPing sonar(trigPin, echoPin, 200);štrukturovaťcan_framecanMsg;
neplatnénastaviť(){
Serial.začať(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}neplatnéslučka(){
nepodpísanéint vzdialenosť = sonar.ping_cm();
canMsg.can_id = 0x036; //CAN id ako 0x036
canMsg.can_dlc = 8; //Dĺžka údajov CAN ako 8
canMsg.data[0] = vzdialenosť; //Aktualizácia hodnoty vlhkosti v [0]
canMsg.data[1] = 0x00; //Odpočívaj všetko s 0
canMsg.data[2] = 0x00;
canMsg.data[3] = 0x00;
canMsg.data[4] = 0x00;
canMsg.data[5] = 0x00;
canMsg.data[6] = 0x00;
canMsg.data[7] = 0x00;
mcp2515.sendMessage(&canMsg);//Odošle správu CAN
meškanie(100);
}
Kód prijímača:
#zahŕňajú
#zahŕňajú
#zahŕňajúMCP2515 mcp2515(10);
LiquidCrystal_I2C lcd(0x27,16,2);
štrukturovaťcan_framecanMsg;neplatnénastaviť(){
Serial.začať(9600);mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
lcd.nastaviť kurzor(0, 0);
lcd.vytlačiť("NÁVOD NA MUO CAN");
meškanie(3000);
lcd.jasný();
}
neplatnéslučka(){
ak (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) // Na príjem údajov
{
int vzdialenosť = canMsg.data[0];
lcd.nastaviť kurzor(0,0);
lcd.vytlačiť("Vzdialenosť:");
lcd.vytlačiť(vzdialenosť);
lcd.vytlačiť("cm");
}
}
Posuňte svoje Arduino projekty na ďalšiu úroveň
Kombinácia zbernice CAN a Arduina poskytuje výkonnú platformu pre budovanie alebo učenie sofistikovaných komunikačných sietí používaných v rôznych aplikáciách. Aj keď sa to môže zdať ako strmá krivka učenia, vlastné nastavenie na doske je celkom praktický spôsob, ako sa naučiť používať sieť zbernice CAN v zložitých projektoch pre domácich majstrov.