Naudokite šį tvirtą nuosekliojo ryšio protokolą, norėdami sujungti dvi Arduino plokštes ir siųsti duomenis viena kitai.

„Controller Area Network“ (CAN) magistralė yra tvirtas ir patikimas ryšio protokolas, plačiai naudojamas įvairiose pramonės, automobilių ir kosmoso srityse. Jis skirtas duomenų perdavimui tarp mikrovaldiklių ir įrenginių CAN magistralės tinklu. Galbūt to dar nežinote, bet tai yra dalykas, slypintis už tų beprotiškų automobilių prietaisų skydelio modifikacijų, kurias matote socialinėje žiniasklaidoje.

Mes paaiškinsime, kaip sukurti CAN magistralę su MCP2515 CAN moduliu naudojant Arduino ir duonos lentą. Taip pat apžvelgsime Arduino CAN biblioteką ir parodysime, kaip siųsti ir gauti duomenis per CAN magistralę.

Kas yra CAN magistralė?

CAN magistralė yra nuosekliojo ryšio protokolas, kurį Bosch sukūrė devintajame dešimtmetyje. Dėl didelio patikimumo ir tvirtumo jis plačiai naudojamas įvairiose srityse. Tai leidžia perduoti duomenis tarp įrenginių dideliu greičiu su minimalia delsa tik dviem linijomis: CAN High ir CAN Low.

instagram viewer

1994 m. CAN magistralė tapo tarptautiniu standartu (ISO 11898), kuris buvo sukurtas specialiai greitam nuosekliam duomenų mainams tarp elektroninių valdiklių automobilių pramonėje. Peržiūrėkite mūsų išsamų vadovą kas yra CAN magistralė ir kokį vaidmenį ji atlieka automobilių sistemose Norėdami gauti daugiau informacijos.

Viena iš priežasčių, kodėl CAN magistralė yra tokia populiari, yra jos klaidų aptikimo ir taisymo funkcijos. Protokolas gali aptikti ir ištaisyti duomenų perdavimo klaidas. Dėl to jis idealiai tinka programoms, kuriose duomenų vientisumas yra labai svarbus, pavyzdžiui, pramoninėje automatizacijoje.

Žinant MCP2515 CAN modulį

MCP2515 CAN magistralės valdiklio modulis yra įrenginys, suteikiantis išskirtinį palaikymą plačiai naudojamai CAN protokolo versijai 2.0B. Šis modulis idealiai tinka bendravimui dideliu duomenų perdavimo greičiu iki 1Mbps.

MCP2515 IC yra nepriklausomas CAN valdiklis su SPI sąsaja, leidžiančia bendrauti su įvairiais mikrovaldikliais. Kita vertus, TJA1050 IC veikia kaip sąsaja tarp MCP2515 CAN valdiklio IC ir fizinės CAN magistralės.

Siekiant didesnio patogumo, yra trumpiklis, leidžiantis pritvirtinti 120 omų galą, todėl dar lengviau prijungti laidus prie CAN_H & CAN_L varžtai ryšiui su kitais CAN moduliais.

Funkcija

Specifikacija

Siųstuvas-imtuvas

TJA1050

Mikrovaldiklio sąsaja

SPI (leidžia integruoti kelių CAN magistrales)

Kristalinis osciliatorius

8MHz

Nutraukimas

120Ω

Greitis

1Mbps

Energijos sąnaudos

Mažos srovės budėjimo režimas

Matmenys

40x28mm

Mazgo talpa

Palaiko iki 112 mazgų

Papildomos informacijos galite gauti iš MCP2515 duomenų lapas jei jums reikia šio modulio sudėtingesniam projektui.

CAN pranešimų struktūra

CAN pranešimų struktūra susideda iš kelių segmentų, tačiau svarbiausi šio projekto segmentai yra identifikatorius ir duomenys. Identifikatorius, taip pat žinomas kaip CAN ID arba parametrų grupės numeris (PGN), identifikuoja CAN įrenginius. tinkle, o identifikatoriaus ilgis gali būti 11 arba 29 bitai, priklausomai nuo CAN protokolo tipo naudojamas.

Tuo tarpu duomenys rodo tikruosius perduodamus jutiklio / valdymo duomenis. Duomenys gali būti nuo 0 iki 8 baitų, o duomenų ilgio kodas (DLC) nurodo esamų duomenų baitų skaičių.

Arduino MCP2515 CAN autobusų biblioteka

Ši biblioteka įgyvendina CAN V2.0B protokolas, kuris gali veikti iki 1Mbps greičiu. Jame yra SPI sąsaja, kuri gali veikti iki 10MHz greičiu, kartu palaikydama ir standartinius (11 bitų), ir išplėstinius (29 bitų) duomenis. Be to, jame yra du priėmimo buferiai, kurie leidžia pirmenybę teikti pranešimų saugojimui.

CAN magistralės inicijavimas

Štai sąrankos kodas, kurio jums reikės norint inicijuoti CAN magistralę:

#įtraukti
#įtraukti

MCP2515 mcp2515(10); // Nustatyti CS kaištį

tuštumasąranka(){
kol (!Serijinis);
Serijinis.pradėti(9600);
SPI.pradėti(); //Prasideda SPI komunikacija

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

Tai inicijuoja MCP2515 su 500Kbps CAN bitų sparta ir 8MHz generatoriaus dažniu.

MCP2515 CAN veikimo režimai

Su MCP2515 CAN magistralės valdikliu naudojami trys darbo režimai:

  • setNormalMode(): nustato valdiklį siųsti ir gauti pranešimus.
  • setLoopbackMode(): nustato valdiklį siųsti ir gauti pranešimus, tačiau jo siunčiami pranešimai taip pat bus gauti patys.
  • setListenOnlyMode(): nustato valdiklį priimti tik pranešimus.

Tai yra funkcijų iškvietimai, naudojami MCP2515 CAN magistralės valdiklio veikimo režimui nustatyti.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Duomenų siuntimas per CAN magistralę

Norėdami išsiųsti pranešimą per CAN magistralę, naudokite sendMsgBuf() metodas:

nepasirašytaschar duomenys[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, duomenys);

Taip išsiunčiamas pranešimas su ID 0x01 ir naudingoji duomenų apkrova 0x01, 0x02, 0x03, 0x04}. Pirmasis parametras yra CAN ID, antrasis yra pranešimo prioritetas, trečiasis yra duomenų naudingosios apkrovos ilgis, o ketvirtasis yra pats duomenų naudingumas.

The sendMsgBuf() metodas grąžina reikšmę, nurodantį, ar pranešimas išsiųstas sėkmingai, ar ne. Šią reikšmę galite patikrinti paskambinę tel patikrinimo klaida () metodas:

jeigu (CAN.checkError()) {
Serijinis.println(„Klaida siunčiant pranešimą“.);
}

Taip patikrinama, ar perduodant pranešimą neįvyko klaida ir, jei reikia, išspausdinamas klaidos pranešimas.

Duomenų gavimas iš CAN magistralės

Norėdami gauti pranešimą per CAN magistralę, galite naudoti readMsgBuf() metodas:

nepasirašytaschar len = 0;
nepasirašytaschar buf[8];
nepasirašytaschar canID = 0;

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

Taip patikrinama, ar CAN magistralėje yra pranešimas, tada jis nuskaitomas į buf masyvas. Pranešimo ilgis išsaugomas len kintamasis, o pranešimo ID yra saugomas canID kintamasis.

Gavę pranešimą, pagal poreikį galėsite apdoroti naudingą duomenų kiekį. Pavyzdžiui, galite atspausdinti naudingus duomenis į serijinį monitorių:

Serijinis.spausdinti(„Gauta žinutė su ID“);
Serijinis.spausdinti(canID, HEX);
Serijinis.spausdinti(" ir duomenys: ");

dėl (tarpt aš = 0; i < len; i++) {
Serijinis.spausdinti(buf[i], HEX);
Serijinis.spausdinti(" ");
}

Serijinis.println();

Tai atspausdina gauto pranešimo ID ir naudingą duomenų kiekį į serijinį monitorių.

Kaip prijungti CAN magistralės siųstuvą-imtuvą prie plokštės

Norėdami sukurti CAN magistralę, skirtą sujungti du įrenginius šiame pavyzdiniame projekte, jums reikės:

  • Du mikrovaldikliai (šiam pavyzdžiui skirtos dvi Arduino Nano plokštės)
  • Du MCP2515 CAN moduliai
  • Duonos lenta
  • Jumperių laidai
  • I2C 16x2 LCD ekrano modulis
  • HC-SR04 ultragarsinis jutiklis

Šiame projekto pavyzdyje Arduino eskize naudojamos keturios bibliotekos. Ten yra NaujasPing biblioteka, kurioje yra paprasta naudoti ultragarso jutiklio sąsaja, taip pat SPI biblioteka, kuris palengvina ryšį tarp Arduino plokštės ir MCP2515 CAN magistralės valdiklio. The Skystųjų kristalų_I2C biblioteka naudojama ekrano moduliui.

Galiausiai yra mcp2515 biblioteka sąsaja su MCP2515 mikroschema, leidžiančia lengvai perduoti duomenis CAN magistralės tinklu.

Aparatinės įrangos sąranka (HC-SR04 pavyzdys)

Šiame projekte naudojant HC-SR04 jutiklį ir LCD, viena Arduino Nano plokštė veiks kaip imtuvas, o kita Arduino – kaip siuntėjas. Prijunkite siuntėjo komponentus pagal toliau pateiktą laidų schemą:

Čia yra imtuvo grandinės schema:

Galiausiai sujunkite du mazgus naudodami CAN_H ir CAN_L eilutės, kaip parodyta:

Sujungiant modulius svarbu užtikrinti, kad maitinimo įtampa būtų nurodytose srityse ir kad GALI H ir GALI L kaiščiai tinkamai prijungti prie magistralės.

MCP2515 CAN magistralės modulio programavimas

Atkreipkite dėmesį, kad programuojant MCP2515 modulį, svarbu naudoti teisingą bitų spartą, kad būtų užtikrintas sėkmingas ryšys su kitais tinklo CAN įrenginiais.

Siuntėjo kodas:

#įtraukti
#įtraukti
#įtraukti

MCP2515 mcp2515(10);
konstbaitas trigPin = 3;
konstbaitas echoPin = 4;
NaujasPing sonaras(trigPin, echoPin, 200);

struktūracan_framegaliMsg;

tuštumasąranka(){
Serijinis.pradėti(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

tuštumakilpa(){
nepasirašytastarpt atstumas = sonaras.ping_cm();
canMsg.can_id = 0x036; //CAN ID kaip 0x036
canMsg.can_dlc = 8; //CAN duomenų ilgis yra 8
canMsg.data[0] = atstumas; //Atnaujinti drėgmės vertę [0]
canMsg.data[1] = 0x00; //Pailsėkite su 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);//Siunčia CAN pranešimą
delsimas(100);
}

Gavėjo kodas:

#įtraukti
#įtraukti
#įtraukti

MCP2515 mcp2515(10);
Skystųjų kristalų_I2C LCD(0x27,16,2);
struktūracan_framegaliMsg;

tuštumasąranka(){
Serijinis.pradėti(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
LCD.nustatyti žymeklį(0, 0);
LCD.spausdinti(„MUO CAN TUTORIAL“);
delsimas(3000);
LCD.aišku();
}

tuštumakilpa(){
jeigu (mcp2515.skaityti pranešimą(&canMsg) == MCP2515::ERROR_OK) // Duomenims gauti
{
tarpt atstumas = canMsg.data[0];
LCD.nustatyti žymeklį(0,0);
LCD.spausdinti("Atstumas:");
LCD.spausdinti(atstumas);
LCD.spausdinti("cm ");
}
}

Perkelkite savo Arduino projektus į kitą lygį

CAN magistralės ir Arduino derinys suteikia galingą platformą sudėtingiems komunikacijos tinklams, naudojamiems įvairiose programose, kurti ar mokytis. Nors tai gali atrodyti staigi mokymosi kreivė, turėti savo sąranką duonos lentoje yra gana patogus būdas išmokti naudoti CAN magistralės tinklą sudėtinguose „pasidaryk pats“ projektuose.