Spisu treści:

Protokół CAN - Tak, możemy!: 24 kroki
Protokół CAN - Tak, możemy!: 24 kroki

Wideo: Protokół CAN - Tak, możemy!: 24 kroki

Wideo: Protokół CAN - Tak, możemy!: 24 kroki
Wideo: Cleo - Za Krokiem Krok 2024, Lipiec
Anonim
Image
Image
Wykorzystane zasoby
Wykorzystane zasoby

Innym tematem, który ostatnio zasugerowali mi obserwujący mój kanał na YouTube, był protokół CAN (Controller Area Network), na którym skupimy się dzisiaj. Należy wyjaśnić, że CAN jest protokołem jednoczesnej komunikacji szeregowej. Oznacza to, że synchronizacja pomiędzy modułami podłączonymi do sieci odbywa się w odniesieniu do początku każdej wiadomości wysyłanej do magistrali. Zaczniemy od wprowadzenia podstawowych pojęć protokołu CAN i wykonamy prosty montaż z dwoma ESP32.

W naszym obwodzie ESP mogą działać zarówno jako Master, jak i Slave. Możesz mieć wiele mikrokontrolerów transmitujących jednocześnie, ponieważ CAN radzi sobie z kolizją wszystkiego automatycznie. Kod źródłowy tego projektu jest bardzo prosty. Sprawdź to!

Krok 1: Wykorzystane zasoby

  • Dwa moduły ESP WROOM 32 NodeMcu
  • Dwa transceivery CAN z WaveShare
  • Zworki do połączeń
  • Analizator logiczny do przechwytywania
  • Trzy kable USB do ESP i analizatora
  • 10 metrów skrętki pełniącej rolę autobusu

Krok 2: CAN (sieć kontrolera)

CAN (sieć kontrolera)
CAN (sieć kontrolera)
  • Został opracowany przez firmę Robert Bosch GmbH w latach 80. XX wieku, aby służyć branży motoryzacyjnej.
  • Z biegiem lat stał się powszechny ze względu na swoją solidność i elastyczność wdrażania. Jest używany ze sprzętem wojskowym, maszynami rolniczymi, automatyką przemysłową i budowlaną, robotyką i sprzętem medycznym.

Krok 3: MOŻE - Funkcje

MOŻE-Funkcje
MOŻE-Funkcje
MOŻE-Funkcje
MOŻE-Funkcje
  • Komunikacja szeregowa dwuprzewodowa
  • Maksymalnie 8 bajtów przydatnych informacji na ramkę, z możliwością fragmentacji
  • Adres skierowany do wiadomości, a nie do węzła
  • Przypisywanie priorytetu wiadomościom i przekazywanie wiadomości „wstrzymanych”
  • Skuteczna umiejętność wykrywania i sygnalizowania błędów
  • Możliwość multi-master (wszystkie węzły mogą żądać dostępu do magistrali)
  • Możliwość multiemisji (jedna wiadomość dla wielu odbiorców jednocześnie)
  • Szybkość transmisji do 1Mbit/s na 40-metrowej szynie (zmniejszenie prędkości wraz ze wzrostem długości szyny)
  • Elastyczność konfiguracji i wprowadzania nowych węzłów (do 120 węzłów na magistralę)
  • Standardowy sprzęt, niski koszt i dobra dostępność
  • Protokół regulowany: ISO 11898

Krok 4: Użyty obwód

Użyty obwód
Użyty obwód

Tutaj mam Transceivery. Jest po jednym z każdej strony i są połączone parą przewodów. Jeden odpowiada za wysyłanie, a drugi za odbieranie danych.

Krok 5: Napięcia linii transmisyjnych (wykrywanie różnicowe)

Napięcia linii transmisyjnych (wykrywanie różnicowe)
Napięcia linii transmisyjnych (wykrywanie różnicowe)

W CAN dominującym bitem jest zero.

Detekcja różnicowa linii zmniejsza czułość na hałas (EFI)

Krok 6: Standardy CAN i format ramek

Standardy CAN i format ramek
Standardy CAN i format ramek

Standardowy format z 11-bitowym identyfikatorem

Krok 7: Standardy CAN i format ramek

Standardy CAN i format ramek
Standardy CAN i format ramek

Rozszerzony format z 29-bitowym identyfikatorem

Krok 8: Standardy CAN i format ramek

Należy zauważyć, że protokół już oblicza CRC i wysyła sygnały ACK i EOF, które są już wykonywane przez protokół CAN. Gwarantuje to, że wysłana wiadomość nie dotrze w niewłaściwy sposób. Dzieje się tak, ponieważ jeśli powoduje problem w CRC (nadmiarowa kontrola cykliczna lub kontrola nadmiarowa), która jest taka sama jak cyfra kontrolna informacji, zostanie zidentyfikowany przez CRC.

Krok 9: Cztery rodzaje ramek (ramek)

Cztery rodzaje ramek (ramki)
Cztery rodzaje ramek (ramki)

Należy zauważyć, że protokół już oblicza CRC i wysyła sygnały ACK i EOF, które są już wykonywane przez protokół CAN. Gwarantuje to, że wysłana wiadomość nie dotrze w niewłaściwy sposób. Dzieje się tak dlatego, że jeśli powoduje problem w CRC (nadmiarowa kontrola cykliczna lub kontrola nadmiarowa), która jest taka sama jak cyfra kontrolna informacji, zostanie zidentyfikowany przez CRC.

Cztery rodzaje ramek (ramki)

Transmisja i odbiór danych w sieci CAN opiera się na czterech typach ramek. Typy ramek będą identyfikowane przez zmiany w bitach kontrolnych lub nawet przez zmiany w zasadach zapisu ramki dla każdego przypadku.

  • Ramka danych: zawiera dane nadajnika dla odbiornika (-ów)
  • Zdalna ramka: jest to żądanie danych z jednego z węzłów
  • Error Frame: Jest to ramka wysyłana przez dowolny z węzłów podczas identyfikowania błędu w magistrali i może zostać wykryta przez wszystkie węzły
  • Ramka przeciążenia: Służy do opóźniania ruchu w magistrali z powodu przeciążenia danych lub opóźnienia w jednym lub większej liczbie węzłów.

Krok 10: Obwód - szczegóły połączeń

Obwód - szczegóły połączeń
Obwód - szczegóły połączeń

Krok 11: Obwód - przechwytywanie danych

Obwód - przechwytywanie danych
Obwód - przechwytywanie danych

Długości fal uzyskane dla standardowego CAN z 11-bitowym ID

Krok 12: Obwód - przechwytywanie danych

Obwód - przechwytywanie danych
Obwód - przechwytywanie danych

Długości fal uzyskane dla rozszerzonej sieci CAN z 29-bitowym ID

Krok 13: Obwód - przechwytywanie danych

Obwód - przechwytywanie danych
Obwód - przechwytywanie danych

Dane uzyskane przez analizator stanów logicznych

Krok 14: Biblioteka Arduino - CAN

Biblioteka Arduino - CAN
Biblioteka Arduino - CAN

Pokazuję tutaj dwie opcje, w których można zainstalować bibliotekę sterowników CAN

Menedżer bibliotek Arduino IDE

Krok 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Krok 16: Kod źródłowy nadajnika

Kod źródłowy: zawiera i konfiguracja ()

Dołączymy bibliotekę CAN, uruchomimy port szeregowy do debugowania i uruchomimy magistralę CAN z prędkością 500 kb/s.

#include //Inclui a biblioteca CAN void setup() { Serial.begin(9600); //inicia a serial para debug while (!Serial); Serial.println("Nadajnik CAN"); // Inicia o barramento CAN 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); } }

Krok 17: Kod źródłowy: pętla (), wysyłanie standardowego pakietu CAN 2.0

Za pomocą standardowego CAN 2.0 wysyłamy paczkę. 11-bitowy identyfikator identyfikuje wiadomość. Blok danych musi mieć do 8 bajtów. Rozpoczyna pakiet o identyfikatorze 18 w systemie szesnastkowym. Pakuje 5 bajtów i zamyka funkcję.

void loop() { // Użyj funkcji CAN 2.0 padrão //Wypełnij pakiet: o id tem 11 bitów i identyfikacja komunikatu (priorytet, zdarzenie) //o zablokowanie dados opracowują 8 bajtów Serial.println("Wybierz kod …”); CAN.początekPakietu (0x12); //id 18 em szesnastkowo CAN.write('h'); //1º bajt CAN.write('e'); //2º bajt CAN.write('l'); //3º bajt CAN.write('l'); //4º bajt CAN.write('o'); //5º bajt CAN.endPacket(); //encerra o pacote para envio Serial.println("Enviado."); opóźnienie (1000);

Krok 18: Kod źródłowy: pętla (), wysyłanie rozszerzonego pakietu CAN 2.0

W tym kroku identyfikator ma 29 bitów. Zaczyna wysyłać 24 bity identyfikatora i ponownie pakuje 5 bajtów i kończy działanie.

//Usando CAN 2.0 Estendido //Wypełnij pakiet: o id tem 29 bitów i identyfikacja komunikatu (priorytet, zdarzenie) //o bloco de dados opracuj 8 bajtów Serial.println("Enviando panote estendido…"); CAN.beginExtendedPacket(0xabcdef); //id 11259375 dziesiętny (abcdef em hexa) = 24 bity preenchidos até aqui CAN.write('w'); //1º bajt CAN.write('o'); //2º bajt CAN.write('r'); //3º bajt CAN.write('l'); //4º bajt CAN.write('d'); //5º bajt CAN.endPacket(); //encerra o pacote para envio Serial.println("Enviado."); opóźnienie (1000); }

Krok 19: Kod źródłowy odbiornika

Kod źródłowy: zawiera i konfiguracja ()

Ponownie włączymy bibliotekę CAN, uruchomimy port szeregowy do debugowania i uruchomimy magistralę CAN z prędkością 500 kb/s. Jeśli wystąpi błąd, ten błąd zostanie wydrukowany.

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

Krok 20: Kod źródłowy: Loop (), pobieranie pakietu i sprawdzanie formatu

Próbowaliśmy sprawdzić rozmiar odebranego pakietu. Metoda CAN.parsePacket() pokazuje mi rozmiar tego pakietu. Jeśli więc mamy paczkę, sprawdzimy, czy jest ona rozszerzona, czy nie.

void loop() { // Zweryfikuj czas o tammanho do acote recebido int packageSize = CAN.parsePacket(); if (packetSize) { // Ustaw temos um pacote Serial.println("Recebido pacote. "); if (CAN.packetExtended()) { //Sprawdź, czy pakiet jest dostępny Serial.println("Estendido"); }

Krok 21: Źródło: Loop (), sprawdza, czy jest to pakiet zdalny

Tutaj sprawdzamy, czy odebrany pakiet jest żądaniem danych. W tym przypadku nie ma danych.

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: Kod źródłowy: Pętla (), Żądana lub odebrana długość danych

Jeśli otrzymany pakiet jest żądaniem, podajemy żądaną długość. Następnie otrzymujemy kod długości danych (DLC), który wskazuje długość danych. Na koniec wskazujemy otrzymaną długość.

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 (Kod długości danych, que indica o comprimento dos dados) } else { Serial.print(" e comprimento "); // aqui somente indica lub comprimento recebido Serial.println(packetSize);

Krok 23: Kod źródłowy: Pętla (), jeśli dane są odbierane, są drukowane

Drukujemy (na monitorze szeregowym) dane, ale tylko wtedy, gdy odebrany pakiet nie jest żądaniem.

//Imprime o dados somente se o pacote recebido não foi de requisição while (CAN.available()) { Serial.print((char)CAN.read()); } Serial.println(); } Serial.println(); } }

Krok 24: Pobierz pliki

PDF

JA NIE

Zalecana: