
Съдържание:
- Стъпка 1: Използвани ресурси
- Стъпка 2: CAN (зона на контролер)
- Стъпка 3: МОЖЕ - Функции
- Стъпка 4: Използвана верига
- Стъпка 5: Напрежения на преносната линия (диференциално откриване)
- Стъпка 6: CAN стандарти и рамки формат
- Стъпка 7: CAN стандарти и рамки
- Стъпка 8: CAN стандарти и рамки формат
- Стъпка 9: Четири вида рамки (рамки)
- Стъпка 10: Схема - Подробности за връзките
- Стъпка 11: Верига - улавяне на данни
- Стъпка 12: Верига - улавяне на данни
- Стъпка 13: Верига - улавяне на данни
- Стъпка 14: Библиотека Arduino - МОЖЕ
- Стъпка 15: Github
- Стъпка 16: Изходен код на предавателя
- Стъпка 17: Изходен код: Цикъл (), Изпращане на стандартен CAN 2.0 пакет
- Стъпка 18: Изходен код: Loop (), Изпращане на разширен CAN 2.0 пакет
- Стъпка 19: Изходен код на приемника
- Стъпка 20: Изходен код: Loop (), получаване на пакета и проверка на формата
- Стъпка 21: Източник: Loop (), Проверява дали е отдалечен пакет
- Стъпка 22: Изходен код: Цикъл (), Дължина на данните, поискана или получена
- Стъпка 23: Изходен код: Loop (), Ако данните са получени, след това се отпечатва
- Стъпка 24: Изтеглете файловете
2025 Автор: John Day | [email protected]. Последно модифициран: 2025-01-23 14:36



Друга тема, предложена наскоро от последователите на канала ми в YouTube, беше протоколът CAN (Controller Area Network), върху който ще се съсредоточим днес. Важно е да се обясни, че CAN е протокол за едновременна серийна комуникация. Това означава, че синхронът между модулите, свързани към мрежата, се извършва по отношение на началото на всяко съобщение, изпратено до шината. Ще започнем с въвеждането на основните концепции на CAN протокола и ще извършим проста сглобка с два ESP32.
В нашата схема ESP могат да действат като главни и подчинени. Можете да имате няколко микроконтролера, предаващи едновременно, защото CAN се справя автоматично с сблъсъка на всичко. Изходният код на този проект е супер прост. Виж това!
Стъпка 1: Използвани ресурси
- Два модула на ESP WROOM 32 NodeMcu
- Два CAN трансийвъра от WaveShare
- Джъмпери за връзки
- Логически анализатор за улавяне
- Три USB кабела за ESP и анализатор
- 10 метра усукана двойка, която да служи като автобус
Стъпка 2: CAN (зона на контролер)

- Той е разработен от Robert Bosch GmbH през 80 -те години на миналия век за обслужване на автомобилната индустрия.
- Той стана широко разпространен през годините поради своята здравина и гъвкавост на прилагане. Използва се с военна техника, селскостопанска техника, промишлена и сградна автоматизация, роботика и медицинско оборудване.
Стъпка 3: МОЖЕ - Функции


- Двупроводна серийна комуникация
- Максимум 8 байта полезна информация на кадър, с възможна фрагментация
- Адрес, насочен към съобщението, а не към възела
- Присвояване на приоритет на съобщенията и препредаване на съобщения "на задържане"
- Ефективна способност за откриване и сигнализиране на грешки
- Възможност за множествено управление (всички възли могат да поискат достъп до шината)
- Възможност за мултикаст (едно съобщение за множество приемници едновременно)
- Скорости на трансфер до 1Mbit / s на 40-метрова шина (намаляване на скоростта с увеличаване на дължината на шината)
- Гъвкавост на конфигуриране и въвеждане на нови възли (до 120 възли на шина)
- Стандартен хардуер, ниска цена и добра наличност
- Регулиран протокол: ISO 11898
Стъпка 4: Използвана верига

Тук имам трансивърите. Има по един от всяка страна и те са свързани с чифт проводници. Единият е отговорен за изпращането, а другият за получаването на данни.
Стъпка 5: Напрежения на преносната линия (диференциално откриване)

В CAN доминиращият бит е нула.
Линейно диференциално откриване намалява чувствителността към шум (EFI)
Стъпка 6: CAN стандарти и рамки формат

Стандартен формат с 11-битов идентификатор
Стъпка 7: CAN стандарти и рамки

Разширен формат с 29-битов идентификатор
Стъпка 8: CAN стандарти и рамки формат
Важно е да се отбележи, че протокол вече изчислява CRC и изпраща ACK и EOF сигнали, които са неща, които вече са направени от CAN протокола. Това гарантира, че изпратеното съобщение няма да пристигне по грешен начин. Това е така, защото ако създава проблем в CRC (Redundant Cyclic Check или Redundancy Check), който е същият като цифра за проверка на информация, той ще бъде идентифициран от CRC.
Стъпка 9: Четири вида рамки (рамки)

Важно е да се отбележи, че протокол вече изчислява CRC и изпраща ACK и EOF сигнали, които са неща, които вече са направени от CAN протокола. Това гарантира, че изпратеното съобщение няма да пристигне по грешен начин. Това е така, защото ако създава проблем в CRC (Redundant Cyclic Check или Redundancy Check), който е същият като цифра за проверка на информация, той ще бъде идентифициран от CRC.
Четири вида рамки (рамки)
Предаването и приемането на данни в CAN се основава на четири типа рамки. Типовете рамки ще бъдат идентифицирани чрез вариации в контролните битове или дори чрез промени в правилата за писане на рамки за всеки случай.
- Рамка за данни: Съдържа данните за предавателя за приемника (ите)
- Remote Frame: Това е заявка за данни от един от възлите
- Рамка за грешки: Това е кадър, изпратен от всеки от възлите при идентифициране на грешка в шината и може да бъде открит от всички възли
- Рамка за претоварване: Служи за забавяне на трафика в шината поради претоварване на данни или забавяне на един или повече възли.
Стъпка 10: Схема - Подробности за връзките

Стъпка 11: Верига - улавяне на данни

Дължини на вълните, получени за стандартна CAN с 11-битов ID
Стъпка 12: Верига - улавяне на данни

Дължини на вълните, получени за разширена CAN с 29-битов ID
Стъпка 13: Верига - улавяне на данни

Данни, получени от логическия анализатор
Стъпка 14: Библиотека Arduino - МОЖЕ

Показвам тук двете опции, където можете да инсталирате библиотеката CAN Driver
Arduino IDE библиотечен мениджър
Стъпка 15: Github

github.com/sandeepmistry/arduino-CAN
Стъпка 16: Изходен код на предавателя
Изходен код: Включва и настройка ()
Ще включим CAN библиотеката, ще стартираме сериала за отстраняване на грешки и ще стартираме CAN шината при 500 kbps.
#include // Включва библиотека CAN void setup () {Serial.begin (9600); // inicia сериен параметър за отстраняване на грешки while (! Serial); Serial.println ("Transmissor 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: Изходен код: Цикъл (), Изпращане на стандартен CAN 2.0 пакет
Използвайки стандартния CAN 2.0, изпращаме пакет. 11-битовият идентификатор идентифицира съобщението. Блокът с данни трябва да има до 8 байта. Той стартира пакета с ID 18 в шестнадесетична форма. Той пакетира 5 байта и затваря функцията.
void loop () {// Usando 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 шестнадесетичен CAN.write ('h'); // 1º байт CAN.write ('e'); // 2º байт CAN.write ('l'); // 3º байт CAN.write ('l'); // 4º байт CAN.write ('o'); // 5º байт CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); забавяне (1000);
Стъпка 18: Изходен код: Loop (), Изпращане на разширен CAN 2.0 пакет
В тази стъпка идентификаторът има 29 бита. Той започва да изпраща 24 бита ID и отново пакетира 5 байта и се отказва.
// 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 десетичен (abcdef em шестоъгълник) = 24 бита предварително въведени в aqui aqui CAN.write ('w'); // 1º байт CAN.write ('o'); // 2º байт CAN.write ('r'); // 3º байт CAN.write ('l'); // 4º байт CAN.write ('d'); // 5º байт CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); забавяне (1000); }
Стъпка 19: Изходен код на приемника
Изходен код: Включва и настройка ()
Отново ще включим CAN библиотеката, ще стартираме сериала за отстраняване на грешки и ще стартираме CAN шината при 500 kbps. Ако възникне грешка, тази грешка ще бъде отпечатана.
#include // Включва библиотека CAN void setup () {Serial.begin (9600); // inicia сериен параметър за отстраняване на грешки while (! Serial); Serial.println ("Рецептор МОЖЕ"); // Inicia или 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: Изходен код: Loop (), получаване на пакета и проверка на формата
Опитахме се да проверим размера на получения пакет. Методът CAN.parsePacket () ми показва размера на този пакет. Така че, ако имаме пакет, ще проверим дали е удължен или не.
void loop () {// Теста за проверка на таманхо до прием на рецепта int packetSize = CAN.parsePacket (); if (packetSize) {// Se temos um pacote Serial.println ("Recebido pacote."); if (CAN.packetExtended ()) {// проверява се за pacote é estendido Serial.println ("Estendido"); }
Стъпка 21: Източник: Loop (), Проверява дали е отдалечен пакет
Тук проверяваме дали полученият пакет е заявка за данни. В този случай няма данни.
if (CAN.packetRtr ()) {// Verifica se o pacote é um pacote remoto (Requisição de dados), neste caso não há dados Serial.print ("RTR"); }
Стъпка 22: Изходен код: Цикъл (), Дължина на данните, поискана или получена
Ако полученият пакет е заявка, ние посочваме исканата дължина. След това получаваме кода за дължина на данните (DLC), който показва дължината на данните. Накрая посочваме получената дължина.
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 (Data Length Code, que indica o comprimento dos dados)} else {Serial.print ("e comprimento"); // aqui somente indica o comprimento Recebido Serial.println (packetSize);
Стъпка 23: Изходен код: Loop (), Ако данните са получени, след това се отпечатва
Ние отпечатваме (на серийния монитор) данните, но само ако полученият пакет не е заявка.
// 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: Изтеглете файловете
АЗ НЕ
Препоръчано:
Декодер за протокол за дистанционно управление RC5 без библиотека: 4 стъпки

Декодер на протокол за дистанционно управление RC5 без библиотека: преди декодирането на rc5 първо обсъждаме какво е команда rc5 и каква е нейната структура. така че основно командата rc5, използвана в дистанционни управления, които се използват в телевизори, cd плейъри, d2h, системи за домашно кино и т.н., тя има 13 или 14 бита, подредени в
Интернет часовник: Показване на дата и час с OLED с използване на ESP8266 NodeMCU с NTP протокол: 6 стъпки

Интернет часовник: Показване на дата и час с OLED с помощта на ESP8266 NodeMCU с NTP протокол: Здравейте момчета в тази инструкция, ние ще изградим интернет часовник, който ще получава време от интернет, така че този проект няма да се нуждае от никакъв RTC, за да работи, ще му трябва само работеща интернет връзка И за този проект се нуждаете от esp8266, който ще има
Nextion дисплей - Интерфейс и протокол, обяснени с PIC и Arduino: 10 стъпки

Nextion дисплей | Интерфейс и протокол, обяснени с PIC и Arduino: Nextion Display е много лесен за използване и лесен интерфейс с микроконтролери. С помощта на Nextion редактор можем да конфигурираме дисплея и можем да проектираме потребителски интерфейс на дисплея. Така че въз основа на събития или команди Nextion дисплей ще действа върху, за да покаже
Цифрова табла за съобщения, използваща Raspberry Pi и MQTT протокол: 8 стъпки

Дигитална дъска за съобщения, използваща протокол Raspberry Pi и MQTT: Табла за съобщения се използват почти навсякъде, като офиси, училища, болници и хотели. Те могат да се използват отново и отново за показване на важни известия или рекламиране на предстоящи събития или срещи. Но обявлението или рекламите трябва да бъдат отпечатани
ОСНОВИ НА СПИ КОМУНИКАЦИОННИЯ ПРОТОКОЛ: 13 стъпки

ОСНОВИ НА СПИ КОМУНИКАЦИОННИЯ ПРОТОКОЛ: Когато свържете микроконтролер към сензор, дисплей или друг модул, мислите ли си някога как двете устройства говорят помежду си? Какво точно казват? Как могат да се разбират? Комуникация между електронно устройство