INHOUDSOPGAWE:

CAN Protocol - Ja, ons kan !: 24 stappe
CAN Protocol - Ja, ons kan !: 24 stappe

Video: CAN Protocol - Ja, ons kan !: 24 stappe

Video: CAN Protocol - Ja, ons kan !: 24 stappe
Video: 1 Чайная ложечка под любой домашний цветок и пышное цветение вам обеспечено!Цветет Вмиг +10 рецептов 2024, November
Anonim
Image
Image
Hulpbronne gebruik
Hulpbronne gebruik

'N Ander onderwerp wat die volgelinge van my YouTube -kanaal onlangs voorgestel het, was die CAN (Controller Area Network) protokol, waarop ons ons vandag sal toespits. Dit is belangrik om te verduidelik dat CAN 'n gelyktydige seriële kommunikasieprotokol is. Dit beteken dat die sinchronisasie tussen die modules wat aan die netwerk gekoppel is, uitgevoer word in verhouding tot die begin van elke boodskap wat na die bus gestuur word. Ons begin met die bekendstelling van die basiese konsepte van die CAN -protokol en voer 'n eenvoudige samestelling uit met twee ESP32's.

In ons kring kan die ESP's as beide meester en slaaf optree. U kan verskeie mikrobeheerders gelyktydig stuur, omdat die CAN die botsing van alles outomaties hanteer. Die bronkode van hierdie projek is super eenvoudig. Kyk daarna!

Stap 1: Hulpbronne gebruik

  • Twee modules van ESP WROOM 32 NodeMcu
  • Twee CAN -ontvangers van WaveShare
  • Springers vir verbindings
  • Logiese ontleder vir opname
  • Drie USB -kabels vir ESP's en ontleder
  • 10 meter gedraaide paar om as bus te dien

Stap 2: CAN (Controller Area Network)

CAN (Controller Area Network)
CAN (Controller Area Network)
  • Dit is in die 1980's deur Robert Bosch GmbH ontwikkel om die motorbedryf te bedien.
  • Dit het oor die jare wydverspreid geword vanweë die robuustheid en buigbaarheid van implementering. Dit word gebruik met militêre toerusting, landboumasjinerie, industriële en geboutomatisering, robotika en mediese toerusting.

Stap 3: KAN - funksies

CAN - funksies
CAN - funksies
CAN - funksies
CAN - funksies
  • Tweedraads seriële kommunikasie
  • Maksimum van 8 grepe nuttige inligting per raam, met fragmentasie moontlik
  • Adres gerig op die boodskap en nie na die knoop nie
  • Gee prioriteit aan boodskappe en gee boodskappe wat in die wag is, deur
  • Doeltreffende vermoë om foute op te spoor en aan te dui
  • Multi-meestervermoë (alle nodusse kan toegang tot die bus versoek)
  • Multicast -funksie (een boodskap vir verskeie ontvangers tegelyk)
  • Oordraagtempo's van tot 1 Mbit / s op 'n bus van 40 meter (vermindering van die koers met toename in die lengte van die rail)
  • Buigbaarheid van konfigurasie en bekendstelling van nuwe nodusse (tot 120 knope per bus)
  • Standaard hardeware, lae koste en goeie beskikbaarheid
  • Gereguleerde protokol: ISO 11898

Stap 4: Kring gebruik

Kring gebruik
Kring gebruik

Hier het ek die Transceivers. Daar is een aan elke kant, en hulle is verbind met 'n paar drade. Die een is verantwoordelik vir die stuur en die ander vir die ontvangs van data.

Stap 5: Transmissielynspannings (differensiële opsporing)

Transmissielynspannings (differensiële opsporing)
Transmissielynspannings (differensiële opsporing)

In CAN is die dominante bietjie nul.

Line Differential Detection Verminder geraasgevoeligheid (EFI)

Stap 6: CAN Standards and Frames Format

CAN -standaarde en rame -formaat
CAN -standaarde en rame -formaat

Standaardformaat met 11-bis identifiseerder

Stap 7: CAN Standards and Frames Format

CAN -standaarde en rame -formaat
CAN -standaarde en rame -formaat

Uitgebreide formaat met 29-bis identifiseerder

Stap 8: CAN Standards and Frames Format

Dit is belangrik om daarop te let dat 'n protokol die CRC reeds bereken en ACK- en EOF -seine stuur, wat dinge reeds deur die CAN -protokol gedoen word. Dit waarborg dat die gestuurde boodskap nie op die verkeerde manier kom nie. Dit is omdat dit 'n probleem in die CRC (Redundant Cyclic Check of Redundancy Check), wat dieselfde is as 'n inligtingkontrolesyfer, sal identifiseer deur die CRC.

Stap 9: Vier soorte rame (rame)

Vier soorte rame (rame)
Vier soorte rame (rame)

Dit is belangrik om daarop te let dat 'n protokol die CRC reeds bereken en ACK- en EOF -seine stuur, wat dinge reeds deur die CAN -protokol gedoen word. Dit waarborg dat die gestuurde boodskap nie op die verkeerde manier kom nie. Dit is omdat dit 'n probleem in die CRC (Redundant Cyclic Check of Redundancy Check), wat dieselfde is as 'n inligtingkontrolesyfer, sal identifiseer deur die CRC.

Vier soorte rame (rame)

Die oordrag en ontvangs van data in die CAN is gebaseer op vier soorte rame. Die raamtipes sal geïdentifiseer word deur variasies in die kontrolebits of selfs deur veranderinge in die raamskryfreëls vir elke geval.

  • Data raam: Bevat die sender data vir die ontvanger (s)
  • Afstandsraam: Dit is 'n versoek vir data van een van die nodusse
  • Foutraamwerk: dit is 'n raam wat deur enige van die nodusse gestuur word tydens die identifisering van 'n fout in die bus en kan deur alle nodusse opgespoor word
  • Oorbelasingsraamwerk: dien om die verkeer op die bus te vertraag weens data -oorlading of vertraging op een of meer nodusse.

Stap 10: Kring - Besonderhede van verbindings

Kring - Besonderhede van verbindings
Kring - Besonderhede van verbindings

Stap 11: Kringloop - datavaslegging

Kringloop - datavaslegging
Kringloop - datavaslegging

Golflengtes verkry vir standaard CAN met 11-bis ID

Stap 12: Kringloop - datavaslegging

Kring - datavaslegging
Kring - datavaslegging

Golflengtes verkry vir uitgebreide CAN met 29-bis ID

Stap 13: Kringloop - datavaslegging

Kringloop - datavaslegging
Kringloop - datavaslegging

Data verkry deur die logiese ontleder

Stap 14: Arduino -biblioteek - KAN

Arduino -biblioteek - KAN
Arduino -biblioteek - KAN

Ek wys hier die twee opsies waar u die CAN Driver Library kan installeer

Arduino IDE -biblioteekbestuurder

Stap 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Stap 16: Senderbronkode

Bronkode: Sluit in en opstel ()

Ons sluit die CAN -biblioteek in, begin die reeks vir ontfouting en begin die CAN -bus teen 500 kbps.

#include // Sluit 'n biblioteca KAN leegstelling opstel () {Serial.begin (9600); // inicia 'n reekse vir ontfouting terwyl (! Serial); Serial.println ("Transmissor CAN"); // Inicia o barramento KAN 500 kbps as (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

Stap 17: Bronkode: lus (), stuur 'n standaard CAN 2.0 -pakkie

Met die standaard CAN 2.0 stuur ons 'n pakket. Die 11-bis-ID identifiseer die boodskap. Die datablok moet tot 8 grepe hê. Dit begin die pakkie met ID 18 in heksadesimaal. Dit pak 5 grepe en sluit die funksie.

void loop () {// Usando o CAN 2.0 pad // Envia um pacote: o id tem 11 bits e identifiera a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote … "); CAN.beginPacket (0x12); // id 18 em heksadesimale 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."); vertraging (1000);

Stap 18: Bronkode: Loop (), stuur 'n uitgebreide CAN 2.0 -pakket

In hierdie stap het die ID 29 bisse. Dit begin 24 stukkies ID stuur en pak weer 5 grepe en stop.

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e identifiera a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote estendido …"); CAN.beginExtendedPacket (0xabcdef); // id 11259375 desimale (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."); vertraging (1000); }

Stap 19: Bronkode van die ontvanger

Bronkode: Sluit in en opstel ()

Weereens sluit ons die CAN -biblioteek in, begin die reeks om te ontfout en begin die CAN -bus teen 500 kbps. As 'n fout voorkom, word hierdie fout gedruk.

#include // Sluit 'n biblioteca KAN leegstelling opstel () {Serial.begin (9600); // inicia 'n reekse vir ontfouting terwyl (! Serial); Serial.println ("Ontvanger KAN"); // Inicia o barramento KAN 500 kbps as (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

Stap 20: Bronkode: lus (), die pakket kry en die formaat nagaan

Ons het probeer om die grootte van die pakkie te kontroleer. Die CAN.parsePacket () -metode wys my die grootte van hierdie pakket. As ons 'n pakket het, sal ons kyk of dit verleng is of nie.

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

Stap 21: Bron: Loop (), kyk of dit 'n eksterne pakket is

Hier kyk ons of die pakkie wat ontvang is 'n data -versoek is. In hierdie geval is daar geen data nie.

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

Stap 22: Bronkode: lus (), datalengte aangevra of ontvang

As die ontvangde pakkie 'n versoek is, dui ons die verlangde lengte aan. Ons kry dan die Data Length Code (DLC), wat die lengte van die data aandui. Laastens dui ons die lengte aan.

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

Stap 23: Bronkode: lus (), as data ontvang word, word dit dan gedruk

Ons druk (op die seriële monitor) die data, maar slegs as die ontvangde pakkie nie 'n versoek is nie.

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

Stap 24: Laai die lêers af

PDF

EK NEE

Aanbeveel: