Вход на сайт

Просмотр новости

Найдите то, что Вас интересует

Разработка CAN адаптера (часть 1)

Дата публикации: 04-10-2026 11:28:08

Если при слове CAN вы представляете автомобиль и поток данных между его блоками, а слово терминатор, ассоциируется в первую очередь с резистором на 120 Ом, то возможно Вам будет интересно почитать как я дополнил существующий зоопарк CAN адаптеров своим собственным зверем с мобильным приложением для диагностики и логирования. Читать далее

Основное содержимое страницы с новостью.

Дисклеймер
В этой статье рассказывается о диагностическом оборудовании способном работать в автомобильной и индустриальной сетях, при неправильном использовании подобных устройств возможны аварийные ситуации. Все манипуляции с такими устройствами должны проводится квалифицированными специалистами. Ни при каких обстоятельствах не используйте их при движении по дорогам общего пользования, это может привести к аварии.

Предыстория

Отлаживая очередной блок автомобиля, я заметил, что он перестал подавать признаки жизни, первая мысль — нужно проверить все соединения ведь мгновение назад блок бодро передавал данные, но даже перезагрузка компа и переподключение USB никак не помогла, ведь проблема оказалась в CAN адаптере. Так у меня сгорел второй Sysworxx, и началась история создания собственного CAN адаптера.

За несколько лет я активно поработал с множеством адаптеров в том числе Vector, Ixxat и Kvaser, все они хорошо выполняют свои задачи, но по мере использования накапливались и неудобства. В первое время основной проблемой являлась установка для каждого адаптера собственной программы и драйверов. В каждой программе были собственные сильные и слабые стороны, например, в первой удобно настраивать фильтры для просмотра CAN трафика, но у нее нет записи в файл, а у другой наоборот есть логирования, но не удобный интерфейс просмотра CAN сообщений. Эта проблема решилась, когда мне посоветовали использовать TSMaster она бесплатная и поддерживает множество адаптеров. Казалось бы, все здорово, но примерно в это время у меня сгорел первый Ixxat. Потеря 40к₽ без явной причины сильно огорчала, ведь работы проводились в лабораторных условиях с дополнительной опто‑развязкой. Но узнав сколько стоят другие адаптеры я был рад что в тот день не использовал их.

Поиск альтернативы

После непродолжительных поисков наткнулся на открытый проект canable, цены на такие адаптеры составляют около 1к₽. У canable есть две версии прошивки первая slcan работает как COM порт и его поддерживают множество открытых программ, например, SavvyCAN, а вторая версия называется candleLight и работает как нативный USB и именно его поддерживает TSMaster. Но про абсолютно разные версии прошивок я узнал, когда уже купил адаптер и по классике жанра я ошибся с выбором. Потратив пару вечеров на установку открытых прошивок, в конечном итоге купил вторую версию адаптера. Еще один вечер потратил на установку драйверов, и подключение к TSMaster, однако так и не удалось добиться стабильной работы. И я принялся создавать собственного зверя пополняя существующий зоопарк.

Создание велосипеда

На основе своего опыта составил следующий список хотелок:

  • Работа по USB, Wi‑Fi и Bluetooth;

  • Поддержка работы с открытым ПО на Windows и Linux;

  • Два CAN канала;

  • Поддержка slcan и gs_usb для работы с TSMaster и другими программами;

  • Приложение на Android, с удобным просмотром сырых сообщений, парсингом DBC со стандартом j1939, а также с записью и воспроизведением логов в форматах LOG, ASC, BLF и TRC.

Для работы с Wi‑Fi и Bluetooth у меня в наличии была ESP32. Первое что решил сделать это запустить модуль CAN (точнее TWAI именно так он называется в ESP32). С ним не было особых проблем и довольно быстро на логическом анализаторе появились заветные сигналы с ID, данными и CRC. Теперь предстояло организовать связь между адаптером и телефоном по Bluetooth SPP и тут появились первые проблемы. Дело в том, что в начале я тестировал отправку одиночных сообщений и с ними все было хорошо, но при воспроизведении лога с реальной машины, начались большие потери. Bluetooth отправлял сообщения не мгновенно, а с некоторой не постоянной задержкой, из‑за которой плыли все тайминги. Для решения этой проблемы было сделано следующее, вместо одиночной отправки, отправлялся сразу пакет на несколько сотен сообщений с меткой времени, а ESP32 отправлял их по внутреннему микросекундному таймеру. Это помогло значительно улучшить стабильность передачи данных, но меня не устраивало что на плотных логах были потери, даже при идеальных условиях, когда телефон лежал возле адаптера. В конечном итоге было принято решение отказаться от Bluetooth и переключиться на Wi‑Fi.

К этому моменту мне уже пришла ESP32-S3, в отличии от ESP32 она поддерживает нативный USB и как бонус у нее больше объем памяти. К сожалению, у выбранного МК был только один модуль CAN, поэтому пришлось дополнительно установить микросхему MCP2518, она выступает мостом между CAN и SPI, а также поддерживает CAN‑FD. При добавлении второй шины начались проблемы с потерей сообщений, в тестах участвовали заведомо тяжёлые логи в них было как минимум 3 сообщения на прием с периодом 1 мс и это давало примерно 78% нагрузки на скорости 500кб/сек, + другие сообщения с периодом 10мс и 100 мс на отправку, и загрузка доходила до 100%. Не учитывая ошибки арбитража, стабильно работал либо прием, либо передача. Оптимизировав все что только можно, жонглируя приоритетами задач и увеличив буферы до разумного предела мне так и не удалось добиться полного отсутствия потерь на загрузке шины больше 90%, для этого мне нужно либо отключить полностью задачи отправки, либо задачи на прием. На практике загрузка шины более 70% большая редкость, поэтому можно было двигаться дальше.

Радость, негодование и костыль

Для работы в TSMaster нужно включить поддержку canable и назначить каналы.

Окно TSMaster с настройкой каналов

Окно TSMaster с настройкой каналов

Первые тесты были положительные, создав вручную несколько сообщений по 1кГц и 100Гц в окне trace появились заветные 998 — 1001 Гц и 100 Гц, погрешность в несколько Герц меня полностью устраивала, до момента запуска лога записанного на планшет. Вместо 1кГц было 660Гц, а вместо 100Гц было 66Гц. Проведя эксперименты с другими частотами обнаружил что механизм воспроизведения логов выдает только 2/3 от нужной частоты. Сначала начал копать в сторону адаптера, думал может он не выдает ACK сигнал или упирается в пропускную способность USB, но потом вспомнил что в окне Transmit эти же сообщения отправляются правильно. Затем проверил лог, там тоже было все в порядке, даже создал через скрипт два идеальных лога, но они показывали туже картину. Проведя еще несколько экспериментов, пришел к выводу что в TSMaster используются разные таймеры для отправки через окна Transmit и Bus Playback. Вероятно, фирменные адаптеры используют не потоковую передачу сообщений по таймеру, а пакетную, где для каждого сообщения указана временная метка. Перспектива остаться без такого мощного инструмента не давала мне покоя, к счастью, в одном из тестов заметил, что если отправить через окно Transmit сообщение с частотой 1кГц на шину CAN1, то на шине CAN2, 66Гц превращаются в 100Гц и все остальные сообщения из записанного лога становятся с нужными частотами. Вероятно отправка сообщения в окне Transmit будит таймер в окне Bus Playback. В качестве тактозадающего канала, можно выбрать виртуальный CAN, это исправит ошибку для большинства сообщений, но эксперименты с 1кГц все еще продолжаются.

Железо

После отладки на макетных платах пришло время заказать изготовление собственных адаптеров и вот через 1.5 месяца у меня на столе лежали 10 плат. Вся элементная база рассчитана на работу в 12В и 24В сетях, для защиты логики используется гальваническая развязка. Адаптер может работать как от сети автомобиля, так и через USB порт, в обоих случаях есть самовосстанавливающийся предохранители.

7659fcf76a5a84f31c554adc1b44363a.JPG

На производстве обнаружились две ошибки, первая размер площадки для конденсаторов сделал 0402, а модель с корпусом 0603, вторая ошибка в наложении DC‑DC преобразователя на резистор. После исправления ошибок с помощью паяльника, загрузил прошивку и начал делать корпус.

28faaf8a6e3382ef70e0ccf8f929237f.JPG

Знаю, получилась просто серая коробка, для отладки этого достаточно.

2c8d36575341eb9fa94638dcdd9e2468.JPG

Приложение на Android

Большая часть времени ушла на написание приложение под Android, для этого даже купил планшет, чтобы тестировать не только на телефоне. Изначально планировал сделать только просмотр шины, запись и отправку логов, но каждый раз добавлял то, чего мне не хватало ранее, в итоге получилось около 10 основных вкладок и еще примерно столько же второстепенных. В планах расширить поддержку диагностических сообщений и других стандартов. Этот проект планировал закончить за месяц, но вот идет уже третий месяц, поэтому сейчас решил взять паузу и выложить его в Rustore и Google Play чтобы протестировать то, что уже сделано (как помощь с тестированием написал ниже). Кратко про основные окна:

  1. Окно шина — все сообщения что видит и отправляет адаптер. Все сообщения можно сортировать и фильтровать по многочисленным атрибутам, а также записывать в один из четырех форматов логов. Режим «Мост» предназначен для отправки выбранных сообщений на другой канал, например, если у шин отличается битрейт.

  2. Окно сигналы — преобразует сырые CAN сообщения в сигналы с единицами измерений из DBC, в том числе и DM1, а также строит графики.

  3. Окно отправка — отправляет сообщения в шину, есть простой встроенный дизайнер для отправки сигналов по нажатию на кнопки или движению слайдера.

  4. Окно логи — отображает доступные файлы логов (.asc,.blf,.log,.trc) и воспроизводит их через встроенный плеер.

  5. Окно еще — Настройка подключенных адаптеров, конвертер логов, документация и другие настройки.

Скриншоты приложения и комментарии
Окно Шина - у него два основных режима "Уникальные ID" показывает сколько раз сообщение появлялось в шине и рассчитывает дельту времени, второй режим - "Поток" показывает сообщения в порядке их появления на шине. На скриншоте выделено три  сообщения, можно включить фильтр и либо исключить их, либо наоборот отображать только их, либо скопировать ID и данные. Можно сделать сортировку по каждому столбцу, например, сначала показывать сообщения с наименьшим периодом.

Окно Шина — у него два основных режима «Уникальные ID» показывает сколько раз сообщение появлялось в шине и рассчитывает дельту времени, второй режим — «Поток» показывает сообщения в порядке их появления на шине. На скриншоте выделено три сообщения, можно включить фильтр и либо исключить их, либо наоборот отображать только их, либо скопировать ID и данные. Можно сделать сортировку по каждому столбцу, например, сначала показывать сообщения с наименьшим периодом.

Окно Сигналы - загружаете DBC и смотрите как поток данных преобразуется в сигналы с единицами измерения. Если нужного сообщения нет в шине, то все сигналы в ветке будут серыми, а вместо значений будут прочерки. Если нет DBC, то сигнал можно добавить вручную.

Окно Сигналы — загружаете DBC и смотрите как поток данных преобразуется в сигналы с единицами измерения. Если нужного сообщения нет в шине, то все сигналы в ветке будут серыми, а вместо значений будут прочерки. Если нет DBC, то сигнал можно добавить вручную.

Воспринимайте эту вкладку как холст, все плашки можно двигать, растягивать и привязывать сигналы из подгруженной DBC.

Воспринимайте эту вкладку как холст, все плашки можно двигать, растягивать и привязывать сигналы из подгруженной DBC.

DM1 - для расширенных описаний можно импортировать базу SPN. Если вам не нравится темная тема можно включить светлую, если скучно можно поставить на фон картинку, вероятно это одна из причин почему проект затянулся:)

DM1 — для расширенных описаний можно импортировать базу SPN. Если вам не нравится темная тема можно включить светлую, если скучно можно поставить на фон картинку, вероятно это одна из причин почему проект затянулся:)

Окно отправки сообщений использую когда мне нужно эмулировать блок, которого нет в шине. Также можно скопировать нужные ID в окне Шина и вставить тут.

Окно отправки сообщений использую когда мне нужно эмулировать блок, которого нет в шине. Также можно скопировать нужные ID в окне Шина и вставить тут.

Это окно появилось когда мне надоело вспоминать какой сигнал в сообщении за что отвечает. Так можно наглядно эмулировать ключ зажигания и перемещаться по меню автомобиля.

Это окно появилось когда мне надоело вспоминать какой сигнал в сообщении за что отвечает. Так можно наглядно эмулировать ключ зажигания и перемещаться по меню автомобиля.

В окне Шина вы можете записать лог и после он попадет сюда. На практике встречались логи продолжительностью по 20 минут, а сообщение с ошибкой было на 15 минуте и если я пропускал момент, то приходилось запускать лог заново, здесь добавлен бегунок и можно сразу перемотать лог на 15 минут.

В окне Шина вы можете записать лог и после он попадет сюда. На практике встречались логи продолжительностью по 20 минут, а сообщение с ошибкой было на 15 минуте и если я пропускал момент, то приходилось запускать лог заново, здесь добавлен бегунок и можно сразу перемотать лог на 15 минут.

Окно настройки подключенного адаптера. Если адаптер находится в незнакомой местности, то он создает свою точку доступа Wi-Fi, но если вы скажите ему пароль от локальной сети, то он переключится на нее.

Окно настройки подключенного адаптера. Если адаптер находится в незнакомой местности, то он создает свою точку доступа Wi‑Fi, но если вы скажите ему пароль от локальной сети, то он переключится на нее.

Linux

Для работы через драйвер gs_usb нужно установить can‑utils
sudo apt install can-utils
# can0 = CAN1, can1 = CAN2
sudo ip link set can0 up type can bitrate 500000
sudo ip link set can1 up type can bitrate 500000
candump -ta can0
cansend can0 123#1122334455667788
cansend can1 18FEF100#0102030405060708
ip -details -statistics link show can0
sudo ip link set can0 down 

А вот пример для работы через slcan.
sudo slcand -o -c -s6 /dev/ttyACM0 slcan0
sudo ip link set slcan0 up
candump slcan0
cansend slcan0 123#11223344
# порт на CAN2 (до запуска slcand)
printf '~7E01\r' > /dev/ttyACM0
# обратно на CAN1
printf '~7E00\r' > /dev/ttyACM0

Предварительный итог

Доволен ли я тем, что сделал? Думаю да, этот адаптер уже закрывает все мои рабочие потребности, и если раньше меня что‑то не устраивало в покупных адаптерах, то было только два варианта, терпеть или найти другой, то сейчас у меня появился третий вариант — исправить. Несмотря на простую идею адаптера, начинаю понимать почему производители устанавливают такие цены, они потратили много ресурсов на разработку не только железки, но и сопутствующего ПО, а также поддержку и обновление. Мои прямые затраты вышли чуть больше стоимости одного Ixxat и на выходе получил 10 адаптеров, думаю для меня это вполне экономически выгодно. Но за какую стоимость их имеет смысл продавать, учитывая еще производство корпуса, упаковки, комиссии маркетплейсов, налогов, сертификации, обновлений и поддержки — ответ на этот вопрос буду искать после полноценных независимых испытаний, ведь может оказаться что этот адаптер нужен только мне:)
Мне также интересно узнать какими адаптерами пользуются сервисные центры, у каждого производителя свое фирменное оборудование или есть универсальное? Мои знания для выездной диагностики ограничиваются ELM 327, но он используется для легковых автомобилей, а меня больше интересует спецтехника.

В ближайшее время я хочу провести тестирование адаптеров в реальных условия, в сервисных центрах, если у Вас есть желание и возможность и вы из Москвы, то свяжитесь пожалуйста со мной в одной из групп.
t.me/kvortek
vk.ru/club241980208

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

0%до 1000₽0

50%от 1000₽ до 5000₽1

0%от 5000₽ до 15000₽0

0%от 15000₽ до 25000₽0

50%лучше не знать1

Проголосовали 2 пользователя. Воздержавшихся нет.

Схожие новости

#Наименование новостиТональностьИнформативностьДата публикации
1От RTSP-камеры до истории событий: настраиваем видеоаналитику через JavaScript Viewer08.1606-10-2026
2EvertyDisplay: что я сделал и зачем06.5414-09-2026
3EventBus и CommandBus во frontend: когда прямых вызовов становится слишком много011.7230-09-2026
4Capacitor: от веба к мобильным приложениям. Часть 5. Микрофронтенды в Capacitor08.401-10-2026
5[Перевод] Реверс‑инжиниринг электросамоката и новая прошивка для него на Rust08.1411-09-2026
6Как я автоматизировал работу врачей на Rust07.0327-09-2026
7Составное устройство USB на AT32. Часть 1: Подготовка011.3801-10-2026
8Пост №639025709.5628-09-2026
9Мобильник почти из ничего: Как ИИ помог собрать телефон из деталей с маркетплейсов06.3327-09-2026

Классификация: Пресс-релизы. Схожих патентов: 0. Схожих новостей: 9. Тональность: 0. Информативность: 10.4. Источник: habr.com.