Izmantojiet šo spēcīgo seriālo sakaru protokolu, lai savienotu divas Arduino plates un nosūtītu datus viena otrai.

Kontrollera apgabala tīkla (CAN) kopne ir spēcīgs un uzticams sakaru protokols, ko plaši izmanto dažādās rūpniecības, automobiļu un kosmosa lietojumprogrammās. Tas ir paredzēts datu pārraidei starp mikrokontrolleriem un ierīcēm, izmantojot CAN kopnes tīklu. Jūs, iespējams, to vēl nezināt, taču tas ir aiz tiem trakajiem automašīnu paneļa modifikācijām, ko redzat sociālajos medijos.

Mēs jums pastāstīsim, kā izveidot CAN kopni ar MCP2515 CAN moduli, izmantojot Arduino un maizes paneli. Mēs arī apskatīsim Arduino CAN bibliotēku un parādīsim, kā nosūtīt un saņemt datus, izmantojot CAN kopni.

Kas ir CAN autobuss?

CAN kopne ir seriālās komunikācijas protokols, ko Bosch izstrādāja astoņdesmitajos gados. To plaši izmanto dažādās lietojumprogrammās, jo tā ir augsta uzticamība un izturība. Tas ļauj pārsūtīt datus starp ierīcēm lielā ātrumā ar minimālu latentumu tikai divās līnijās: CAN High un CAN Low.

1994. gadā CAN kopne kļuva par starptautisku standartu (ISO 11898), kas tika īpaši izstrādāts ātrai sērijas datu apmaiņai starp elektroniskajiem kontrolieriem automobiļu lietojumos. Apskatiet mūsu visaptverošo ceļvedi par kas ir CAN kopne un kādu lomu tā spēlē automobiļu sistēmās lai iegūtu sīkāku informāciju.

Viens no iemesliem, kāpēc CAN kopne ir tik populāra, ir tās kļūdu noteikšanas un labošanas iespējas. Protokols var atklāt un labot kļūdas datu pārraidē. Tas padara to ideāli piemērotu lietojumiem, kur datu integritāte ir kritiska, piemēram, rūpnieciskajā automatizācijā.

Zinot MCP2515 CAN moduli

MCP2515 CAN kopnes kontrollera modulis ir ierīce, kas nodrošina izcilu atbalstu plaši izmantotajai CAN protokola versijai 2.0B. Šis modulis ir ideāli piemērots saziņai ar lielu datu pārraides ātrumu līdz 1Mbps.

MCP2515 IC ir neatkarīgs CAN kontrolieris ar SPI interfeisu, kas nodrošina saziņu ar plašu mikrokontrolleru klāstu. No otras puses, TJA1050 IC darbojas kā interfeiss starp MCP2515 CAN kontrollera IC un fizisko CAN kopni.

Papildu ērtībai ir pieejams džemperis, kas ļauj pievienot 120 omu galu, padarot vēl vienkāršāku vadu pievienošanu CAN_H & CAN_L skrūves saziņai ar citiem CAN moduļiem.

Funkcija

Specifikācija

Raiduztvērējs

TJA1050

Mikrokontrollera interfeiss

SPI (pieļauj vairāku CAN kopņu integrāciju)

Kristāla oscilators

8MHz

Izbeigšana

120Ω

Ātrums

1Mbps

Elektrības patēriņš

Vājas strāvas gaidstāves darbība

Izmērs

40 x 28 mm

Mezgla ietilpība

Atbalsta līdz 112 mezgliem

Papildinformāciju varat iegūt no MCP2515 datu lapa ja jums ir nepieciešams šis modulis progresīvākam projektam.

CAN ziņojuma struktūra

CAN ziņojumu struktūra sastāv no vairākiem segmentiem, taču vissvarīgākie segmenti šim projektam ir identifikators un dati. Identifikators, kas pazīstams arī kā CAN ID vai parametru grupas numurs (PGN), identificē CAN tīklā esošās ierīces. tīklā, un identifikatora garums var būt 11 vai 29 biti atkarībā no CAN protokola veida lietots.

Tikmēr dati atspoguļo faktiskos sensora/vadības datus, kas tiek pārraidīti. Dati var būt no 0 līdz 8 baitiem gari, un datu garuma kods (Data Length Code — DLC) norāda esošo datu baitu skaitu.

Arduino MCP2515 CAN autobusu bibliotēka

Šī bibliotēka īsteno CAN V2.0B protokols, kas var darboties ar ātrumu līdz 1Mbps. Tas nodrošina SPI interfeisu, kas var darboties ar ātrumu līdz 10MHz, vienlaikus atbalstot gan standarta (11 bitu), gan paplašinātos (29 bitu) datus. Turklāt tam ir divi saņemšanas buferi, kas nodrošina prioritāru ziņojumu glabāšanu.

CAN kopnes inicializācija

Šeit ir iestatīšanas kods, kas jums būs nepieciešams, lai inicializētu CAN kopni:

#ietver
#ietver

MCP2515 mcp2515(10); // Iestatīt CS tapu

nederīgsuzstādīt(){
kamēr (!Seriāls);
Seriāls.sākt(9600);
SPI.sākt(); //Sākas SPI komunikācija

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

Tas inicializē MCP2515 ar CAN bitu pārraides ātrumu 500Kbps un oscilatora frekvenci 8MHz.

MCP2515 CAN darbības režīmi

Ar MCP2515 CAN kopnes kontrolleri tiek izmantoti trīs darbības režīmi:

  • setNormalMode(): iestata kontrolleri sūtīt un saņemt ziņojumus.
  • setLoopbackMode(): iestata kontrolleri sūtīt un saņemt ziņojumus, taču tā sūtītie ziņojumi tiks saņemti arī paši.
  • setListenOnlyMode(): iestata kontrolleri saņemt tikai ziņas.

Tie ir funkciju izsaukumi, ko izmanto, lai iestatītu MCP2515 CAN kopnes kontrollera darbības režīmu.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Datu sūtīšana, izmantojot CAN kopni

Lai nosūtītu ziņojumu, izmantojot CAN kopni, izmantojiet sendMsgBuf() metode:

neparakstītschar dati[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, dati);

Tas nosūta ziņojumu ar ID 0x01 un datu kravnesība 0x01, 0x02, 0x03, 0x04}. Pirmais parametrs ir CAN ID, otrais ir ziņojuma prioritāte, trešais ir datu slodzes garums un ceturtais ir pati datu slodze.

The sendMsgBuf() metode atgriež vērtību, kas norāda, vai ziņojums tika veiksmīgi nosūtīts vai nē. Šo vērtību var pārbaudīt, zvanot uz pārbaudes kļūda () metode:

ja (CAN.checkError()) {
Seriāls.println("Kļūda nosūtot ziņojumu.");
}

Tas pārbauda, ​​vai ziņojuma pārsūtīšanas laikā nav radusies kļūda, un, ja nepieciešams, izdrukā kļūdas ziņojumu.

Datu saņemšana no CAN kopnes

Lai saņemtu ziņojumu, izmantojot CAN kopni, varat izmantot readMsgBuf() metode:

neparakstītschar len = 0;
neparakstītschar buf[8];
neparakstītschar canID = 0;

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

Tas pārbauda, ​​vai ziņojums ir pieejams CAN kopnē, un pēc tam nolasa ziņojumu buf masīvs. Ziņojuma garums tiek saglabāts len mainīgais, un ziņojuma ID tiek saglabāts canID mainīgs.

Kad esat saņēmis ziņojumu, varat apstrādāt datu slodzi pēc vajadzības. Piemēram, varat izdrukāt datu lietderīgo slodzi uz sērijas monitoru:

Seriāls.drukāt("Saņemta ziņa ar ID");
Seriāls.drukāt(canID, HEX);
Seriāls.drukāt(" un dati: ");

priekš (starpt i = 0; i < len; i++) {
Seriāls.drukāt(buf[i], HEX);
Seriāls.drukāt(" ");
}

Seriāls.println();

Tas izdrukā saņemtā ziņojuma ID un datu lietderīgo slodzi uz sērijas monitoru.

Kā savienot CAN kopnes raiduztvērēju ar plati

Lai šajā projekta paraugā izveidotu CAN kopni divu ierīču savienošanai, jums būs nepieciešams:

  • Divi mikrokontrolleri (šim piemēram divas Arduino Nano plates)
  • Divi MCP2515 CAN moduļi
  • Maizes dēlis
  • Džemperu vadi
  • I2C 16x2 LCD ekrāna modulis
  • HC-SR04 ultraskaņas sensors

Šajā projekta piemērā Arduino skicē tiek izmantotas četras bibliotēkas. Tur ir JaunsPing bibliotēka, kas nodrošina ērti lietojamu interfeisu Ultraskaņas sensoram, kā arī SPI bibliotēka, kas atvieglo saziņu starp Arduino plati un MCP2515 CAN kopnes kontrolieri. The Liquid Crystal_I2C displeja modulim tiek izmantota bibliotēka.

Visbeidzot, ir mcp2515 bibliotēka lai savienotos ar MCP2515 mikroshēmu, ļaujot mums viegli pārsūtīt datus pa CAN kopnes tīklu.

Aparatūras iestatīšana (HC-SR04 piemērs)

Šajā projektā, izmantojot HC-SR04 sensoru un LCD, viena Arduino Nano plate darbosies kā uztvērējs, bet otra Arduino kā sūtītājs. Pievienojiet sūtītāja komponentus saskaņā ar tālāk norādīto elektroinstalācijas shēmu:

Šeit ir uztvērēja shēmas shēma:

Visbeidzot savienojiet abus mezglus kopā, izmantojot CAN_H un CAN_L līnijas, kā parādīts:

Pieslēdzot moduļus, ir svarīgi nodrošināt, lai barošanas spriegums būtu norādītajā diapazonā un lai VAR H un VAR L tapas ir pareizi savienotas ar kopni.

MCP2515 CAN kopnes moduļa programmēšana

Ņemiet vērā, ka, programmējot MCP2515 moduli, ir svarīgi izmantot pareizo bitu pārraides ātrumu, lai nodrošinātu veiksmīgu saziņu ar citām tīkla CAN ierīcēm.

Sūtītāja kods:

#ietver
#ietver
#ietver

MCP2515 mcp2515(10);
konstbaits trigPin = 3;
konstbaits echoPin = 4;
JaunsPing sonārs(trigPin, echoPin, 200);

struktūracan_framevarZiņojums;

nederīgsuzstādīt(){
Seriāls.sākt(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

nederīgscilpa(){
neparakstītsstarpt distance = sonar.ping_cm();
canMsg.can_id = 0x036; //CAN id kā 0x036
canMsg.can_dlc = 8; //CAN datu garums ir 8
canMsg.data[0] = attālums; //Atjaunināt mitruma vērtību šeit: [0]
canMsg.data[1] = 0x00; //Atpūtieties ar 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);//Nosūta CAN ziņojumu
kavēšanās(100);
}

Uztvērēja kods:

#ietver
#ietver
#ietver

MCP2515 mcp2515(10);
Liquid Crystal_I2C LCD(0x27,16,2);
struktūracan_framevarZiņojums;

nederīgsuzstādīt(){
Seriāls.sākt(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
LCD.iestatīt Kursoru(0, 0);
LCD.drukāt("MUO CAN TUTORIAL");
kavēšanās(3000);
LCD.skaidrs();
}

nederīgscilpa(){
ja (mcp2515.lasīt ziņojumu(&canMsg) == MCP2515::ERROR_OK) // Lai saņemtu datus
{
starpt distance = canMsg.data[0];
LCD.iestatīt Kursoru(0,0);
LCD.drukāt("Attālums:");
LCD.drukāt(attālums);
LCD.drukāt("cm");
}
}

Paceliet savus Arduino projektus uz nākamo līmeni

CAN kopnes un Arduino kombinācija nodrošina jaudīgu platformu, lai izveidotu vai apgūtu sarežģītus sakaru tīklus, ko izmanto dažādās lietojumprogrammās. Lai gan var šķist, ka mācīšanās līkne ir stāva, sava iestatīšana uz maizes dēļa ir diezgan ērts veids, kā apgūt CAN kopnes tīkla izmantošanu sarežģītos DIY projektos.