Käytä tätä vahvaa sarjaliikenneprotokollaa yhdistääksesi kaksi Arduino-korttia ja lähettääksesi tietoja toisilleen.

Controller Area Network (CAN) -väylä on vankka ja luotettava viestintäprotokolla, jota käytetään laajasti erilaisissa teollisuus-, auto- ja ilmailusovelluksissa. Se on suunniteltu tiedonsiirtoon mikro-ohjainten ja laitteiden välillä CAN-väyläverkon kautta. Et ehkä vielä tiedä tätä, mutta se on niiden hullujen autojen kojelaudan modien takana, joita näet sosiaalisessa mediassa.

Opastamme sinua rakentamaan CAN-väylän MCP2515 CAN-moduulilla Arduinon ja koelevyn avulla. Käymme myös läpi Arduino CAN -kirjaston ja näytämme kuinka lähettää ja vastaanottaa tietoja CAN-väylän kautta.

Mikä on CAN-väylä?

CAN-väylä on sarjaliikenneprotokolla, jonka Bosch kehitti 1980-luvulla. Sitä käytetään laajalti erilaisissa sovelluksissa sen korkean luotettavuuden ja kestävyyden vuoksi. Se mahdollistaa tiedonsiirron laitteiden välillä suurilla nopeuksilla minimaalisella latenssilla vain kahdella linjalla: CAN High ja CAN Low.

instagram viewer

Vuonna 1994 CAN-väylästä tuli kansainvälinen standardi (ISO 11898), joka on suunniteltu erityisesti nopeaan sarjamuotoiseen tiedonvaihtoon autoteollisuuden elektronisten ohjaimien välillä. Tutustu kattavaan oppaaseemme mikä CAN-väylä on ja mikä rooli sillä on autojen järjestelmissä lisätietoja.

Yksi syy siihen, miksi CAN-väylä on niin suosittu, johtuu sen virheiden havaitsemis- ja korjausominaisuuksista. Protokolla voi havaita ja korjata virheet tiedonsiirrossa. Tämä tekee siitä ihanteellisen sovelluksiin, joissa tietojen eheys on kriittistä, kuten teollisuusautomaatiossa.

MCP2515 CAN -moduulin tunteminen

MCP2515 CAN Bus Controller -moduuli on laite, joka tarjoaa poikkeuksellisen tuen laajalti käytetylle CAN-protokollan versiolle 2.0B. Tämä moduuli on ihanteellinen tiedonsiirtoon korkeilla, jopa 1 Mbps: n tiedonsiirtonopeuksilla.

MCP2515 IC on itsenäinen CAN-ohjain, jossa on SPI-liitäntä, joka mahdollistaa tiedonsiirron useiden mikro-ohjainten kanssa. TJA1050 IC puolestaan ​​toimii rajapintana MCP2515 CAN-ohjainpiirin ja fyysisen CAN-väylän välillä.

Käyttömukavuuden lisäämiseksi siinä on hyppyjohdin, jonka avulla voit liittää 120 ohmin päätteen, mikä tekee johtojen liittämisestä entistä helpompaa. CAN_H & VOINKO MINÄ ruuvit yhteydenpitoon muiden CAN-moduulien kanssa.

Ominaisuus

Erittely

Lähetin-vastaanotin

TJA1050

Mikrokontrollerin käyttöliittymä

SPI (mahdollistaa usean CAN-väylän integroinnin)

Kristalli oskillaattori

8 MHz

Irtisanominen

120Ω

Nopeus

1 Mbps

Tehon kulutus

Pienvirran valmiustila

Ulottuvuus

40 x 28 mm

Solmun kapasiteetti

Tukee jopa 112 solmua

Saat lisätietoja osoitteesta MCP2515 tekninen esite jos tarvitset tätä moduulia edistyneempään projektiin.

CAN-viestirakenne

CAN-sanomarakenne koostuu useista segmenteistä, mutta kriittisimmät segmentit tälle projektille ovat tunniste ja data. Tunniste, joka tunnetaan myös nimellä CAN ID tai Parameter Group Number (PGN), identifioi CAN: ssa olevat laitteet. verkkoon, ja tunnisteen pituus voi olla joko 11 tai 29 bittiä CAN-protokollan tyypistä riippuen käytetty.

Samaan aikaan tiedot edustavat todellista lähetettävää anturin/ohjausdataa. Data voi olla missä tahansa 0 - 8 tavua pitkä, ja Data Length Code (DLC) ilmaisee läsnä olevien datatavujen määrän.

Arduino MCP2515 CAN Bus Library

Tämä kirjasto toteuttaa CAN V2.0B -protokolla, joka voi toimia jopa 1 Mbps: n nopeudella. Se tarjoaa SPI-liitännän, joka voi toimia jopa 10 MHz: n nopeuksilla ja tukee sekä tavallista (11-bittinen) että laajennettua (29-bittinen) dataa. Lisäksi siinä on kaksi vastaanottopuskuria, jotka mahdollistavat viestien priorisoinnin.

CAN-väylän alustus

Tässä on asennuskoodi, jota tarvitset CAN-väylän alustamiseen:

#sisältää
#sisältää

MCP2515 mcp2515(10); // Aseta CS-pinni

mitätönperustaa(){
sillä aikaa (!Sarja);
Sarja.alkaa(9600);
SPI.alkaa(); //Aloittaa SPI-viestinnän

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

Tämä alustaa MCP2515:n CAN-bittinopeudella 500Kbps ja oskillaattoritaajuudella 8MHz.

MCP2515 CAN -toimintatilat

MCP2515 CAN-väyläohjaimessa käytetään kolmea toimintatilaa:

  • setNormalMode(): asettaa ohjaimen lähettämään ja vastaanottamaan viestejä.
  • setLoopbackMode(): asettaa ohjaimen lähettämään ja vastaanottamaan viestejä, mutta sen lähettämät viestit vastaanottavat myös itse.
  • setListenOnlyMode(): asettaa ohjaimen vastaanottamaan vain viestejä.

Nämä ovat toimintokutsuja, joilla asetetaan MCP2515 CAN-väyläohjaimen toimintatila.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Tietojen lähettäminen CAN-väylän kautta

Voit lähettää viestin CAN-väylän kautta käyttämällä sendMsgBuf() menetelmä:

allekirjoittamatonhiiltyä data[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, data);

Tämä lähettää viestin tunnuksella 0x01 ja datahyötykuorma 0x01, 0x02, 0x03, 0x04}. Ensimmäinen parametri on CAN ID, toinen on viestin prioriteetti, kolmas on datahyötykuorman pituus ja neljäs on itse datahyötykuorma.

The sendMsgBuf() menetelmä palauttaa arvon, joka osoittaa, lähetettiinkö viesti onnistuneesti vai ei. Voit tarkistaa tämän arvon soittamalla numeroon checkError() menetelmä:

jos (CAN.checkError()) {
Sarja.println("Virhe lähetettäessä viestiä.");
}

Tämä tarkistaa, tapahtuiko virhe viestin lähetyksen aikana ja tulostaa virheilmoituksen tarvittaessa.

Tietojen vastaanotto CAN-väylältä

Voit vastaanottaa viestin CAN-väylän kautta käyttämällä readMsgBuf() menetelmä:

allekirjoittamatonhiiltyä len = 0;
allekirjoittamatonhiiltyä buf[8];
allekirjoittamatonhiiltyä canID = 0;

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

Tämä tarkistaa, onko viesti saatavilla CAN-väylällä ja lukee sitten viestin buf joukko. Viestin pituus on tallennettu len muuttuja, ja viestin tunnus on tallennettu canID muuttuja.

Kun olet vastaanottanut viestin, voit käsitellä datan hyötykuormaa tarpeen mukaan. Voit esimerkiksi tulostaa datan hyötykuorman sarjamonitoriin:

Sarja.Tulosta("Vastaanotettu viesti tunnuksella");
Sarja.Tulosta(canID, HEX);
Sarja.Tulosta(" ja tiedot: ");

varten (int minä = 0; i < len; i++) {
Sarja.Tulosta(buf[i], HEX);
Sarja.Tulosta(" ");
}

Sarja.println();

Tämä tulostaa vastaanotetun viestin tunnuksen ja datan hyötykuorman sarjamonitoriin.

Kuinka yhdistää CAN-väylälähetin-vastaanotin koelevyyn

CAN-väylän rakentaminen kahden laitteen yhdistämiseksi tässä esimerkkiprojektissa tarvitset:

  • Kaksi mikro-ohjainta (kaksi Arduino Nano -levyä tässä esimerkissä)
  • Kaksi MCP2515 CAN-moduulia
  • Leipälauta
  • Jumper johdot
  • I2C 16x2 LCD-näyttömoduuli
  • HC-SR04 ultraäänianturi

Tässä projektiesimerkissä Arduino-luonnoksessa käytetään neljää kirjastoa. Siellä on UusiPing kirjasto, joka tarjoaa helppokäyttöisen käyttöliittymän ultraäänianturille, sekä SPI-kirjasto, joka helpottaa tiedonsiirtoa Arduino-kortin ja MCP2515 CAN-väyläohjaimen välillä. The LiquidCrystal_I2C kirjastoa käytetään näyttömoduulille.

Lopuksi siellä on mcp2515-kirjasto liittääkseen MCP2515-sirun, jolloin voimme helposti siirtää tietoja CAN-väyläverkon kautta.

Laitteiston asennus (HC-SR04 esimerkki)

Tässä projektissa, jossa käytetään HC-SR04-anturia ja LCD-näyttöä, yksi Arduino Nano -kortti toimii vastaanottimena, kun taas toinen Arduino toimii lähettäjänä. Liitä lähetinkomponentit alla olevan kytkentäkaavion mukaisesti:

Tässä on vastaanottimen piirin kaavio:

Lopuksi yhdistä kaksi solmua yhteen käyttämällä CAN_H ja VOINKO MINÄ kuvan mukaiset rivit:

Moduuleja kytkettäessä on tärkeää varmistaa, että virtalähteen jännite on määritetyllä alueella ja että VOI H ja VOINKO MINÄ nastat on kytketty oikein väylään.

MCP2515 CAN-väylämoduulin ohjelmointi

Huomaa, että MCP2515-moduulia ohjelmoitaessa on tärkeää käyttää oikeaa bittinopeutta, jotta varmistetaan onnistunut viestintä verkon muiden CAN-laitteiden kanssa.

Lähettäjäkoodi:

#sisältää
#sisältää
#sisältää

MCP2515 mcp2515(10);
konsttavu trigPin = 3;
konsttavu echoPin = 4;
UusiPing luotain(trigPin, echoPin, 200);

structcan_framevoiMsg;

mitätönperustaa(){
Sarja.alkaa(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

mitätönsilmukka(){
allekirjoittamatonint etäisyys = kaikuluotain.ping_cm();
canMsg.can_id = 0x036; //CAN-tunnus on 0x036
canMsg.can_dlc = 8; //CAN-tietojen pituus on 8
canMsg.data[0] = etäisyys; //Päivitä kosteusarvo paikassa [0]
canMsg.data[1] = 0x00; //Lepää kaikki 0:lla
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);//Lähettää CAN-viestin
viive(100);
}

Vastaanottajan koodi:

#sisältää
#sisältää
#sisältää

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

mitätönperustaa(){
Sarja.alkaa(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.Tulosta("MUO CAN OPETUS");
viive(3000);
lcd.asia selvä();
}

mitätönsilmukka(){
jos (mcp2515.lue Viesti(&canMsg) == MCP2515::ERROR_OK) // Tietojen vastaanottaminen
{
int etäisyys = canMsg.data[0];
lcd.setCursor(0,0);
lcd.Tulosta("Etäisyys: ");
lcd.Tulosta(etäisyys);
lcd.Tulosta("cm");
}
}

Vie Arduino-projektisi seuraavalle tasolle

CAN-väylän ja Arduinon yhdistelmä tarjoaa tehokkaan alustan monissa sovelluksissa käytettävien kehittyneiden tietoliikenneverkkojen rakentamiseen tai oppimiseen. Vaikka se saattaa tuntua jyrkältä oppimiskäyrältä, omat asetukset leipälaudalla on melko kätevä tapa oppia käyttämään CAN-väyläverkkoa monimutkaisissa tee-se-itse-projekteissa.