После замены штатной аудио системы на 2-din радио фирмы Тыква(Pumpkin) с Android в Volvo XC90, прошло полтора года. Красивые ничего не делающие кнопки на руле не то чтобы мешали спать, но зудели — сделай нас. И парктроники, несмотря на замену их камерой заднего вида, своим молчанием напоминали — мы есть.

Итак радио для работы хочет резистивные кнопки руля. А Volvo XC90 имеет две CAN шины быструю и медленную (low и high speed).
Двигатель, коробка, заслонка работают быстро по быстрой. Климат, сидения, двери, парктроники, кнопки на руле и др. по медленной.
И никаких проводов от кнопок. Так же на радио можно подать сигнал заднего хода, для выключения звука во время движения задом, и сигнал включения подсветки, если в салоне темно.
Плюс нашлось странное поведение сигнала ключа зажигания. Если включить зажигание, то 12 вольт появляется, и радио включается. Заглушил машину — радио выключается. Но если завестись, и через 2-3 минуты или меньше, заглушить, сигнал остаётся активен от минуты до 5 минут. Было не очень удобно что уходишь, а радио работает, да, оно потом выключается, но хотелось чтоб сразу.
Для анализа данных на шине были заказаны и собраны два адпатера к Arduino.


Разницы оказалось нет. Можно использовать любой.
Удобное место для подключения находится в багажнике

Вот этот провод, нужны белый и зеленый

Большинство программ для анализа на компьютере работают по протоколу Lawicel CAN232/CANUSB.
Соответственно нужна прошивка/скетч для Arduino, которая конвертирует CAN сообщения в этот протокол.
Я брал arduino-canbus-monitor. Для одного адаптера правда нужно было поменять частоту кварца в прошивка с 16 на 8 МГц.
Аппаратное обеспечение готово, что с программным? Оказалось все грустно.
Пересмотрел несколько программ для логгирования CAN.
Почти все просто лупят сообщения в лог файл. Максимум можно отфильтровать по идентификатору источника. Т.е. все они задуманы для систем, где либо мало сообщений. Либо известны критерии фильтрации по идентификатору отправителя.
А у меня Вольво, ничего не известно, около тысячи сообщений в секунду.
В интернете пишут в файл, потом скриптами обрабатывают. В общем прошлое тысячелетие.
Наиболее известная CanHacker и её клоны.

И как тут искать? Никаких масок по данным.
Логи выглядят примерно так:
T0240162A8E0100040070019004337
T0240162A80030004007001900435A
T0240162A84030004007009900437D
T02A074288C1000000000000004380
T012177FC8C10C4800101008004385
Пока я нажимаю и отпускаю кнопку на руле, у меня уже пару тыщ сообщений.
Нашел несколько похожих проектов. Читал шведские Volvo форумы. Искал сообщения от указанных модулей в логе — НИЧЕГО. Еще и у всех разные цифры. Но данные все таки есть.
У обычных машин адреса строго определены — допустим 0x45FE модуль управления сидением пассажира. Он 0x45FE у всех машин этой модели, и другие модули знают о 0x45FE, все же просто. Инженеры же Volvo как обычно оказались. скажем так — неправильной ориентации, и вот что удумали. В заботе о клиенте они придумали такое — каждый модуль в сети имеет свой адрес и он разный для всех машин. Соответственно модули разных машин одной модели, просто так не переставишь. Оправдывают это они тем, чтобы модули не воровали.
Но! Можно прописать адрес модуля в другие модули машины, чтобы они "увидели" новый модуль.
Это делается только через их онлайн систему за неразумные деньги. Или делают умельцы без их системы для ворованных модулей.
Т.е. чтобы поменять модуль надо во ВСЕ! (те которым надо взаимодействовать) модули системы записать новый адрес.
Ок! Буду искать не знаю что, непонятно где :)
Для этого я написал свою программу для анализа сообщений.
Доступна на Github — CANLogger.

Итак в сообщении есть адрес отправителя, я собрал их в левом списке. Рядом количество сообщений от модуля всего и количество уникальных сообщений. Модулю для удобства можно дать имя.
Кликнув на модуль можно посмотреть уникальные события от этого модуля, они по 8 байт.
Новые сообщения появляются снизу.
Теперь стало ясно, все модули машины тупо посылают своё состояние в сеть.
В большинстве сообщений меняются только старшие биты первого байта — похоже циклический код.
Добавил возможность маскировать биты по байтам — одну глобальную, и одну для каждого модуля.
Поставил 3F в первом байте, проигнорировав первых 6 бит.
О! Стало значительно меньше уникальных сообщений.
Для удобства сделал сброс сообщений и количества сообщений, и глобально и по модулям.
Теперь стало понятнее, ждем пока система успокоится — перестанут расти количества уникальных сообщений. Далее нажимаю кнопку на руле. О! несколько модулей выдали новое сообщение.
Сбрасываю список сообщений подозрительный модулях, и повторяю нажатие кнопки.
Только один модуль явно посылает одно новое сообщение одновременно с кнопкой. Есть ещё модули которые лупят сообщения, но явно не одновременно с кнопкой.
Для сравнения двух сообщения сделал окно побитного сравнения

Вот и кнопки:
Адрес SWM 00404066
nav enter
… … … …:… … .1… …
nav back
… … … …:… … …1… …
nav up
… … … …:… … …1… …
nav down
… … … …:… … …1. …
nav left
… … … …:… … …1 …
nav right
… … … …:… … …1. …
Так потихоньку собрал, то что мне нужно:
Состояние кнопок на руле, дистанцию парктроников, уровень освещенности, позицию ключа зажигания, позицию коробки передач P, R, N, D, кнопка включения/отключения парктроников.
Заодно и другая инфа попадалась — сложил в VolvoModules в проекте.
На основе собранной информации за долгие новогодние выходные родился Volvo Can Adapter.
Адаптер выложил на Github — VolvoCan.
Arduino, CAN адаптер, цифровой резистор для эмуляции нажатий кнопок.

Пригодился модуль телефона из машины, он стал донором зеленого разъема, как раз на него в машине приходит CAN low-speed шина


Поскольку на него шли еще несколько проводов от SIM карты ICM модуля я их обрезал (уж точно SIM карта никому в машине не понадобится), и через них подключил модуль к питанию. А так пока ни один провод машины не поврежден, и можно все модули вернуть назад.
Итак:
Модуль отслеживает положение ключа зажигания, и через реле дает питание на радио.
Модуль отслеживает положения переключателя передач, и выдает сигнал заднего хода на радио, радио выключает звук (как было в штатной системе).
Одновременно пищит через центральный динамик около монитора навигации, с разными интервалами в зависимости от расстояния (штатная система использовала динамик в правой задней двери, что было как-то странно). Кнопкой парктроника в блоке климата можно отключить звук и включить обратно.
При падении освещенности ниже определенного уровня (взял пасмурный день) модуль выдает сигнал на радио, и радио включает подсветку.
Модуль отслеживает 12 кнопок управления на руле, и эмулирует резистивные кнопки для радио. В радио можно запрограммировать их на любое поведение.
Настроил регулировать громкость, переключать треки, принимать, отклонять звонки, Back, Home в Androide, запуск Waze, включение видео с регистратора, переключение на радио.
Есть еще длинное нажатие кнопки, я было настроил по долгому нажатию Volume down — выключить звук. Но китайцы подвели, радио не запоминают эту настройку после выключения (если настраивать кнопки за раз, то запоминает — инфа с 4pda).






Комментарии 55
Спасибо большое! Статья огонь 🔥
кем учился?!
Олег, добрый день. С быстрым Каном эксперименты не ставили? Есть необходимость подменить модуль дросселя (magnetti) на ардуинку. Соответственно понять какие сообщения адресованы к нему и какие ответы он выдает на принятые сообщения. Вижу это так:
1) сниффером записываем лог
2) покадрово воспроизводим на снятом дросселе на столе
3) смотрим на какие фреймы дроссель отвечает и какая у него реакция физически.
4) имитируем перегрузки эл.мотора, ошибки датчиков положения и смотрим какие он при этом фреймы выдает.
5) посылаем эти фреймы (ошибок) в кан на машине заведенной, смотрим, появляются ли ошибки в виде.
Возник вопрос по времени отправки сообщений от дросселя в шину. Получаем сообщение допустим "установить заслонку в 15°", так вот ответ на это сообщение я пока не понимаю тактирован стандартным интервалом после запроса или сразу как выполнено позиционирование? Если скажем блок дросселя отправляет свой статус раз в 20мс, то как понять в какой момент отправлять сообщения? Ждать какого-то сообщения в шине или тупо на все забив раз в 20мс отправлять?
На дуинке будет только макет, готовое устройство естественно буду делать на заказной плате с завода.
Топ!
Дополню идентификаторами SWM разных годов:
99-00: 0x00100066
00-01: 0x00200066
02: 0x00400066
03-04: 0x00404066
05+: 0x0131726c — мной не проверено, если у кого есть информация — дайте знать правильный идентификатор или нет
У меня 00404066 — 03 год, но я не уверен что есть система в идетификаторах по годам, думаю как выходит новая версия модуля они меняют идентификатор, вполне допустим в октябре могут начать ставить новый модуль, а в марте при ремонте могут снова со склада установить старый. Вида для общения с модулями использует другие номера. А при замене модуля — все номера отпрвляются на их сервер, и оттуда приходит новая прошивка для всех модулей, где уже прошит номер замененного модуля
есть по годам (точнее по конструкционным неделям) система.
при замене модуля именно он прошивается под конкретную машину, а не все модули машины под заменяемый
github.com/olegel/VolvoCa…e/master/doc/VolvoModules
Тут сохранил номера разных модулей от моей ХС90-2003
ssssmileeee
Топ!
Дополню идентификаторами SWM разных годов:
99-00: 0x00100066
00-01: 0x00200066
02: 0x00400066
03-04: 0x00404066
05+: 0x0131726c — мной не проверено, если у кого есть информация — дайте знать правильный идентификатор или нет
Это не только на 90к, я правильно понимаю?
вся платформа P2
ssssmileeee
Топ!
Дополню идентификаторами SWM разных годов:
99-00: 0x00100066
00-01: 0x00200066
02: 0x00400066
03-04: 0x00404066
05+: 0x0131726c — мной не проверено, если у кого есть информация — дайте знать правильный идентификатор или нет
05+: 0x0131726c -> очень похоже на правду.
Огромное спасибо за софтину. Будем покурить её с C30…
У меня есть приборная панель дома, я её подключил. При подключении она выдаёт 2 пакета, (что-то просит) и через 5 секунд отключается. А я в это время учусь пользоватся Вашей программой
Здравствуйте. Прочитал Ваш рассказ. Я примерно тем же занимаюсь сейчас. У менятакая проблемма, есть ардуино nano и mcp2515 и canhacker. При подключении к volvo xc90 читает 5—10 пакетов и замолкает. Перезагружаешь canhacker и опять тоже самое. у Вас небыло такой проблеммы?
Я мало использовал canhacker. В основном своей программой. Такого не было. Можно глянуть правильно ли выставлена кан скорость и частота кварца в прошивке для ардуино. canhacker надо запускать в режиме только чтение. А что моя программа говорит?
А сигнализация по какой шине работает?
Добрый день. Вот интересно, доводчк стёкол возможно сделать на arduino? (при установки на сигнализацию окна закрывались)
да, можно, тут на drive2 кто-то уже сделал, единственно что мне не нравится, узнать открыто ли окно или нет — нельзя, приходится тупо подавать команду включить двигатель на некоторое время, с виду оно жмет окно пока не послана команда отключить
Вот например www.drive2.ru/l/457211845397185931/
Спасибо
Добрый день. Есть XC70 MY13, Музыка Base Performance, то есть просто магнитола, которая не может ничего) Апгрейд ее стоит дорого. Решил пойти по пути создания нечто подобного CAR PC на Андройд. Пока на этапе формирования своих "хотелок" нахожусь.
Уже есть понимание, что для упрощения своей жизни на первом этапе это просто планшет в роли MP3 плеера + отдельной навигации, но одна хотелка присутствует: планшет должен "понимать" нажатие как минимум 2х кнопок на руле: ">>" и "<<", так как во время работы AUX режима эти кнопки не задействованы. То есть не могут влиять на воспризводимую музыку. Связь планшета с авто по сути только по аудиокабелю.
Теперь вопрос: Можно ли с помощьюкаких-то готовых решений получить с кнопок аналогичный просотому "резистивному" сигнал? Или пляски с бубном и чтение CAN неизбежны?
Спасибо, и прошу прощения за отсутствие опыта в этой теме и собсвенно возможную путаницу в терминах.
PS: ваш проект — просто БОМБА. Уважение и респект!
Тебе необходимо ковырять шину LIN. т.к. кнопки на руле работают по этой шине.
Что это за разъем к которому подключаетесь где находятся не могу найти такой в багажнике
В хс90 справа, в полу, в углу есть треугольная заглушка, под ней правее аккумулятора, у меня он на дне лежал, он для подключения блока комфорта, 4х проводный, 2 провода кан шина и +12 и земля. Но возможно не во всех комплектациях есть.
Возможно у меня его нет. У меня 5 мест
Плохо гуглили)
www.drive2.ru/l/495513058072854668/
И куча инфы есть на шведском форуме, хотя я тоже сначала сам все сделал, а потом наткнулся на этот форум)))
Ссылку в студию!
www.svxc.se/phpBB2/viewto…457f3e93ed1a95a5caac04186
Это я видел. Не особо помогло. Разве что понимание работы системы в целом.
Идентификаторы у модулей в машинах разные. Разбор данных размазан на 30 страниц, к тому же на шведском. Данные тоже варьируются по моделям и годам. Оказалось проще самому данные собрать.
Я написал прогу для анализа за неделю, потом с ней за пару часов все что надо нашел.
Если делать активный адаптер (с отправкой запросов в шину), то проще из видовской базы все запросы получить, с расшифровкой данных.
Прочитал заголовок, думаю так же сделаю)
После второго абзаца понял, что не сделаю)))
Ну вы мозг конечно!👍🏻✊🏻
Какой молодца, нет вы посмотрите на него, а! )) 💪
круто, много работы проделал!
аж захотелось поиграться ардуинкой на кан шине ауди)
Хорошая работа! Воспользуюсь ей когда придет время :)
Респект и молодец что делишься! Собираюсь себе что-то похожее замутить. Теперь будет проще. Самое ценное для меня — расшифровка сообщений can.
Для самодельщиков и писал
👍
маньяк/!
М-да, вроде про машину заметка, но так мало знакомых слов )))
У меня тоже кнопки на руле не работают, поможешь? )
Все инфу, прошивки, программы выложил. Но непросто это.
Неее, с электроникой сам не справлюсь )
Можно просто купить адаптер, это я так для развлечения делал.
А кто у нас этим занимается? Как-то на глаза не попадалось…
гугли Volvo XC90 can adapter, вполне можно найти.
вот например
2-din.ru/product/adapter_…iversalnyy_rezistivnyy-1/
Правда с оговорками: Поднять\положить трубку — не поддерживается!
Да, хочешь сделать хорошо сделай сам :) У меня все 12 кнопок поддерживаются.
Мне бы в Риге )))
www.12volt-shop.lv/1/auto_audio/WEBb.html
Что-то есть
О, благодарю. 100 евро, однако…
Тебя, случайно, не Нео зовут?
Какую таблетку надо съесть, что бы разгадать эту матрицу?)
Монстр радиодела и компов… Я решил всё покупкой адаптера кнопок, т всё работает, у каждого свой путь…
Покупной модуль не умеет парктроники озвучивать
Оставил модуль штатного парктроника и звук вывел на динамик и всё работает
Интересно, мой работал через штатную аудио систему, т.е. подключить некуда, он с CAN шины данные брал.
Там просто провод оптики нужно было переставить и все работает
вот это да
Монстр! Уважуха!
Спасибо