OBD2 reader — диагностика автомобиля

Изначально необходимо пояснить что для подключения к авто будет использоваться ELM327 адаптер. ELM327 – это микросхема, которая позволяет преобразовать протоколы, используемые в диагностических шинах автомобилей в протокол RS232, которым мы и будем передавать данные. За счет того что передача данных по протоколу RS232 происходит последовательно возникает первая проблема – скорости передачи данных, которую мы постараемся обойти в одном из следующих пунктов.

Существует несколько вариаций адаптера ELM327, которые классифицируются по способу передачи данных – Bluetooth, WIFI, USB. Исходя из того что целью разработки является мобильное устройство под операционной системой Android можно подобрать две наиболее подходящие версии ELM327, такие как Bluetooth и WIFI. Так как способ получения и обработки данных один, а отличаются они всего лишь вариантами подключения к адаптеру, то можно выбрать всего один, организовать при помощи него диалог, а после добавить остальные варианты подключения.

ELM327 1.5 vs ELM327 2.1

Одной из первых проблем, с которыми можно столкнуться стала проблема выбора непосредственно адаптера, в нашем случае Bluetooth. Оказывается если вам необходимо поддерживать все (по крайней мере большинство) автомобилей необходимо выбирать версию v1.5 вместо v2.1, что на самом то деле необходимо несколько раз уточнить при покупке адаптера, потому как продавцы пытаются выдать версию адаптера не за ту, которая есть на самом деле, т. к. они особо ничем не отличаются. На деле же в версии v2.1 отсутствует поддержка протоколов J1850 PWM и J1850 VPW, что говорит о том, что у вас не получится подключиться к автомобилям, которые используют эти протоколы.

Подключение

Подключение к адаптеру происходит в несколько этапов:

AT Z [reset all]
Сброс настроек адаптера до заводского состояния.
AT L1-0
Включить/Отключить символы перевода строки.
AT E1-0
Echo on – off
AT H1-0
Headers on – off
AT AT0-1-2
Adaptive Timing Off — adaptive Timing Auto1 — adaptive Timing Auto2
AT ST FF
Установить таймаут на максимум.
AT D [set all to Default]
Сброс настроек в исходное, настроенное пользователем состояние.
AT DP [Describe the current Protocol]
Сканер способен самостоятельно определять протокол автомобиля, к которому он подключен.
AT IB10 [set the ISO Baud rate to 10400]
Команда устанавливает скорость обмена данных для ISO 9141-2 и
ISO 14230-4 10400
AT IB96 [ set the ISO Baud rate to 9600]
Команда устанавливает скорость обмена данных для ISO 9141-2 и
ISO 14230-4 9600 для протоколов 3,4,5.
AT SP h [ Set Protocol h]
Команда выбора протокола h, где h:

0 – Automatic;
1 — SAE J1850 PWM (41.6 Kbaud);
2 — SAE J1850 VPW (10.4 Kbaud);
3 — ISO 9141-2 (5 baud init, 10.4 Kbaud);
4 — ISO 14230-4 KWP (5 baud init, 10.4 Kbaud);
5 — ISO 14230-4 KWP (fast init, 10.4 Kbaud);
6 — ISO 15765-4 CAN (11 bit ID, 500 Kbaud);
7 — ISO 15765-4 CAN (29 bit ID, 500 Kbaud);
8 — ISO 15765-4 CAN (11 bit ID, 250 Kbaud);
9 — ISO 15765-4 CAN (29 bit ID, 250 Kbaud);
AT SP Ah [Set Protocol h with Auto]

Команда устанавливает по умолчанию протокол h, если подключение по протоколу h не удалось, тогда адаптер начинает автоматический подбор протокола.

Исходя из описанных выше команд, формируем инициализационную строку.

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

Так же желательно обратить внимание на команду APSP0, таким образом мы устанавливаем по умолчанию автоматический подбор протокола, это может занять некоторое время.

Соответственно если пользователь знает какой у его авто протокол, то используя возможность смены протокола подключения он может поменять 0 на номер его протокола.

Считывание диагностических данных

Для считывания диагностических данных используются специальные команды PID’s.
PID (Parameter id’s — Бортовые диагностические идентификаторы параметров) – коды, которые используются для запроса показателей определенных датчиков автомобиля.

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

Также есть возможность получать текущие данные от автомобиля при этом команда получения данных от авто будет иметь вначале 01, указывая на то что мы хотим получить real data. Если же мы хотим получить сохраненные данные автомобиля, то вначале команды необходимо указать 02. Например, команда для получения текущей скорости автомобиля – 010D, а для получения сохраненной скорости – 020D.

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

0100 – PIDs supported [01 — 20]
0120 – PIDs supported [21 — 40]
0140 – PIDs supported [41 — 60]
0160 – PIDs supported [61 — 80]
0180 – PIDs supported [81 – A0]
01A0 – PIDs supported [A1 — C0]

Я продемонстрирую как определить какие датчики присутствуют в автомобиле при помощи одного из пидов. Например:

Используя следующую табличку можем определить какие пиды поддерживаются нашим автомобилем, начиная от 01 до 20:

Исходя из получившихся данных можем определить, что наш автомобиль поддерживает следующие пиды:

Теперь вместо отправки всех 32 команд и ожидания ответа на них, несмотря на то, что некоторые могут отсутствовать, мы будем использовать всего 15 команд. Но и это не предел так называемой оптимизации. Для того чтобы данные обновлялись еще быстрее советую запрашивать только данные о тех датчиках, которые отображаются на экране. Хотя это ограничивает некоторый функционал приложения. Например, запись истории.

Считывание и расшифровка ошибок автомобиля

Ошибки автомобиля тоже могут быть различными и для них тоже существуют отдельные команды. Например:

А теперь пояснение.

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

3, 4, 5 символы формируются по этой таблице:

Исходя из этого можем попробовать разобрать следующий ответ 0001000000111110

Эпилог

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

Матвиенко Александр, Хоссейн Фахр.
P. S. Оригинальную английскую версию статьи можно найти здесь

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Читают сейчас

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

Похожие публикации

Анонс: общаемся об Android-разработке с Senior Android Developer Spotify Славой Савицким

Google запустила новый Android Developer Challenge

Краткое руководство как стать Google Certified Associate Android Developer

Курсы

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Минуточку внимания

Комментарии 58

Сейчас как решил вопрос прямого общения с CAN шиной через elm327.
Obd2 это протокол который должны поддерживать все автомобили любой марки.
По Can ходит проприетарный протокол, у разных производителей свой набор команд.

Can управляет всему функциями авто. Obd2 для диагностики малого количества параметров.
Например через obd2 я не могу посмотреть открыта дверь или закрыта, по Can могу.

Я поправлю: CAN НЕ управляет всеми функциями авто.

CAN — это сеть из контроллеров которые сидят на одной шине и общаются между собой. Такие сети можно связать между собой только через Gateway.
Обычно же CAN’ом ошибочно называют два провода на корых сидят контроллеры.

ODB2 это протокол, по которому контроллеры могут общатся с внешним миром.

Все верно. И простейший вариант: подключиться к CAN-шине через OBD-разъем, воткнув в него «китайский свисток» на основке ELM327 (адаптер).

А в документации этого адаптера есть описание и протокола CAN-шины, и команды управления, например, тут.

В ответ на команду вы получите код, расшифровку которого можно посмотреть, например, здесь. Но это только общая часть, действительная для практически всех производителей. А далее надо копать для каждого отдельно: Peugeot, Scoda, Reno, Volvo и т. д.

OBD — это грубо говоря стандарт на порт диагностики. CAN — это протокол обмена. В разъеме OBD2 может быть как CAN, так и что-то другое.

Вообще, рассматривайте CAN как ethernet для автомобиля. Как через обычный ethernet может ходить что угодно, начиная от голосовых звонков и заканчивая торрентами, так и на шине CAN может быть все что туда захочет запихнуть производитель авто.

Конечно. Вопрос, какие именно данные.
Я заказал пятидолларовый свисток из китая, а приложений в сторе валом.

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

Ээээ, правильнен сказать: «Самое дешёвое профессиональное CAN-устройство — от 100 у. е.» ;)

А аот верхней границы, увы, нет. :)))

Устройство — это просто адаптер. Вся соль в программе, которая будет подавать команды и разбирать затем ответ. А вот тут без знаний протоколов конкретных производителей НИКУДА не шагнешь. Поэтому и так дорого стоят.

Есть программа на python PyRen. Там многое очень доступно прямо из кода

Ну, не совсем — если вам будет нужен высокоточный и многоканальный CAN-сниффер & логгер для отладки программ — то там само по себе железо будет тоже не одну тысячу у. е. стоить. :)

В общем из известных мне профессиональных, но самых простых решений — где чисто на USB идёт поток данных, но там и оболочка есть простая и удобная, и API, и ещё пара мелочей — это вот:

Кажется, в «классических работах» Миллера и Валасека их тоже видел. :)

Эээ, тут я, увы, не знаю, что сказать — не видел, опыта нет. :)

Ну вот у меня как-то забарахлила приборка.
Ехать оставалось километров 200, а скорость 0. Да и обороты не особо верно кажет.
Подрубаем EML’ку и вуаля. Аналогичные истории с загоранием чека внезапным.

Пока у вас машина новая, это все не нужно — когда вы ездите на винтаже, то вот тут оно нужно и даже очень.

Если под словом OBD-2 Вы понимаете протокол, то нет, нельзя. Этот стандарт изначально предназначался для контроля за выбросами двигателя, и там есть только параметры, которые явно или косвенно на эти выбросы влияют.
Список параметров можно найти в википедии, «OBD-II PIDs». Также можно почитать стандарты, например ISO 14230 (платный, но можно найти в интернетах).

А если под словом OBD-2 подразумевать разъем, всё становится интереснее. В дорогих машинах он соединяется с остальной шиной через гейт, и кроме диагностики там ничего нет, а вот во всём, что попроще, прямо в разъеме видно весь обмен на шине. И вот там есть и скорость (сама приходит, ничего спрашивать не надо), и обороты, и угол руля (если есть ESP или усилитель достаточно умный). Текущей передачи, правда, не будет (если задний ход не считать :-) ), но её можно самому посчитать по отношению скорости и оборотов двигателя.

Конечно, если «чисто случайно» подключить OBD-разъем не к Diagnostic-CAN, а к скажем Body-CAN (а CAN распределитель не трудно найти), то там столько самого прийдет, что только успевай подставлять HDD :-)

По сути-то — что и где будет видно, это решение архитекторов конкретной модели.

И настройки гейтвеев (если они есть).

Как пример: когда я в самообразовательных и тестовых целях подключился на OBD-разъём моей сейчас семилетней Хюндай i30 — то там прекрасно было видно весь поток CAN-информации. С реакцией отдельных байтов и битов на открывание дверей, окон и пр.

Но если есть гейтвеи и строгая фильтрация — то мало что будет видно.

Все машины разные, гарантированного набора данных просто нет.
Вы можете примерно ориентироваться на то, что есть на приборной панели. Эти данные передаются через моторный CAN, но не факт что все. Например на моей Toyota Isis датчик уровня топлива подключен к приборке аналоговым проводом, и в моторном CAN отсутствует. Информация о номере передачи и вообще режимах автомата тоже отсутствует (лампочки на консоли подключены проводами напрямую к контроллеру автомата).
Для информации о кузове (управление замками, состояние концевиков дверей), надо подключаться к кузовному CAN. Опять же, для моей машины второго CAN просто нет, и такую информацию снять нельзя.

Чисто ради примера — вот там одна точка с моей машины в движении. Указаны все параметры, которые удалось снять из моторного CAN по стандартному протоколу:

Toyota Isis OBDII info:

mode 1: show current data; PID 0x01: MIL/DTC monitor; FUEL:GASOLINE; (0x00072100)
mode 1: show current data; PID 0x03: Fuel system status; Fuel corection 1: Open loop due to engine load OR fuel cut due to deceleration; (0x0400)
mode 1: show current data; PID 0x04: Calculated engine load value; 54% (0x8A)
mode 1: show current data; PID 0x05: Engine coolant temperature; 89°C (0x81)
mode 1: show current data; PID 0x06: Short term fuel % trim—Bank 1; (0x80)
mode 1: show current data; PID 0x07: Long term fuel % trim—Bank 1; (0x7D)
mode 1: show current data; PID 0x0B: Intake manifold absolute pressure; 53 kPa (0x35)
mode 1: show current data; PID 0x0C: Engine RPM; 1664 RPM (0x1A00)
mode 1: show current data; PID 0x0D: Vehicle speed; 85 km/h (0x55)
mode 1: show current data; PID 0x0E: Timing advance; 9° (0x92)
mode 1: show current data; PID 0x0F: Intake air temperature; 7°C (0x2F)
mode 1: show current data; PID 0x10: MAF air flow rate; 5 gramm/sec (0x0240)
mode 1: show current data; PID 0x11: Throttle position; 19% (0x32)
mode 1: show current data; PID 0x13: Oxygen sensors present; (0x03)
mode 1: show current data; PID 0x15: Bank 1, Sensor 2: Oxygen sensor voltage, Short term fuel trim; (0x03FF)
mode 1: show current data; PID 0x1C: OBD standards this vehicle conforms to; JOBD (Japan); (0x0A)
mode 1: show current data; PID 0x1F: Run time since engine start; 2889 sec (0x0B49)
mode 1: show current data; PID 0x21: Distance traveled with malfunction indicator lamp (MIL) on; 0 km (0x0000)
mode 1: show current data; PID 0x24: O2S1_WR_lambda(1): Equivalence Ratio Voltage; (0x9DCF9FFF)
mode 1: show current data; PID 0x2E: Commanded evaporative purge; 0% (0x00)
mode 1: show current data; PID 0x30: # of warm-ups since codes cleared; 255 (0xFF)
mode 1: show current data; PID 0x31: Distance traveled since codes cleared; 9531 km (0x253B)
mode 1: show current data; PID 0x33: Barometric pressure; 99 kPa = 742 mm Hg (Absolute) (0x63)
mode 1: show current data; PID 0x34: O2S1_WR_lambda(1): Equivalence Ratio; (0x9DCF829C)
mode 1: show current data; PID 0x3C: Catalyst Temperature Bank 1, Sensor 1; 731°C (0x1E1F)
mode 1: show current data; PID 0x3E: Catalyst Temperature Bank 1, Sensor 2; 575°C (0x180F)
mode 1: show current data; PID 0x42: Control module voltage; 13.867 V (0x362B)
mode 1: show current data; PID 0x43: Absolute load value; 18% (0x0030)
mode 1: show current data; PID 0x44: Command equivalence ratio; 0 (0x6D97)
mode 1: show current data; PID 0x45: Relative throttle position; 1% (0x04)
mode 1: show current data; PID 0x46: Ambient air temperature; 1°C (0x29)
mode 1: show current data; PID 0x47: Absolute throttle position B; 51% (0x84)
mode 1: show current data; PID 0x49: Accelerator pedal position D; 17% (0x2D)
mode 1: show current data; PID 0x4A: Accelerator pedal position E; 32% (0x52)
mode 1: show current data; PID 0x4C: Commanded throttle actuator; 19% (0x32)
mode 1: show current data; PID 0x4D: Time run with MIL on; 0 min (0x0000)
mode 1: show current data; PID 0x4E: Time since trouble codes cleared; 24406 min (0x5F56)
mode 3: show stored DTC; none
mode 7: show pending DTC (detected during current or last driving cycle); none

Источники:

https://habr. com/ru/post/444726/

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: