Indholdsfortegnelse:

CAN -protokol - Ja, vi kan !: 24 trin
CAN -protokol - Ja, vi kan !: 24 trin

Video: CAN -protokol - Ja, vi kan !: 24 trin

Video: CAN -protokol - Ja, vi kan !: 24 trin
Video: Торт МОЛОЧНАЯ ДЕВОЧКА. Выпечка и сборка торта. Лучший рецепт из Германии. Карамельно-творожный крем 2024, Juli
Anonim
Image
Image
Ressourcer brugt
Ressourcer brugt

Et andet emne, der for nylig blev foreslået af min YouTube -kanals tilhængere, var CAN (Controller Area Network) -protokol, hvilket vi vil fokusere på i dag. Det er vigtigt at forklare, at CAN er en samtidig seriel kommunikationsprotokol. Det betyder, at synkronismen mellem de moduler, der er forbundet til netværket, udføres i forhold til begyndelsen af hver meddelelse, der sendes til bussen. Vi starter med at introducere de grundlæggende begreber i CAN -protokollen og udfører en simpel samling med to ESP32'er.

I vores kredsløb kan ESP'erne fungere som både Master og Slave. Du kan få flere mikrokontrollere til at sende samtidigt, fordi CAN håndterer kollision af alt automatisk. Kildekoden til dette projekt er super enkel. Tjek det ud!

Trin 1: Brugte ressourcer

  • To moduler af ESP WROOM 32 NodeMcu
  • To CAN -transceivere fra WaveShare
  • Jumpere til forbindelser
  • Logisk analysator til optagelse
  • Tre USB -kabler til ESP'er og analysator
  • 10 meter snoet par til at tjene som bus

Trin 2: CAN (Controller Area Network)

CAN (Controller Area Network)
CAN (Controller Area Network)
  • Det blev udviklet af Robert Bosch GmbH i 1980'erne til at betjene bilindustrien.
  • Det er blevet udbredt gennem årene på grund af dets robusthed og fleksibilitet i implementeringen. Det bruges med militært udstyr, landbrugsmaskiner, industri- og bygningsautomation, robotik og medicinsk udstyr.

Trin 3: CAN - Funktioner

CAN - Funktioner
CAN - Funktioner
CAN - Funktioner
CAN - Funktioner
  • To-leder seriel kommunikation
  • Maksimalt 8 bytes nyttig information pr. Ramme, med fragmentering mulig
  • Adresse rettet til meddelelsen og ikke til noden
  • Tildele meddelelser prioritet og videresendelse af "i venteposition" -meddelelser
  • Effektiv evne til at opdage og signalere fejl
  • Multi-master-kapacitet (alle noder kan anmode om busadgang)
  • Multicast -kapacitet (én besked til flere modtagere på samme tid)
  • Overførselshastigheder på op til 1 Mbit / s på en 40 meter lang bus (reduktion af hastigheden med stigning i samlingsstanglængde)
  • Fleksibilitet i konfiguration og introduktion af nye noder (op til 120 noder pr. Bus)
  • Standard hardware, lave omkostninger og god tilgængelighed
  • Reguleret protokol: ISO 11898

Trin 4: Kredsløb brugt

Kredsløb brugt
Kredsløb brugt

Her har jeg transceiverne. Der er en på hver side, og de er forbundet med et par ledninger. Den ene er ansvarlig for at sende og den anden for at modtage data.

Trin 5: Transmissionslinjespændinger (differentialregistrering)

Transmissionslinjespændinger (differentialdetektion)
Transmissionslinjespændinger (differentialdetektion)

I CAN er den dominerende bit Zero.

Line Differential Detection reducerer støjfølsomhed (EFI)

Trin 6: CAN -standarder og rammerformat

CAN -standarder og rammerformat
CAN -standarder og rammerformat

Standardformat med 11-bit identifikator

Trin 7: CAN -standarder og rammerformat

CAN -standarder og rammerformat
CAN -standarder og rammerformat

Udvidet format med 29-bit identifikator

Trin 8: CAN -standarder og rammerformat

Det er vigtigt at bemærke, at en protokol allerede beregner CRC og sender ACK- og EOF -signaler, som er ting, der allerede udføres af CAN -protokollen. Dette garanterer, at den sendte besked ikke kommer forkert. Dette skyldes, at hvis det giver et problem i CRC (Redundant Cyclic Check eller Redundancy Check), som er det samme som et informationskontrolciffer, vil det blive identificeret af CRC.

Trin 9: Fire typer rammer (rammer)

Fire typer rammer (rammer)
Fire typer rammer (rammer)

Det er vigtigt at bemærke, at en protokol allerede beregner CRC og sender ACK- og EOF -signaler, som er ting, der allerede udføres af CAN -protokollen. Dette garanterer, at den sendte besked ikke kommer forkert. Dette skyldes, at hvis det giver et problem i CRC (Redundant Cyclic Check eller Redundancy Check), som er det samme som et informationskontrolciffer, vil det blive identificeret af CRC.

Fire typer rammer (rammer)

Overførsel og modtagelse af data i CAN er baseret på fire typer rammer. Rammetyperne vil blive identificeret ved variationer i kontrolbitene eller endda ved ændringer i rammeskrivereglerne for hvert tilfælde.

  • Dataramme: Indeholder transmitterdata for modtageren (e)
  • Fjernramme: Dette er en anmodning om data fra en af noderne
  • Fejlramme: Det er en ramme, der sendes af en hvilken som helst af noderne, når der identificeres en fejl i bussen, og kan registreres af alle knudepunkter
  • Overload Frame: Tjener til at forsinke trafik på bussen på grund af dataoverbelastning eller forsinkelse på en eller flere noder.

Trin 10: Kredsløb - Detaljer om forbindelser

Kredsløb - Detaljer om forbindelser
Kredsløb - Detaljer om forbindelser

Trin 11: Kredsløb - datafangst

Kredsløb - datafangst
Kredsløb - datafangst

Bølgelængder opnået til standard CAN med 11-bit ID

Trin 12: Kredsløb - datafangst

Kredsløb - datafangst
Kredsløb - datafangst

Bølgelængder opnået til udvidet CAN med 29-bit ID

Trin 13: Kredsløb - datafangst

Kredsløb - datafangst
Kredsløb - datafangst

Data opnået af den logiske analysator

Trin 14: Arduino Library - CAN

Arduino bibliotek - CAN
Arduino bibliotek - CAN

Jeg viser her de to muligheder, hvor du kan installere CAN Driver Library

Arduino IDE Library Manager

Trin 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Trin 16: Senderkildekode

Kildekode: Inkluderer og opsætning ()

Vi inkluderer CAN -biblioteket, starter serien til fejlfinding og starter CAN -bussen med 500 kbps.

#include // Inkluder en biblioteca CAN void setup () {Serial.begin (9600); // inicia en seriel para debug mens (! Serial); Serial.println ("Transmissor CAN"); // Inicia o barramento KAN 500 kbps hvis (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

Trin 17: Kildekode: Loop (), afsendelse af en standard CAN 2.0 -pakke

Ved hjælp af standard CAN 2.0 sender vi en pakke. 11-bit-id'et identificerer meddelelsen. Datablokken skal have op til 8 bytes. Det starter pakken med ID 18 i hexadecimal. Den pakker 5 bytes og lukker funktionen.

void loop () {// Usando o CAN 2.0 padr // // 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 hexadecimal CAN.write ('h'); // 1º byte CAN.write ('e'); // 2º byte CAN.write ('l'); // 3º byte CAN.write ('l'); // 4º byte CAN.write ('o'); // 5º byte CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); forsinkelse (1000);

Trin 18: Kildekode: Loop (), afsendelse af en udvidet CAN 2.0 -pakke

I dette trin har ID'et 29 bits. Den begynder at sende 24 bits ID og pakker endnu en gang 5 bytes og afslutter.

// 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 decimal (abcdef em hexa) = 24 bits preenchidos até aqui CAN.write ('w'); // 1º byte CAN.write ('o'); // 2º byte CAN.write ('r'); // 3º byte CAN.write ('l'); // 4º byte CAN.write ('d'); // 5º byte CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); forsinkelse (1000); }

Trin 19: Modtagerkildekode

Kildekode: Inkluderer og opsætning ()

Igen vil vi inkludere CAN -biblioteket, starte serien til fejlfinding og starte CAN -bussen med 500 kbps. Hvis der opstår en fejl, udskrives denne fejl.

#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inicia en seriel para debug mens (! Serial); Serial.println ("Receptor CAN"); // Inicia o barramento KAN 500 kbps hvis (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

Trin 20: Kildekode: Loop (), Hentning af pakken og kontrol af formatet

Vi forsøgte at kontrollere størrelsen på den modtagne pakke. CAN.parsePacket () -metoden viser mig størrelsen på denne pakke. Så hvis vi har en pakke, kontrollerer vi, om den er forlænget eller ej.

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

Trin 21: Kilde: Loop (), tjekker, om det er en fjernpakke

Her kontrollerer vi, om den modtagne pakke er en dataanmodning. I dette tilfælde er der ingen data.

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

Trin 22: Kildekode: Loop (), anmodet eller modtaget datalængde

Hvis den modtagne pakke er en anmodning, angiver vi den ønskede længde. Vi får derefter Data Length Code (DLC), som angiver længden af dataene. Endelig angiver vi den modtagne længde.

Serial.print ("Pacote com id 0x"); Serial.print (CAN.packetId (), HEX); hvis (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);

Trin 23: Kildekode: Loop (), hvis data modtages, udskrives det derefter

Vi udskriver (på den serielle skærm) dataene, men kun hvis den modtagne pakke ikke er en anmodning.

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

Trin 24: Download filerne

PDF

INO

Anbefalede: