Kazalo:

Protokol CAN - Da, lahko !: 24 korakov
Protokol CAN - Da, lahko !: 24 korakov

Video: Protokol CAN - Da, lahko !: 24 korakov

Video: Protokol CAN - Da, lahko !: 24 korakov
Video: Моя работа наблюдать за лесом и здесь происходит что-то странное 2024, Julij
Anonim
Image
Image
Uporabljeni viri
Uporabljeni viri

Druga tema, ki so jo privrženci mojega YouTube kanala nedavno predlagali, je bil protokol CAN (Controller Area Network), na katerega se bomo danes osredotočili. Pomembno je pojasniti, da je CAN protokol hkratne serijske komunikacije. To pomeni, da se sinhronizacija med moduli, povezanimi v omrežje, izvede glede na začetek vsakega sporočila, poslanega na vodilo. Začeli bomo z uvajanjem osnovnih konceptov protokola CAN in izvedli preprosto sestavo z dvema ESP32.

V našem vezju lahko ESP delujejo kot glavni in pomožni. Lahko oddajate več mikrokrmilnikov hkrati, ker CAN samodejno obravnava trčenje vsega. Izvorna koda tega projekta je zelo preprosta. Preverite!

1. korak: Uporabljeni viri

  • Dva modula ESP WROOM 32 NodeMcu
  • Dva oddajnika CAN iz WaveShare
  • Mostički za priključke
  • Logični analizator za zajem
  • Trije USB kabli za ESP in analizator
  • 10 metrov zvitega para, ki služi kot avtobus

2. korak: CAN (omrežje krmilnika)

CAN (omrežje krmilnika)
CAN (omrežje krmilnika)
  • Robert Bosch GmbH ga je v osemdesetih letih prejšnjega stoletja razvil za avtomobilsko industrijo.
  • Z leti je postala razširjena zaradi svoje robustnosti in prilagodljivosti pri izvajanju. Uporablja se z vojaško opremo, kmetijskimi stroji, industrijsko in gradbeno avtomatizacijo, robotiko in medicinsko opremo.

3. korak: LAHKO - Lastnosti

CAN - Lastnosti
CAN - Lastnosti
CAN - Lastnosti
CAN - Lastnosti
  • Dvožična serijska komunikacija
  • Največ 8 bajtov uporabnih informacij na okvir z možno fragmentacijo
  • Naslov, usmerjen v sporočilo in ne v vozlišče
  • Dodelitev prednostnih sporočil in prenos sporočil "na čakanju"
  • Učinkovita sposobnost odkrivanja in signalizacije napak
  • Možnost več glavnih (vsa vozlišča lahko zahtevajo dostop do vodila)
  • Večpredstavnost (eno sporočilo za več sprejemnikov hkrati)
  • Hitrosti prenosa do 1Mbit / s na 40-metrskem vodilu (zmanjšanje hitrosti s povečanjem dolžine vodila)
  • Prilagodljivost konfiguracije in uvedbe novih vozlišč (do 120 vozlišč na vodilo)
  • Standardna strojna oprema, nizki stroški in dobra razpoložljivost
  • Regulirani protokol: ISO 11898

4. korak: Uporabljeno vezje

Rabljeno vezje
Rabljeno vezje

Tukaj imam oddajnike. Na vsaki strani je po ena in povezana sta s parom žic. Eden je odgovoren za pošiljanje, drugi pa za sprejem podatkov.

5. korak: Napetosti daljnovoda (diferencialno zaznavanje)

Napetosti daljnovoda (diferencialno zaznavanje)
Napetosti daljnovoda (diferencialno zaznavanje)

V CAN -u je prevladujoči bit nič.

Linearno diferencialno zaznavanje zmanjša občutljivost hrupa (EFI)

Korak 6: Oblika standardov in okvirjev CAN

Oblika standardov in okvirjev CAN
Oblika standardov in okvirjev CAN

Standardna oblika z 11-bitnim identifikatorjem

7. korak: Oblika standardov in okvirjev CAN

Oblika standardov in okvirjev CAN
Oblika standardov in okvirjev CAN

Razširjena oblika z 29-bitnim identifikatorjem

8. korak: Oblika standardov in okvirjev CAN

Pomembno je omeniti, da protokol že izračuna CRC in pošilja signale ACK in EOF, kar je že storjeno s protokolom CAN. To zagotavlja, da poslano sporočilo ne bo prispelo na napačen način. Če to povzroči težavo v CRC (Redundant Cyclic Check ali Redundancy Check), ki je enaka kontrolni številki informacij, jo bo CRC identificiral.

9. korak: štiri vrste okvirjev (okvirji)

Štiri vrste okvirjev (okvirji)
Štiri vrste okvirjev (okvirji)

Pomembno je omeniti, da protokol že izračuna CRC in pošilja signale ACK in EOF, kar je že storjeno s protokolom CAN. To zagotavlja, da poslano sporočilo ne bo prišlo na napačen način. Če to povzroči težavo v CRC (Redundant Cyclic Check ali Redundancy Check), ki je enaka kontrolni številki informacij, jo bo CRC identificiral.

Štiri vrste okvirjev (okvirjev)

Prenos in sprejem podatkov v CAN temelji na štirih vrstah okvirjev. Vrste okvirjev bodo prepoznane z variacijami kontrolnih bitov ali celo s spremembami pravil za zapis okvirja za vsak primer.

  • Podatkovni okvir: vsebuje podatke oddajnika za sprejemnike
  • Oddaljeni okvir: To je zahteva po podatkih iz enega od vozlišč
  • Okvir napak: To je okvir, ki ga pošlje katero koli od vozlišč pri ugotavljanju napake v vodilu in ga lahko zaznajo vsa vozlišča
  • Okvir preobremenitve: služi za zamudo prometa na vodilu zaradi preobremenitve podatkov ali zamude na enem ali več vozliščih.

10. korak: Vezje - podrobnosti o povezavah

Vezje - podrobnosti o povezavah
Vezje - podrobnosti o povezavah

11. korak: Vezje - zajem podatkov

Vezje - zajem podatkov
Vezje - zajem podatkov

Valovne dolžine, pridobljene za standardni CAN z 11-bitnim ID-jem

12. korak: Vezje - zajem podatkov

Vezje - zajem podatkov
Vezje - zajem podatkov

Valovne dolžine, pridobljene za razširjen CAN z 29-bitnim ID-jem

13. korak: Vezje - zajem podatkov

Vezje - zajem podatkov
Vezje - zajem podatkov

Podatki, pridobljeni z logičnim analizatorjem

Korak 14: Knjižnica Arduino - LAHKO

Knjižnica Arduino - LAHKO
Knjižnica Arduino - LAHKO

Tukaj prikazujem dve možnosti, kjer lahko namestite knjižnico gonilnikov CAN

Arduino IDE knjižnični upravitelj

Korak 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Korak 16: Izvorna koda oddajnika

Izvorna koda: Vključuje in nastavitev ()

Vključili bomo knjižnico CAN, zagnali serijsko serijo za odpravljanje napak in zagnali vodilo CAN pri 500 kb / s.

#include // Vključi biblioteco CAN void setup () {Serial.begin (9600); // inicia serijsko odpravljanje napak while (! Serial); Serial.println ("Transmisor CAN"); // Inicia o barramento CAN 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

Korak 17: Izvorna koda: Zanka (), pošiljanje standardnega paketa CAN 2.0

S standardnim CAN 2.0 pošljemo paket. 11-bitni ID identificira sporočilo. Podatkovni blok mora imeti do 8 bajtov. Začne paket z ID 18 v šestnajstiški številki. Pakira 5 bajtov in zapre funkcijo.

void loop () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bits e identifica a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote … "); CAN.beginPacket (0x12); // id 18 em šestnajstiški CAN.write ('h'); // 1º bajt CAN.write ('e'); // 2º bajt CAN.write ('l'); // 3º bajt CAN.write ('l'); // 4º bajt CAN.write ('o'); // 5º bajt CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); zamuda (1000);

18. korak: izvorna koda: zanka (), pošiljanje razširjenega paketa CAN 2.0

V tem koraku ima ID 29 bitov. Začne pošiljati 24 bitov ID -ja, spet pakira 5 bajtov in konča.

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e identifica a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote estendido …"); CAN.beginExtendedPacket (0xabcdef); // id 11259375 decimalno mesto (abcdef em hexa) = 24 bitov vnaprej nastavljenih na CAN.write ('w'); // 1º bajt CAN.write ('o'); // 2º bajt CAN.write ('r'); // 3º bajt CAN.write ('l'); // 4º bajt CAN.write ('d'); // 5º bajt CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); zamuda (1000); }

19. korak: izvorna koda sprejemnika

Izvorna koda: Vključuje in nastavitev ()

Ponovno bomo vključili knjižnico CAN, začeli serijsko odpravljanje napak in zagnali vodilo CAN pri 500 kb / s. Če pride do napake, bo ta napaka natisnjena.

#include // Vključi biblioteco CAN void setup () {Serial.begin (9600); // inicia serijsko odpravljanje napak while (! Serial); Serial.println ("Receptor CAN"); // Inicia o barramento CAN 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

20. korak: izvorna koda: zanka (), pridobivanje paketa in preverjanje oblike

Poskušali smo preveriti velikost prejetega paketa. Metoda CAN.parsePacket () mi pokaže velikost tega paketa. Če imamo torej paket, bomo preverili, ali je podaljšan ali ne.

void loop () {// Tenta verificar o tamanho do acote recebido int packetSize = CAN.parsePacket (); if (packetSize) {// Se temos um pacote Serial.println ("Recebido pacote."); if (CAN.packetExtended ()) {// preveri se o pacote é estendido Serial.println ("Estendido"); }

21. korak: Vir: Loop (), preveri, ali gre za oddaljeni paket

Tu preverimo, ali je prejeti paket podatkovna zahteva. V tem primeru ni podatkov.

if (CAN.packetRtr ()) {// Verifica se o pacote é um pacote remoto (Requisição de dados), neste caso não há dados Serial.print ("RTR"); }

Korak 22: Izvorna koda: Zanka (), Zahtevana ali prejeta dolžina podatkov

Če je prejeti paket zahteva, navedemo zahtevano dolžino. Nato dobimo kodo dolžine podatkov (DLC), ki označuje dolžino podatkov. Na koncu navedemo prejeto dolžino.

Serial.print ("Pacote com id 0x"); Serial.print (CAN.packetId (), HEX); if (CAN.packetRtr ()) {// se o pacote recebido é de requisição, indicamos o comprimento solicitado Serial.print ("e requsitou o comprimento"); Serial.println (CAN.packetDlc ()); // obtem o DLC (Data Length Code, que indica o comprimento dos dados)} else {Serial.print ("e comprimento"); // aqui somente indica o comprimento Recebido Serial.println (packetSize);

23. korak: izvorna koda: zanka (), če so podatki prejeti, se nato natisne

Natisnemo (na serijski monitor) podatke, vendar le, če prejeti paket ni zahteva.

// Imprime os dados somente se o pacote recebido não foi de requisição while (CAN.available ()) {Serial.print ((char) CAN.read ()); } Serial.println (); } Serial.println (); }}

Korak: Prenesite datoteke

PDF

JAZ NE

Priporočena: