79

Сделай сам. Сканер J1939 на ESP32

По профессиональной своей деятельности случаются задачи по оперативной диагностике промышленной техники. В моем случае силовые агрегаты техники, как правило, дизельные двигатели самостоятельно или в паре с автоматической трансмиссией. Система управления силовых агрегатов построена на CAN шине и использует протокол J1939.

Поскольку по работе я не в ИТ, но по хобби давно и плотно с этим связан, то решил я собрать просмотрщик параметров сам. Импортозаместить, так сказать, готовые дорогие заморские решения.

Конечно правда жизни такова, что не использовать импортные компоненты и программные решения уже невозможно, и поэтому в конечном устройстве из отечественного - желание и время.. ну и денег немного. И даже исходники были выложены на “не наш” Github, но это из-за github pages для демонстрации веб интерфейса. В конце концов хватит работать в стол и пришло время тоже бесплатно что-то отдать обществу.

Продукт довольно нишевый и не предназначен для широких масс, но тем не менее я надеюсь, что мои наработки позволят кому нибудь получить ответы на какие-то свои вопросы или быстро стартануть свой проект, если возникнет необходимость использовать подобный стек. А стек здесь такой - в качестве сервера ESP32. В качестве языка backend - c++ в качестве фреймворка бэкенда - ESP-IDF. Для фронтенда использовал Vue3, Typescript, Vite…

Обзор устройства начну с конца, постепенно раскрывая детали:

Онлайн демо веб интерфейса

Комплектующие:

Корпус

Кабель

Контроллер

Преобразователь напряжения

Приемопередатчик CAN


Схема:

Прошивка:

Проект

Программа для прошивки


Железо и backend:

Код тут

По схеме тут все просто - используются готовые компоненты. Задача понижающего преобразователя напряжения - получить 5v из бортовой сети двигателя (24-28v). На плате Devkit ESP32 имеется свой преобразователь и он из 5v делает 3.3v, что и используется непосредственно ESP32. На входе преобразователя я еще дополнительно припаял диод как элементарную защиту от переполюсовки, хотя по идее можно поставить диодный мост и тогда по поводу перепутать плюс и минус можно не заморачиваться. А переполюсовка тут актуальная тема т.к. у разных производителей на одном и том же разъеме плюсы и минусы на тех же пинах, но поменяны местами. CAN трансивер необходим для преобразования физического уровня CAN шины для работы с обычными цифровыми пинами микроконтроллера.

Для создания программы для микроконтроллера использовался VS Code с установленным официальным расширением от Espressif - Espressif IDF. Может быть используя Arduino платформу какие то вещи можно было бы сделать удобнее, но был интерес въехать и потрогать немного FreeRTOS как бы непосредственно. Немного непривычно поначалу, но если разобраться, то все хорошо. Могу сказать, что система сборки у Espressif норм.

Микроконтроллер при старте инициализирует SPIFFS хранилище (аналог файлового хранилища, где хранятся файлы фронтенда), поднимает точку доступа, файловый сервер, websocket сервер, инициализирует CAN драйвер, начинает слушать CAN шину и при получении сообщений рассылать их всем websocket клиентам подключенным к серверу. Кстати CAN драйвер в ESP32 называется TWAI , что , как я понял , связано с какими-то лицензионными заморочками.

Особенностью файлового сервера является то, что при запросе клиентом файла он пытается отдать этот файл , а если его нет, то пытается отдать заархивированный файл {имяфайла}.{расширение}.gz и только если нет ни того ни другого отвечает ошибкой. Что касается протокола J1939, то на микроконтроллере реализовано только чтение обычных сообщений , широковещательных сообщений переданных по транспортному протоколу (более 8 байт) и отправка простых (8 байт) сообщений в шину. По задумке устройство может отправлять в шину только сообщения об очистке сохраненных ошибок, но тот же самый механизм используется при отправке сообщений для управления желаемой скоростью вращения двигателя и желаемой передачи АКПП. Расшифровка же сообщений происходит в браузере клиента.

Фото:

Frontend:

Код тут

Для веб интерфейса использовал современные инструменты веб разработки последних ревизий:

TypeScript

Vue3

Vite

VueUse

Echarts

AnimateCss

W3Css

FuseJs

AJV

IndexedDb


Проект веб приложения имеет 3 сценария сборки:


build_preview - собирает проект для предпросмотра на локальном сервере (preview)


build_embedded - собирает проект непосредственно для микроконтроллера. Генерируются только архивированные файлы gz. Разделение на части не производится т.к. опытным путем установлено, что файловый сервер ESP32 быстрее отдает один файл побольше чем несколько разделенных файлов. Весь проект в архивированном виде имеет размер 498kB и отлично помещается в памяти ESP.


build_deploy - этот сценарий добавлен недавно и создает файлы для публикации приложения на github pages. Пример настройки альтернативного именования файлов, поскольку сборка по умолчанию (preview) генерирует файл с символом “_” в начале, что в результате порождает ошибку при скачивании файла браузером.


Помню в начале знакомства с веб разработкой у меня было непонимание - где конкретно находятся файлы веб приложения и как они исполняются. И если у кого-то возникает такой вопрос, то работает это все так: При обращении из браузера (клиента) к какой-либо странице, сервер отвечает файлом index.html. В этом файле есть список файлов веб приложения и браузер запрашивает эти файлы с сервера, разархивирует и далее действует по инструкциям из этих файлов. Таким образом файлы веб приложения изначально находятся на сервере, скачиваются и выполняются браузером.

На веб приложение ушло больше всего времени. Изначально я сделал все с использованием замечательной библиотеки element-plus, но почему-то выловил жесткую утечку памяти и месяц бился с этим явлением. Постепенно заменяя компоненты из element-plus самописными.


Общий алгоритм работы приложения такой- приложение получает массив байт от микроконтроллера, далее этот массив декодируется с помощью данных из JSON файла. (Как я искал и парсил доступную инфу по J1939 - тема для отдельной статьи.)


Поскольку вся спецификация протокола довольно объемна, то хранить ее на мк не выйдет , по крайней мере в стандартной комплектации ESP32 Devkit с 4 Mb флеш памяти. В связи с чем решено было хранить данные для декодирования параметров и передаваемых ошибок на стороне клиента в браузере. При первой загрузке веб приложения эти файлы создаются автоматически, но имеют немного данных для декодирования и можно изменить данные в этом файле в текстовом редакторе или загрузить по указанным в приложении ссылкам.

При загрузке файлов правильность их структуры проверяется с помощью отличного AJV по схеме файла. Данные хранятся в памяти браузера и при использовании из другого браузера или с другого устройства надо опять подгружать файлы.

Поиск по параметрам осуществляется с помощью FuseJS через интеграцию VueUse. Вообще библиотека VueUse должна быть дефолтной частью проекта на Vue3 поскольку содержит огромное количество очень полезных функций, которые намного облегчают код и работают напрямую с реактивными объектами Vue.

В приложении есть возможность строить графики изменения параметров. Добавление параметра на график осуществляется включением соответствующего переключателя в меню параметра. Графики строятся используя гениальный Echarts и в коде в частности есть пример переключения темы графика “на лету”.


И все это дело собирается в 498Kb! По моему не плохо. Собранные файлы помещаются в папку spiffs_images проекта для микроконтроллера и сохраняются в его памяти при прошивке. Из этой области памяти файловый сервер ESP32 отдает файлы по запросу браузера.


Среди вопросов по работе остался момент периодической “заморозке” вебсокет сообщений, которые были замечены из браузеров на линуксе и на андройде, причем периодичность их появления не зависит ни от чего. Из браузеров виндовса подобная проблема ни разу не проявила себя, что наталкивает на мысль о какой-то глубокой малозаметной ошибке в реализации протокола либо на стороне ESP либо на клиентской стороне.

Вообще в целом реализация проекта подарила интересный опыт и полезные наработки, что, думаю, может пригодиться в будущем (если оно будет)).


Фото в “полях”:

P.S. Поскольку я сам не в ит и для знакомых я занимаюсь непонятными делами и разговариваю непонятными словами, то мне была бы интересна обратная связь, замечания и предложения по коду и реализации проекта.

Лига программистов

2.3K поста12K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

1
Автор поста оценил этот комментарий

Да ещё и espressif взял а не ссаный ардуино, двойной респект

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

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

4
Автор поста оценил этот комментарий
Я ещё не дочитал, и навряд ли что-то пойму. По поводу диодного моста вместо диодной защиты от переплюсовки: а он не приподнимет потенциал нуля над общей массой? Или кан трансивер гальванически развязан?
ЗЫ непонятно, но очень интересно )
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

вопрос интересный, если честно не думал, про поднятие нуля.. надо попробовать, спасибо)  трансивер - это микросхема vp230. эквивалентная схема входа

Иллюстрация к комментарию
0
Автор поста оценил этот комментарий
Надеюсь ответите) Делаю похожий проект ,только хочу сделать бортовой компьютер на есп32,тоде с протоколом sae j1939. Просто просмотр параметров,таких как обороты,давление масла,температура ОЖ и т.д. на экранчике. Хотел сначала просто снифер сделать,для прослушки шины. Код есть,трансивер тоже,есп32 девкит. Подключил к трактору,ни одного кода не увидел. Прочитал в интернете что нужно выпаивать резистор с трансивера(если в блоке уже есть терминаторы). И хотел спросить,вы тоже его убирали?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да. Надо выпаять резистор.

0
Автор поста оценил этот комментарий

Приветствую! Проект заморозили или ещё продолжаете? Интересует возможность управления по j1939.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

приветствую. пока в замороженом состоянии. управление там в принципе есть - газовал и скорости переключал успешно на насосе буровом на caterpillare). не помню в мастер ветке есть или нет.

относительно недавно еще нашёл информацию в официальной документации, что в есп именно в twai модуле много ошибок хардварных, которые официальными костылями там обходятся.. но оно всё равно работало как-то)

если что управлять там не сложно.. вот ошибки сохраненные не особо читает и сбрасывает

0
Автор поста оценил этот комментарий

Тогда скажите какие сигналы на линиях в рецессивном состоянии? И почему слушать можно по одной линии?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

ой всё) я сейчас  отвлекся от темы, особенности физического уровня обсуждать не готов.

0
Автор поста оценил этот комментарий

Респект автору! У меня такой вопрос - насколько полный J1939.DBC вам удалось собрать? Можете поделиться?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

выпустили из бана, уря) j1939 очень ограниченный - по сути слушает широковещательные фреймы, но может и писать полегкому ( испытывал управление оборотами на caterpillar c-15 и c-32 и переключение скоростей на cat th48). а так поделиться больше нечем. этот проект я выделил из другого , который заморозил за ненадобностью. ( делал систему управления буровыми насосами ) чисто на интузиазме делал, украдкой, но инициатива наказуема.

0
Автор поста оценил этот комментарий

Разве дифференциальна?? Может все же синфазна?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

интернет пишет, что всеж дифференциальна...

показать ответы
0
Автор поста оценил этот комментарий

Hvd230 не работает во многих сетях, уже не помню почему, используйте 233, выше кто то писал что не увидел сообщений, это возможная причина. Зачем вы запаковываете в архив? Вам не хватило 4МБ?? Ну и обработка фрэймов в веб приложении.. так вам точно памяти ни на что не хватит

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

о, выпустили меня из бана) архивирую фронт т.к. использовал стандартный есп с 1мб памяти. обработка фреймов в веб - да тяжеловато, пришлось углубиться в отладку и ловить утечки памяти (очень интересный опыт)). но с другой стороны в вебе и видеопотоки идут и 3d игры играются.. грех не использовать ресурсы машин пользователя.

1
Автор поста оценил этот комментарий

Большая работа! Это круто. Аналогично тебе собираю контроллер управления ДВС и подогревом. На данный момент работает в локале бек на Джанго, фронт на реакт, устройство на стм32ф411 макет, хочется джсм и вафлю. Дошло дело до печатной платы, залез на Али и ужаснулся от цен, решил переехать на есп32, заодно перенести физическое управление на модуль удалённой переферии и связать их каном. Наткнулся на статью, аж на душе потеплело.

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

если что то пригодится - буду рад)

1
Автор поста оценил этот комментарий
Не видит ни одной ошибки, ни после запроса, ни до. Но я думаю тут с протоколом что-то не то. Это эбу с Уаза, с двигателем Ивеко. Сообщения в меню бегут, есп видит эбу. Завтра попробую еще, отпишусь. Если можно, напишите в телегу @nikolatmn. Устройство заинтересовало очень, думаю собрать своим сотрудникам электрикам-диагностам еще пару после опробования. Очень удобная штука для быстрой диагностики двс, на неимением под рукой компа и нужного сканера. Да и работа у нас на крайнем севере, где ни интернета ни связи нет. А телефон то всегда под рукой.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Отлично! Для таких применений и задумывал) Напишу в тг!

1
Автор поста оценил этот комментарий
Собрал устройство по вашей схеме, работает, но ошибки не видит, подключал на столе. Пробовал на эбу edc16c39 с двигателя f1a. Пока нет возможности добраться до Дэс. Есть в компании Дэс с моторами Скания, да и техники много разной строительной, буду пробовать. Если есть или будут другие версии ПО, обязательно сообщайте, пишите посты. Думаю мне не одному интересно
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ого) я думал всем лень. Спасибо за обратную связь! Не видит активные ошибки или сохраненные при запросе? Я столкнулся с тем, что на некоторых агрегатах сохраненные не сразу прилетают.. Если что-то обновлю обязательно дам знать!

показать ответы
4
Автор поста оценил этот комментарий
Я ещё не дочитал, и навряд ли что-то пойму. По поводу диодного моста вместо диодной защиты от переплюсовки: а он не приподнимет потенциал нуля над общей массой? Или кан трансивер гальванически развязан?
ЗЫ непонятно, но очень интересно )
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Вообще теоретически должно работать т.к. физически can шина же дифференциальна

CAN контроллеры соединяются с помощью дифференциальной шины, которая имеет две линии - CAN_H (can-high) и CAN_L (can-low), по которым передаются сигналы. Логический ноль регистрируется, когда на линии CAN_H сигнал выше, чем на линии CAN_L. Логическая единица - в случае когда сигналы CAN_H и CAN_L одинаковы (отличаются менее чем на 0.5 В). Использование такой дифференциальной схемы передачи делает возможным работу CAN сети в очень сложных внешних условиях.
показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества