Kasutage seda tugevat jadasideprotokolli kahe Arduino plaadi ühendamiseks ja üksteisele andmete saatmiseks.

Controller Area Network (CAN) siin on tugev ja usaldusväärne sideprotokoll, mida kasutatakse laialdaselt erinevates tööstus-, auto- ja kosmoserakendustes. See on mõeldud andmete edastamiseks mikrokontrollerite ja seadmete vahel CAN siini võrgu kaudu. Te ei pruugi seda veel teada, kuid see on nende pööraste autode armatuurlaua modifikatsioonide taga, mida näete sotsiaalmeedias.

Juhendame teid, kuidas luua CAN-siini MCP2515 CAN-mooduliga, kasutades Arduino ja leivaplaati. Vaatame ka Arduino CAN-i raamatukogu ja näitame, kuidas andmeid CAN-siini kaudu saata ja vastu võtta.

Mis on CAN-buss?

CAN-siin on jadasideprotokoll, mille Bosch töötas välja 1980. aastatel. Seda kasutatakse laialdaselt erinevates rakendustes selle kõrge töökindluse ja vastupidavuse tõttu. See võimaldab andmete edastamist seadmete vahel suurel kiirusel minimaalse latentsusega ainult kahe liini kaudu: CAN High ja CAN Low.

instagram viewer

1994. aastal sai CAN-siinist rahvusvaheline standard (ISO 11898), mis oli loodud spetsiaalselt kiireks jadaandmevahetuseks autotööstuses kasutatavate elektrooniliste kontrollerite vahel. Tutvuge meie põhjaliku juhendiga mis on CAN-siin ja millist rolli see autosüsteemides mängib täpsemalt.

Üks põhjusi, miks CAN-siin on nii populaarne, on selle veatuvastus- ja -parandusfunktsioonid. Protokoll suudab tuvastada ja parandada andmete edastamise vigu. See muudab selle ideaalseks rakenduste jaoks, kus andmete terviklikkus on kriitilise tähtsusega, näiteks tööstusautomaatika puhul.

MCP2515 CAN mooduli tundmine

Moodul MCP2515 CAN Bus Controller on seade, mis pakub erakordset tuge laialdaselt kasutatavale CAN-protokolli versioonile 2.0B. See moodul sobib ideaalselt suhtlemiseks suure andmeedastuskiirusega kuni 1Mbps.

MCP2515 IC on sõltumatu CAN-kontroller, millel on SPI-liides, mis võimaldab suhelda paljude mikrokontrolleritega. TJA1050 IC seevastu toimib liidesena MCP2515 CAN-kontrolleri IC ja füüsilise CAN-siini vahel.

Mugavuse suurendamiseks on olemas hüppaja, mis võimaldab kinnitada 120-oomise otsmikuga, mis muudab juhtmete ühendamise veelgi lihtsamaks. CAN_H & CAN_L kruvid teiste CAN-moodulitega suhtlemiseks.

Tunnusjoon

Spetsifikatsioon

Transiiver

TJA1050

Mikrokontrolleri liides

SPI (võimaldab integreerida mitut CAN siini)

Kristallostsillaator

8 MHz

Lõpetamine

120Ω

Kiirus

1Mbps

Energiatarve

Nõrkvoolu ooterežiim

Mõõtmed

40 x 28 mm

Sõlme läbilaskevõime

Toetab kuni 112 sõlme

Lisateavet saate aadressilt MCP2515 andmeleht juhuks, kui vajate seda moodulit keerukama projekti jaoks.

CAN-sõnumi struktuur

CAN-sõnumi struktuur koosneb mitmest segmendist, kuid selle projekti jaoks on kõige olulisemad segmendid identifikaator ja andmed. Identifikaator, tuntud ka kui CAN ID või parameetrirühma number (PGN), identifitseerib CAN-is olevad seadmed võrku ja identifikaatori pikkus võib olenevalt CAN-protokolli tüübist olla kas 11 või 29 bitti kasutatud.

Vahepeal tähistavad andmed tegelikke edastatavaid anduri/juhtimisandmeid. Andmed võivad olla 0–8 baiti pikad ja andmepikkuskood (DLC) näitab olemasolevate andmebaitide arvu.

Arduino MCP2515 CAN-bussiteek

See raamatukogu rakendab Protokoll CAN V2.0B, mis võib töötada kiirusega kuni 1 Mbps. See pakub SPI-liidest, mis võib töötada kiirusel kuni 10 MHz, toetades nii standardseid (11-bitine) kui ka laiendatud (29-bitine) andmeid. Veelgi enam, sellel on kaks vastuvõtupuhvrit, mis võimaldavad sõnumite prioriteetset salvestamist.

CAN siini lähtestamine

Siin on seadistuskood, mida vajate CAN-siini lähtestamiseks:

#sisaldama
#sisaldama

MCP2515 mcp2515(10); // Määra CS pin

tühineseadistamine(){
samal ajal (!Sari);
Sari.alustada(9600);
SPI.alustada(); //Algab SPI-suhtlus

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

See initsialiseerib MCP2515 CAN-bitikiirusega 500Kbps ja ostsillaatori sagedusega 8MHz.

MCP2515 CAN-i töörežiimid

MCP2515 CAN-siini kontrolleriga kasutatakse kolme töörežiimi:

  • setNormalMode(): seadistab kontrolleri sõnumeid saatma ja vastu võtma.
  • setLoopbackMode(): määrab kontrolleri sõnumeid saatma ja vastu võtma, kuid selle saadetud sõnumid võetakse ka ise vastu.
  • setListenOnlyMode(): seab kontrolleri ainult sõnumeid vastu võtma.

Need on funktsioonikutsed, mida kasutatakse MCP2515 CAN-siini kontrolleri töörežiimi määramiseks.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Andmete saatmine CAN siini kaudu

CAN-siini kaudu sõnumi saatmiseks kasutage nuppu sendMsgBuf() meetod:

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

See saadab ID-ga sõnumi 0x01 ja andmekoormus 0x01, 0x02, 0x03, 0x04}. Esimene parameeter on CAN ID, teine ​​on sõnumi prioriteet, kolmas on andmekoormuse pikkus ja neljas on andmemaht ise.

The sendMsgBuf() meetod tagastab väärtuse, mis näitab, kas sõnum saadeti edukalt või mitte. Seda väärtust saate kontrollida helistades checkError() meetod:

kui (CAN.checkError()) {
Sari.println("Viga sõnumi saatmisel.");
}

See kontrollib, kas teate edastamise ajal tekkis tõrge ja vajadusel prindib veateate.

Andmete vastuvõtmine CAN siinilt

CAN-siini kaudu sõnumite vastuvõtmiseks võite kasutada readMsgBuf() meetod:

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

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

See kontrollib, kas sõnum on CAN-siinil saadaval, ja seejärel loeb sõnumi sisse buf massiivi. Sõnumi pikkus salvestatakse len muutuja ja sõnumi ID salvestatakse canID muutuv.

Kui olete sõnumi saanud, saate andmemahtu vastavalt vajadusele töödelda. Näiteks võite printida andmekoormuse jadamonitorile:

Sari.printida("Saadud sõnum ID-ga");
Sari.printida(canID, HEX);
Sari.printida(" ja andmed: ");

jaoks (int i = 0; i < len; i++) {
Sari.printida(buf[i], HEX);
Sari.printida(" ");
}

Sari.println();

See prindib vastuvõetud sõnumi ID ja andmemahu jadamonitorile.

Kuidas ühendada CAN-siini transiiver leivalauaga

Selles näidisprojektis kahe seadme ühendamiseks CAN-siini ehitamiseks vajate:

  • Kaks mikrokontrollerit (selle näite jaoks kaks Arduino Nano plaati)
  • Kaks MCP2515 CAN-moodulit
  • Leivalaud
  • Jumper juhtmed
  • I2C 16x2 LCD-ekraani moodul
  • HC-SR04 ultraheliandur

Selle projekti näite puhul kasutatakse Arduino visandis nelja teeki. Seal on UusPing raamatukogu, mis pakub ultraheliandurile lihtsalt kasutatavat liidest, samuti SPI raamatukogu, mis hõlbustab suhtlust Arduino plaadi ja MCP2515 CAN siini kontrolleri vahel. The LiquidCrystal_I2C kuvamooduli jaoks kasutatakse raamatukogu.

Lõpuks on seal mcp2515 raamatukogu liidestada MCP2515 kiibiga, võimaldades meil hõlpsasti andmeid üle CAN siini võrgu edastada.

Riistvara häälestus (HC-SR04 näide)

Selles HC-SR04 andurit ja LCD-d kasutavas projektis toimib üks Arduino Nano plaat vastuvõtjana, teine ​​Arduino aga saatjana. Ühendage saatja komponendid vastavalt allolevale juhtmestikule:

Siin on vastuvõtja vooluahela skeem:

Lõpuks ühendage kaks sõlme, kasutades CAN_H ja CAN_L read nagu näidatud:

Moodulite ühendamisel on oluline jälgida, et toitepinge oleks ettenähtud vahemikus ja et KAS H ja CAN L tihvtid on korralikult siiniga ühendatud.

MCP2515 CAN siini mooduli programmeerimine

Pange tähele, et MCP2515 mooduli programmeerimisel on oluline kasutada õiget bitikiirust, et tagada edukas side teiste võrgus olevate CAN-seadmetega.

Saatja kood:

#sisaldama
#sisaldama
#sisaldama

MCP2515 mcp2515(10);
konstbait trigPin = 3;
konstbait echoPin = 4;
UusPing sonar(trigPin, echoPin, 200);

struktuurcan_framesaabSõnum;

tühineseadistamine(){
Sari.alustada(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

tühinesilmus(){
allkirjastamataint kaugus = sonar.ping_cm();
canMsg.can_id = 0x036; //CAN-id kui 0x036
canMsg.can_dlc = 8; //CAN-andmete pikkus on 8
canMsg.data[0] = kaugus; //Niiskuse väärtuse värskendamine asukohas [0]
canMsg.data[1] = 0x00; //Puhke kõik 0-ga
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);//Saadab CAN-teate
viivitus(100);
}

Vastuvõtja kood:

#sisaldama
#sisaldama
#sisaldama

MCP2515 mcp2515(10);
LiquidCrystal_I2C LCD(0x27,16,2);
struktuurcan_framesaabSõnum;

tühineseadistamine(){
Sari.alustada(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
LCD.määra Kursor(0, 0);
LCD.printida("MUO CAN TUTORIAL");
viivitus(3000);
LCD.selge();
}

tühinesilmus(){
kui (mcp2515.loe sõnumit(&canMsg) == MCP2515::ERROR_OK) // Andmete vastuvõtmiseks
{
int kaugus = canMsg.data[0];
LCD.määra Kursor(0,0);
LCD.printida("Kaugus:");
LCD.printida(kaugus);
LCD.printida("cm");
}
}

Viige oma Arduino projektid järgmisele tasemele

CAN-siini ja Arduino kombinatsioon annab võimsa platvormi mitmesugustes rakendustes kasutatavate keerukate sidevõrkude ehitamiseks või õppimiseks. Kuigi see võib tunduda järsk õppimiskõver, on oma seadistus leivalaual üsna mugav viis õppida CAN-siinide võrgu kasutamist keerulistes isetegemisprojektides.