После замены штатной аудио системы на двухдиновое радио фирмы Тыква с Android в Volvo XC90, прошло полтора года. Красивые ничего не делающие кнопки на руле не то чтобы мешали спать, но зудели - сделай нас. И парктроники, несмотря на замену их камерой заднего вида, своим молчанием напоминали - мы есть.
Радио для работы хочет резистивные кнопки руля.
Volvo XC90 имеет две CAN шины быструю и медленную (low и high speed).
Двигатель, коробка, заслонка работают быстро по быстрой. Климат, сидения, двери, парктроники, кнопки на руле и др. по медленной.
И никаких проводов от кнопок. Так же на радио можно подать сигнал заднего хода, для выключения звука во время движения задом, и сигнал включения подсветки, если в салоне темно.
Плюс нашлось странное поведение сигнала ключа зажигания. Если включить зажигание, то 12 вольт появляется, и радио включается. Заглушил машину - радио выключается. Но если завестись, и через 2-3 минуты или меньше заглушить, сигнал остаётся активен от минуты до 5 минут. Было не очень удобно что уходишь, а радио работает, да, оно потом выключается, но хотелось чтоб сразу.
Для анализа данных на шине были заказаны и собраны два адпатера к Arduino.
Разницы оказалось нет. Можно использовать любой.
Удобное место для подключения находится в багажнике
Вот этот провод, нужны белый и зеленый
Большинство программ для анализа на компьютере работают по протоколу Lawicel CAN232/CANUSB.
Соответственно нужна прошивка для Arduino, которая конвертирует CAN сообщения в этот протокол.
Я брал
arduino-canbus-monitor. Для одного адаптера правда нужно было поменять частоту кварца в прошивка с 16 на 8 МГц.
Аппаратное обеспечение готово, что с программным? Как обычно все грустно.
Пересмотрел несколько программ для логирования.
Почти все просто лупят сообщения в лог файл. Максимум можно отфильтровать по идентификатору источника. Т.е. все они задуманы для систем, где либо мало сообщений. Либо известны критерии фильтрации по идентификатору отправителя.
А у меня Вольво, ничего не известно, около тысячи сообщений в секунду.
В интернете пишут в файл, потом скриптами обрабатывают. В общем прошлое тысячелетие.
Наиболее известная
CanHacker и её клоны.
И как тут искать? Никаких масок по данным.
Логи выглядят примерно так:
T0240162A8E0100040070019004337
T0240162A80030004007001900435A
T0240162A84030004007009900437D
T02A074288C1000000000000004380
T012177FC8C10C4800101008004385
Пока я нажимаю и отпускаю кнопку на руле, у меня уже пару тыщ сообщений.
Нашел несколько похожих проектов. Читал шведские Volvo форумы. Искал сообщения от указанных модулей в логе - НИЧЕГО. Еще и у всех разные цифры. Но данные все таки есть.
У обычных машин адреса строго определены - допустим 0x45FE модуль управления сидением пассажира. Он 0x45FE у всех машин этой модели, и другие модули знают о 0x45FE, все же просто. Инженеры же Volvo как обычно оказались.. скажем так - неправильной ориентации, и вот что удумали. В заботе о клиенте они придумали такое - каждый модуль в сети имеет свой адрес и он разный для всех машин. Соответственно модули разных машин одной модели, просто так не переставишь. Оправдывают это они тем, чтобы модули не воровали.
Но! Можно прописать адрес модуля в другие модули машины, чтобы они "увидели" новый модуль.
Это делается только через их онлайн систему за неразумные деньги. Или делают умельцы без их системы для ворованных модулей.
Т.е. чтобы поменять модуль надо во ВСЕ! (те которым надо взаимодействовать) модули системы записать новый адрес.
Ок! Буду искать не знаю что, непонятно где :)
Для этого я написал свою программу логер.
Доступна на
Github.
Итак в сообщении есть адрес отправителя, я собрал их в левом списке. Рядом количество сообщений от модуля всего и количество уникальных сообщений. Модулю для удобства можно дать имя.
Кликнув на модуль можно посмотреть уникальные события от этого модуля, они по 8 байт.
Новые сообщения появляются снизу.
Теперь стало ясно, все модули машины тупо посылают своё состояние в сеть.
В большинстве сообщений меняются только старшие биты первого байта - похоже циклический код.
Добавил маску по байтам - одну глобальную, и одну для каждого модуля.
Поставил 3F в первом байте, проигнорировав первых 5 бит.
О! стало значительно меньше уникальных сообщений.
Для удобства сделал сброс количества сообщений, и глобально и по модулям.
Теперь стало понятно, ждем пока система успокоится - перестанут расти количества уникальных сообщений. Далее нажимаю кнопку на руле. О! несколько модулей выдали новое сообщение.
Сбрасываю список соотношений в подозрительный модулях, и повторяю нажатие кнопки.
Только один модуль явно посылает одно новое сообщение одновременно с кнопкой. Есть ещё модули которые лупят сообщения, но явно не одновременно с кнопкой.
Для сравнения двух сообщения сделал окно побитного сравнения
Вот и кнопки:
Адрес swm 00404066
nav enter
........ ........ ........ ........:........ ........ ..1..... ........
nav back
........ ........ ........ ........:........ ........ ...1.... ........
nav up
........ ........ ........ ........:........ ........ ....1... ........
nav down
........ ........ ........ ........:........ ........ .....1.. ........
nav left
........ ........ ........ ........:........ ........ .......1 ........
nav right
........ ........ ........ ........:........ ........ ......1. ........
Так потихоньку собрал, то что мне нужно:
Состояние кнопок на руле, дистанцию парктроников, уровень освещенности, позицию ключа зажигания, позицию коробки передач P,R,N,D, кнопка включения/отключения парктроников.
Заодно и другая инфа попадалась.
На основе собранной информации за долгие новогодние выходные родился Volvo Can Adapter.
Адаптер выложен на Github. Arduino, CAN адаптер, цифровой резистор для эмуляции нажатий кнопок.
Пригодился модуль телефона из машины, он стал донором зеленого разъема, как раз на него в машине приходит CAN low-speed шина
Поскольку на него шли еще несколько проводов от SIM карты ICM модуля я их обрезал (уж точно SIM карта никому в машине не понадобится), и через них подключил модуль к питанию. А так пока ни один провод машины не поврежден, и можно все модули вернуть назад.
Итак:
Модуль отслеживает положение ключа зажигания, и через реле дает питание на радио.
Модуль отслеживает положения переключателя передач, и выдает сигнал заднего хода на радио, радио выключает звук (как было в штатной системе).
Одновременно пищит через центральный динамик около монитора навигации, с разными интервалами в зависимости от расстояния (штатная система использовала динамик в правой задней двери, что было как-то странно). Кнопкой парктроника в блоке климата можно отключить звук и включить обратно.
При падении освещенности ниже определенного уровня (взял пасмурный день) модуль выдает сигнал на радио, и радио включает подсветку.
Модуль отслеживает 12 кнопок управления на руле, и эмулирует резистивные кнопки для радио. В радио можно запрограммировать их на любое поведение.
Настроил регулировать громкость, переключать треки, принимать, отклонять звонки, Back, Home в Androide, запуск Waze, включение видео с регистратора, переключение на радио.
Есть еще длинное нажатие кнопки, я было настроил по долгому нажатию Volume down - выключить звук. Но китайцы подвели, радио не запоминают эту настройку после выключения.
Заодно поменял прикуриватель на USB зарядку.