Cuprins:
- Pasul 1: Resurse utilizate
- Pasul 2: CAN (rețea de controler)
- Pasul 3: CAN - Caracteristici
- Pasul 4: Circuit utilizat
- Pasul 5: Tensiunile liniei de transmisie (detectarea diferențială)
- Pasul 6: Format CAN pentru standarde și cadre
- Pasul 7: Format CAN standard și cadre
- Pasul 8: Format CAN standard și cadre
- Pasul 9: Patru tipuri de cadre (cadre)
- Pasul 10: Circuit - Detalii despre conexiuni
- Pasul 11: Circuit - Captare date
- Pasul 12: Circuit - Captare date
- Pasul 13: Circuit - Captare date
- Pasul 14: Biblioteca Arduino - CAN
- Pasul 15: Github
- Pasul 16: Codul sursă al emițătorului
- Pasul 17: Cod sursă: Loop (), Trimiterea unui pachet CAN 2.0 standard
- Pasul 18: Cod sursă: Loop (), trimiterea unui pachet extins CAN 2.0
- Pasul 19: Codul sursă al receptorului
- Pasul 20: Cod sursă: Loop (), Obținerea pachetului și Verificarea formatului
- Pasul 21: Sursă: Loop (), verifică dacă este un pachet la distanță
- Pasul 22: Cod sursă: Buclă (), Lungimea datelor solicitate sau primite
- Pasul 23: Cod sursă: Loop (), dacă datele sunt primite, apoi se imprimă
- Pasul 24: Descărcați fișierele
Video: Protocol CAN - Da, putem !: 24 de pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:45
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)
- 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
- 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
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ă)
În CAN, bitul dominant este Zero.
Detectarea diferențialului de linie reduce sensibilitatea la zgomot (EFI)
Pasul 6: Format CAN pentru standarde și cadre
Format standard cu identificator de 11 biți
Pasul 7: Format CAN standard și 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)
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
Pasul 11: Circuit - Captare date
Lungimi de undă obținute pentru CAN standard cu ID de 11 biți
Pasul 12: Circuit - Captare date
Lungimi de undă obținute pentru CAN extins cu ID de 29 de biți
Pasul 13: Circuit - Captare date
Date obținute de analizorul logic
Pasul 14: 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.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
EU NU
Recomandat:
Tahometru / Manometru de scanare folosind Arduino, OBD2 și CAN Bus: 8 pași
Tahometru / Manometru de scanare folosind Arduino, OBD2 și CAN Bus: Orice posesor de Toyota Prius (sau alt vehicul hibrid / special) va ști că panourile lor de bord pot lipsi câteva cadrane! Prius-ul meu nu are RPM-ul motorului și nici un indicator de temperatură. Dacă sunteți un tip de performanță, poate doriți să știți lucruri precum avansul de sincronizare și
Ceas Internet: Afișați data și ora cu un OLED utilizând ESP8266 NodeMCU cu protocol NTP: 6 pași
Ceas Internet: Afișați data și ora cu un OLED folosind ESP8266 NodeMCU Cu protocolul NTP: Bună băieți în acest instructables vom construi un ceas de internet care va primi timp de pe internet, astfel încât acest proiect nu va avea nevoie de niciun RTC pentru a rula, va avea nevoie doar de un conexiune la internet funcțională Și pentru acest proiect aveți nevoie de un esp8266 care va avea un
Afișare Nextion - Interfață și protocol explicate cu PIC și Arduino: 10 pași
Afișare Nextion | Interfață și protocol explicate cu PIC și Arduino: Nextion Display este foarte ușor de utilizat și interfață ușoară cu microcontroler. Cu ajutorul editorului Nextion putem configura afișajul și putem proiecta interfața de utilizare pe ecran. Deci pe baza evenimentelor sau comenzilor Afișare Nextion va acționa pe pentru a afișa
Reverse Engineering Ritter 8341C Protocol pentru ESP3866: 5 pași
Reverse Engineering Ritter 8341C Protocol pentru ESP3866: Bună @ all. Pentru propria mea mică casă de automatizare folosesc prize primare controlate de 433 MHz. Dețin 3 seturi cu comutatoare DIP pentru a regla adresa. Acestea funcționau bine. Dar acum ceva timp (unul sau doi ani), am cumpărat un set de prize de la „Ritter & Quo
Placă de codificare și decodare cu protocol NEC în infraroșu: 5 pași
Infraroșu NEC Protocol Encoder and Decoder Board: primește un semnal NEC IR brut modulat sau demodulat și îl convertește în octeți care sunt expediați în portul serial. Rata de transmisie în serie este selectabilă din două viteze implicite. Modul de utilizare implicit transmite o secvență de comandă cu octet de încadrare