вторник, 2 августа 2011 г.

Модуль всех модулей

Бортовой диагностический компьютер, насколько сложно это может быть?..
Задача распадается на две:
  1. Отображение информации
  2. Опрос блока управления двигателем
Для отображения используем графический ЖК дисплей MT-12232.
Чтобы понять как это все должно выглядеть, я начал с фотошопа и нарисовал там примерную компоновку данных на дисплее. Получилось вот это:
Эскиз компоновки экрана. Увеличено в 4 раза.
Поля:
1. Верхняя строка слева направо: километраж на остатке топлива, температура двигателя, время и  день недели
2. Вторая двухэтажная строка между двумя горизонтальными линиями слева направо: обороты двигателя, скорость, пройденная дистанция за поездку, передача, остаток бака.
3. Третья строка: меню для отображения параметров и настроек других подключенных модулей - модуль печки, модуль центрального замка, модуль стеклоподъемников и т.д.

Потом, эту картинку после преобразований, залил в микроконтроллер, чтобы понять как это выглядит в реальности. Выглядело вот так:
Из эскиза в фотошопе был сформирован набор шрифтов, состоящий только из использованных символов и иконок.
Дисплей вмонтирован в многострадальное центральное сопло воздуховода 2110, как в самый восприимчивый к изменениям элемент салона.
Теперь дело за прошивкой, которая должна шустро выводить постоянно меняющиеся параметры, что далось не сразу, так как дисплей не самый быстрый, и попутно опрашивая ЭБУ. В прошивке перерисовываем только то, что изменилось. Пока реализовано только отображение скорости, температуры и оборотов.
Для подключения дисплея использовал одну из первых испытательных плат, которая включала МК ATMEGA-162, а к одному из последовательных портов был подключен  драйвер K-LINE, схема подключения к дисплею и драйвер K-LINE ниже:
Подключение МК к MT-12232
Подключение МК к K-LINE
Испытательная плата слева.
В машине уже был установлен маршрутный компьютер, так что я воспользовался передаваемыми данными, чтобы извлечь оттуда необходимые параметры. Т.е. общение с ЭБУ сводится к прослушиванию порта.
Привожу разобранный лог обмена между ЭБУ и маршрутником (разбор на основе широко доступной документации по протоколу KWP2000 для блока Январь 5, совпало практически все):
mul>> 81 10 F1 82 [CS: 04]
ecu>> 83 F1 10 7F 82 10 [CS: 95]
mul>> 81 10 F1 81 [CS: 03] 81 = startDiagnosticSession
ecu>> 83 F1 10 C1 6B 8F [CS: 3F] C1 = Положительный ответ startCommunication
mul>> 82 10 F1 3E 01 [CS: C2] 3E = testerPresent 01 = Блок управления должен послать ответное сообщение на запрос тестера.
ecu>> 81 F1 10 7E [CS: 00] 7E = положительный ответ на testerPresent
mul>> 82 10 F1 21 01 [CS: A5] 21 = readDataByLocalIdentifier
ecu>> 80 F1 10 [26 - длина] 
61 = положительный ответ readDataByLocalIdentifier
01 = afterSalesServiceRecordLocalIdentifier
3B = слово комплектации 1
92 = слово комплектации 2
41 = слово режима работы 1
84 = слово режима работы 2
00 = слово флагов текущих неисправностей 1
00 = слово флагов текущих неисправностей 2
00 = слово флагов текущих неисправностей 3
00 = слово флагов текущих неисправностей 4
3E = температура охлаждающей жидкости, N=E-40 [C], 
80  = коэффициент коррекции СО, N=E/256, где E-знаковое
00  = положение дроссельной заслонки, N=E [%]
00 = скорость вращения двигателя, N=E*40 [об/мин]
00 = скорость вращения двигателя на холостом ходу, N=E*10 [об/мин]
6B = желаемое положение регулятора холостого хода, N=E [шагов]
6B = текущее положение регулятора холостого хода, N=E [шагов]
80 = коэффициент коррекции времени впрыска, N=(E+128)/256
02 = угол опережения зажигания, N=E/2 [гр.КВ] , где E-знаковое
00 = скорость автомобиля, N=E [км/час]
7E = напряжение бортсети, N=5.2 +E*0.05 [В] 7E = 126
00 = желаемые обороты холостого хода, N=E*10 [об/мин]
5C  = длительность импульса впрыска (младший байт)
00 = длительность импульса впрыска (старший байт), N=E/125 [мсек]
00  = массовый расход воздуха (младший байт)
00 = массовый расход воздуха (старший байт), N=E/10 [кг/час]
00  = цикловой расход воздуха (младший байт)
00 = цикловой расход воздуха (старший байт), N=E/6 [мг/такт]
00 = часовой расход топлива (младший байт)
00 = часовой расход топлива (старший байт), N=E/50[л/час]
00 = путевой расход топлива(младший байт)
00 = путевой расход топлива(старший байт), N=E/128[л/100км]
FF
FF
00 
00 
42  = Контрольная сумма ПЗУ (младший байт)
01 = Контрольная сумма ПЗУ (старший байт)
[CS: CC]
mul>> 82 10 F1 21 01 [CS: A5]
ecu>> 80 F1 10 26 61 01 3B 92 41 84 00 00 00 00 3E 80 00
00 00 6B 6B 80 02 00 7E 00 5C 00 00 00 00 00 00 00 
00 00 FF FF 00 00 42 01 [CS: CC]
mul>> 84 10 F1 18 00 00 00 [CS: 9D]
18 = readDiagnosticTroubleCodesByStatus
ecu>> 85 F1 10 58 01 16 02 20 [CS: 17]
        58 = положительный ответ readDTCByStatus
   01 = numberOfDTC

Не очень понял зачем, но покупной маршрутник на один запрос параметров трижды запрашивает коды ошибок....
В результате получился вполне рабочий маршрутник. Пока есть небольшие баги с отображением - паразитные пиксели и залипающие неперерисованные разряды цифровых параметров. Видео работы, документальное:

Основная идея была в получении главного модуля, который бы объединил уже описанный ранее модуль стеклоподъемников, ждущий своего часа модуль печки, модуль центрального замка и другие. Следующим этапом будем встраивать небольшую телефонную клавиатуру для управления всем хозяйством.

Исходники

Комментариев нет:

Отправить комментарий