Koristite ovaj robusni serijski komunikacijski protokol za spajanje dvije Arduino ploče zajedno i slanje podataka jedna drugoj.

Mrežna mrežna sabirnica (CAN) je robustan i pouzdan komunikacijski protokol koji se široko koristi u raznim industrijskim, automobilskim i zrakoplovnim aplikacijama. Namijenjen je prijenosu podataka između mikrokontrolera i uređaja preko mreže CAN sabirnice. Možda to još ne znate, ali to je stvar iza onih ludih modifikacija upravljačke ploče automobila koje vidite na društvenim mrežama.

Provest ćemo vas kroz kako izgraditi CAN sabirnicu s MCP2515 CAN modulom koristeći Arduino i matičnu ploču. Također ćemo proći kroz Arduino CAN biblioteku i pokazati kako slati i primati podatke preko CAN sabirnice.

Što je CAN sabirnica?

CAN sabirnica je serijski komunikacijski protokol koji je razvio Bosch 1980-ih. Široko se koristi u raznim primjenama zbog svoje visoke pouzdanosti i robusnosti. Omogućuje prijenos podataka između uređaja velikim brzinama s minimalnom latencijom preko samo dvije linije: CAN High i CAN Low.

instagram viewer

Godine 1994. CAN sabirnica postala je međunarodna norma (ISO 11898) koja je posebno dizajnirana za brzu serijsku razmjenu podataka između elektroničkih kontrolera u automobilskim aplikacijama. Pogledajte naš sveobuhvatni vodič o što je CAN sabirnica i koju ulogu ima u automobilskim sustavima za više detalja.

Jedan od razloga zašto je CAN sabirnica toliko popularna je njezino otkrivanje i ispravljanje grešaka. Protokol može otkriti i ispraviti pogreške u prijenosu podataka. To ga čini idealnim za aplikacije u kojima je integritet podataka kritičan, kao što je industrijska automatizacija.

Poznavanje MCP2515 CAN modula

MCP2515 CAN Bus Controller modul je uređaj koji pruža iznimnu podršku za naširoko korišteni CAN protokol verzije 2.0B. Ovaj modul je idealan za komunikaciju pri velikim brzinama prijenosa podataka do 1Mbps.

MCP2515 IC je neovisni CAN kontroler sa SPI sučeljem koje omogućuje komunikaciju sa širokim rasponom mikrokontrolera. TJA1050 IC, s druge strane, funkcionira kao sučelje između IC CAN kontrolera MCP2515 i fizičke CAN sabirnice.

Za dodatnu pogodnost, postoji kratkospojnik koji vam omogućuje spajanje završetka od 120 ohma, što dodatno olakšava spajanje vaših žica na CAN_H & MOŽE_L vijci za komunikaciju s drugim CAN modulima.

Značajka

Specifikacija

Primopredajnik

TJA1050

Sučelje mikrokontrolera

SPI (omogućuje integraciju s više CAN sabirnica)

Kristalni oscilator

8MHz

Raskid

120Ω

Ubrzati

1 Mbps

Potrošnja energije

Rad u pripravnom stanju niske struje

Dimenzija

40 x 28 mm

Kapacitet čvora

Podržava do 112 čvorova

Dodatne informacije možete dobiti na MCP2515 podatkovna tablica u slučaju da vam je ovaj modul potreban za napredniji projekt.

Struktura CAN poruke

Struktura CAN poruke sastoji se od više segmenata, ali najkritičniji segmenti za ovaj projekt su identifikator i podaci. Identifikator, poznat i kao CAN ID ili broj grupe parametara (PGN), identificira uređaje na CAN-u mreže, a duljina identifikatora može biti 11 ili 29 bita, ovisno o vrsti CAN protokola koristi se.

U međuvremenu, podaci predstavljaju stvarne podatke senzora/kontrole koji se prenose. Podaci mogu biti dugački od 0 do 8 bajtova, a kod duljine podataka (DLC) označava broj prisutnih bajtova podataka.

Arduino MCP2515 CAN Bus biblioteka

Ova biblioteka implementira CAN V2.0B protokol, koji može raditi brzinama do 1Mbps. Omogućuje SPI sučelje koje može raditi na brzinama do 10MHz dok podržava standardne (11-bitne) i proširene (29-bitne) podatke. Štoviše, dolazi s dva međuspremnika za primanje, koji omogućuju pohranu prioritetnih poruka.

Inicijalizacija CAN sabirnice

Evo koda za postavljanje koji će vam trebati za pokretanje CAN sabirnice:

#uključiti
#uključiti

MCP2515 mcp2515(10); // Postavi CS pin

poništitipostaviti(){
dok (!Serijski);
Serijski.početi(9600);
SPI.početi(); //Započinje SPI komunikaciju

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

Ovo inicijalizira MCP2515 s CAN brzinom prijenosa od 500Kbps i frekvencijom oscilatora od 8MHz.

MCP2515 CAN načini rada

Postoje tri načina rada koji se koriste s kontrolerom CAN sabirnice MCP2515:

  • setNormalMode(): postavlja upravljač za slanje i primanje poruka.
  • setLoopbackMode(): postavlja kontroler da šalje i prima poruke, ali poruke koje šalje će također biti primljene.
  • setListenOnlyMode(): postavlja kontroler da prima samo poruke.

Ovo su funkcijski pozivi koji se koriste za postavljanje načina rada MCP2515 CAN sabirnice.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Slanje podataka preko CAN sabirnice

Za slanje poruke preko CAN sabirnice koristite sendMsgBuf() metoda:

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

Time se šalje poruka s ID-om 0x01 i nosivost podataka od {0x01, 0x02, 0x03, 0x04}. Prvi parametar je CAN ID, drugi je prioritet poruke, treći je duljina korisnih podataka, a četvrti je sam korisni podaci.

The sendMsgBuf() metoda vraća vrijednost koja pokazuje je li poruka uspješno poslana ili ne. Ovu vrijednost možete provjeriti pozivom na checkError() metoda:

ako (CAN.checkError()) {
Serijski.println("Pogreška pri slanju poruke.");
}

Time se provjerava je li došlo do pogreške tijekom prijenosa poruke i ispisuje se poruka o pogrešci ako je potrebno.

Primanje podataka s CAN sabirnice

Za primanje poruke preko CAN sabirnice, možete koristiti readMsgBuf() metoda:

nepotpisanchar leća = 0;
nepotpisanchar buf [8];
nepotpisanchar canID = 0;

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

Time se provjerava je li poruka dostupna na CAN sabirnici i zatim se poruka čita u buf niz. Duljina poruke pohranjuje se u leća varijabla, a ID poruke pohranjen je u canID varijabla.

Nakon što primite poruku, možete obraditi korisni teret podataka prema potrebi. Na primjer, možete ispisati podatke na serijski monitor:

Serijski.ispisati("Primljena poruka s ID-om");
Serijski.ispisati(canID, HEX);
Serijski.ispisati(" i podaci: ");

za (int ja = 0; ja < leća; i++) {
Serijski.ispisati(buf[i], HEX);
Serijski.ispisati(" ");
}

Serijski.println();

Ovo ispisuje ID primljene poruke i sadržaj podataka na serijski monitor.

Kako spojiti primopredajnik CAN sabirnice na matičnu ploču

Za izgradnju CAN sabirnice za povezivanje dva uređaja u ovom primjeru projekta trebat će vam:

  • Dva mikrokontrolera (dvije Arduino Nano ploče za ovaj primjer)
  • Dva MCP2515 CAN modula
  • Mjesna ploča
  • Premosne žice
  • Modul LCD zaslona I2C 16x2
  • Ultrazvučni senzor HC-SR04

Za ovaj primjer projekta, četiri biblioteke se koriste u Arduino skici. Tu je NewPing knjižnica, koja pruža sučelje jednostavno za korištenje za ultrazvučni senzor, kao i za SPI knjižnica, što olakšava komunikaciju između Arduino ploče i MCP2515 CAN bus kontrolera. The LiquidCrystal_I2C knjižnica se koristi za zaslonski modul.

Na kraju, tu je mcp2515 knjižnica za sučelje s MCP2515 čipom, što nam omogućuje jednostavan prijenos podataka preko mreže CAN sabirnice.

Postavljanje hardvera (primjer HC-SR04)

U ovom projektu koji koristi HC-SR04 senzor i LCD, jedna Arduino Nano ploča će djelovati kao prijemnik, dok će druga Arduino djelovati kao pošiljatelj. Spojite svoje komponente pošiljatelja prema donjem dijagramu ožičenja:

Evo dijagrama kruga prijemnika:

Na kraju spojite dva čvora pomoću CAN_H i MOŽE_L linije kao što je prikazano:

Prilikom povezivanja modula, važno je osigurati da je napon napajanja unutar navedenog raspona i da MOŽE LI H i MOŽE LI L pinovi su pravilno spojeni na sabirnicu.

Programiranje MCP2515 CAN Bus modula

Imajte na umu da je prilikom programiranja modula MCP2515 važno koristiti točnu brzinu prijenosa kako bi se osigurala uspješna komunikacija s drugim CAN uređajima na mreži.

Šifra pošiljatelja:

#uključiti
#uključiti
#uključiti

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

strukturiratilimenka_okvircanMsg;

poništitipostaviti(){
Serijski.početi(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

poništitipetlja(){
nepotpisanint udaljenost = sonar.ping_cm();
canMsg.can_id = 0x036; //CAN ID kao 0x036
canMsg.can_dlc = 8; //CAN duljina podataka kao 8
canMsg.data[0] = udaljenost; //Ažuriraj vrijednost vlažnosti u [0]
canMsg.data[1] = 0x00; //Odmori sve s 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);//Šalje CAN poruku
odgoditi(100);
}

Šifra primatelja:

#uključiti
#uključiti
#uključiti

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

poništitipostaviti(){
Serijski.početi(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.pozadinsko osvjetljenje();
lcd.setCursor(0, 0);
lcd.ispisati("UPUTSTVO ZA MUO CAN");
odgoditi(3000);
lcd.čisto();
}

poništitipetlja(){
ako (mcp2515.pročitaj poruku(&canMsg) == MCP2515::ERROR_OK) // Za primanje podataka
{
int udaljenost = canMsg.data[0];
lcd.setCursor(0,0);
lcd.ispisati("Udaljenost: ");
lcd.ispisati(udaljenost);
lcd.ispisati("cm");
}
}

Podignite svoje Arduino projekte na višu razinu

Kombinacija CAN sabirnice i Arduina pruža moćnu platformu za izgradnju ili učenje sofisticiranih komunikacijskih mreža koje se koriste u raznim aplikacijama. Iako se može činiti da je to strma krivulja učenja, posjedovanje vlastite postavke na matičnoj ploči prilično je zgodan način za učenje o korištenju mreže CAN sabirnice u složenim DIY projektima.