Реверс-інжиніринг протоколу діагностики daewoo nexia
Тому приблизне технічне завдання звучало так:
- відобразити обороти двигуна;
- температуру охолоджуючої рідини;
- напруга в бортовій мережі.
Ідея вимірювати всі ці параметри безпосередньо відпала відразу. Навіщо, якщо у нас є «мозок» який управляє двигуном і сам вимірює всі ці параметри. Треба у нього їх лише попросити. Google не дає ніякої зрозумілої інформації про протокол діагностики Daewoo. Тому починаємо активно думати.
Роз'єм діагностики знаходиться біля правої ноги переднього пасажира.

Типорозмір один зі стандартних. Напруга на К-лінії при включеному запалюванні 5 вольт. Значить потрібен K-Line адаптер з підтяжкою лінії до 5 вольт (на ВАЗ до 12 В).
Тепер відкриваємо будь-яку програму для діагностики автомобілів даної марки. Запускаємо сниффер СОМ порту через який підключений наш адаптер. І бачимо обмін інформацією між ЕБУ і програмою. Ось найцікавіше:
F4 92 01 00 6D 00 00 61 54 1E 00 00 FF 00 00 00 66 00 00 80 80 00 00 4B 4B AF 00 F5
F5 FF FF 4A 85 78 00 FF F9 06 F4 51 6F 00 00 C6 7B 7E 83 00 00 32 00 00 00 08 01 01
00 78 20 2F A0 00 F5 D4
Зрозуміти що є що у відповіді відразу не вийде. Але тут на допомогу приходить старий добрий АвтоВАЗ. А саме зв'язка GM-АвтоВАЗ. Документ «Послідовний високошвидкісний порт головного процесора». Дивлюся туди і просто не вірю своїм очам. Там описаний точнісінько такий же протокол обміну як я тільки що зняв з K-лінії! Отже по порядку:
Ніякої початкової ініціалізації немає. Відразу надсилається запит даних.
Формат повідомлення:
- Байт ідентифікації пристрою (ID);
- Байт довжини повідомлення (85 + N). Вказує загальна кількість слів даних в решти повідомлення N плюс 85 (десяткове);
- Байт запитуваної режиму (mode) (M);
- Контрольна сума. Двійкове доповнення суми всіх інших слів повідомлення, включаючи ідентифікатор повідомлення і слово довжини повідомлення (КС).
Розберемося із запитом:
F4 - ідентифікатор повідомлення;
56 - довжина повідомлення в hex вигляді. У нашому випадку довжина всього 1 байт: 85 + 1 = 86 (dec) = 56 (hex)
01 - номер режиму / таблиці даних яку ми запитуємо у ЕБУ.
В5 - контрольна сума. F4 + 56 + 01 = 14B. Інвертуємо число 14В і отримуємо число B4. Додаємо до нього 1 і отримуємо В5.
Із запитом все досить просто. Але мене найбільше цікавила відповідь ЕБУ. дивимося:
F4 92 01 00 6D 00 00 61 54 1E 00 00 FF 00 00 00 66 00 00 80 80 00 00 4B 4B AF 00 F5
F5 FF FF 4A 85 78 00 FF F9 06 F4 51 6F 00 00 C6 7B 7E 83 00 00 32 00 00 00 08 01 01
00 78 20 2F A0 00 F5 D4
F4 - ідентифікатор повідомлення;
92 - довжина повідомлення. 85 + 61 = 146 (dec) = 92 (hex). Тобто після цього байта у нас ще 61 байт даних;
01 - дані за запитом 1-го режиму / таблиці (1-й байт з 61);
2 байт даних
.
61 байт даних
D4 - Контрольна сума.
З форматом відповіді тепер теж все ясно. Найскладніше визначити який байт у відповіді що означає. Тут ми повертаємося до назви даної статті і визначенню реверс-інжиніринг ( «зворотна розробка»). Розкриваю основну суть. На Delphi написав програму яка імітує роботу ЕБУ:

Встановив програму com0com, створив в системі 2 віртуальних COM порту і з'єднав їх між собою. Програма діагностики відправляє дані в COM2, а моя програма приймає їх на COM1 і відправляє відповідь назад. Зроблено це тому що COM порт при роботі може бути зайнятий тільки однією програмою. Потім, змінюючи значення кожного байта у відповіді ЕБУ, стежив за зміною показань в програмі діагностики. Як тільки свідчення будь то параметра починали змінюватися - значить за цей параметр відповідає саме цей байт (або 2 байта). Потім підбирав формулу перекладу до нормальних значень. Ось що вдалося розкопати:
Далі справа за малим: ATMega16A + дисплей від Nokia 1202. Цей дисплей був обраний через його доступності та низької ціни (33 рубля). Що добре не треба городити перетворювач рівнів для K- Лінії.

Харчування частково змонтовано навісним монтажем прямо на дроті. Дросель узятий з комп'ютерного блоку живлення. Підсвічування дисплея запитана через резистор 20 Ом. На друкованій платі він позначений як «яскравість». Змінюючи його номінал, можна підібрати комфортний рівень яскравості в нічний час. Як показала практика краще поставити резистор трохи більшого номіналу 30-50 Ом. На K-лінію поставив стабілітрон на 5,1В якщо раптом на лінії з'явиться 12 вольт. А з імпульсними перешкодами нехай борються діоди на вході портів мікроконтролера. Бажаючі можуть допаять на вхід пару 1N4148, резистор 100-200 Ом послідовно, конденсатор на пару нанофарадах на землю. Оскільки провід K-лінії від колодки ЕБУ до бортового комп'ютера виходить досить довгим, то його бажано в цьому випадку взяти екранованим. Щоб було менше наведень. Екран підключити на мінус тільки з одного боку (з боку колодки діагностики). Що я і зробив. Харчування на бортовий комп'ютер подається при включенні запалювання (плюс підключений прямо до замку запалювання). Мінус і K-лінія підключені до колодки діагностики.
Фільтр живлення:


Ну і сам бортовий комп'ютер:

Пристрій являє собою індикатор 3-х основних параметрів: обороти двигуна, температура охолоджуючої рідини, напруга бортової мережі. Іншого не було потрібно.

Після того як вклеїли дисплей в корпус - нас чекало розчарування:

По якійсь невідомої причини дисплей перестав показувати частину інформації. Можливо клей виявився занадто агресивним і порушив цілісність «скла» дисплея. Довелося їхати за новим. Було куплено 2 штуки, з запасом.
Але тут нас чекало друге розчарування. Мало того що дисплеї судячи з усього виявилися з іншої партії і володіли низьким контрастом у порівнянні з першим, так ще й не реагували на деякі команди управління. Чи не працювала команда дзеркального відображення щодо осі Y. Довелося робити це програмно. Пояснити це я можу лише низькою якістю виготовлення самого дисплея і тим що мабуть нам попався самий неоригінальний з неоригінальних дисплеїв. Тому в архіві 2 версії прошивки: початкова і виправлена під кривою неоригінал. Виправлена повинна працювати з будь-яким дисплеєм, але швидкість виведення на екран там трохи нижче. Відрізняються вони лише виправленнями в файлі LCD.c (прошивка написана в CodeVisionAVR). Якщо дисплей «нормальний», то краще використовувати перший варіант.
Після подолання всіх труднощів дисплей все таки був успішно вклеєна в корпус, а сам корпус приклеєний до кожуха рульової колонки на 2-х сторонній автомобільний скотч.


Вирішили розмістити не по центру для кращої видимості спідометра:

