Чтение данных OBD-II автомобиля через CAN в контейнерном приложении во встроенном Linux

CNXSoft: обзор от гостя Андре Марсио де Лима Курвелло – старшего FAE и технического евангелиста Toradexо – о поддержке OBD-II и CAN во встроенном Linux

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

В этом обзоре вы узнаете, как создать приложение для связи с автомобилем через CAN с помощью стандарта OBD-II. Мы используем современную программную контейнеризацию с Docker и Torizon, современной промышленной платформой для встраиваемых Linux-систем от Toradex. Мы реализуем приложение на компьютере-на-модуле Verdin, который разработан для использования в суровых условиях, например, в коммерческих автомобилях. Хотя в этом примере описывается гипотетическое автомобильное приложение, вы можете использовать CAN даже в промышленных приложениях.

Краткий разговор о CAN


Прежде чем мы углубимся в технические детали приложения, вы должны знать, что оно будет использовать CAN, что означает сеть контроллеров. Это один из наиболее часто используемых протоколов связи для транспортных средств, грузовиков и даже тракторов. Если у вас есть автомобиль, произведенный после 2004 года, он наверняка имеет сеть CAN, соединяющую десятки ЭБУ.

Рисунок 1. Пример узла шины CAN. Автор: EE JRW
– Собственная работа, CC BY-SA 4.0,

Для тех, кто не знаком с этим термином, ЭБУ(ECU) – это аббревиатура от электронный блок управления (Electronic Control Unit). Он соответствует каждому электронному устройству в сети CAN, которое может принимать и передавать данные, отвечая за управление одной или несколькими функциями в транспортном средстве, такими как двигатель, трансмиссия и даже мультимедийная система.

Как правило, любой данный ЭБУ, действующий как узел CAN, способный взаимодействовать с шиной CAN транспортного средства, должен иметь два основных компонента: контроллер CAN, который реализует уровень канала передачи данных ISO 11898-1 для CAN, и приемопередатчик CAN, который, в свою очередь, заботится о физическом уровне в соответствии со стандартами ISO 11898-2 / 3, как показано на рисунке 1.

Первоначально шина CAN была предназначена для использования на транспортных средствах, но она оказалась настолько надежной, что ее начали использовать другие области, добавляя транспортные протоколы, чтобы она могла поддерживать больше приложений, таких как стандарт CAN J1939, созданный для грузовиков, и ISO-11783 (также известный как ISOBUS) создан для тракторов. OBD-II поверх CAN, о котором мы будем говорить, построен на ISOTP, или, другими словами, ISO-15765-2.

Рисунок 2. Пример диагностического анализа
автомобиля, выполняемого через компьютер
с адаптером OBD-2.

В том же направлении сеть CAN в большинстве транспортных средств также должна обмениваться данными по стандарту бортовой диагностики (OBD-II), в котором она должна отвечать на серию запросов, чтобы предоставить информацию о скорости, оборотах в минуту, уровне батареи, уровне топлива, среди множества других данных, связанных с информацией о двигателе. Как видно из названия, OBD-II может использоваться (и используется) для диагностики транспортных средств, как показано на Рисунке 2.

Возможность взаимодействия с данным транспортным средством со стандартом OBD-II позволяет любому приложению запрашивать информацию из главного ЭБУ данного транспортного средства, без необходимости знать собственные сообщения CAN, используемые каждым производителем для передачи интересующего сообщения. OBD-II не только означает стандарт сообщений через сетевой протокол, но также относится к используемому общему физическому разъему, как показано на рисунке 3.

Рисунок 3 Разъем OBD2 (слева) и типичный сканер Bluetooth ODB-II (справа)

Этот разъем обычно используется компаниями для телематических устройств для мониторинга, помимо других доступных переменных транспортных средств, скорости транспортного средства, уровня топлива, уровня заряда батареи, сгруппированных вместе с данными геолокации, полученными через приемник GPS / GNSS. Также может быть получена другая информация, такая как температура двигателя и частота вращения, которая может указывать на условия высокой интенсивности, которым может подвергаться данный двигатель.

Рисунок 4. Телематические приложения на тяжелом транспорте.

OBD-II – это подход «запрос-ответ». Другими словами, вам не придется читать не интересные вам сообщения по мере их появления. Вы будете отправлять сообщения главному ЭБУ транспортного средства, чтобы он реагировал на данную информацию, например, на скорость транспортного средства. Главный ЭБУ автомобиля ответит на этот запрос, и вы обработаете сообщение в соответствии со стандартом OBD-II. Главное преимущество этого подхода заключается в том, чтобы не спамить шину CAN и периодически запрашивать интересующие сообщения, например, один раз в минуту.

Torizon и Verdin 

Если вы еще не слышали о Torizon, предлагаем вам взглянуть. Torizon – это простая в использовании промышленная встраиваемая Linux-платформа Toradex, которая использует приложения в контейнерах, управляемых Docker, с тем, чтобы облегчить разработку встроенных системных решений. Он также поставляется с клиентом OTA с безопасностью автомобильного уровня. Это открытый исходный код.

Рисунок 5. Логотип Torizon.

Вместе с Torizon Toradex уже предоставляет новое семейство компьютеров-на-модулях под названием Verdin, основанное на разъеме DDR4 SODIMM. Verdin имеет оптимизированный интерфейс, а также упрощенные требования к источнику питания и управлению питанием всей системы. Он разработан для суровых условий, и его прямой выход позволяет добавлять реальные порты ввода-вывода без необходимости пересекать трассы или слои. Первые модули Verdin основаны на процессорах приложений i.MX 8M Mini, подобных показанному на рисунке 6, который использовался в этом примере.

Рисунок 6. Модуль Verdin iMX8MM

NXP i.MX8 M Mini SoC не поставляется с собственными контроллерами CAN. Чтобы компенсировать это, Toradex добавила в модуль контроллер MCP2518 SPI CAN, как показано на рисунке 7. Контроллер CAN MCP2518 совместим с CAN-FD и является хорошим выбором для приложений CAN высокого класса. Вы можете найти более подробную информацию о Verdin iMX8M Mini на его странице в Toradex. CAN также доступен на других компьютерах Toradex в модулях, таких как семейства Apalis и Colibri.

Рис. 7. Verdin iMX8MM с акцентом на интерфейс CAN-контроллера.

В настоящее время есть две несущие платы, которые вы можете использовать для оценки компьютера-на-модуле Verdin: Dahlia и плата разработки Verdin. Dahlia – это компактная несущая плата, обеспечивающая легкий доступ к наиболее распространенным функциям семейства Verdin, а плата разработчика Verdin – это несущая плата, цель которой – раскрыть все функции модуля. В этой демонстрации мы будем использовать плата разработки Verdin, но вы можете легко использовать Dahlia. Плата разработки Verdin использует изолированный CAN-трансивер ISO1042BDWR от Texas Instruments, который предоставляет все необходимые сигналы для CAN, такие как: CAN High, CAN Low и GND (никогда не забывайте о заземлении). Мы будем использовать интерфейс CAN1 в плате разработки Verdin, как показано на рисунке 8.

Рис. 8. Плата разработки Verdin с упором на интерфейс приемопередатчика CAN1.

Мы предоставляем подробные инструкции по правильному использованию Verdin iMX8MM и платы разработки Verdin в Кратком руководстве от Toradex.

Поскольку TorizonCore является встроенным дистрибутивом Linux, он поддерживает SocketCAN, предоставляемый ядром Linux, что позволяет приложению взаимодействовать с сетью CAN как соединение сокета с Linux Socket API.

Теперь, когда все настроено, давайте сделаем шаг за шагом, чтобы вы могли установить TorizonCore 5 в свой Verdin iMX8MM и наше приложение-контейнер для связи CAN со стандартом OBD-II.

Установка TorizonCore 5

На момент написания этого обзора TorizonCore 5 все еще находится в стадии разработки. Мы решили использовать его в нашем обзоре, потому что это будет наша основная ориентированная версия TorizonCore. Посетите веб-страницу Torizon, чтобы увидеть дорожную карту для получения дополнительной информации.

Чтобы установить его в Verdin iMX8MM, сначала вы должны использовать нашу последнюю версию Toradex Easy Installer – 2.0b6, доступную через наши ночные сборки в Toradex Artifactory. Вы можете найти подробные инструкции о том, как его получить, в разделе «Ночной выпуск» на странице «Простой установщик Toradex».

Если в Verdin iMX8MM загружен Toradex Easy Installer 2.0b6, вам необходимо использовать наши каналы CI для загрузки TorizonCore 5, что можно сделать, щелкнув пункт меню «Feeds» в меню Toradex Easy Installer и отметив значок Вариант подачи CI, как показано на рисунке 9.

Рисунок 9. Диалоговое окно каналов с флажком для каналов Toradex CI.

Этот процесс займет некоторое время, так как он загрузит множество ссылок на изображения из Toradex Artifactory.

После завершения загрузки выберите один образ TorizonCore 5, например «5.1.0-devel-20201019 + build.98», выбранный ниже (одна из наших последних ночных сборок), и установите его. Если вы не можете найти эту, выберите самую близкую к вашей дате ночную сборку.

Рисунок 10. Выбор ночного TorizonCore 5 для установки.

Обратите внимание, что ночные сборки могут быть нестабильными. Если вы обнаружите проблему, не стесняйтесь опубликовать ее в нашем сообществе Toradex, и мы проанализируем ее как можно быстрее. После установки вы сможете получить доступ к TorizonCore 5 через адаптер Verdin Development Board USB-to-Serial X66. Инструкции о том, как получить доступ к консоли модуля через последовательный порт, представлены в нашей статье “Настройка консоли отладки последовательного порта (Linux / U-Boot)”. При первом входе в систему и пользователь, и пароль – torizon. Вам будет предложено изменить пароль, как показано на рисунке 11.

Рисунок 11. Приглашение входа в TorizonCore 5 на Verdin iMX8MM

Теперь у нас есть Verdin iMX8MM с TorizonCore 5, и пришло время для практического использования контейнера.

Загрузка контейнера, готового к обмену данными по CAN на TorizonCore 5

Одна из основ TorizonCore – это использование контейнеров для изоляции приложений и управления ими, что осуществляется через Docker. Это может сбивать с толку разработчиков встраиваемых систем «старой школы», но это общая тенденция на рынке, поскольку встраиваемые устройства более мощные и способны выполнять более сложные задачи, чем в прошлом. Кроме того, безопасность сегодня вызывает большее беспокойство, чем когда-либо прежде.

Мы приглашаем вас ознакомиться с обзором TorizonCore с документацией, а также вы можете прочитать статью для быстрого начала работы с контейнерами на Torizon.

Но для нетерпеливых, необходимая настройка для этого руководства – иметь хост-машину с Docker и настроенную с эмуляцией Arm, чтобы вы могли создавать образы контейнеров для своего целевого устройства. Об этом у есть подробный обзор.

Пожалуйста, всегда создавайте образы докеров для TorizonCore на главном компьютере разработки. Хотя это можно сделать на целевом устройстве (например, Verdin iMX8MM), это займет гораздо больше времени. В рамках этого руководства мы можем создать образ докера со следующим файлом Dockerfile:

Rhis Dockerfile создаст образ контейнера со следующими предварительными условиями для выполнения приложения CAN:

  • iproute2 для настройки, включения и отключения сетевых интерфейсов CAN.
  • can-utils – набор утилит командной строки Linux для отладки сети CAN.
  • Python3-CAN – оболочка SocketCAN для Python3.
  • Плюс другие полезные инструменты, такие как nano, для редактирования файлов внутри контейнера.

С этим Dockerfile в заданном каталоге разработки на вашем хост-компьютере вы можете начать сборку образа контейнера с помощью следующей команды:

Он создаст образ контейнера с именем «can-torizon». После завершения сборки мы можем сохранить образ в tar-файл, чтобы отправить его в целевой модуль разработки, Verdin iMX8MM с TorizonCore 5:

Теперь вы можете отправить can-container.tar в модуль Verdin с помощью SCP, как в приведенной ниже команде, но заменив X.X.X.X IP-адресом Verdin iMX8MM в вашей сети.

Теперь в консоли TorizonCore 5 на Verdin iMX8MM вы можете выполнить следующую команду (не забывая, что она находится в каталоге / home / torizon), чтобы загрузить сжатый образ докера, который мы отправили ранее.

Вы можете проверить, что образ был успешно загружен, выполнив команду «docker image ls», которая выведет список образов докеров в системе.

Теперь, когда изображение правильно загружено, мы можем выполнить его через «запуск докера» со следующими параметрами:

После данной команды «docker run» у вас будет доступ к консоли контейнера, позволяющий запускать в ней команды и / или приложения.

Когда наш контейнер готов, пришло время начать писать код Python, чтобы продемонстрировать, как взаимодействовать с OBD-II через CAN.

Архитектура приложения Python для взаимодействия с OBD-II через CAN

Чтобы создать наше простое приложение на Python, мы будем использовать библиотеку Python CAN для управления сетью CAN. Вы также можете использовать API сокетов в Python для связи CAN, поскольку Python поддерживает CAN с версии 3.3, но на данный момент это более низкоуровневый подход.

Чтобы проиллюстрировать запрос OBD-II для PID 0x0C, как определено в стандарте для частоты вращения двигателя (RPM), мы представляем код ниже. Это будет:

  1. Создайте интерфейс CAN-шины
  2. Создайте ссылку на сообщение CAN для запроса
    1. Запрос сообщения CAN – это кадр CAN с DLC размером 8 байтов.
    2. Сообщение будет построено в следующем формате для стандарта SAE:
      • Байт 0 – количество дополнительных байтов: 2
      • Байт 1 – 1, чтобы показать текущие данные
      • Байт 2 – запрашиваемый PID-код
      • Байты с 3 по 7: они не используются, но ISO 15765-2 предлагает установить для них CCh
  3. Отправьте запрос в главный ЭБУ с идентификатором 0x7DF
  4. Получите сообщение и сравните его с ожидаемым идентификатором ответа 0x7E8
    1. Если мы получим сообщение от ожидаемого идентификатора ответа, он напечатает результат в шестнадцатеричном формате.

Чтобы выполнить наше приложение CAN, мы должны сначала настроить и включить сеть CAN в модуле. Интерфейс CAN1, физический, уже включен в его дереве устройств и обозначен как can0 на стороне Linux. Процесс настройки и включения может быть выполнен с помощью вызовов os.system () в Python, в которых мы настраиваем сеть CAN с битрейтом 500k.

Вы можете загрузить этот код в свою цель, скопировав и вставив его с помощью редактора nano, который мы установили в наш образ контейнера, как показано в его Dockerfile. Другой способ – привязать этот контейнер к /home/torizon, чтобы упростить отправку кода через scp.

Имея приложение под рукой, давайте попробуем его.

Тестирование нашего примера приложения с помощью симулятора OBD-II

У нас есть два способа проверить приложение CAN OBD-II:

  1. Подключаем наше устройство к разъему OBD-II на транспортном средстве и начинаем общаться с реальным транспортным средством.
  2. Использование другого устройства в качестве «ЭБУ» и ответа на запросы OBD-II по CAN.

Вариант 2 жизнеспособен, в противном случае потребовалось бы хорошее расширение мощности, чтобы мы могли попробовать его в машине автора этого обзора.

Сохраняя тему «Python», существует также проект Python виртуального ЭБУ для ответа на запросы OBD-II, называемый OBDSimulator. Мы использовали его на Colibri iMX6 с платой-носителем Viola, поэтому он будет вести себя как ЭБУ, отвечающий на наш Verdin iMX8MM по сети CAN между ними.

Использование несущей платы Viola было более сложной задачей при сборке установки с внешним трансивером CAN. Более простой способ – использовать оценочную плату Colibri для семейства Colibri или даже плату Ixora Carrier для семейства Apalis, поскольку эти несущие платы уже поставляются со встроенными трансиверами CAN, что делает их идеальными в качестве реализации эталонного дизайна. .

Схема, использованная для этого теста, показана на Рисунке 12. Для несущей платы Viola мы использовали приемопередатчик CAN SN65HVD230, так как iMX6 уже имеет контроллеры CAN. Он также использует резисторы 120 Ом на каждом конце «простой» сети CAN между ними.

Рис. 12. Verdin iMX8MM на плате разработки Verdin, подключенной через CAN к Colibri iMX6 на плате-носителе Viola.

С сервером OBDSimulator, работающим на Colibri iMX6 (как подробно описано в репозитории GitHub), мы выполнили следующие запросы на Verdin iMX8MM:

  • Запросите текущие данные (режим 1) скорости двигателя (также известные как RPM, PID 0x0C):

Мы используем CAN в 11-битном формате, и после заданного запроса OBD-II ответ будет в следующем формате:

  • Байт 0 – количество дополнительных байтов
  • Байт 1 – 41h = отображение текущих данных
  • Байт 2 – PID-код
  • Байт 3 и выше – содержимое ответа на запрос.

В таблице OBD-II PID в Википедии информация о частоте вращения двигателя получается из содержимого запроса по следующей формуле:

Переменная A является третьим байтом в ответе, а переменная B – четвертым байтом (см. Ответ «Hex:» нашей команды выше). В OBDSimulator частота вращения двигателя составляет 514 об/мин. Давайте проверим, правда ли это?

((256 * 8) + 8)/4 = 514

Это также показывает еще один ценный ресурс: обратите внимание на подробное описание каждого PID OBD-II, чтобы декодировать запрошенную информацию!

Мы можем изменить код, чтобы запросить другие PID OBD-II. Измените значение obd_req_data, чтобы теперь он запрашивал PID 0x0D (скорость автомобиля в км/ч) с текущими данными (режим 1):

Выполнение кода теперь даст нам вывод для запроса OBD-II PID 0x0D:

Если после повторного выполнения кода вы получаете сообщение «RTNETLINK отвечает: устройство или ресурс занят», это означает, что сетевой интерфейс уже настроен и работает.

В таблице OBD-II PID в Википедии информация о скорости транспортного средства получается как прямой результат третьего байта ответа, который является ответом на наш запрос. В OBDSimulator установлена скорость автомобиля 26 км / ч. Давайте проверим, правда ли это?

1A в шестнадцатеричном формате – 26 в десятичном. Так что, это!

Упрощение с помощью расширения Torizon с кодом Visual Studio

Некоторые из вас могут быть не слишком знакомы с Docker и контейнерами. Это не проблема для работы с Torizon, знаете почему? Toradex также предоставляет вам расширение Torizon, доступное как для Visual Studio, так и для Visual Studio Code. С помощью расширения Torizon вы сможете быстро разрабатывать и загружать приложения в модуль с TorizonCore.

Рисунок 13. Расширение поддержки Toradex Torizon в Visual Studio Code

У использования нашего расширения Torizon для Visual Studio Code много преимуществ, не говоря уже о поддержке разработки приложений на следующих языках программирования:

  • C/C++
  • Python
  • .NET Core

Расширение Torizon позволяет развертывать и отлаживать ваше приложение в целевом объекте по сети всего за несколько щелчков мышью, имея также возможность управлять и отслеживать ваши устройства и контейнерные приложения с ними.

В этом конкретном примере мы покажем вам, как вы можете легко настроить приложение Python с помощью расширения Torizon для кода Visual Studio и запустить его на Verdin iMX8MM с установленным TorizonCore 5.

Давайте выполним следующие простые шаги для настройки:

  1. Загрузите и установите Visual Studio Code и Torizon Extension в соответствии с инструкциями.
  2. Имейте в виду, что вы должны настроить среду сборки для контейнеров Torizon, как мы объяснили выше.
  3. Создайте новый проект Torizon / Python в коде Visual Studio

После выполнения этой первоначальной настройки ваша среда готова для разработки приложения Python для Torizon. Следующие шаги обычно включают определение необходимых параметров, дополнительных пакетов и самого кода.

Вы можете видеть, что в коде Visual Studio в левой части экрана есть панель, содержащая значки каждого ресурса редактора. Одна из них – иконка Torizon. Щелкните по нему и настройте следующие параметры, наблюдая, что в каждом элементе появится значок типа «+» или символ карандаша справа, который вы должны щелкнуть, чтобы добавить или отредактировать этот конкретный элемент:

  • username: root
  • volumes: /dev and /dev
  • extraparams:
    • cap_add with value CAP_NET_ADMIN
    • network_mode with value host
  • extrapackages: iproute2 can-utils python3-can

См. Обзор этой части на рисунке 14.

Рисунок 14. Описание интересующих полей и параметров в меню расширения Torizon в Visual Studio Code

По сути, это те изменения, которые мы внесли в Dockerfile вместе с командами «docker run», которые мы выполнили вручную выше. Но теперь Torizon Extension позаботится о всех формальностях за нас.

Теперь перейдите в меню «Проводник» в коде Visual Studio, затем откройте файл «main.py» вашего проекта. Скопируйте и вставьте тот же код, который мы использовали в примере командной строки выше.

Чтобы загрузить этот код на свою плату, где расширение Torizon уже запросило свои учетные данные (например, имя хоста / IP, пользователь и пароль), вы можете просто нажать F5 на клавиатуре. Затем утилита начнет создавать образ контейнера, загрузит его в устройство и начнет выполнение в режиме отладки, процесс, который вы можете наблюдать в разделе «Вывод» кода Visual Studio.

С помощью расширения Torizon и кода Visual Studio вы также можете добавлять точки останова в свое приложение для отслеживания частей процесса выполнения программы. На рис. 15 показан пример выполнения приведенной выше программы с точками останова.

Рисунок 15. Выполнение приложения Python на целевом устройстве с помощью кода Visual Studio и расширения Torizon.

Размышления

Как упоминалось в начале обзора, вы можете использовать OBD-II для запроса данных об автомобиле, но избегайте спама на шине CAN, используйте минимально необходимое количество/период запросов, чтобы не повлиять на работу основного ЭБУ. Учитывая, что шина CAN работает с приоритетом сообщений CAN через идентификатор CAN, и чем ниже идентификатор CAN, тем выше приоритет, приоритет наших запросов OBD-II, вероятно, будет низким.

Вы можете улучшить оба примера приложения для запроса данных OBD-II, чтобы оно уже могло получать и декодировать интересующую информацию. А знание того, что есть возможность использовать OBDSimulator, может еще больше облегчить ваши тесты.

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

Существует также еще одна хорошая библиотека (с примерами) для связи CAN с Python3, это pyvit: Python Vehicle Interface Toolkit. Его пример для OBD-II использует диспетчер для обработки передачи и приема CAN-кадров.

Дальнейшие улучшения нашего телематического устройства могут заключаться в взаимодействии модуля GNSS с Verdin iMX8MM через UART или / и добавлении модема через Modem Manager.

Надеемся, вам понравился этот урок! Ждем ваше мнение.

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

0 0 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments