Реверс-инжиниринг протокола диагностики Daewoo Nexia

В предыдущей статье Бортовой компьютер для ВАЗ с цветным дисплеем и тачскрином я рассказывал о том как своими руками можно сделать бортовой компьютер для автомобилей семейства ВАЗ. В этой статье речь пойдет об автомобиле Daewoo Nexia 2006 года выпуска с двигателем объемом 1,5 литра. Комбинация приборов тут выполнена очень не информативной. Узнать даже примерную температуру двигателя нельзя, потому что огромный стрелочный указатель не имеет промежуточной градуировки. Тахометр попросту отсутствует.

Поэтому приблизительное техническое задание звучало так:
— отобразить обороты двигателя;
— температуру охлаждающей жидкости;
— напряжение в бортовой сети.

Идея измерять все эти параметры напрямую отпала сразу. Зачем, если у нас есть «мозг» который управляет двигателем и сам измеряет все эти параметры. Надо у него их лишь попросить. Google не дает никакой вразумительной информации о протоколе диагностики Daewoo. Поэтому начинаем активно думать.

Разъем диагностики находится возле правой ноги переднего пассажира.

 Разъем диагностики

Типоразмер один из стандартных. Напряжение на К-линии при включенном зажигании 5 вольт. Значит нужен K-Line адаптер с подтяжкой линии к 5 вольтам (на ВАЗ к 12 В).

Теперь открываем любую программу для диагностики автомобилей данной марки. Запускаем сниффер СОМ порта через который подключен наш адаптер. И видим обмен информацией между ЭБУ и программой. Вот самое интересное:

Запрос:

F4 56 01 B5   

Ответ:

 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 байта). Затем подбирал формулу перевода к нормальным значениям. Вот что удалось раскопать:

F4 92 … № байта данных … КС

№ байта данных

Значение

Формула

1

01

2

Идентификатор (1-й байт)

нет

3

Идентификатор (2-й байт)

нет

4

Ошибки (1-й байт)

нет

5

Ошибки (2-й байт)

нет

6

Температура охлаждающей жидкости (С)

(Е*0,75) — 40

7

8

Напряжение на ДПДЗ (В)

Е*0.02

9

Положение дроссельной заслонки (%)

(Е*100)/255

10

Обороты двигателя (об/мин)

Е*25

11

12

13

Скорость (км/ч)

E*1,61

14

15

Напряжение на датчике кислорода (В)

1.13*(Е/255)

24

Желаемые обороты

Е*25/4

25

Желаемые обороты на ХХ

Е*25/4

26

Атмосферное давление (кПа)

(N+28.06)/2.71

27

Давление на впуске (кПа)

10.4 + (Е*0.3685)

28

29

30

Температура на впуске (С)

(Е*0,75) — 40

31

32

Напряжение (В)

Е/10

33

34

35

Угол опережения зажигания

не смог подобрать

36

Длительность впрыска (1-й байт)

Е*62.5/4096

37

Длительность впрыска (2-й байт)

38

Соотношение воздух-топливо

Е/10

39

40

Время с момента пуска двигателя (1-й байт)

Е, сек

41

Время с момента пуска двигателя (2-й байт)

61

Дальше дело за малым: 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-х сторонний автомобильный скотч.

 

 

 

Решили разместить не по центру для лучшей видимости спидометра:

 

 

 

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
ATMega16 МК AVR 8-бит ATmega16A 1
VR1 Линейный регулятор LM7805CT 1
VR2 Линейный регулятор REG1117-33 1
D1 Стабилитрон 5.1 В 1
D2, D3 Выпрямительный диод 1N4148 2 По желанию
D4 Диод Шоттки 1N5818 1
D5 Защитный диод 1.5KE22C 1
C1, C2 Конденсатор 22 пФ 2
C3, C4 Конденсатор 470 мкФ 2
C5 Конденсатор 0.33 мкФ 1
C6, C8 Конденсатор 0.1 мкФ 2
C7 Конденсатор 0.01 мкФ 1
R1 Резистор 510 Ом 1
R2 Резистор 10 кОм 1
R3-R6 Резистор 2 кОм 4
R7, R8, R9, R10 Резистор 3.6 кОм 4
R11 Резистор 20 Ом 1
F1 Предохранитель 1
Cr1 Кварцевый резонатор 16 МГц 1
Nokia 1202 Дисплей от Nokia 1202 1