Реверс-инжиниринг протокола диагностики 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-битATmega16A1
VR1
Линейный регуляторLM7805CT1
VR2
Линейный регуляторREG1117-331
D1
Стабилитрон5.1 В1
D2, D3
Выпрямительный диод1N41482
По желаниюD4
Диод Шоттки1N58181
D5
Защитный диод1.5KE22C1
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А1
Cr1
Кварцевый резонатор16 МГц1
Nokia 1202
Дисплейот Nokia 12021
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.