Uporabite ta robusten serijski komunikacijski protokol za povezavo dveh plošč Arduino skupaj in pošiljanje podatkov druga drugi.

Vodilo CAN (Controller Area Network) je robusten in zanesljiv komunikacijski protokol, ki se pogosto uporablja v različnih industrijskih, avtomobilskih in vesoljskih aplikacijah. Namenjen je prenosu podatkov med mikrokontrolerji in napravami po omrežju CAN vodila. Morda tega še ne veste, a to je stvar za tistimi norimi modifikacijami armaturne plošče avtomobila, ki jih vidite na družbenih omrežjih.

Povedali vam bomo, kako zgraditi vodilo CAN z modulom CAN MCP2515 z uporabo Arduina in navigacijske plošče. Preučili bomo tudi knjižnico Arduino CAN in pokazali, kako pošiljati in prejemati podatke prek vodila CAN.

Kaj je vodilo CAN?

Vodilo CAN je serijski komunikacijski protokol, ki ga je razvil Bosch v osemdesetih letih prejšnjega stoletja. Zaradi svoje visoke zanesljivosti in robustnosti se široko uporablja v različnih aplikacijah. Omogoča prenos podatkov med napravami pri visokih hitrostih z minimalno zakasnitvijo po samo dveh linijah: CAN High in CAN Low.

instagram viewer

Leta 1994 je vodilo CAN postalo mednarodni standard (ISO 11898), ki je bil zasnovan posebej za hitro serijsko izmenjavo podatkov med elektronskimi krmilniki v avtomobilskih aplikacijah. Oglejte si naš obsežen vodnik o kaj je vodilo CAN in kakšno vlogo ima v avtomobilskih sistemih za več podrobnosti.

Eden od razlogov, zakaj je vodilo CAN tako priljubljeno, je njegova funkcija za odkrivanje in odpravljanje napak. Protokol lahko odkrije in popravi napake pri prenosu podatkov. Zaradi tega je idealen za aplikacije, kjer je celovitost podatkov ključnega pomena, na primer v industrijski avtomatizaciji.

Poznavanje modula CAN MCP2515

Modul MCP2515 CAN Bus Controller je naprava, ki zagotavlja izjemno podporo za široko uporabljen protokol CAN različice 2.0B. Ta modul je idealen za komunikacijo pri visokih podatkovnih hitrostih do 1Mbps.

MCP2515 IC je neodvisen krmilnik CAN z vmesnikom SPI, ki omogoča komunikacijo s široko paleto mikrokontrolerjev. Po drugi strani IC TJA1050 deluje kot vmesnik med IC krmilnika MCP2515 CAN in fizičnim vodilom CAN.

Za dodatno udobje je na voljo mostiček, ki vam omogoča pritrditev 120 ohmskega zaključka, kar še olajša priklop vaših žic na CAN_H & CAN_L vijaki za komunikacijo z drugimi moduli CAN.

Funkcija

Specifikacija

Transiver

TJA1050

Mikrokrmilniški vmesnik

SPI (omogoča integracijo vodila Multi CAN)

Kristalni oscilator

8MHz

Prekinitev

120Ω

Hitrost

1Mbps

Poraba energije

Delovanje v stanju pripravljenosti z nizkim tokom

Dimenzija

40 x 28 mm

Zmogljivost vozlišča

Podpira do 112 vozlišč

Dodatne informacije dobite pri Podatkovni list MCP2515 če potrebujete ta modul za naprednejši projekt.

Struktura sporočila CAN

Struktura sporočila CAN je sestavljena iz več segmentov, vendar sta najbolj kritična segmenta za ta projekt identifikator in podatki. Identifikator, znan tudi kot CAN ID ali številka skupine parametrov (PGN), identificira naprave na CAN omrežja, dolžina identifikatorja pa je lahko 11 ali 29 bitov, odvisno od vrste protokola CAN rabljeno.

Medtem pa podatki predstavljajo dejanske podatke senzorja/kontrole, ki se prenašajo. Podatki so lahko dolgi od 0 do 8 bajtov, koda dolžine podatkov (DLC) pa označuje število prisotnih podatkovnih bajtov.

Arduino MCP2515 CAN Bus knjižnica

Ta knjižnica izvaja Protokol CAN V2.0B, ki lahko deluje s hitrostjo do 1Mbps. Zagotavlja vmesnik SPI, ki lahko deluje s hitrostjo do 10MHz, hkrati pa podpira standardne (11-bitne) in razširjene (29-bitne) podatke. Še več, prihaja z dvema sprejemnima medpomnilnikoma, ki omogočata prednostno shranjevanje sporočil.

Inicializacija vodila CAN

Tu je nastavitvena koda, ki jo boste potrebovali za inicializacijo vodila CAN:

#vključujejo
#vključujejo

MCP2515 mcp2515(10); // Nastavitev zatiča CS

prazninanastaviti(){
medtem (!Serijski);
Serijski.začeti(9600);
SPI.začeti(); //Začne komunikacijo SPI

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

To inicializira MCP2515 z bitno hitrostjo CAN 500 Kbps in frekvenco oscilatorja 8 MHz.

Načini delovanja CAN MCP2515

S krmilnikom vodila CAN MCP2515 se uporabljajo trije načini delovanja:

  • setNormalMode(): nastavi krmilnik za pošiljanje in prejemanje sporočil.
  • setLoopbackMode(): nastavi krmilnik za pošiljanje in prejemanje sporočil, vendar bo sporočila, ki jih pošlje, prejel tudi sam.
  • setListenOnlyMode(): nastavi krmilnik tako, da prejema le sporočila.

To so funkcijski klici, ki se uporabljajo za nastavitev načina delovanja krmilnika vodila CAN MCP2515.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Pošiljanje podatkov prek vodila CAN

Če želite poslati sporočilo prek vodila CAN, uporabite sendMsgBuf() metoda:

nepodpisanchar podatki [] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, podatki);

To pošlje sporočilo z ID-jem 0x01 in podatkovno obremenitev {0x01, 0x02, 0x03, 0x04}. Prvi parameter je CAN ID, drugi je prioriteta sporočila, tretji je dolžina podatkovnega tovora in četrti je sam podatkovni tovor.

The sendMsgBuf() metoda vrne vrednost, ki označuje, ali je bilo sporočilo poslano uspešno ali ne. To vrednost lahko preverite tako, da pokličete na checkError() metoda:

če (CAN.checkError()) {
Serijski.println("Napaka pri pošiljanju sporočila.");
}

To preveri, ali je med prenosom sporočila prišlo do napake, in po potrebi natisne sporočilo o napaki.

Prejemanje podatkov iz vodila CAN

Če želite prejeti sporočilo prek vodila CAN, lahko uporabite readMsgBuf() metoda:

nepodpisanchar len = 0;
nepodpisanchar buf [8];
nepodpisanchar canID = 0;

če (CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId();
}

To preveri, ali je sporočilo na voljo na vodilu CAN, nato pa sporočilo prebere v buf niz. Dolžina sporočila je shranjena v len spremenljivka, ID sporočila pa je shranjen v canID spremenljivka.

Ko prejmete sporočilo, lahko po potrebi obdelate koristne podatke. Na primer, lahko natisnete koristne podatke na serijski monitor:

Serijski.tiskanje("Prejeto sporočilo z ID-jem");
Serijski.tiskanje(canID, HEX);
Serijski.tiskanje(" in podatki: ");

za (int jaz = 0; i < len; i++) {
Serijski.tiskanje(buf[i], HEX);
Serijski.tiskanje(" ");
}

Serijski.println();

To natisne ID prejetega sporočila in koristne podatke v serijski monitor.

Kako povezati oddajnik-sprejemnik vodila CAN na matično ploščo

Če želite zgraditi vodilo CAN za povezavo dveh naprav v tem primeru projekta, boste potrebovali:

  • Dva mikrokontrolerja (dve plošči Arduino Nano za ta primer)
  • Dva CAN modula MCP2515
  • Krovna plošča
  • Premostitvene žice
  • Modul LCD zaslona I2C 16x2
  • Ultrazvočni senzor HC-SR04

Za ta primer projekta so v skici Arduino uporabljene štiri knjižnice. Tukaj je NewPing knjižnico, ki ponuja vmesnik, enostaven za uporabo za ultrazvočni senzor, kot tudi za Knjižnica SPI, ki olajša komunikacijo med ploščo Arduino in krmilnikom CAN vodila MCP2515. The LiquidCrystal_I2C knjižnica se uporablja za zaslonski modul.

Nazadnje je tu še knjižnica mcp2515 za vmesnik s čipom MCP2515, kar nam omogoča enostaven prenos podatkov preko omrežja vodila CAN.

Nastavitev strojne opreme (primer HC-SR04)

V tem projektu z uporabo senzorja HC-SR04 in LCD bo ena plošča Arduino Nano delovala kot sprejemnik, medtem ko bo druga Arduino delovala kot oddajnik. Komponente oddajnika povežite v skladu s spodnjim diagramom ožičenja:

Tukaj je diagram za vezje sprejemnika:

Nazadnje povežite obe vozlišči skupaj z CAN_H in CAN_L vrstice, kot je prikazano:

Pri priklopu modulov je pomembno zagotoviti, da je napajalna napetost v določenem območju in da LAHKO H in LAHKO L zatiči pravilno priključeni na vodilo.

Programiranje modula vodila CAN MCP2515

Upoštevajte, da je pri programiranju modula MCP2515 pomembno, da uporabite pravilno bitno hitrost, da zagotovite uspešno komunikacijo z drugimi napravami CAN v omrežju.

Koda pošiljatelja:

#vključujejo
#vključujejo
#vključujejo

MCP2515 mcp2515(10);
konstbajt trigPin = 3;
konstbajt echoPin = 4;
NewPing sonar(trigPin, echoPin, 200);

structcan_framecanMsg;

prazninanastaviti(){
Serijski.začeti(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

prazninazanka(){
nepodpisanint razdalja = sonar.ping_cm();
canMsg.can_id = 0x036; //CAN ID kot 0x036
canMsg.can_dlc = 8; //Dolžina podatkov CAN kot 8
canMsg.data[0] = razdalja; //Posodobi vrednost vlažnosti v [0]
canMsg.data[1] = 0x00; //Vse ostalo z 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);//Pošlje sporočilo CAN
zamuda(100);
}

Koda prejemnika:

#vključujejo
#vključujejo
#vključujejo

MCP2515 mcp2515(10);
LiquidCrystal_I2C lcd(0x27,16,2);
structcan_framecanMsg;

prazninanastaviti(){
Serijski.začeti(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.tiskanje("VADNICA MUO CAN");
zamuda(3000);
lcd.jasno();
}

prazninazanka(){
če (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) // Za prejemanje podatkov
{
int razdalja = canMsg.data[0];
lcd.setCursor(0,0);
lcd.tiskanje("Razdalja: ");
lcd.tiskanje(razdalja);
lcd.tiskanje("cm");
}
}

Popeljite svoje projekte Arduino na naslednjo raven

Kombinacija vodila CAN in Arduina zagotavlja zmogljivo platformo za gradnjo ali učenje sofisticiranih komunikacijskih omrežij, ki se uporabljajo v različnih aplikacijah. Čeprav se morda zdi, da gre za strmo krivuljo učenja, je imeti lastno nastavitev na mizi precej priročen način za učenje o uporabi omrežja vodila CAN v zapletenih projektih DIY.