Реклама ⓘ
Главная » Электроника для авто
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Реверс-инжиниринг протокола диагностики 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 12021 Поиск в магазине ОтронВ блокнот
Добавить все

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

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

Теги:

Опубликована: 0 0
Я собрал 0 7
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 3.8 Проголосовало: 7 чел.

Комментарии (36) | Я собрал (0) | Подписаться

+1
ut1wpr #
Хороший кусок работы проделан, молодец!
Я бы ограничил частоту вывода на дисплей до 1 - 2 Гц. "Сливание" символов приводит к потере информативности. Ну, и если сделать символ тахометра с динамической стрелкой - получились бы красивые "рюшечки"
Ответить
0

[Автор]
mr_smit #
Вывод на дисплей 2 раза в секунду. Видео снято на не прогретой машине. Кристаллы дисплея холодные. Зима на дворе... Когда салон прогревается, то всё нормально.
Ответить
0
Zlodey #
Хорошая статья, обожаю реверс инжиниринг... Ну а обновлять дисплей можно и пореже - 1 Гц думаю достаточно.
Ответить
0
BOCEM #
Слишком мелкий дисплей, не удобно пользоваться на ходу, а как демо прототип не плохо. Вот только диод и предохранитель последовательно вещи взаимно исключающие.
Ответить
0

[Автор]
mr_smit #
Чего это вдруг взаимно исключающие? Диод - это защита от переплюсовки при подключении. Предохранитель - это защита от КЗ. А по поводу дисплея тут дело вкуса.
Ответить
0
BOCEM #
Что же тогда от часов наручных дисплей не применить? А избыточность элементов в схеме ведет сами знаете куда! Диод 1 ампер и предохранитель 1 ампер, если уж защищать от "дурака", то диодным мостом и деталь одна и маркировать провода не нужно, как и в инструкции предупреждать про переполюсовку. А плавкую вставку ставить да, надо, чтобы потом не тушить машину СОГЛАСЕН!
Ответить
0

[Автор]
mr_smit #
Схемотехнику можно обсуждать бесконечно... Тип используемого дисплея тоже. На момент разработки схемы я принял такое решение.
Ответить
0
sanyasanya #
А можете дописать, чтобы показывало расход и считывало ошибки?
Ответить
0

[Автор]
mr_smit #
Нет
Ответить
0
Mrshilov #
Проверьте формулы. Здесь документация по протоколу "Россия-83" и "Евро-II" - немного отличаются.
http://team-rs.ru/tarticleinj.php?id=5
См. страницы 24 и 27.
Ответить
0

[Автор]
mr_smit #
"Россия-83" и "Евро-II" тут абсолютно ни при чем.
Ответить
0
Vladimir #
А почему #define BUFFER_SIZE 200 ?
Просто с запасом или где то есть зацепка на принимаемый объем?
Ответить
0

[Автор]
mr_smit #
Просто с запасом.
Ответить
0
Valera174 #
Не могли бы вы выложить исходный код вашей программки? Заранее благодарен
Ответить
0

[Автор]
mr_smit #
Вообще то код выложен в самом конце статьи.
Ответить
0
Дмитрий #
Уважаемый автор можно у вас попросить программу которую вы написали для моделирования работы ЭБУ?
Ответить
0

[Автор]
mr_smit #
Можно.
Отредактирован 21.04.2016 10:00
Ответить
0
Сергей #
Уважаемый автор могу и я у вас попросить программу для моделирования работы эбу?
Ответить
0
Александр #
Здрасьте, хотел попросить программу для управления ЭБУ Нексии:)
Ответить
0

[Автор]
mr_smit #
Pobedyst, подсказал формулу для расчета УОЗ:
(45*x)/127-20 - где Х значение из блока управления.
Ответить
0
Сергей #
Добрый день, А остаток уровня топлива можно реализовать?
Ответить
0

[Автор]
mr_smit #
Можно измерять значение напрямую с датчика уровня, но надо изменять схему и править прошивку. По отображению уровня топлива в интернете полно вариантов.
Ответить
0
Сергей #
Спасибо за ответ. Жалко что так, думал есть возможность напрямую с мозгов считывать данную инфу, а то шатный индикатор не настолько информативен, как хотелось бы. Особенно при приближении 10 литров.
Ответить
0
Евгений Ал #
Эх наверное сейчас уже не актуально, но вдруг кто ответит, можно ли эту схему собрать на ардуино? Валяется нано, думаю замутить
Ответить
0

[Автор]
mr_smit #
Можно, собирайте. Только весь код под неё переделайте.
Отредактирован 16.11.2017 07:37
Ответить
0
Vlad13 #
Пытаюсь переложить программу на 16кл. двигатель. Можно автора попросить эмулятор ЭБУ и вопрос - как организовывалась шина к-лайн со стороны ПК?
Ответить
0

[Автор]
mr_smit #
Эмулятор самописный, все настройки в исходном коде. Для другого человека не применимо. Про шину не понял что имеется ввиду. Для эмуляции железо не нужно. Для диагностики обычный k-line адаптер на FT232, только с подтяжкой к +5В.
Ответить
0
MaksVV #
Автору респект! Сам делал реверс-инжениринг на опеле зафира. Поэтому все понятно до нельзя. Хочу поковырять нексию брата, думал большая рутина предстоит, а тут все готово, протокол расшарен!
В статье желательно бы только добавить, что скорость обмена 8200.
Ответить
0
MaksVV #
На запрос диагностики F4 56 01 B5 я отправляю длинное сообщение ответа, дак она мне такое сообщение прислала F4 58 2 38 0 7A. И что же на него отвечать интересно? Гы, придётся на машине все таки сниффить обмен.
Выбрал другой ЭБУ в диагностике. Всё пошло. Диагностике хватает ответа только на F4 56 01 B5. Данные показывает. Ошибки тоже
Ответить
0
aleks007 #
Отличная работа.
Уважаемый автор можно у Вас попросить программу для моделирования работы ЭБУ?
Ответить
0

[Автор]
mr_smit #
Там все настройки в исходном коде. Она вам ничем не поможет. Всё для чего она писалась она выполнила. Больше там нечего делать.
Ответить
0
aleks007 #
Нужна для отладки - переписал в атмел студии на atmega328 c lcd1602
Ответить
0
Александр #
Будет ли работать ваш код с Микас 7.6 ?
Ответить
0

[Автор]
mr_smit #
Понятия не имею
Ответить
0
agele #
Нашел небольшую ошибку: скорость в протоколе передается в явном виде, умножать на 1.6 не требуется. Так же К-линия прекрасно работает с подтяжкой к 12 вольтам. В остальном описание протокола вполне рабочее. Автору спасибо
Ответить
0
Ded_Moroz_113 #
Попробовал собрать данное устройство на нексию 2007 года, двигатель A15MF 16-клапанный, ЭБУ KDAC ZXIT. Физически все работает, с мозгами коннектится, но параметры по номерам байт отличаются. Хотел сначала прореверсировать протокол как автор этой статьи, но поскольку изначально для диагностики я использовал программу Delco 1.2.1.1 и только ее, и внезапно наткнулся на ее настройки. Оказалось, что в ней можно задавать формулы расчета параметров к соответствующим номерам байтов из посылки. Если кому нужно - пользуйте, но имейте в виду, что байты пронумерованы с первого байта посылки (дабы не запутаться с этой статьей), т.е. 0xF4 - 0-й байт, 0x92 - 1-й байт, 0х01 - 2-й байт и т.д.
Прикрепленный файл: bytes.jpg
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Печатная плата для усилителя "LM3886 + AD825" Ветрогенератор
вверх