12 января 2019 г.

Кнопки для Тыквы или адaптер CAN шины для Volvo XC90

После замены штатной аудио системы на двухдиновое радио фирмы Тыква с 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 зарядку.









41 комментарий:

Александр комментирует...

Добрый день. Научите пользоваться :) Скачал ваш VolvoCanLogger. Какой скетч заливать в ардуино? Очень хочу разобраться со своей шиной. Авто xc70. Спасибо.

Олег комментирует...

Я брал этот https://github.com/latonita/arduino-canbus-monitor

Александр комментирует...

Спасибо. Вроде бы, на столе заработало. Позже проверю на авто.

Олег комментирует...

Скорость CAN у меня не ставится, используется та что в адаптере по умолчанию 125к. Если у тебя машина поновее может быть 500к.

Олег комментирует...

не 500, а 250.

Александр комментирует...

Вы проделали огромную работу! Спасибо! У меня получилось подключиться к моему авто. Машина 2006 года, шина там 125. Осталось разобраться в тысячах сообщений. И поубирать проблемы с шилдами. Скорее всего нужно все спаять до кучи, а не пользоваться перемычками. Очень много провозился с тем, что данные идут не постоянно. Не понятно отчего вообще зависит. То загружу повторно скетч чтения, то провода от шины переподключу. Сейчас пропаял MCP 2515. На столе работает стабильно.

Олег комментирует...

Спасибо! Удачи в исследовании. Если будут вопросы обращайтесь.
https://github.com/olegel/VolvoCan/tree/master/doc/VolvoModules
Здесь в файлах я сложил найденную информацию по модулям. Конечно идентификатор модуля может отличаться.

Александр комментирует...

Добрый вечер. Спасибо за ссылку. Я перелопатил уже все ваши ссылки :). Я поставил себе задачу, как минимум, сложить зеркала при закрытии и разложить при открытии машины. С помощью вашего инструмента читать машину получается. Но нужно еще все проанализировать. Последний раз подключил ваш логер к машине через разъем магнитолы, а в OBD присоединил DICE. С подключенным DICE шина не успокаивается. Постоянно что то летает. Дождался когда количество разных ИД остановилось и через VIDA сложил зеркало (Без VIDA никак. Зеркало можно сложить или с включенным зажиганием или через диагностику). Получил три посылки. Две с одним и тем же ИД, одну с другим ИД. Первые две были от диагностики. Без задержки. Третья, на сколько я понял была ответом от зеркала, с некоторой задержкой. Попробовал отправить в шину эти первые два пакета и ничего не получил :( . Решил на столе собрать эмулятор шины, но ваш логер почему то не видит моих расширенных пакетов. Стандартные(11 бит) принимает. А 29 бит не видит. Хотя ардуиновские сборки write/read видят друг друга. Думаю, что проблема не в логере, т.к. логер шину видит,а в шине все ИД 29 бит. Проблема со сборкой ардуино + MCP и скетчами. Думаю, что поэтому и авто не принял мои пакеты. Хотя я до этого собрал на этом же железе получение температуры масла в коробке. Но эти запросы были в высокоскоростную шину 500kbs. В общем пока в замешательстве.

Олег комментирует...

Скетч логера работает в listen only режиме. Он не подтверждает прием пакета. Т.е. для теста надо два MCP в Normal Mode, один посылает, другой читает(ну и логгер в режиме чтения), либо логер переключить в Normal mode. У меня на столе принимал 1 пакет и затыкался. Я CanHacker-ом отпрaвлял, он отсылает и если никто не ответил, затыкается. Еще в скетче логера есть глюк, я не помню точно, но в адаптере я по другому флаги MCP обрабатывал.
Поробуй читать на столе не логгером, а сделай свой скетч на основе этого:
https://github.com/olegel/VolvoCan/blob/master/VolvoCan/include/VolvoCan.h
Заодно: Vida пишет в лог то что она отпрвляла/принимала. Там удобнее смотреть.
Да посылать можно только, то что она посылает, она посылает на специальные адреса(совсем другие айдишники).
XC70 случаем при одновременноом нажатии на L R кнопок зеркала и удержании, не включает автосложение зеркал?

Олег комментирует...

Еще можно вытащить из базы данных Vida то что надо. Там Microsoft SQL Server. В принципе можно разобраться. Логин/пароль можно в хаке Vida найти.
Но сначала конечно должно отпрвляться приниматься на столе.

Александр комментирует...

XC70 случаем при одновременноом нажатии на L R кнопок зеркала и удержании, не включает автосложение зеркал? Не пробовал и нигде не читал. С CanHackerом провозился неделю. Ничего путнего с ним не получилось. На столе то читает, то не читает. В машине вообще ничего не читал. Ковырялся с логами VIDA, получилось найти складываение/раскладываение. Пакеты такие же, как и на вашем логере. Но сложить/разложить у меня не получается :(

Олег комментирует...

Я пока с отправкой не разбирался, тут помочь не могу. Но без паники :) Надо спокойно сделать два простых скеча, оба в normal mode, один посылает, другой принимает, все флаги и сообщения MCP читать и печатать в компорт, открыть два терминала от обоих модулей.
В pdf MCP есть блоксхема, она мне помогла найти ошибку при приеме. Я вспомнил, у меня прерывания переставали работать, пока флаг не сбросишь.
Надо идти по блоксхеме отправки по шагам, сверясь с флагами полученыыми от модулей.
Там возможно возникает ошибка, ставится флаг и пока не сбросишь, не отправляет.
В крайнем случае, я весной хочу добавить автозакрытие дверей при переключении на вторую скорость, заодно и разберусь. Так что можно подождать :)

Олег комментирует...

https://github.com/vtl/volvo-ddd
здесь человек, точно командами из виды, получал кучу данных, может поможет.

Александр комментирует...

В крайнем случае, я весной хочу добавить автозакрытие дверей при переключении на вторую скорость. Мне эту опцию активировали на СТО Вольво. За 20 долларов. При достижении скорости в 7 км/ч двери блокируются, а в Мегане - нажал кнопку блокировки, подождал 5 сек. и двери уже потом сами блокируются. Не нужно - опять нажал, подождал и снова не блокируются :) Так что на счет зеркал, я очень сомневаюсь. Завтра попробую.

Александр комментирует...

https://github.com/vtl/volvo-ddd
здесь человек, точно командами из виды, получал кучу данных, может поможет.
Видел и это. Все дело в том, что получать и я могу :) а вот отправить не получается. Я даже могу с ELM 327 на монитор своей магнитолы вывести всякие параметры. https://www.drive2.ru/l/520810346726818690/ Но мне нужно другое...

Олег комментирует...

Он отправляет именно видовский запрос, а модуль ему отвечает

Александр комментирует...

Детально его программу не рассматривал. Но, по моему, все его запросы это запросы в высокоскоростную шину. А с ней у меня получается. У него и машина такая же, как моя и год такой же. Но мне не нужны те все показатели. Мне достаточно раз в месяц почитать ошибки VIDA. Опять же, что у вас, что у него в плане перехвата сообщений от кнопок все схоже. Вы ловите в шине нажатие и отправляете на СТОРОННЕЕ устройство. Я на выходных попробую отловить свое нажатие кнопок и пробовать на родную магнитолу отправлять эти нажатия. А потом буду уже с зеркалами в гараже играться. Не жарко там в гараже :)

Александр комментирует...

"Поробуй читать на столе не логгером, а сделай свой скетч на основе этого:
https://github.com/olegel/VolvoCan/blob/master/VolvoCan/include/VolvoCan.h""
Я не столько хорошо разбираюсь в программировании С++, что бы самому написать скетч на основе вашего файла :(

Александр комментирует...

Не смотря на то, что с утра сборки ардуино+мср выпили мне ведро крови, день Удался! Огромное спасибо за логер! Зеркала складываются и раскладываются. Нащупал некоторые кнопки на руле. https://youtu.be/s0D3JwAf5us

Александр комментирует...

На выходных игрался с зеркалами. Написал скетч, который скрадывает и раскладывает их по сигналу из компорта. Послал "О" - раскрыл, послал "С" - сложил. Складывает/раскладывает зеркала по очереди. Сначала левое, потом правое. Работает без каких либо недостатков. Все четко. Дописал в скетч раскрыть/сложить по сигналу из каншины. И начались непредсказуемые глюки. То реагирует только одно зеркало, то оба. То все двери открываются, то только задние. По итогу подключил диагностику. А там куча ошибок(уже не действующих). Веселое дело :( Непонятно. Ведь я же ЧИТАЮ шину, а отправляю команды от имени диагностики.

Александр комментирует...

Есть просьба. Помогите(научите) пользоваться фильтрами.

Олег комментирует...

В логгере фильтров как таковых нет. Можно ставить маски. Есть маска на все сообщения. И есть на сообщения от определенного модуля. Маска просто обнуляет биты в сообщении, там где в маске указан 0.
Т.е. пусть приходит сообщение 1 и 2
1. 12 34 56 78
2. 12 34 56 79
Без маски ( FF FF FF FF ) программа посчитает их как 2 разных.
12 34 56 78 - 1 шт.
12 34 56 79 - 1 шт.
Если поставить маску FF FF FF 00, то при получении сообщения программа обнулит тот байт где 00 ( вместо 78 и 79 будет ноль)
1. 12 34 56 78 -> 00
2. 12 34 56 79 -> 00
Соответственно программа уже сохранит их как одно два раза
12 34 56 00 - 2 шт.
Удобно когда какие-то биты скачут покругу и их надо притушить.
Например, у меня в машине первые 6 бит в сообшения идут по кругу, хотя остальные не меняются, соответсвенно я ставил маску 3F FF FF FF.... чтобы их игнорировать.
Еще вариант когда трудно найти нужный бит, например кнопки на руле. Тогда я делал так:
Ставил глобальную маску, чтобы остался один байт - 00 00 ... 00 FF
Сбрасывал данные и счетчики, ждал пока успокоится. Нажимал кнопку. Если ни в одном модуле не появилось новое сообщение, переходил к следущему байту, ставил маску 00 00... FF 00. И по новой.

Александр комментирует...

Ок. Спасибо за разъяснения. Пробую :)

Олег комментирует...

Еще есть возможность включить запись в лог-файл, и потом без машины его проигрывать. Можно пошагово посмотреть, что происходило

Александр комментирует...

Да, да! Я это видел и пользуюсь. Программа просто СУПЕР! Экономит не просто массу, а огромную массу времени. Спасибо.

Unknown комментирует...

Здравствуйте, Олег! Я намереваюсь пройти ваш путь по отлавливанию кнопок на вольве, хотел воспользоваться вашей программой, но не понял как ее запустить, это проект для Визуал Студио, просто так ее не запустить? Я новичок в программировании, прошу простить за, возможно, глупые вопросы.

Олег комментирует...

Там есть скомпиленное приложение
https://github.com/olegel/CANLogger/raw/master/Release/VolvoCanLogger.exe

Headlamp Modification комментирует...

you help me out to learn more about volvo. thank you

ave комментирует...

Can you write C+ code Example for sending button change volume? because i need it for my project like when we stop the cars then mirror auto closed.

Headlamp Modification комментирует...

can you giving me example how write on C+
for sending byte with CANBUS closed mirror.

Олег комментирует...

You need to capture corresponded command (close mirror, or change volume) from communication between VIDA and the car firstly. Unfortunately the command depends from your car model.
Then you can test it trying to send the command to the car using CanHacker.
If it works, I can help to send it from Arduino.

Александр комментирует...

Добрый день. Снова взялся за ваш логер. Снова хочу побрагодарить за него. Подскажите, есть ли возможность установить фильтр в логфайле? Есть ли возможность понять с каким интервалом шлются определенные данные?
На данный момент я открываю лог файл в экселе и там его ковыряю.
T 02A0240E 8 0000000000000026
T 02A0240E 8 0000000000000022
T 02A0240E 8 0000000000000022
T 02A0240E 8 0000000000000022
T 02A0240E 8 0000000000000027
T 02A0240E 8 0000000000000023
T 01800008 8 A700416E73776572
T 01800008 8 213F202020202020
T 01800008 8 222020202B333830
T 02A0240E 8 0000000000000023
T 01800008 8 2336383938343530
T 02A0240E 8 0000000000000023
T 01800008 8 6530302020200000
T 02A0240E 8 0000000000000023
T 02A0240E 8 0000000000000023
T 02A0240E 8 0000000000000023

Unknown комментирует...

Здравствуйте, хочу , осуществить проект навигации , машина volvo xc90/2011 ,хочу заменить rti навигацию на sbc khadas vim 3 , есть дисплей 6,5, хочу подключить к рулевом управлении , думаю через mcp2515 получать данные с can шины и через arduino hid kybord управлять андроид , правда написание программы для управления всего этого нет , но думаю по чуть чуть да разберусь , как думаете будет ли это работать ?

AC комментирует...

Hello Friend:

I don't speak or read Russian, but I found my way here through your GitHub Post. As such I'm sending you this message assuming you speak English.

I'm an Electronic and Mechanic enthusiast in Calgary, Canada. A friend is a Volvo mechanic, and as a result, a number of my friends drive these cars. I know three people who drive XC90's all like your project applies to, two of which have expressed interest to me in installing car stereos which would update their cars to be like more modern ones (Android Auto, rear camera etc.). I myself have an XC70 which needs most of the exact same functionality. So I'll be looking to build at least 3 of your units to start. As such I have been thinking of a project like yours for quite some time.

I'm thinkin of adding the following features:

-Cell phone Modem, for internet connectivity, if only to add more functionality off the CAN bus
-GPS Unit, which could then broadcast vehicle location, for theft recovery
-Alarm Condition sensing. Should be as trivial as having your design listen for one more CAN signal. However, when coupled with the above cell modem, I could do something like send a text message if the Car alarm goes off, because we all know that the problem with car alarms is that you can't hear them when you're in a store, and bystanders ignore them.

As such, I'll be attempting to replace the Arduino Nano with, possibly, a Raspberry pi zero in order to coordinate the connectivity, then using the digital pins with the rest of your hardware design. I'm not familiar with your software libraries, but if I have to write it from scratch, that shouldn't be a problem. The bulk of the work is in the hardware here, after that the code is just a series of bridges (CAN to 12V, CAN to beeping sound).

I do have a question: You state in your GitHub post that you managed to remove several modules from the Car, the stereo, the head, the amp. How did you do this without setting off any lights? My understanding was that the car stereo places cut up and hide the front control unit behind the dash to fake the fact that it's still there. This seems like a poor way to do this, but acceptable if you do not have the ability to create your own CAN modules. The Github post states that the CAN controller is in listen-only mode. Is there something you did to your car to prevent warning lights when this equipment was removed, or does this module have the functionality to imitate these modules on the CAN system?

Thank you for your time, and I hope to send you the Mark II from Canada!

feel free to email me at aaron.chree@gmail.com

Анонимный комментирует...

Странно, вроде логгер сделал как по инструкции, но он не хочет считывать. Подключается, но в ответ тишина. Не могли бы Вы помочь понять в чем проблема? Спасибо

Олег комментирует...

>Странно, вроде логгер сделал как по инструкции, но он не хочет считывать. Подключается, но в >ответ тишина. Не могли бы Вы помочь понять в чем проблема? Спасибо
Попробуйте CanHacker, если тоже тишина, то что-то либо с подключением, либо с адаптером (може частота кварца задана в прошивке неверно). Лучше всего иметь 2 адаптера и сначала поверить их, соединив вместе и запустив два CanHacker

Анонимный комментирует...

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

Анонимный комментирует...

Все оказалось очень просто. Надо было подсоединить в другие пины в разъему обд. (3 и 11, а не 6 и 14). Спасибо Вам

Artjoms комментирует...

Я еще хотел узнать - а как Вы выставили в Кан Логгере комментарии к can id?(названия блоков) Спасибо

Artjoms комментирует...

Уже и с этим разобрался. Теперь осталось только разобраться в id. И если у меня уже сейчас не стоит оригинальная магнитола, то у меня все равно получится все это настроить? Остальные блоки отсылают же по кан шине сообщения, только магнитола и рти их ре принимает. Правильно ли я понял?

Artjoms комментирует...

Здравствуйте. С id блоков кое как разобрался, но понял, что в 2005 году Вольво немного поменяли схему коммуникации и у меня некоторые сообщения отличны от Ваших. Например, переключение передач меняет другие биты в сообщениях. Так же из-за отключенной оригинальной ГУ автоматом отключен так же rti, phm (телефон) и блок датчиков парковки - вида ругается на то, что нет связи с ними. Я так понял, что пока я не запущу эту связь (не установлю ГУ, либо какой эмулятор), то и остальное не запустится. Хотя на просторах интернета видел фото одной вольво 2005 года, у которой заменен ГУ, но кнопка парктроников активна