Obsah:

Protokol CAN - Ano, můžeme !: 24 kroků
Protokol CAN - Ano, můžeme !: 24 kroků

Video: Protokol CAN - Ano, můžeme !: 24 kroků

Video: Protokol CAN - Ano, můžeme !: 24 kroků
Video: Ukecala jsem taťku, aby se mnou natočil video!😄 Zkuste taky něco natočit s rodičema, je to sranda💜 2024, Listopad
Anonim
Image
Image
Použité zdroje
Použité zdroje

Dalším předmětem, který nedávno navrhli následovníci mého kanálu YouTube, byl protokol CAN (Controller Area Network), na který se dnes zaměříme. Je důležité vysvětlit, že CAN je simultánní sériový komunikační protokol. To znamená, že synchronizace mezi moduly připojenými k síti se provádí ve vztahu k začátku každé zprávy odeslané na sběrnici. Začneme představením základních konceptů protokolu CAN a provedeme jednoduchou montáž se dvěma ESP32.

V našem obvodu mohou ESP fungovat jako Master i Slave. Můžete vysílat více mikrokontrolérů současně, protože CAN řeší kolizi všeho automaticky. Zdrojový kód tohoto projektu je velmi jednoduchý. Koukni na to!

Krok 1: Použité zdroje

  • Dva moduly ESP WROOM 32 NodeMcu
  • Dva CAN transceivery od WaveShare
  • Propojky pro připojení
  • Logický analyzátor pro zachycení
  • Tři USB kabely pro ESP a analyzátor
  • 10 metrů kroucené dvojice, aby sloužil jako autobus

Krok 2: CAN (Network Area Network)

CAN (Network Area Network)
CAN (Network Area Network)
  • Byl vyvinut společností Robert Bosch GmbH v 80. letech minulého století, aby sloužil automobilovému průmyslu.
  • V průběhu let se rozšířila díky své robustnosti a flexibilitě implementace. Používá se s vojenským vybavením, zemědělskými stroji, průmyslovou a stavební automatizací, robotikou a zdravotnickým zařízením.

Krok 3: CAN - Funkce

CAN - Funkce
CAN - Funkce
CAN - Funkce
CAN - Funkce
  • Dvouvodičová sériová komunikace
  • Maximálně 8 bajtů užitečných informací v rámci s možnou fragmentací
  • Adresa směrovaná na zprávu a ne na uzel
  • Přiřazení priorit zprávám a předávání zpráv „na počkání“
  • Efektivní schopnost detekovat a signalizovat chyby
  • Možnost více masterů (všechny uzly mohou požadovat přístup na sběrnici)
  • Možnost vícesměrového vysílání (jedna zpráva pro více přijímačů současně)
  • Přenosové rychlosti až 1 Mbit / s na 40metrové sběrnici (snížení rychlosti s prodloužením délky přípojnice)
  • Flexibilita konfigurace a zavedení nových uzlů (až 120 uzlů na sběrnici)
  • Standardní hardware, nízké náklady a dobrá dostupnost
  • Regulovaný protokol: ISO 11898

Krok 4: Použitý obvod

Použitý obvod
Použitý obvod

Tady mám vysílače. Na každé straně je jeden a jsou spojeny dvojicí vodičů. Jeden je zodpovědný za odesílání a druhý za příjem dat.

Krok 5: Napětí přenosového vedení (diferenciální detekce)

Napětí přenosového vedení (diferenciální detekce)
Napětí přenosového vedení (diferenciální detekce)

V CAN je dominantní bit Nula.

Line Differential Detection Reductions Noise Sensitivity (EFI)

Krok 6: Formát standardů a rámců CAN

Formát standardů a rámců CAN
Formát standardů a rámců CAN

Standardní formát s 11bitovým identifikátorem

Krok 7: Formát standardů a rámců CAN

Standardy a rámce CAN
Standardy a rámce CAN

Rozšířený formát s 29bitovým identifikátorem

Krok 8: Formát standardů a rámců CAN

Je důležité si uvědomit, že protokol již vypočítává CRC a odesílá signály ACK a EOF, což jsou věci, které již protokol CAN provádí. To zaručuje, že odeslaná zpráva nedorazí špatným způsobem. Důvodem je, že pokud způsobí problém v CRC (Redundant Cyclic Check nebo Redundancy Check), který je stejný jako kontrolní kontrolní číslice, bude identifikován CRC.

Krok 9: Čtyři typy rámců (rámečků)

Čtyři typy rámců (rámečků)
Čtyři typy rámců (rámečků)

Je důležité si uvědomit, že protokol již vypočítává CRC a odesílá signály ACK a EOF, což jsou věci, které již protokol CAN provádí. To zaručuje, že odeslaná zpráva nedorazí špatným způsobem. Důvodem je, že pokud způsobí problém v CRC (Redundant Cyclic Check nebo Redundancy Check), který je stejný jako kontrolní kontrolní číslice, bude identifikován CRC.

Čtyři typy rámů (rámečků)

Přenos a příjem dat v CAN jsou založeny na čtyřech typech rámců. Typy rámců budou identifikovány variacemi v řídicích bitech nebo dokonce změnami pravidel pro zápis rámců pro každý případ.

  • Datový rámec: Obsahuje data vysílače pro přijímače
  • Vzdálený rámec: Toto je požadavek na data z jednoho z uzlů
  • Chybový rámec: Je to rámec odeslaný kterýmkoli z uzlů při identifikaci chyby na sběrnici a může být detekován všemi uzly
  • Rámec přetížení: Slouží ke zpoždění provozu na sběrnici v důsledku přetížení dat nebo zpoždění na jednom nebo více uzlech.

Krok 10: Okruh - detaily připojení

Okruh - detaily připojení
Okruh - detaily připojení

Krok 11: Okruh - zachycení dat

Circuit - Data Capture
Circuit - Data Capture

Vlnové délky získané pro standardní CAN s 11bitovým ID

Krok 12: Okruh - zachycení dat

Circuit - Data Capture
Circuit - Data Capture

Vlnové délky získané pro rozšířený CAN s 29bitovým ID

Krok 13: Okruh - zachycení dat

Circuit - Data Capture
Circuit - Data Capture

Data získaná logickým analyzátorem

Krok 14: Knihovna Arduino - CAN

Knihovna Arduino - CAN
Knihovna Arduino - CAN

Ukazuji zde dvě možnosti, kde můžete nainstalovat knihovnu ovladačů CAN

Správce knihovny Arduino IDE

Krok 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Krok 16: Zdrojový kód vysílače

Zdrojový kód: Zahrnuje a nastavení ()

Zahrneme knihovnu CAN, spustíme seriál pro ladění a spustíme sběrnici CAN rychlostí 500 kb / s.

#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println („Transmissor CAN“); // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao initiar o controlador CAN"); // caso não seja possível initiar o controlador while (1); }}

Krok 17: Zdrojový kód: Loop (), odeslání standardního paketu CAN 2.0

Pomocí standardního CAN 2.0 odesíláme balíček. Zprávu identifikuje 11bitové ID. Datový blok musí mít až 8 bajtů. Spustí paket s ID 18 v šestnáctkové soustavě. Zabalí 5 bajtů a zavře funkci.

void loop () {// Používání o CAN 2.0 padrão // 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 hexadecimální 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."); zpoždění (1000);

Krok 18: Zdrojový kód: Loop (), odeslání rozšířeného balíčku CAN 2.0

V tomto kroku má ID 29 bitů. Začíná odesílat 24 bitů ID a ještě jednou zabalí 5 bajtů a skončí.

// 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 bitů 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."); zpoždění (1000); }

Krok 19: Zdrojový kód přijímače

Zdrojový kód: Zahrnuje a nastavení ()

Opět zahrneme knihovnu CAN, spustíme sériové ladění a spustíme sběrnici CAN rychlostí 500 kb / s. Pokud dojde k chybě, tato chyba se vytiskne.

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

Krok 20: Zdrojový kód: Loop (), získání balíčku a kontrola formátu

Pokusili jsme se zkontrolovat velikost přijatého paketu. Metoda CAN.parsePacket () mi ukazuje velikost tohoto balíčku. Pokud tedy máme balíček, zkontrolujeme, zda je prodloužen či nikoli.

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"); }

Krok 21: Zdroj: Loop (), zkontroluje, zda se jedná o vzdálený balíček

Zde zkontrolujeme, zda je přijatý paket datovým požadavkem. V tomto případě neexistují žádná data.

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

Krok 22: Zdrojový kód: Loop (), požadovaná nebo přijatá délka dat

Pokud je přijatý paket požadavkem, uvedeme požadovanou délku. Poté získáme Data Length Code (DLC), který udává délku dat. Nakonec označíme přijatou délku.

Serial.print ("Pacote com id 0x"); Serial.print (CAN.packetId (), HEX); if (CAN.packetRtr ()) {// se o příjem pacote é de requisição, indikace o obsolento solicitado Serial.print ("e requsitou o Combo"); Serial.println (CAN.packetDlc ()); // obtem o DLC (Data Length Code, que indica o obsimento dos dados)} else {Serial.print ("e Comboimento"); // aqui somente indica o Compimento recebido Serial.println (packetSize);

Krok 23: Zdrojový kód: Smyčka (), pokud jsou data přijata, pak se vytisknou

Data vytiskneme (na sériovém monitoru), ale pouze v případě, že přijatý paket není požadavkem.

// Zvýraznění některých momentů, které mohou být přijímány, zatímco (CAN.available ()) {Serial.print ((char) CAN.read ()); } Serial.println (); } Serial.println (); }}

Krok 24: Stáhněte si soubory

PDF

INO

Doporučuje: