Spisu treści:
- Krok 1: Wykorzystane zasoby
- Krok 2: CAN (sieć kontrolera)
- Krok 3: MOŻE - Funkcje
- Krok 4: Użyty obwód
- Krok 5: Napięcia linii transmisyjnych (wykrywanie różnicowe)
- Krok 6: Standardy CAN i format ramek
- Krok 7: Standardy CAN i format ramek
- Krok 8: Standardy CAN i format ramek
- Krok 9: Cztery rodzaje ramek (ramek)
- Krok 10: Obwód - szczegóły połączeń
- Krok 11: Obwód - przechwytywanie danych
- Krok 12: Obwód - przechwytywanie danych
- Krok 13: Obwód - przechwytywanie danych
- Krok 14: Biblioteka Arduino - CAN
- Krok 15: Github
- Krok 16: Kod źródłowy nadajnika
- Krok 17: Kod źródłowy: pętla (), wysyłanie standardowego pakietu CAN 2.0
- Krok 18: Kod źródłowy: pętla (), wysyłanie rozszerzonego pakietu CAN 2.0
- Krok 19: Kod źródłowy odbiornika
- Krok 20: Kod źródłowy: Loop (), pobieranie pakietu i sprawdzanie formatu
- Krok 21: Źródło: Loop (), sprawdza, czy jest to pakiet zdalny
- Krok 22: Kod źródłowy: Pętla (), Żądana lub odebrana długość danych
- Krok 23: Kod źródłowy: Pętla (), jeśli dane są odbierane, są drukowane
- Krok 24: Pobierz pliki
Wideo: Protokół CAN - Tak, możemy!: 24 kroki
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:31
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)
- 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
- 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
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)
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
Standardowy format z 11-bitowym identyfikatorem
Krok 7: 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)
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ń
Krok 11: Obwód - przechwytywanie danych
Długości fal uzyskane dla standardowego CAN z 11-bitowym ID
Krok 12: Obwód - przechwytywanie danych
Długości fal uzyskane dla rozszerzonej sieci CAN z 29-bitowym ID
Krok 13: Obwód - przechwytywanie danych
Dane uzyskane przez analizator stanów logicznych
Krok 14: 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.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
JA NIE
Zalecana:
Wyświetlacz Nextion - Interfejs i protokół wyjaśniony za pomocą PIC i Arduino: 10 kroków
Wyświetlacz Nextion | Wyjaśnienie interfejsu i protokołu za pomocą PIC i Arduino: Wyświetlacz Nextion jest bardzo łatwy w użyciu i łatwy w obsłudze interfejs z mikrokontrolerami. Za pomocą edytora Nextion możemy skonfigurować wyświetlacz i zaprojektować interfejs użytkownika na wyświetlaczu. W oparciu o zdarzenia lub polecenia Wyświetlacz Nextion będzie działać na, aby wyświetlić
Cyfrowa tablica ogłoszeń wykorzystująca Raspberry Pi i protokół MQTT: 8 kroków
Cyfrowa tablica ogłoszeń wykorzystująca Raspberry Pi i protokół MQTT: Tablice ogłoszeń są używane prawie wszędzie, np. w biurach, szkołach, szpitalach i hotelach. Mogą być używane wielokrotnie do wyświetlania ważnych ogłoszeń lub reklamowania nadchodzących wydarzeń lub spotkań. Ale ogłoszenie lub reklamy muszą być wydrukowane
Seeed Studio CAN-BUS V2.0 Hakowanie - Pierwsze kroki: 5 kroków
Seeed Studio CAN-BUS V2.0 Hacking - Pierwsze kroki: Ta instrukcja jest przeznaczona dla początkujących, którzy już znają się na Arduino. Wstępna wiedza, jak zacząć, jest zawsze bolesna i czasochłonna w każdym projekcie. Ale dopóki nie poznasz swojego sposobu poruszania się, prawie zawsze żałujesz, że nie masz kogoś, kogo
Soda Can Wind Spinner: 4 kroki (ze zdjęciami)
Soda Can Wind Spinner: Ta instrukcja pokazuje, jak zrobić wiatraczek z jednej puszki po napojach. Aby uzyskać pierwsze wrażenie, jak ładnie to wygląda, obejrzyj film (Link). Jest to piękny element wystroju zewnętrznego, który załamuje światło słoneczne w Twoim domu
Reverse Engineering Ritter 8341C Protokół dla ESP3866: 5 kroków
Reverse Engineering Protokół Ritter 8341C dla ESP3866: Cześć @all.Dla mojej własnej małej automatyki domowej używam podstawowych gniazd sterowanych 433 MHz. Posiadam 3 zestawy z przełącznikami DIP do regulacji adresu. Działały dobrze. Ale jakiś czas (rok lub dwa lata) kupiłem zestaw gniazd od „rittera”