Cuprins:

Protocol CAN - Da, putem !: 24 de pași
Protocol CAN - Da, putem !: 24 de pași

Video: Protocol CAN - Da, putem !: 24 de pași

Video: Protocol CAN - Da, putem !: 24 de pași
Video: PROTOCOL pentru un SOMN mai bun 2024, Noiembrie
Anonim
Image
Image
Resurse utilizate
Resurse utilizate

Un alt subiect sugerat recent de adepții canalului meu YouTube a fost protocolul CAN (Controller Area Network), pe care ne vom concentra astăzi. Este important să explicăm că CAN este un protocol de comunicare în serie simultan. Aceasta înseamnă că sincronismul dintre modulele conectate la rețea se realizează în raport cu începutul fiecărui mesaj trimis la magistrală. Vom începe prin a introduce conceptele de bază ale protocolului CAN și vom efectua o asamblare simplă cu două ESP32.

În circuitul nostru, ESP-urile pot acționa atât ca Master, cât și ca Slave. Puteți avea mai multe microcontrolere care transmit simultan, deoarece CAN se ocupă automat de coliziunea tuturor. Codul sursă al acestui proiect este foarte simplu. Verifică!

Pasul 1: Resurse utilizate

  • Două module ale ESP WROOM 32 NodeMcu
  • Două transmițătoare CAN de la WaveShare
  • Jersee pentru conexiuni
  • Analizor logic pentru captare
  • Trei cabluri USB pentru ESP-uri și analizor
  • 10 metri de pereche răsucită pentru a servi drept autobuz

Pasul 2: CAN (rețea de controler)

CAN (rețea de controler)
CAN (rețea de controler)
  • A fost dezvoltat de Robert Bosch GmbH în anii 1980 pentru a servi industria auto.
  • A devenit răspândit de-a lungul anilor datorită robusteții și flexibilității sale de implementare. Se folosește cu echipamente militare, mașini agricole, automatizări industriale și de construcții, robotică și echipamente medicale.

Pasul 3: CAN - Caracteristici

CAN - Caracteristici
CAN - Caracteristici
CAN - Caracteristici
CAN - Caracteristici
  • Comunicare serială cu două fire
  • Maxim 8 octeți de informații utile pe cadru, cu fragmentare posibilă
  • Adresa direcționată către mesaj și nu către nod
  • Atribuirea priorității mesajelor și transmiterea mesajelor „în așteptare”
  • Capacitatea eficientă de a detecta și semnaliza erorile
  • Capacitate multi-master (toate nodurile pot solicita acces la magistrală)
  • Capacitate de difuzare multiplă (un mesaj pentru mai multe receptoare în același timp)
  • Rată de transfer de până la 1Mbit / s pe un autobuz de 40 de metri (reducerea ratei cu creșterea lungimii barei)
  • Flexibilitatea configurării și introducerea de noi noduri (până la 120 de noduri pe magistrală)
  • Hardware standard, cost redus și disponibilitate bună
  • Protocol reglementat: ISO 11898

Pasul 4: Circuit utilizat

Circuit folosit
Circuit folosit

Aici, am Transmițătoarele. Există câte una pe fiecare parte și sunt conectate printr-o pereche de fire. Unul este responsabil pentru trimiterea și celălalt pentru primirea datelor.

Pasul 5: Tensiunile liniei de transmisie (detectarea diferențială)

Tensiunea liniei de transmisie (detectare diferențială)
Tensiunea liniei de transmisie (detectare diferențială)

În CAN, bitul dominant este Zero.

Detectarea diferențialului de linie reduce sensibilitatea la zgomot (EFI)

Pasul 6: Format CAN pentru standarde și cadre

Standarde CAN și format cadre
Standarde CAN și format cadre

Format standard cu identificator de 11 biți

Pasul 7: Format CAN standard și cadre

Standarde CAN și format cadre
Standarde CAN și format cadre

Format extins cu identificator de 29 de biți

Pasul 8: Format CAN standard și cadre

Este important de reținut că un protocol calculează deja CRC și trimite semnale ACK și EOF, care sunt lucruri care sunt deja realizate de protocolul CAN. Acest lucru garantează că mesajul trimis nu va ajunge în mod greșit. Acest lucru se datorează faptului că dacă dă o problemă în CRC (Redundant Cyclic Check sau Redundancy Check), care este același cu o cifră de verificare a informațiilor, va fi identificată de CRC.

Pasul 9: Patru tipuri de cadre (cadre)

Patru tipuri de cadre (cadre)
Patru tipuri de cadre (cadre)

Este important de reținut că un protocol calculează deja CRC și trimite semnale ACK și EOF, care sunt lucruri care sunt deja realizate de protocolul CAN. Acest lucru garantează că mesajul trimis nu va ajunge în mod greșit. Acest lucru se datorează faptului că dacă dă o problemă în CRC (Redundant Cyclic Check sau Redundancy Check), care este același cu o cifră de verificare a informațiilor, va fi identificată de CRC.

Patru tipuri de cadre (cadre)

Transmiterea și recepția datelor în CAN se bazează pe patru tipuri de cadre. Tipurile de cadre vor fi identificate prin variații ale biților de control sau chiar prin modificări ale regulilor de scriere a cadrelor pentru fiecare caz.

  • Cadru de date: Conține datele emițătorului pentru receptor (e)
  • Cadru la distanță: Aceasta este o cerere de date de la unul dintre noduri
  • Cadru de eroare: este un cadru trimis de oricare dintre noduri atunci când identifică o eroare în magistrală și poate fi detectat de toate nodurile
  • Cadru de suprasarcină: servește pentru a întârzia traficul pe autobuz din cauza supraîncărcării sau întârzierii datelor pe unul sau mai multe noduri.

Pasul 10: Circuit - Detalii despre conexiuni

Circuit - Detalii despre conexiuni
Circuit - Detalii despre conexiuni

Pasul 11: Circuit - Captare date

Circuit - Captare date
Circuit - Captare date

Lungimi de undă obținute pentru CAN standard cu ID de 11 biți

Pasul 12: Circuit - Captare date

Circuit - Captare date
Circuit - Captare date

Lungimi de undă obținute pentru CAN extins cu ID de 29 de biți

Pasul 13: Circuit - Captare date

Circuit - Captare date
Circuit - Captare date

Date obținute de analizorul logic

Pasul 14: Biblioteca Arduino - CAN

Biblioteca Arduino - CAN
Biblioteca Arduino - CAN

Arăt aici cele două opțiuni în care puteți instala biblioteca de drivere CAN

Arduino IDE Library Manager

Pasul 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Pasul 16: Codul sursă al emițătorului

Cod sursă: include și configurare ()

Vom include biblioteca CAN, vom începe seria pentru depanare și vom porni autobuzul CAN la 500 kbps.

#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inițiază un serial pentru debug while (! Serial); Serial.println ("Transmițător CAN"); // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível initia o controlador while (1); }}

Pasul 17: Cod sursă: Loop (), Trimiterea unui pachet CAN 2.0 standard

Folosind standardul CAN 2.0, trimitem un pachet. ID-ul de 11 biți identifică mesajul. Blocul de date trebuie să aibă până la 8 octeți. Începe pachetul cu ID 18 în hexazecimal. Pachetează 5 octeți și închide funcția.

void loop () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bits e identifica a mensagem (prioritate, eveniment) // o bloco de dados trebuie să aibă 8 bytes Serial.println ("Enviando pacote … "); CAN.beginPacket (0x12); // id 18 em hexadecimal CAN.write ('h'); // 1º octet CAN.write ('e'); // 2º octeți CAN.write ('l'); // 3º octeți CAN.write ('l'); // 4º octeți CAN.write ('o'); // 5º octeți CAN.endPacket (); // encerra o pacote pentru invio Serial.println ("Enviado."); întârziere (1000);

Pasul 18: Cod sursă: Loop (), trimiterea unui pachet extins CAN 2.0

În acest pas, ID-ul are 29 de biți. Începe să trimită 24 de biți de ID și, încă o dată, ambalează 5 octeți și iese.

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e identifica a mensagem (prioritate, eveniment) // o bloco de dados deve possuire até 8 bytes Serial.println ("Enviando pacote estendido …"); CAN.beginExtendedPacket (0xabcdef); // id 11259375 decimal (abcdef em hexa) = 24 bits preenchidos até aqui CAN.write ('w'); // 1º octet CAN.write ('o'); // 2º octeți CAN.write ('r'); // 3º octeți CAN.write ('l'); // 4º octeți CAN.write ('d'); // 5º octeți CAN.endPacket (); // encerra o pacote pentru inviatie Serial.println ("Enviado."); întârziere (1000); }

Pasul 19: Codul sursă al receptorului

Cod sursă: include și configurare ()

Din nou, vom include biblioteca CAN, vom începe seria de depanare și vom porni magistrala CAN la 500 kbps. Dacă apare o eroare, această eroare va fi tipărită.

#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inițiază un serial pentru debug while (! Serial); Serial.println ("Receptor CAN"); // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível initia o controlador while (1); }}

Pasul 20: Cod sursă: Loop (), Obținerea pachetului și Verificarea formatului

Am încercat să verificăm dimensiunea pachetului primit. Metoda CAN.parsePacket () îmi arată dimensiunea acestui pachet. Deci, dacă avem un pachet, vom verifica dacă acesta este extins sau nu.

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

Pasul 21: Sursă: Loop (), verifică dacă este un pachet la distanță

Aici, verificăm dacă pachetul primit este o cerere de date. În acest caz, nu există date.

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

Pasul 22: Cod sursă: Buclă (), Lungimea datelor solicitate sau primite

Dacă pachetul primit este o cerere, indicăm lungimea solicitată. Apoi obținem codul lungimii datelor (DLC), care indică lungimea datelor. În cele din urmă, indicăm lungimea primită.

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, care indica o comprimento dos dados)} else {Serial.print ("e comprimento"); // aqui somente indica o comprimento recebido Serial.println (packetSize);

Pasul 23: Cod sursă: Loop (), dacă datele sunt primite, apoi se imprimă

Tipărim (pe monitorul serial) datele, dar numai dacă pachetul primit nu este o cerere.

// 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 (); }}

Pasul 24: Descărcați fișierele

PDF

EU NU

Recomandat: