Volkswagen Passat B5 (1.8T)

Протокол общения руля с мафоном

Я їжджу на Volkswagen Passat B5
Україна

Всем привет.
Захотел добавить себе блутус в машину (вместо кассеты, так как Changer у меня стоит и снимать не хочется, а AM только моно). Начитался мануалов (их тут десятки на драйве), быстренько нашел место для пайки входа, быстренько проверил работу AUX-а по проводам, быстренько заказал XS3868 и быстренько его подцепил к этому самому AUX-у. Это всё сто раз пережевано, и поэтому скучно.
А мне хотелось приключений. Поэтому я поставил себе задачу чуть сложнее, а именно: "Переключать треки в телефоне, используя штатные кнопки на руле".

Первое, что надо было для этого сделать — это запустить мафон на столе, чтобы не заниматься его ковырянием в машине. Для этого нужен был код, которого я не знал. Пришлось с этим разобраться

Дальше был долгий гуглинг, который дал ясно понять, что руль на моей машине даёт полностью цифровой сигнал

В более поздних машинах сигнал с руля можно поймать через CAN, но в машинах 2001-го года — нет. Поэтому придётся разобраться, что за сигнал приходит, и что с ним дальше делать.

Открыв схему моего мафона (Blaupunkt Gamma V Z1Z3), я выбрал точку, в которой удобнее всего снимать сигнал кнопок руля — это оказался разъём фронтальной панели. Рядом есть тестпоинт, к которому удобно припаяться, и сигнал уже прошел через внутренние защиты и он точно пятивольтовый. Сигнал на разъёме я не померял.

Выцыганив у товарища на время логический анализатор, я припаялся к указанной точке, отнёс мафон в машину и записал сигналы кнопок. Получилось следующее:
{0x00, 0x00, 0xFF, 0x5D, 0x55, 0x77, 0x77, 0x5D, 0x57, 0x75, 0xD5, 0x55, 0xD7, 0x77, 0x77} — вверх
{0x00, 0x00, 0xFF, 0x5D, 0x55, 0x77, 0x77, 0x5D, 0x55, 0xD7, 0x55, 0x75, 0xD7, 0x77, 0x77} — вниз
{0x00, 0x00, 0xFF, 0x5D, 0x55, 0x77, 0x77, 0x5D, 0x57, 0x55, 0x55, 0x77, 0x77, 0x77, 0x77} — увеличить громкость
{0x00, 0x00, 0xFF, 0x5D, 0x55, 0x77, 0x77, 0x5D, 0x55, 0x55, 0x57, 0x77, 0x77, 0x77, 0x77} — уменьшить громкость
Если кнопку удерживать в нажатом состоянии, то каждые 60мс после первой посылки отправляется код повтора вида {0x00, 0x00, 0xF7}.
Длительность 0 и 1 примерно одинаковая, порядка 500мкс, то есть частота сигнала всего около 2кГц.

Нормальный бы человек в этот момент пошел бы писать декодер для этого сигнала (ну, совсем нормальный человек купил бы себе мафон с блутусом, или не заморачивался бы вообще, но будем говорить хотя бы о почти нормальных людях), а я пошел делать эмулятор кнопок на руле :)

В принципе делать там особо нечего — взял подвернувшуюся под руку Arduino nano, прицепил 4 кнопки, написал небольшую программку, пол-часа потратил на подбор задержек — и вуаля :) Разве только с задержками накосячил — в Make-файле поставил частоту процессора в 20МГц, а в реальности кварц стоит на 16 — поэтому задержки в числовом виде не совпадают с тем, что я увидел через логический анализатор. Ну да ладно, подключаем ардуину к мафону, кнопаем кнопочки, смотрим, что треки переключаются, несём мафон обратно в машину и садимся писать анализатор!

Я понятия не имею, что у меня за протокол перед глазами (может он имеет хитрое название, или как-то стандартизирован), но мне это и не нужно — мне нужно всего-то отличить 4 кнопки и состояние повтора. Поэтому будем говнокодить упрощать :) Железо — точно такая же ардуино нано за пару баксов. От Arduino я использую только загрузчик, пишу на C.

В начале видим последовательность 0x00, 0x00, 0xFF, 0x5D, 0x55. Что в ней хорошего? Во-первых то, что мы смело можем пропустить первых штук 8 смен полярности сигнала просто так (на заморачиваясь с частотой), а потом использовать 0x55 (aka 01010101) для синхронизации частоты. Для верности измерим длину каждого 0 и 1 в этом самом 0x55, отбросим пару граничных значений, а остальное усредним. Потом подождём немного, и через вычисленный интервал времени считаем все нужные нам 80 бит. В общем, зря я тут распинаюсь — это же не форум по программированию. Короче, кому интересен код — сюда (тапками не бросами — это Proof of Concept, не более)

Подключил эмулятор к приёмнику, проверил, что первый эмулирует, а второй принимает, сходил в машину, посмотрел, что команды от настоящего руля приёмник тоже успешно распознаёт и пошел прикручивать его к блутусу. Тут тоже описывать пока нечего — через транзистор на 250мс по получению команды подаю +3В на командную ногу, и всё. Подробнее опишу в следующих сериях ;)
Засада меня ждала в другом месте. Подключил блутус, проверил дома, что всё ОК, несу в машину. Включаю. Играет. Rewind — на телефоне включается следующий трек, а звук в колонках пропадает — ЦП вырубает при перемотке входы предусилка :( К такой засаде я готов не был. Вторая засада — это мотор, который не так просто отключить, и который дёргано жужжит при перемотке. Но это ерунда по сравнению с тем, что я могу слушать только нечётные треки :D.
Промежуточный итог: протокол разобран, но для полноценного вкорячивания блутуса — we need to go deeper ;)
Забегая вперёд — сейчас блутус стоит в машине, треки с руля переключаются, кассетный механизм физически отсутствует. Но об этом — в следующих сериях :)

Опубліковано: 19 травня 2016р. 17:16
0 0 0

Коментарі

Щоб залишати коментарі, потрібно авторизуватись.