December 30, 2019

You CAN. Превращаем телефон в панель приборов автомобиля

Источник: t.me/USBKiller

Содержание статьи

На смену классическим автомобильным приборам приходят цифровые панели. Наверное, самая популярная машина с такой панелью — это Tesla с ее внушительным сенсорным дисплеем. На нем можно следить за маршрутом, управлять музыкой и видеть диагностическую информацию. А знаешь ли ты, что в бюджетных авто используются те же электронные блоки? Информацию с них можно считать и показать. Давай попробуем это сделать.

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

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

Чем дороже машина, тем больше полезной информации отображается на штатном бортовом компьютере.


Изучение возможностей

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

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

Чтобы получить информацию о работе систем автомобиля, нужно подключиться к CAN. Есть несколько способов подключения.

  1. Подключиться непосредственно к проводам внутри машины. Этот способ требует частичной разборки авто.
  2. Подключиться в диагностический разъем OBD2.

В автомобилях группы VAG (Volkswagen, Audi, Škoda, Seat) разъем OBD2 подключен к шине CAN через шлюз: прямого доступа к ней нет. Это означает, что если попытаться послушать команды в разъеме OBD2, то ничего не получится. Шлюз не пропускает команды из основной сети в диагностический разъем. Но есть официальный диагностический комплекс VCDS, который позволяет через OBD2 видеть все датчики, читать ошибки и настраивать оборудование.

Работает он просто: VCDS для каждого датчика запрашивает у шлюза информацию о его состоянии; когда шлюз получает ее, он передает информацию в OBD2.

Итак, если подслушать, что запрашивает VCDS, можно будет получить список команд для опроса датчиков.

Сниффер шины CAN

На основе Arduino Uno и модуля TJA1050 Niren с CAN-контроллером MCP2515 я собрал сниффер, который подключается в любое место в шине CAN и слушает пролетающий трафик. При этом сниффер никак не мешает работе систем. Чтобы подслушать, что отправляет VCDS, нужно подпаяться в сам диагностический кабель к пинам CAN-High и CAN-Low.

После подключения кабеля в разъем OBD2 можно наблюдать весь трафик между шлюзом и VCDS с помощью программы CANHackerV2. Для Arduino есть специальный скетч, он принимает данные по CAN и отправляет через преобразователь UART → USB в формате, который понимает CANHackerV2. Скетч находится в открытом доступе и лежит на GitHub.

Прослушав отправленные VCDS команды, я сформировал список команд, которые можно запрашивать у машины.

Двери:

  • 714 03 22 22 0D 55 55 55 55 — запрос;
  • 77E 05 62 22 0D 55 65 AA AA — все двери закрыты;
  • 77E 05 62 22 0D 00 65 AA AA — все двери открыты.

Уровень топлива:

  • 714 03 22 22 06 55 55 55 55 — запрос;
  • 77E 04 62 22 06 2C AA AA AA — 44 литра;
  • 77E 04 62 22 06 16 AA AA AA — 22 литра.

Температура масла:

  • 714 03 22 20 2F 55 55 55 55 — запрос;
  • 77E 04 62 20 2F 36 AA AA AA — –4 °С;
  • 77E 04 62 20 2F 67 AA AA AA — 45 °С.

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

Диагностический сканер ELM327

С 1996 года все автомобили должны поддерживать спецификацию OBD2, которая предусматривает 16-пиновый разъем. Разъем OBD2 обязан быть в районе рулевого колеса или где-то неподалеку. В спецификацию также входит стандартный набор команд, который должны поддерживать все автомобили.

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

Программ для работы с базовыми функциями ELM327 хватает. Но только разработчики знают, что потенциал ELM327 гораздо больше. ELM327 поддерживает работу с двенадцатью различными протоколами, в том числе и ISO 15765-4 CAN. Это означает, что диагностический сканер может получить доступ к шине CAN и общаться с ней.

Чтобы ELM327 мог отправлять запросы и получать данные через шину CAN, нужно его настроить. Для этого подключаемся к UART-консоли сканера по Wi-Fi, Bluetooth или с помощью провода и отправляем набор команд AT согласно документации на ELM327.

  • atz — сброс всех настроек;
  • at e0 — отключаем эхо;
  • at sh 714 — ID, к которому будем отправлять запрос;
  • at cra 77e — ID, с которого будем получать ответ;
  • at fc sh 714 — включить Flow control для ID 714;
  • at fc sd 30 00 00 — задать данные для Flow control;
  • at fc sm 1 — режим Flow Control, когда юзер задает ID и данные;
  • at al — разрешить длинные сообщения, больше 7 байт;
  • at sp 6 — протокол общения ISO 15764-4 CAN (11 бит ID, 500 кБод);
  • at ca f0 — отключить автоматическое форматирование CAN;
  • at l0 — отключаем перенос.

После настройки ELM327 сделаем тестовый запрос. Запрашиваем температуру масла (03 22 22 0D 55 55 55 55) и получаем ответ: 05 62 22 0D 55 65 AA AA.

Сообщения в шине CAN передаются со скоростью 500 кБод, это очень быстро. ELM327 работает намного медленнее, среднее время на запрос-ответ — 50 мс, за одну секунду можно сделать всего двадцать запросов. Это нужно учитывать при разработке приложения, которое будет опрашивать датчики и выводить информацию на экран.

Разработка приложения под iPhone

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

Я решил разработать приложение для телефона или планшета, которое сможет выполнять функции приборной панели автомобиля.

Разработка приложения будет вестись под iOS, но для Android алгоритмы работы с ELM327 те же. Для разработки приложений под iOS требуется Xсode. Сейчас на выбор у разработчика есть два официально поддерживаемых языка программирования: Objective-C и Swift. Последний новее, проще и лучше защищен от ошибок.

В первой версии приложения главное — создать стабильную основу для коммуникации с Wi-Fi ELM327 сканером, чтобы затем было легче расширять набор функций приложения.

Фреймворк CocoaAsyncSocket прост в использовании и стабилен, он работает напрямую с сокетами по протоколу TCP и UDP. С его помощью можно начать соединение, отправлять и получать данные, закрывать соединение.

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

Разместив виджеты датчиков на Storyboard, нужно соединить их с кодом. В Xсode это делается с помощью соединительных линий. После этой операции при обновлении датчика его значение будет записано в переменную и отобразится на виджете.

Основа для приложения готова. Сейчас приложение показывает открытые двери и основные данные параметров автомобиля.

Подрулевой переключатель TRIP при долгом удержании меняет стиль отображения приборов.

Я протестировал приложение на нескольких автомобилях:

  • Škoda Octavia A5 2011 Ambiente;
  • Škoda Octavia A5 2012 L&K;
  • Škoda Yeti 2011 Ambiente;
  • Škoda Octavia A7 2014 Elegance.

На последнем отображается только часть параметров. Приложение должно работать и с другими моделями группы VAG (Volkswagen, Audi, Škoda, Seat).

Итог

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

ПОДПИСАТЬСЯ - USBKiller