You CAN. Превращаем телефон в панель приборов автомобиля
Источник: t.me/USBKiller
Содержание статьи
- Изучение возможностей
- Сниффер шины CAN
- Диагностический сканер ELM327
- Разработка приложения под iPhone
- Итог
На смену классическим автомобильным приборам приходят цифровые панели. Наверное, самая популярная машина с такой панелью — это Tesla с ее внушительным сенсорным дисплеем. На нем можно следить за маршрутом, управлять музыкой и видеть диагностическую информацию. А знаешь ли ты, что в бюджетных авто используются те же электронные блоки? Информацию с них можно считать и показать. Давай попробуем это сделать.
Раньше на панель приборов выводилась только основная информация: обороты, скорость, температура. Сейчас можно вывести любые данные, какие пожелаешь: видео с камеры под бампером, дорожные знаки, график расхода топлива.
Автомобиль — это большая компьютерная сеть, в которой множество датчиков и исполнительных механизмов. Но информацию об их работе можно посмотреть только с помощью специального диагностического оборудования.
Чем дороже машина, тем больше полезной информации отображается на штатном бортовом компьютере.
Изучение возможностей
В современных автомобилях используется шина С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).
Итог
Сначала проект задумывался как исследовательский. Было интересно узнать, как работают электронные системы автомобиля и как можно улучшить их работу. Полученные знания позволили разработать простое мобильное приложение, которое может попробовать каждый.