Реверс инжиниринг приборной панели Nissan Muran Z50
…то оцифровать приборную панель уже будет посложнее. Однако, глаза боятся, а руки делают.
Для экспериментов я приобрел приборку от европейца, но принципиально она ничем от американца не отличается, кроме как расположением кнопок одометра и стоп-сигнала, и настройками тока для стрелочки спидометра (а еще она не такая жирная и не пытается найти у меня нефть). Дело в том, что у европейца и американца отличается максимальная скорость на спидометре, соответственно при 240 км/ч на американце, европеец покажет приблизительно 210. Таким образом, графическая накладка не взаимозаменяемая:
Далее, согласно документации на приборную панель (файл Приборка.pdf, все архивы оставлю в конце) подключаем питание к приборке. Контакты 22, 23, 24 черные провода, на схеме обозначены буквой «B» подключаем к минусу (один или все вместе неважно), и контакты 21«Y/R» — желтый с красной полосой и 20«O» — оранжевый (оба сразу) к + 12 вольтам. Контакт 15«R/W» красный с белой полосой это освещение приборки, то же 12 вольт, но подключать не обязательно. Важное замечание: фактический номер контакта может отличатся от указанного в схеме, ибо инженеры нисан — японцы на всю голову и менуют номер контакта по японскому! То есть на плате три штекера — один основной для подключения к тачке и два для подключения кнопок стоп-сигнала и сброса одометра. Так вот вместо того, чтобы обозначить в каждом штекере контакты от 1 и до максимального, они объединили номера всех трех штекеров в одну группу, таким образом первый по номеру контакт находится на первом штекере, а последний на третьем. Короче ориентируйтесь по цветам и моим картинкам. Вот фото задней части:
Вот схема из файла Приборка.pdf (страница 10) с номерами контактов и куда чего идет:
А теперь опишу как работает панель согласно документации Приборка.pdf.
- Лампа ремня безопасности контакт 3
- Лампа омывайки — контакт 6
- Лампа аккумулятора контакт 4
- Лампа сигнализации контакт 5
- Работа спидометра:
Контакт 14 «V/W» Фиолетовый с белой полосой. Приборная панель выдает на него +5 вольт. Сигнал с датчика скорости замыкает контакт на землю формируя на нем логическую единицу. На один оборот колеса приходится 8 импульсов на землю.
И тут начинается самое вкусное. Все остальные данные которые выводит приборная панель, приходят по шине UART, а именно: тахометр, уровень топлива, температура охлаждайки, ошибка двигателя, CVT, ABS, низкое давление в шинах, AWD, AWD Lock, сигнал поворота, дальний свет, VDC OFF, SLIP, индикаторы круиз-контроля — CRUISE и SET, CVT, индикатор открытой двери, уровень масла, габариты, сигнал пищалки и режим коробки (P, D, R, S и так далее включая ручной режим и номер передачи). Пробег одометра рассчитывается согласно показаниям сигнала спидометра и пишется в память приборной панели (в том числе). Когда я подключаю чужую приборку к своему авто, показания одометра не родной приборки не сбрасываются.
Далее приведу показания приборки при подключении питания, но отсутствии управляющих сигналов (согласно файлу Приборка.pdf страница 32). UART не подключен и линии контактов 3, 4, 5 и 6 висят в воздухе:
Спидометр, тахометр, топливо, температура охлаждайки показания по нулям. Сама панель будет находиться в ночном режиме, то есть подсветка приборов включена. Дисплей Вариатора не показывает ничего. Пищалка молчит.
ABS, VDC OFF, SLIP, Ошибка тормоза — все эти индикаторы должны гореть при подключении питания и отсутствии связи.
Дальний свет, не закрыта дверь, низкое давление в шинах, CRUISE, SET, AWD, AWD LOCK, масло, поворотники, ошибка двигателя, CVT — эти лампы будут выключены.
Теперь нам необходимо подключиться к контактам UART и вывести данные в компьютер при помощи USB-UART моста. Я использовал вот такой:
Вы можете использовать любой другой по запросу USB to UART bridge. Упоротые могут достать из arduino UNO проц или закоротить его на ресет и использовать встроенный UART. Короче TX приборки (контакт 18«R/L» красный с синей полосой) подключаем к RX нашего UART преобразователя и любой из черных проводов (контакты 22, 23, 24) к контакту GND UART. Далее запускаем любой монитор COM порта, выбираем свой UART в списке, подключаемся и наблюдаем поток сознания. Это краткая версия. Теперь подробнее. Качаем, например, это и втыкаем UART в USB. В списке COM Port должен появится новый COM к нему и подключаемся. Вот теперь и наблюдаем поток сознания от приборной панели в главном окне программы. Если не наблюдаем значит вы все сделали правильно, поскольку еще необходимо подобрать скорость приема данных — Baud Rate. Выбирая разные режимы, я отмел все, что выше 115200, ибо при таких настройках терминал выдавал сплошные нули. В настройках между 9600 и 19200 стала появляться хоть какая-то структура. Но дальше понятнее не становилось. Приуныв, я подпер подбородок рукой и, внезапно, обнаружил на столе осциллограф! Ого — подумал я. — У меня есть такая штука! Короче решил я посмотреть, что покажет эта шайтан-машинка. Кое-как подобрав настройки, я наблюдал непонятное нечто, с которым, ума не приложу, что делать. Ладно поищем что же вообще обозначает Baud Rate. Ага, википедия говорит, что это количество бит данных в секунду. Ну, думаю, дай гляну по осциллографу длину самого короткого импульса. Оказалось, что-то около 70 наносекунд. Почесав репу, решил это дело разделить на 1000000 наносекунд, а почему нет? Результат оказался близок к 14400. Есть такая скорость — снова подумал я, и выставил на всякий случай такие настройки: Baud Rate 14400, Data bits — 8, Parity — odd, Stop bits — 1, Handshaking XON/XOFF. И, черт возьми, все внезапно заработало! Ну то ест ничего не изменилось, окно выдавало все такой же странный набор символов, но чуйка подсказывала что я двигаюсь в правильном направлении. Короче снял я со спидометра такую штуку:
Это после декодирования
A0 0F 00 0F 00 14 00 00 00 00 14 A1 0B 00 0B 00 6E 00 00 00 00 6E A2 0F 00 02 00 14 10 00 00 00 09 A3 07 00 00 00 6E 05 00 00 00 6C A4 0F 00 0C 40 34 3F 00 00 00 48 A5 02 00 0E 00 6E 01 08 00 00 6B A6 0C 00 01 00 14 1F 00 00 00 06 A7 00 00 0F 00 6E 00 00 00 00 61A8 00 00 00 00 14 00 00 00 00 14 A9 00 00 00 00 6E 00 00 00 00 6E
Потыкался с нулями, не нашел ничего интересного, но, снова внезапно, обнаружил, что байт со знаком «А…» повторяется каждые 10 раз. Привел я к такой структуре:
(Повторяющийся кусок)
A0 0F 00 0F 00 14 00 00 00 00 14
A1 0B 00 0B 00 6E 00 00 00 00 6E
A2 0F 00 02 00 14 10 00 00 00 09
A3 07 00 00 00 6E 05 00 00 00 6C
A4 0F 00 0C 40 34 3F 00 00 00 48
A5 02 00 0E 00 6E 01 08 00 00 6B
A6 0C 00 01 00 14 1F 00 00 00 06
A7 00 00 0F 00 6E 00 00 00 00 61
A8 00 00 00 00 14 00 00 00 00 14
A9 00 00 00 00 6E 00 00 00 00 6E
Предпоследние два байта всегда по нулям первые, если перевести HEX в DECIMAL растут с 160 по 169. HEX — набор символов о котором речь шла выше, это ничто иное как десятичные числа в шестнадцатеричном (чуть пальцы не сломал пока писал) формате.
Стало жарко. Дай думаю скормлю эти же данные приборке через Terminal. Втыкаю TX USB-UART преобразователя в RX приборки, и она начинает пищать всеми цветами радуги. Тут я догадываюсь что не все так просто. Видимо UART физического уровня несколько отличается от того, что используется в тех же ардуинах. Снимаю накладку с приборки, туплю на плату, перерисовываю схему и ага! Действительно это дифференциальная пара. Не вдаваясь в подробности скажу лишь, что я подпаялся непосредственно к площадкам, идущим прямо к контроллеру и тогда все заработало нормально. Вот фото куда чего паять:
А теперь, самое вкусное. Несем всю эту нанотехнологию в машину, подрубаем свою модифицированную приборку, UART к буку и приборке. Причем к приборке теперь подрубаем не выход, а наоборот ВХОД (Контакт 19«R/B» красный с черной полосой) что бы снять данные которые шлет машина на приборную панель. Затем врубаем зажигание, запускаем на буке Terminal и он начинает записывать все, что приходит на приборку. А теперь начинаем тыкать во все кнопочки подряд в своей машине. Открываем-закрываем двери, включаем дворники, жмем газ-тормоз-реверс-с-м у кого что, свет дальний ближний, поворотники. Желательно убить мотор и вариатор, что бы мы могли снять коды ошибки мотора и вариатора. Причем мотор надо убить в разных вариантах и позах и каждый датчик по отдельности. В общем снял я данные с машины, и вот что вышло:
(Небольшой кусок от A0 до A9)
A0 40 00 00 78 3F 00 00 00 00 07
A1 00 00 00 10 00 00 00 00 00 10
A2 40 00 00 78 3F 00 00 00 00 07
A3 00 00 00 10 00 00 00 00 00 10
A4 40 00 00 78 3F 00 00 00 00 07
A5 00 00 00 10 00 00 00 00 00 10
A6 40 00 00 78 3F 00 00 00 00 07
A7 00 00 00 10 00 00 00 00 00 10
A8 40 00 00 78 3F 00 00 00 00 07
A9 00 00 00 10 00 00 00 00 00 10
Ого — подумал я. — Это же почти как у спидометра! Дай, думаю, скормлю приборке логи, что я записал с машины. Скормил. Приборка повторила все то, что я вытворял в авто с авто на авто. Эка я умен — не скромничал я про себя! Решил изменить некоторые знаки и снова скормить приборке измененный файл. Ничего не произошло. Хм — подумал я. Чего же делать то? И приуныл, снова подперев рукой подбородок.
….Странные цифры в конце каждой секции…
…Четыре пары нулей и потом какие-то цифры…
Открыл я виндокалькулятор. Зачем-то переключил в режим HEX. Почему-то решил взять все числа в формате HEX исключая номер секции и последнее число и перемножить их между собой методом XOR. Внезапно! Сумма XOR чисел оказалась равна последнему числу в секции. Интересно — подумал я. Видимо бит честности — осенило мою голову. Изменил несколько чисел, заXORил их между собой, сумму вписал в конце секции и скормил приборке. Приборка изменила показания тахометра. Все понятно. Структура стала ясна:
A0 40 00 00 78 3F 00 00 00 00 07
Номер секции — A0
Данные — 40 00 00 78 3F 00
Биты конца строки — 00 00 00
Бит четности — 07
Короче, чтобы расшифровать чего куда какой бит изменяет на@овнокодил я такую софтину:
Управление крайне примитивное — жмякаем «Выбрать порт». Ждем… Еще ждем… Опять ждем… Во всяком случае так у меня. Вылезет окошко со списком портов. По клику по имени порта, подключается к порту. Л — Логика! Что бы начать передачу тыкаем кнопку «Начать передачу». Л — Логика! Левая часть содержит 10 секций от A0 до A9. Во время передачи эти секции последовательно грузятся в выбранный порт. Подводим указатель мыши к любой ячейке и крутим колесо. Значения меняются и на лету меняются показания на приборке. В правой части должен был выводиться ответ от приборки, но я @овнокодер, у меня все тупило, потому сейчас там просто форматированный вывод. Можно сохранить текущие настройки HEX в файл и потом его загрузить. Для этого жмякаем одноименные кнопки. Софт автоматом подсчитывает сумму и пересчитывает байт честности. Так что его не трогаем, да и нифига у вас не выйдет. Байт в синем квадратике менять можно, но скорее всего это разделитель. Он вроде как никак не влияет на данные. Для полнофункциональной работы достаточно скармливать первые две секции A0 и A1. В первой секции содержаться данные тахометра и еще что-то, во второй все лампочки-ошибки и положение ручки АКПП. Короче разберетесь. Посредине синие точки, это включатели отправки секции. Если синяя, значит эта секция отправляется в COM port. При запуске открывается дефолтная оснастка, которая 100% работает. Софтина кривая вылетает с завидной регулярностью, да и пофигу. В архивчике лежит все, что надо для самостоятельных танцев с бубнов, включая мануалы к авто и моя кривая софтина.
Облачные серверы от Маклауд быстрые и безопасные.
Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!