Оглавление:
- Шаг 1. Используемые ресурсы
- Шаг 2: CAN (сеть контроллеров)
- Шаг 3: CAN - функции
- Шаг 4: Используемая схема
- Шаг 5: Напряжения в линии передачи (дифференциальное обнаружение)
- Шаг 6: стандарты CAN и формат фреймов
- Шаг 7: стандарты CAN и формат фреймов
- Шаг 8: стандарты CAN и формат фреймов
- Шаг 9: Четыре типа фреймов (фреймов)
- Шаг 10: Схема - Детали подключений
- Шаг 11: Схема - Сбор данных
- Шаг 12: Схема - Сбор данных
- Шаг 13: Схема - Сбор данных
- Шаг 14: Библиотека Arduino - CAN
- Шаг 15: Github
- Шаг 16: Исходный код передатчика
- Шаг 17: Исходный код: Loop (), отправка стандартного пакета CAN 2.0
- Шаг 18: Исходный код: Loop (), отправка расширенного пакета CAN 2.0
- Шаг 19: Исходный код получателя
- Шаг 20: Исходный код: Loop (), получение пакета и проверка формата
- Шаг 21: Источник: Loop (), проверяет, является ли это удаленным пакетом
- Шаг 22: Исходный код: Loop (), длина данных запрошена или получена
- Шаг 23: Исходный код: Loop (), если данные получены, они печатаются
- Шаг 24: Загрузите файлы
Видео: Протокол CAN - да, мы можем !: 24 шага
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:53
Еще одна тема, которую недавно предложили подписчики моего канала на YouTube, - это протокол CAN (сеть контроллеров), на котором мы и сосредоточимся сегодня. Важно объяснить, что CAN - это протокол одновременной последовательной связи. Это означает, что синхронизация между модулями, подключенными к сети, выполняется относительно начала каждого сообщения, отправляемого на шину. Мы начнем с знакомства с основными концепциями протокола CAN и выполним простую сборку с двумя ESP32.
В нашей схеме ESP могут действовать как ведущие, так и ведомые. Вы можете иметь несколько микроконтроллеров, передающих данные одновременно, потому что CAN автоматически устраняет все коллизии. Исходный код этого проекта очень простой. Проверьте это!
Шаг 1. Используемые ресурсы
- Два модуля ESP WROOM 32 NodeMcu
- Два CAN-трансивера от WaveShare
- Перемычки для соединений
- Логический анализатор для захвата
- Три USB-кабеля для ESP и анализатора
- 10 метров витой пары в качестве шины
Шаг 2: CAN (сеть контроллеров)
- Он был разработан Robert Bosch GmbH в 1980-х годах для обслуживания автомобильной промышленности.
- С годами он получил широкое распространение благодаря своей надежности и гибкости в реализации. Он используется с военной техникой, сельскохозяйственной техникой, промышленной и строительной автоматизацией, робототехникой и медицинским оборудованием.
Шаг 3: CAN - функции
- Двухпроводная последовательная связь
- Максимум 8 байтов полезной информации на кадр, с возможной фрагментацией
- Адрес направлен к сообщению, а не к узлу
- Назначение приоритета сообщениям и ретрансляция сообщений "на удержании"
- Эффективная способность обнаруживать и сигнализировать об ошибках
- Возможность работы с несколькими мастерами (все узлы могут запрашивать доступ к шине)
- Возможность многоадресной рассылки (одно сообщение для нескольких получателей одновременно)
- Скорость передачи до 1 Мбит / с на 40-метровой шине (снижение скорости с увеличением длины шины)
- Гибкость настройки и внедрения новых узлов (до 120 узлов на шину)
- Стандартное оборудование, низкая стоимость и хорошая доступность
- Регулируемый протокол: ISO 11898
Шаг 4: Используемая схема
Здесь у меня трансиверы. По одному с каждой стороны, и они соединены парой проводов. Один отвечает за отправку, а другой за получение данных.
Шаг 5: Напряжения в линии передачи (дифференциальное обнаружение)
В CAN доминирующий бит - ноль.
Обнаружение дифференциальной линии снижает чувствительность к шуму (EFI)
Шаг 6: стандарты CAN и формат фреймов
Стандартный формат с 11-битным идентификатором
Шаг 7: стандарты CAN и формат фреймов
Расширенный формат с 29-битным идентификатором
Шаг 8: стандарты CAN и формат фреймов
Важно отметить, что протокол уже вычисляет CRC и отправляет сигналы ACK и EOF, которые уже выполняются протоколом CAN. Это гарантирует, что отправленное сообщение не будет доставлено по ошибке. Это связано с тем, что если возникает проблема в CRC (избыточная циклическая проверка или проверка избыточности), которая аналогична контрольной цифре информации, она будет идентифицирована с помощью CRC.
Шаг 9: Четыре типа фреймов (фреймов)
Важно отметить, что протокол уже вычисляет CRC и отправляет сигналы ACK и EOF, которые уже выполняются протоколом CAN. Это гарантирует, что отправленное сообщение не будет доставлено по ошибке. Это связано с тем, что если возникает проблема в CRC (избыточная циклическая проверка или проверка избыточности), которая совпадает с контрольной цифрой информации, она будет идентифицирована с помощью CRC.
Четыре типа оправ (рамок)
Передача и прием данных в CAN основаны на четырех типах кадров. Типы кадров будут идентифицироваться вариациями в управляющих битах или даже изменениями в правилах записи кадров для каждого случая.
- Кадр данных: содержит данные передатчика для приемника (ов).
- Удаленный фрейм: это запрос данных от одного из узлов.
- Кадр ошибки: это кадр, отправленный любым из узлов при обнаружении ошибки в шине, и может быть обнаружен всеми узлами.
- Кадр перегрузки: Служит для задержки трафика на шине из-за перегрузки или задержки данных на одном или нескольких узлах.
Шаг 10: Схема - Детали подключений
Шаг 11: Схема - Сбор данных
Длины волн, полученные для стандартной CAN с 11-битным идентификатором
Шаг 12: Схема - Сбор данных
Длины волн, полученные для расширенной CAN с 29-битным идентификатором
Шаг 13: Схема - Сбор данных
Данные, полученные логическим анализатором
Шаг 14: Библиотека Arduino - CAN
Я показываю здесь два варианта установки библиотеки драйверов CAN.
Менеджер библиотеки Arduino IDE
Шаг 15: Github
github.com/sandeepmistry/arduino-CAN
Шаг 16: Исходный код передатчика
Исходный код: включает и настройку ()
Мы включим библиотеку CAN, запустим последовательный порт для отладки и запустим шину CAN со скоростью 500 кбит / с.
#include // Включить библиотеку CAN void setup () {Serial.begin (9600); // инициируем последовательную отладку while (! Serial); Serial.println («CAN трансмиссии»); // Начало CAN или CAN 500 кбит / с if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // когда нет возможности инициировать управление while (1); }}
Шаг 17: Исходный код: Loop (), отправка стандартного пакета CAN 2.0
По стандартной CAN 2.0 отправляем посылку. 11-битный идентификатор идентифицирует сообщение. Блок данных должен иметь длину до 8 байтов. Он запускает пакет с идентификатором 18 в шестнадцатеричном формате. Он упаковывает 5 байтов и закрывает функцию.
void loop () {// Использование или блокировка CAN 2.0 // Envia um pacote: o id tem 11 bit e Identifica a mensagem (Prioridade, evento) // o bloco de dados deve possible até 8 bytes Serial.println ("Enviando pacote … »); CAN.beginPacket (0x12); // id 18 в шестнадцатеричном формате 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 бита идентификатора, еще раз упаковывает 5 байтов и завершает работу.
// Usando CAN 2.0 Estendido // Envia um pacote: идентификатор 29 бит и идентификатор сообщения (Prioridade, evento) // блок данных, который может содержать 8 байтов Serial.println ("Enviando pacote estendido…"); CAN.beginExtendedPacket (0xabcdef); // десятичный идентификатор 11259375 (abcdef em hexa) = 24 бита preenchidos até 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 кбит / с. Если произойдет ошибка, эта ошибка будет напечатана.
#include // Включить библиотеку CAN void setup () {Serial.begin (9600); // инициируем последовательную отладку while (! Serial); Serial.println ("Receptor CAN"); // Начало CAN или CAN 500 кбит / с if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // когда нет возможности инициировать управление 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 ()) {// проверка подлинности пакета Serial.println ("Estendido"); }
Шаг 21: Источник: Loop (), проверяет, является ли это удаленным пакетом
Здесь мы проверяем, является ли полученный пакет запросом данных. В этом случае данных нет.
if (CAN.packetRtr ()) {// Подтверждение наличия пакета в удаленном пакете (Requisição de dados), neste caso não ha dados Serial.print ("RTR"); }
Шаг 22: Исходный код: Loop (), длина данных запрошена или получена
Если полученный пакет является запросом, мы указываем запрошенную длину. Затем мы получаем код длины данных (DLC), который указывает длину данных. Напоследок указываем полученную длину.
Serial.print ("Pacote com id 0x"); Serial.print (CAN.packetId (), HEX); if (CAN.packetRtr ()) {// если требуется, указатели или требования для Serial.print ("e requsitou o comprimento"); Serial.println (CAN.packetDlc ()); // объект DLC (код длины данных, указатель или дополнение к данным)} else {Serial.print ("e comprimento"); // содержит индикаторы полученного значения Serial.println (packetSize);
Шаг 23: Исходный код: Loop (), если данные получены, они печатаются
Мы печатаем (на последовательном мониторе) данные, но только если полученный пакет не является запросом.
// Введите данные о том, что нужно сделать, чтобы получить доступ без необходимости использования while (CAN.available ()) {Serial.print ((char) CAN.read ()); } Serial.println (); } Serial.println (); }}
Шаг 24: Загрузите файлы
Я НЕТ
Рекомендуемые:
Распознавание лиц на Raspberry Pi 4B за 3 шага: 3 шага
Обнаружение лиц на Raspberry Pi 4B за 3 шага: в этом руководстве мы собираемся выполнить обнаружение лиц на Raspberry Pi 4 с помощью Shunya O / S, используя библиотеку Shunyaface. Shunyaface - это библиотека распознавания / обнаружения лиц. Проект направлен на достижение максимальной скорости обнаружения и распознавания с помощью
Как установить плагины в WordPress за 3 шага: 3 шага
Как установить плагины в WordPress за 3 шага: в этом уроке я покажу вам основные шаги по установке плагина wordpress на ваш сайт. В основном вы можете установить плагины двумя разными способами. Первый способ - через ftp или через cpanel. Но я не буду перечислять это, потому что он действительно комп
Дисплей Nextion - Интерфейс и протокол, объясненные с помощью PIC и Arduino: 10 шагов
Дисплей Nextion | Интерфейс и протокол, объясненные с помощью PIC и Arduino: Nextion Display очень прост в использовании и имеет легкий интерфейс с микроконтроллером. С помощью редактора Nextion мы можем настроить дисплей и создать пользовательский интерфейс на дисплее. Таким образом, на основе событий или команд Nextion display будет действовать для отображения
Спиннер Soda Can Wind: 4 шага (с изображениями)
Вращатель для газированной воды: в этом руководстве показано, как сделать вертушку из одной повторно использованной банки из-под газировки. Для первого впечатления, насколько красиво это выглядит, посмотрите видео (ссылка). Это красивый предмет декора для улицы, который преломляет солнечный свет в ваш дом
Фонарик Pringles Can: 4 шага
Pringles Can Flashlight: застряли в темноте и вам нужен фонарик? Вот как это сделать. Это довольно простой проект, на сборку которого уйдет всего 10-15 минут. Вот материалы, которые вам понадобятся. - Батарея Pringles Can-D Cell - Нож Exacto - Клейкая лента - Переключатель S