Turinys:

CAN protokolas - Taip, mes galime !: 24 žingsniai
CAN protokolas - Taip, mes galime !: 24 žingsniai

Video: CAN protokolas - Taip, mes galime !: 24 žingsniai

Video: CAN protokolas - Taip, mes galime !: 24 žingsniai
Video: ChatGPT: Kaip uždirbti iš dirbtinio intelekto grėsmės? (Investuojantiems) 2024, Lapkritis
Anonim
Image
Image
Naudojami ištekliai
Naudojami ištekliai

Kita tema, kurią neseniai pasiūlė mano „YouTube“kanalo pasekėjai, buvo CAN (valdiklio srities tinklo) protokolas, į kurį šiandien daugiausia dėmesio skirsime. Svarbu paaiškinti, kad CAN yra sinchroninio ryšio protokolas. Tai reiškia, kad sinchronizavimas tarp modulių, prijungtų prie tinklo, atliekamas atsižvelgiant į kiekvieno pranešimo, siunčiamo į magistralę, pradžią. Pradėsime pristatydami pagrindines CAN protokolo sąvokas ir atliksime paprastą surinkimą su dviem ESP32.

Mūsų grandinėje ESP gali veikti ir kaip pagrindinis, ir kaip pavaldus. Vienu metu galite perduoti kelis mikrovaldiklius, nes CAN automatiškai susiduria su viskuo. Šio projekto šaltinio kodas yra labai paprastas. Pasižiūrėk!

1 žingsnis: naudojami ištekliai

  • Du ESP WROOM 32 moduliai NodeMcu
  • Du CAN imtuvai iš „WaveShare“
  • Džemperiai jungtims
  • Loginis analizatorius fiksavimui
  • Trys USB kabeliai ESP ir analizatoriui
  • 10 metrų vytos poros tarnauja kaip autobusas

2 žingsnis: CAN (valdiklio srities tinklas)

CAN (valdiklio srities tinklas)
CAN (valdiklio srities tinklas)
  • Jis buvo sukurtas Robert Bosch GmbH devintajame dešimtmetyje, kad tarnautų automobilių pramonei.
  • Bėgant metams ji tapo plačiai paplitusi dėl tvirto ir lankstaus įgyvendinimo. Jis naudojamas su karine įranga, žemės ūkio technika, pramonės ir pastatų automatika, robotika ir medicinos įranga.

3 žingsnis: CAN - funkcijos

CAN - Savybės
CAN - Savybės
CAN - Savybės
CAN - Savybės
  • Dviejų laidų nuoseklusis ryšys
  • Viename kadre gali būti ne daugiau kaip 8 baitai naudingos informacijos, galima suskaidyti
  • Adresas nukreiptas į pranešimą, o ne į mazgą
  • Pranešimų prioriteto priskyrimas ir „sulaikytų“pranešimų perdavimas
  • Efektyvus gebėjimas aptikti ir pranešti apie klaidas
  • „Multi-master“galimybė (visi mazgai gali prašyti prieigos prie magistralės)
  • „Multicast“galimybė (vienas pranešimas keliems imtuvams vienu metu)
  • Perdavimo greitis iki 1 Mbit / s 40 metrų magistralėje (sumažinant greitį, padidinant šynų ilgį)
  • Lankstus konfigūravimas ir naujų mazgų įvedimas (iki 120 mazgų vienoje magistralėje)
  • Standartinė įranga, maža kaina ir geras prieinamumas
  • Reguliuojamas protokolas: ISO 11898

4 žingsnis: naudojama grandinė

Naudota grandinė
Naudota grandinė

Čia aš turiu siųstuvus -imtuvus. Kiekvienoje pusėje yra vienas, ir jie yra sujungti laidais. Vienas yra atsakingas už duomenų siuntimą, o kitas - už duomenų priėmimą.

5 žingsnis: perdavimo linijos įtampa (diferencinis aptikimas)

Perdavimo linijos įtampa (diferencinis aptikimas)
Perdavimo linijos įtampa (diferencinis aptikimas)

CAN dominuojantis bitas yra nulis.

Linijų diferencialo aptikimas sumažina triukšmo jautrumą (EFI)

6 žingsnis: CAN standartai ir rėmelių formatas

CAN standartų ir rėmelių formatas
CAN standartų ir rėmelių formatas

Standartinis formatas su 11 bitų identifikatoriumi

7 žingsnis: CAN standartai ir rėmelių formatas

CAN standartų ir rėmelių formatas
CAN standartų ir rėmelių formatas

Išplėstinis formatas su 29 bitų identifikatoriumi

8 žingsnis: CAN standartai ir rėmelių formatas

Svarbu pažymėti, kad protokolas jau apskaičiuoja CRC ir siunčia ACK ir EOF signalus, o tai jau yra padaryta pagal CAN protokolą. Tai garantuoja, kad išsiųstas pranešimas nepasieks netinkamo kelio. Taip yra todėl, kad jei tai sukels problemą CRC (Redundant Cyclic Check or Redundancy Check), kuris yra tas pats kaip informacijos tikrinimo skaitmuo, jį identifikuos CRC.

9 žingsnis: Keturi rėmelių tipai (rėmeliai)

Keturi rėmelių tipai (rėmeliai)
Keturi rėmelių tipai (rėmeliai)

Svarbu pažymėti, kad protokolas jau apskaičiuoja CRC ir siunčia ACK ir EOF signalus, o tai jau yra padaryta pagal CAN protokolą. Tai garantuoja, kad išsiųstas pranešimas nepasieks netinkamo kelio. Taip yra todėl, kad jei tai sukels problemą CRC (Redundant Cyclic Check or Redundancy Check), kuris yra tas pats kaip informacijos tikrinimo skaitmuo, jį identifikuos CRC.

Keturi rėmelių tipai (rėmeliai)

Duomenų perdavimas ir priėmimas CAN yra pagrįsti keturių tipų kadrais. Rėmelių tipai bus identifikuojami pagal valdymo bitų variantus arba net pagal kiekvieno atvejo rašymo taisyklių pakeitimus.

  • Duomenų rėmas: yra imtuvo (-ų) siųstuvo duomenys
  • Nuotolinis kadras: tai duomenų užklausa iš vieno iš mazgų
  • Klaidų rėmas: tai kadras, kurį siunčia bet kuris mazgas, nustatydamas magistralės klaidą ir kurį gali aptikti visi mazgai
  • Perkrovos rėmas: skirtas atidėti eismą magistralėje dėl duomenų perkrovos ar uždelsimo viename ar daugiau mazgų.

10 veiksmas: grandinė - išsami informacija apie jungtis

Grandinė - išsami informacija apie jungtis
Grandinė - išsami informacija apie jungtis

11 veiksmas: grandinė - duomenų surinkimas

Grandinė - duomenų surinkimas
Grandinė - duomenų surinkimas

Bangos ilgiai, gauti naudojant standartinį CAN su 11 bitų ID

12 veiksmas: grandinė - duomenų fiksavimas

Grandinė - duomenų surinkimas
Grandinė - duomenų surinkimas

Bangos ilgiai gauti išplėstiniam CAN su 29 bitų ID

13 veiksmas: grandinė - duomenų fiksavimas

Grandinė - duomenų surinkimas
Grandinė - duomenų surinkimas

Loginio analizatoriaus gauti duomenys

14 žingsnis: „Arduino“biblioteka - CAN

Arduino biblioteka - CAN
Arduino biblioteka - CAN

Čia parodysiu dvi parinktis, kuriose galite įdiegti CAN tvarkyklių biblioteką

„Arduino IDE“bibliotekos vadovas

15 žingsnis: „Github“

„Github“
„Github“

github.com/sandeepmistry/arduino-CAN

16 žingsnis: siųstuvo šaltinio kodas

Šaltinio kodas: apima ir sąranka ()

Įtrauksime CAN biblioteką, pradėsime derinimo seriją ir paleisime CAN magistralę 500 kbps greičiu.

#include // Įtraukta biblioteka CAN void setup () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println („Transmisor 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 iniciar o controlador while (1); }}

17 veiksmas: šaltinio kodas: ciklas (), standartinio CAN 2.0 paketo siuntimas

Naudodami standartinį CAN 2.0, siunčiame paketą. 11 bitų ID identifikuoja pranešimą. Duomenų blokas turi turėti iki 8 baitų. Jis pradeda paketą su ID 18 šešioliktainiu skaičiumi. Jis turi 5 baitus ir uždaro funkciją.

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

18 veiksmas: šaltinio kodas: ciklas (), išplėstinio CAN 2.0 paketo siuntimas

Šiame etape ID turi 29 bitus. Jis pradeda siųsti 24 bitų ID ir dar kartą pakuoja 5 baitus ir išeina.

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e identifika a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote estendido…"); CAN.beginExtendedPacket (0xabcdef); // id 11259375 dešimtainis (abcdef em hexa) = 24 bitai preenchidos até aqui CAN.write ('w'); // 1º baitas CAN.write ('o'); // 2º baitas CAN.write ('r'); // 3º baitas CAN.write ('l'); // 4º baitas CAN.write ('d'); // 5º baitas CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); vėlavimas (1000); }

19 veiksmas: imtuvo šaltinio kodas

Šaltinio kodas: apima ir sąranka ()

Vėlgi, mes įtrauksime CAN biblioteką, pradėsime serijinį derinimą ir paleisime CAN magistralę 500 kbps greičiu. Jei įvyks klaida, ši klaida bus išspausdinta.

#include // Įtraukta biblioteka CAN void setup () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println („CAN receptorius“); // 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 iniciar o controlador while (1); }}

20 veiksmas: šaltinio kodas: ciklas (), paketo gavimas ir formato tikrinimas

Bandėme patikrinti gauto paketo dydį. CAN.parsePacket () metodas parodo man šio paketo dydį. Taigi, jei turime paketą, mes patikrinsime, ar jis pratęstas, ar 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 ()) {// verifica se o pacote é estendido Serial.println ("Estendido"); }

21 veiksmas: šaltinis: ciklas (), patikrinimai, ar tai nuotolinis paketas

Čia mes patikriname, ar gautas paketas yra duomenų užklausa. Šiuo atveju duomenų nėra.

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

22 veiksmas: šaltinio kodas: ciklas (), prašomas arba gautas duomenų ilgis

Jei gautas paketas yra užklausa, nurodome prašomą ilgį. Tada gauname duomenų ilgio kodą (DLC), kuris nurodo duomenų ilgį. Galiausiai nurodome gautą ilgį.

Serial.print („Pacote com id 0x“); Serijinis spaudinys (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 (Duomenų ilgio kodas, que indica o comprimento dos dados)} else {Serial.print ("e comprimento"); // aqui somente indica o comprimento recebido Serial.println (packetSize);

23 veiksmas: šaltinio kodas: ciklas (), jei duomenys gaunami, jie spausdinami

Spausdiname (serijiniame monitoriuje) duomenis, bet tik tuo atveju, jei gautas paketas nėra užklausa.

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

24 veiksmas: atsisiųskite failus

PDF

AŠ NE

Rekomenduojamas: