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

Чем круче машина, тем больше полезной информации отображается на штатном бортовом компьютере.
Изучение возможностей
В современных машинах используется шина СAN для связи датчиков, кнопок, исполнительных устройств и блоков управления. Каждый датчик, который передает информацию, в каждом сообщении указывает свой ID. Все другие устройства на шине видят эти сообщения и сами решают, реагировать на них или нет.
РЕКОМЕНДУЕМ:
Как снять дамп прошивки и получить доступ к консоли управления гаджета
Например, датчик температуры охлаждающей жидкости передает информацию, блок управления двигателем учитывает ее в своей работе, а панель приборов отображает температуру двигателя.

Чтобы получить информацию о работе систем автомобиля, нужно подключиться к CAN. Есть несколько способов подключения.
- Подключиться непосредственно к проводам внутри машины. Этот способ требует частичной разборки авто.
- Подключиться в диагностический разъем 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).
РЕКОМЕНДУЕМ:
3D-сканер из смартфона или фотокамеры
Итог
Сначала проект задумывался как исследовательский. Было интересно узнать, как работают электронные системы автомобиля и как можно улучшить их работу. Полученные знания позволили разработать простое мобильное приложение, которое может попробовать каждый.