Ошибка 14230 4

Содержание

  1. Хакаем CAN шину авто. Мобильное приложение вместо панели приборов
  2. Программный сниффер VCDS
  3. Протокол UDS
  4. VW Transport Protocol 2.0
  5. Диагностический адаптер ELM327
  6. Мобильное приложение VAG Virtual Cockpit
  7. АвтоДиагност
  8. Используемые протоколы и применяемость OBD-II-диагностики на автомобилях разных марок

Хакаем CAN шину авто. Мобильное приложение вместо панели приборов

Я продолжаю изучать CAN шину авто. В предыдущих статьях я голосом открывал окна в машине и собирал виртуальную панель приборов на RPi. Теперь я разрабатываю мобильное приложение VAG Virtual Cockpit, которое должно полностью заменить приборную панель любой модели VW/Audi/Skoda/Seat. Работает оно так: телефон подключается к ELM327 адаптеру по Wi-Fi или Bluetooth и отправляет диагностические запросы в CAN шину, в ответ получает информацию о датчиках.

По ходу разработки мобильного приложения пришлось узнать, что разные электронные блоки управления (двигателя, трансмиссии, приборной панели и др.) подключенные к CAN шине могут использовать разные протоколы для диагностики, а именно UDS и KWP2000 в обертке из VW Transport Protocol 2.0.

Программный сниффер VCDS

Чтобы узнать по какому протоколу общаются электронные блоки я использовал специальную версию VCDS с программным сниффером в комплекте. В этот раз никаких железных снифферов на Arduino или RPi не пришлось изобретать. С помощью CAN-Sniffer можно подсмотреть общение между VCDS и автомобилем, чтобы затем телефон мог прикинуться диагностической утилитой и отправлять те же самые запросы.

Я собрал некоторую статистику по использованию диагностических протоколов на разных моделях автомобилей:

VW/Skoda/Seat (2006-2012) — приборная панель UDS. Двигатель и трансмиссия VW TP 2.0

Audi (2006-2012) — приборная панель VW TP 2.0. Двигатель UDS. Трансмиссия VW TP 2.0

VW/Skoda/Seat/Audi (2012-2021) — везде UDS

Протокол UDS

Unified Diagnostic Services (UDS) — это диагностический протокол, используемый в электронных блоках управления (ЭБУ) автомобильной электроники. Протокол описан в стандарте ISO 14229-1 и является производным от стандарта ISO 14230-3 (KWP2000) и ныне устаревшего стандарта ISO 15765-3 (Diagnostic Communication over Controller Area Network (DoCAN)). Более подробно в википедии.

Диагностические данные от двигателя по протоколу UDS (Skoda Octavia A7)

В моей машине (Skoda Octavia A5) приборка использует UDS протокол, это дало мне легкий старт разработки, т.к. данные были в простом формате Single Frame SF (фрейм, вся информация которого умещается в один CAN пакет) и большинство значений легко поддавались расшифровке. Volkswagen не дает документацию на формат значений, поэтому формулу расшифровки для каждого датчика приходилось подбирать методом логического мышления. Про UDS протокол очень хорошо и с подробным разбором фреймов написано на canhacker.ru.

Разбор UDS пакета в формате Single Frame

Пример запроса и ответа температуры моторного масла:

Запрос температуры моторного масла:

7E0 — Адрес назначения (ЭБУ двигателя)

Байт 0 (0x03) — Размер данных (3 байта)

Байт 1 (0x22) — SID идентификатор сервиса (запрос текущих параметров)

Байт 2, 3 (0x11 0xBD) — PID идентификатор параметра (температура моторного масла)

Байт 4, 5, 6, 7 (0x55) — Заполнитель до 8 байт

Ответ температуры моторного масла:

7E8 — Адрес источника (Диагностический прибор)

Байт 0 (0x05) — Размер данных (5 байт)

Байт 1 (0x62) — Положительный ответ, такой SID существует. 0x22 + 0x40 = 0x62. (0x7F) — отрицательный ответ

Байт 2, 3 (0x11 0xBD) — PID идентификатор параметра (температура моторного масла)

Байт 4, 5 (0x0B 0x74) — значение температуры моторного масла (20.1 °C формулу пока что не смог подобрать)

Байт 6, 7 (0x55) — Заполнитель до 8 байт

Первая версия мобильного приложения VAG Virtual Cockpit умела подключаться только к приборной панели по UDS.

VAG Virtual Cockpit — экран с данными от приборной панели по протоколу UDS

VW Transport Protocol 2.0

Volkswagen Transport Protocol 2.0 используется в качестве транспортного уровня, а данные передаются в формате KWP2000. Keyword Protocol 2000 — это протокол для бортовой диагностики автомобиля стандартизированный как ISO 14230. Прикладной уровень описан в стандарте ISO 14230-3. Более подробно в википедии.

Т.к. KWP2000 использует сообщения переменной длины, а CAN шина позволяет передавать сообщения не больше 8 байт, то VW TP 2.0 разбивает длинное сообщение KWP2000 на части при отправке по CAN шине и собирает заново при получении.

Диагностические данные от двигателя по протоколу KWP2000 (Skoda Octavia A5)

ЭБУ двигателя моей машины использует протокол VW TP 2.0, поэтому мне пришлось изучить его. Видимо Volkswagen разрабатывала транспортный протокол не только для работы по надежной CAN шине, но и для менее надежных линий связи, иначе нет объяснения для чего требуется такая избыточная проверка целостности данных. Главным источником информации по VW TP 2.0 является сайт https://jazdw.net/tp20.

Разбор протокола VW TP 2.0 на примере подключения к первой группе двигателя:

200 01 C0 00 10 00 03 01

Настраиваем канал с двигателем. Байт 0: 0x01 — двигатель, 0x02 — трансмиссия. Байт 5,4: 0x300 — адрес источника

201 00 D0 00 03 40 07 01

Получили положительный ответ. Байт 5,4: 0x740 — к двигателю обращаемся по этому адресу

740 A0 0F 8A FF 32 FF

Настраиваем ЭБУ на отправку сразу 16 пакетов и выставляем временные параметры

300 A1 0F 8A FF 4A FF

Получили положительный ответ

740 10 00 02 10 89

Отправляем команду KWP2000 startDiagnosticSession. Байт 0: 0x10 = 0b0001 — последняя строка данных + 0x0 счетчик отправляемых пакетов 0 (0x0 — 0xF)

Получили первый ACK

300 10 00 02 50 89

Получили положительный ответ. Байт 0: 0x10 — cчетчик принимаемых пакетов 0

Мы отправили первый ACK, что получили ответ

740 11 00 02 21 01

Делаем запрос. Байт 0: 0x11 — счетчик отправляемых пакетов 1. Байт 3: 0x21 — запрос параметров. Байт 4: 0x01 — из группы 1

Получили второй ACK

300 22 00 1A 61 01 01 C8 13

Байт 0: 0x22 — 0b0010 (не последняя строка данных) + 0x02 (cчетчик принимаемых пакетов 2). Байт 1,2: 0x00 0x1A длина 26 байт. Байт 3,4: 0x61 0x01 — положительный ответ на команду запроса параметров 0x21+0x40=0x61 из 0x1 группы. Байт 5: 0х01 — Запрос RPM (соответсвует протоколу KW1281). Байт 6,7: (0xC8 * 0x13)/5 = 760 RPM (формула соответствует протоколу KW1281)

300 23 05 0A 99 14 32 86 10

Байт 1: 0x05 — запрос ОЖ. Байт 2,3: (0x0A * 0x99)/26 = 57.0 C. Байт 4: 0x14 = запрос лямбда контроль %. Байт 5,6: 0x32*0x86; Байт 7: 0х10 — двоичная настройка

300 24 FF BE 25 00 00 25 00

0x25 0x00 x00 — Заполнитель, до 8 параметров

300 15 00 25 00 00 25 00 00

Байт 0: 0x15 — 0b0001 (последняя строка данных) + 0x5 (счетчик принимаемых пакетов 5)

Отправляем ACK. Прибывляем к нашему предыдущему ACK количество полученных пакетов 0xB1 + 0x4 = 0xB5

Запрос KeepAlive, что мы еще на связи

740 A1 0F 8A FF 4A FF

Мы разрываем связь

ЭБУ в ответ тоже разрывает связь

Во второй версии мобильного приложения VAG Virtual Cockpit появилась возможность диагностировать двигатель и трансмиссию по протоколу VW TP 2.0.

VAG Virtual Cockpit — экран с данными от двигателя по протоколу VW TP 2.0

Диагностический адаптер ELM327

Для меня некоторое время было вопросом, как получить данные из CAN шины и передать на телефон. Можно было бы разработать собственный шлюз с Wi-Fi или Bluetooth, как это делают производители сигнализаций, например Starline. Но изучив документацию на популярный автомобильный сканер ELM327 понял, что его можно настроить с помощью AT команд на доступ к CAN шине.

Копия диагностического сканера ELM327 Не все ELM327 одинаково полезны

Оригинальный ELM327 от компании elmelectronics стоит порядка 50$, в России я таких не встречал в продаже. У нас продаются только китайские копии/подделки, разного качества и цены 10-30$. Бывают полноценные копии, которые поддерживают все протоколы, а бывают и те которые умеют отвечать только на несколько команд, остальные игнорируют, такие адаптеры не имеют доступ к CAN шине. Я например пользуюсь копией Viecar BLE 4.0, который поддерживает 100% всех функций оригинала.

Для работы с протоколом UDS через ELM327 нужно указать адреса назначения, источника и разрешить длинные 8 байтные сообщения, по умолчанию пропускается максимум 7 байт.

Последовательность ELM327 AT команд для работы с UDS по CAN шине:

Для работы с протоколом KWP2000 через ELM327 нужно только указать адреса назначения и источника.

Последовательность ELM327 AT команд для работы с VW TP 2.0 по CAN шине:

Мобильное приложение VAG Virtual Cockpit

Для разработки мобильного приложения подключаемого к автомобилю требовалось:

Сниффером собрать трафик от диагностической утилиты VCDS

Изучить работу протоколов UDS, VW TP 2.0, KWP2000

Настроить диагностический сканер ELM327 на работу с UDS и VW TP 2.0

Изучить новый для меня язык программирования Swift

Мобильное приложение VAG Virtual Cockpit для iOS

В итоге получилось приложение, которое сочетает в себе функции отображения точных данных панели приборов и диагностика основных параметров двигателя и трансмиссии.

Пару слов про точность данных. Штатная панель приборов не точно показывает скорость — завышает показания на 5-10 км/ч, стрелка охлаждающей жидкости всегда на 90 °C, хотя реальная температура может быть 80 — 110 °C, стрелка уровня топлива до середины идет медленно, хотя топлива уже меньше половины и при нуле на самом деле топливо еще есть в баке. Производитель это делает для удобства и безопасности водителя.

На данный момент приложение показывает следующие параметры:

Приборная панель

Двигатель

Трансмиссия (температура)

1) Какая дверь открыта
2) Скорость
3) Обороты
4) Температура масла
5) Температура ОЖ
6) Топливо в баке в л.
7) Запас хода в км.
8) Средний расход
9) Время в машине
10) Пробег
11) Температура за бортом

1) Обороты
2) Массовый расход воздуха
3) Температура забора воздуха
4) Температура выхлопа (рассчитанная)
5) Критический уровень масла
6) Уровень масла
7) Наддув турбины (реальный)
8) Наддув турбины (ожидаемый)
9) Пропуски зажигания в цилиндрах
10) Углы откатов зажигания в цилиндрах

1) ATF AISIN (G93)
2) DSG6 (G93)
3) Блок управления DSG6 (G510)
4) Масло диска сцепления DSG6 (G509)
5) Мехатроник DSG7 (G510)
6) Процессор DSG7
7) Диск сцепления DSG7

Я стремлюсь чтобы приложение поддерживало как можно больше моделей автомобилей. Пока что поддерживаются производители: Volkswagen, Skoda, Seat, Audi. На разных комплектациях могут отображаться не все параметры, но это поправимо.

Сейчас я провожу тестирование версии 3.0. Приложение доступно только на iOS, после релиза 3.0 перейду к разработке версии для Android.

Если интересно потестировать и есть желание принять участие в проекте, то установить приложение можно по ссылке. Также я веду бортжурнал на drive2.ru, где делюсь полезной информацией и новостями о VAG Virtual Cockpit.

Источник

АвтоДиагност

Используемые протоколы и применяемость OBD-II-диагностики на автомобилях разных марок

В рамках OBD-II используются пять протоколов обмена данными — ISO 9141, ISO 14230 (также именуется KWP2000), PWM, VPW и CAN (также каждый из протоколов имеет несколько разновидностей — например, разновидности отличаются по скорости обмена информацией). В Интернете встречаются «таблицы применимости», где указываются перечни марок и моделей автомобилей и поддерживаемые ими OBD-II-протоколы. Однако, надо учитывать, что одна и та же модель с одним и тем же двигателем, одного года выпуска может быть выпущена для разных рынков с поддержкой разных протоколов диагностики (точно также протоколы могут различаться и по моделям двигателей, годам выпуска). Таким образом, отсутствие автомобиля в списках не означает, что он не поддерживает OBD-II, так же как и присутствие не означает, что поддерживает и, тем более, полностью поддерживает (возможны неточности в списке, различные модификации автомобиля и пр.). Еще сложнее судить о поддержке конкретной разновидности OBD-II-стандарта.

Общей предпосылкой для того, чтобы предположить, что автомобиль поддерживает OBD-II диагностику, является наличие 16-контактного диагностического разъема (DLC — Diagnostic Link Connector) трапециевидной формы (на подавляющем большинстве OBD-II автомобилей он находится под приборной панелью со стороны водителя; разъем может быть как открыт, так и закрыт легко снимаемой крышкой с надписью «OBD-II», «Diagnose» и т.п.). Тем не менее, это условие необходимое, но недостаточное! Получить справку о расположении разъемов (в том числе нестандартном) можно на странице «Информация и ПО». Также разъем OBD-II иногда устанавливается на автомобили, вообще не поддерживающие ни один из OBD-II-протоколов. В таких случаях необходимо пользоваться сканером, рассчитанным на работу с заводскими протоколами конкретной марки автомобиля — например, это касается автомобилей Opel Vectra B европейского рынка 1996-1997 гг. Для оценки применимости того или иного сканера для диагностики конкретного автомобиля необходимо определить, какой конкретно из OBD-II протоколов используется на конкретном автомобиле (если OBD-II вообще поддерживается).

Для этого можно:

1. Посмотреть в технической документации непосредственно к данному автомобилю (но не в общем руководстве по данной марке/модели!). Также полезно осмотреть все идентификационные таблички на автомобиле — возможно наличие таблички «OBD-II compliant» (поддерживает OBD-II) или «OBD-II certified» (сертифицировано на поддержку OBD-II);

2. Посмотреть в информационной базе данных, типа Mitchell-on-Demand и т.п. Однако, это также не абсолютный способ, так как база может содержать неточности, включать информацию по автомобилям, выпущенным для другого рынка и т.п. Естественно, использование специализированных дилерских баз по отдельной марке повышает степень достоверности информации;

3. Использовать сканер, позволяющий определить, какой из OBD-II протоколов используется на машине. Из предлагаемых нами приборов автоматически это сможет сделать Х-431 и OZEN MOByDic 2600. С помощью комплекта ScanTool Вы сможете это сделать вручную путем последовательной смены используемых адаптеров и проверки наличия связи с ЭБУ автомобиля. Если никаких предположений по используемому протоколу нет, то начинать перебор стоит с протокола ISO как наиболее распространенного (либо с протокола, указанного для диагностируемой машины в таблице);

4. Осмотреть диагностический разъем и определить наличие выводов в нем (как правило, присутствует только часть задействованных выводов, а каждый протокол использует свои выводы разъема).

Назначение выводов («распиновка») 16-ти контактного диагностического разъема OBD-II (стандарт J1962):

02 — J1850 Bus+

04 — Chassis Ground

05 — Signal Ground

06 — CAN High (J-2284)

07 — ISO 9141-2 K-Line

10 — J1850 Bus-

14 — CAN Low (J-2284)

15 — ISO 9141-2 L-Line

16 — Battery Power (напряжение АКБ)

По наличию выводов можно ориентировочно судить об используемом протоколе при помощи следующей таблицы:

Источник

Кажется, ваша инициализация obd и выбор протокола obd завершились неудачно. Вы должны выполнить следующие действия:

AT D
AT Z
AT E0
AT L0
AT S0
AT H0
AT SP 0

При ответе команды выбора протокола без какой-либо ошибки, как показано ниже, ваше соединение в порядке, и вы можете запросить новые команды, такие как команда «0100».


Ошибка:

  • UNABLE TO CONNECT
  • BUS INIT… ERROR
  • ?
  • НЕТ ДАННЫХ
  • STOPPED
  • ОШИБКА

Команда Объяснение:

AT D → Установить все значения по умолчанию

AT Z → Reset Obd

AT E0 → Отключение эха

AT L0 → Подача строки

AT S0 → Пробелы

AT H0 → Заголовки

AT SP 0 → Установить протокол на 0 «Авто», искать все протоколы и подключать его с соответствующим протоколом для этого obd

Для команды AT SP, если вы знаете свой протокол интерфейса OBD вашего автомобиля, вы можете выбрать этот конкретный протокол, кроме автоматического и поиска всех возможных протоколов. Вы можете использовать разные входы:


Параметры протокола: Hex [0,1,2,…, B, C]

Автоматический выбор протокола и сохранение.
AUTO → 0

41,6 кбод
SAE_J1850_PWM → 1

10,4 кбод
SAE_J1850_VPW → 2

5 baud init
ISO_9141_2 → 3

5 baud init
ISO_14230_4_KWP → 4

Быстрая инициализация
ISO_14230_4_KWP_FAST → 5

11 бит ID, 500 кбод
ISO_15765_4_CAN → 6

29 бит ID, 500 кбод
ISO_15765_4_CAN_B → 7

11 бит ID, 250 кбод
ISO_15765_4_CAN_C → 8

29 бит, 250 кбод
ISO_15765_4_CAN_D → 9

29 бит, 250 кбод (настраивается пользователем)
SAE_J1939_CAN → A

11 бит ID (настраивается пользователем), 125 кбод (настраивается пользователем)
USER1_CAN → B

11 бит ID (настраивается пользователем), 50 кбод (настраивается пользователем)
USER2_CAN → C

Aku

Offline

Зарегистрирован: 04.12.2018

Кидаю. Это пример, на его основе соберете свой.

#define F_CPU 16000000UL

#include "din_ind.h"
#include "ds18b20.h"

//https://www.drive2.ru/c/1195541/

#include <avr/io.h>

#define TX 1
#define SPEAKER 2
#define BUTTON 3
#define MODEDISPMAX 6 //количество режимов 

#define W1Syncro 50  // 20-300 Ожидание байта SYNC(300-timeOut)
#define W2byteOut 5 // 5-20 //10(20-timeOut)
#define W3byteIn 15  // 0-20
//#define W4KeyTo 30  // 25 мс <= W4 <= 50 мс (время между завершенным получением ключа 2 и началом отправки инвертированного ключа 2)
#define TxToRx 100   // от отправки до приема 55-5000

#define TIMEDISP 60000*5 //время отображения параметра 5 минуту
#define TIMEKLINE 100 //время между опросами Kline

#define BEEPON 60 //длительность включения BEEP
#define BEEPOFF 50 //длительность выключения BEEP
#define BEEPPAUSE 1000 //длительность между пачками BEEP

#define ADC_AVERAGE 250 // кол-во замеров ADC

#define TIMEADC 1000 //время между опросами температуры DS18b20 и АЦП

char ButtonState = false; // состояние кнопки
char PrevButtonState = false; //предыдущее состояние кнопки
unsigned long PrevButtMillis = 0; //время последнего нажатия кнопки

char ModeDisp = 0; // текущий режим

char StateSelectMode = false; // состояние кнопки для начала отсчета времени возврата 
unsigned long CurrentStateMillis = 0; // время текущего состояния кнопки

unsigned long PrevKlineMillis = 0; 
unsigned long PrevADCMillis = 0;

unsigned long BeepMillis = 0;
unsigned long PrevBeepMillis = 0; 
unsigned long ForceBeepCount; //команда на включение бипера на заданное количество Beep

unsigned char EngCoolTemp[6]  = {0xC2, 0x33, 0xF1, 0x01, 0x05, 0xEC};
unsigned char CalcEngLoad[6]  = {0xC2, 0x33, 0xF1, 0x01, 0x04, 0xEB};
unsigned char VehicleSpeed[6] = {0xC2, 0x33, 0xF1, 0x01, 0x0D, 0xF4};
unsigned char EngineRPM[6]    = {0xC2, 0x33, 0xF1, 0x01, 0x0C, 0xF3};
unsigned char Trouble[5]      = {0xC2, 0x33, 0xF1, 0x03, 0xE9};

unsigned char KeysBuf[4]; 
unsigned char Syncro= 0;
unsigned char Key2 = 0;
unsigned char Clear = 0;
unsigned char Ready = 0;

unsigned char RxBuffer[10] = {0};
signed char   Temperature = 0;
unsigned int  Cel = 0;
unsigned char Speed = 0;
unsigned short Rpm = 0;

unsigned int Volts = 0; //Напряжение в вольтах

char ForceDisplayVoltage = false;  // флаг принудительного отображения напряжения
char ForceDisplayTemper = false;   // флаг принудительного отображения температуры
char ForceDisplayCel = false;      // флаг принудительного отображения нагрузки
char ForceDisplaySpeed = false;    // флаг принудительного отображения скорости
char ForceDisplayRPM = false;      // флаг принудительного отображения оборотов

const int SoundPin = 2;
const byte COUNT_NOTES = 39;

int DelaySound = 1000; 

int tones[COUNT_NOTES] = {
 392, 392, 392, 311, 466, 392, 311, 466, 392,
 587, 587, 587, 622, 466, 369, 311, 466, 392,
 784, 392, 392, 784, 739, 698, 659, 622, 659,
 415, 554, 523, 493, 466, 440, 466,
 311, 369, 311, 466, 392
};
/*
int durations[COUNT_NOTES] = {
 350, 350, 350, 250, 100, 350, 250, 100, 700,
 350, 350, 350, 250, 100, 350, 250, 100, 700,
 350, 250, 100, 350, 250, 100, 100, 100, 450,
 150, 350, 250, 100, 100, 100, 450,
 150, 350, 250, 100, 750
};
*/

int durations[COUNT_NOTES] = {
 300, 300, 300, 200, 50, 300, 200, 50, 650,
 300, 300, 300, 200, 500, 300, 200, 500, 650,
 300, 200, 500, 300, 200, 500, 500, 500, 400,
 100, 300, 200, 50, 50, 50, 400,
 100, 300, 200, 50, 700
};

void sound() {
    for (int i = 0; i <= COUNT_NOTES; i++ ) {
        tone( SoundPin, tones[i], durations[i] * 2 );
        delay( durations[i] * 2 );
        noTone( SoundPin );
    }
}

//////////////////////
// Функция чтения ADC
//////////////////////
unsigned long Read_ADC() {
 if ((millis() - PrevADCMillis >= TIMEADC)) { 
    
   DIDR0 |=0x80; // отключаем цифровой вход ADC7
  
   unsigned char i;
   unsigned long result = 0;
  
   // Настраиваю  АЦП
    ADMUX |= (1 << REFS1)|(1 << REFS0) // Int. 1.1V Ref. with ext. cap. at AREF.       
        |(1 << MUX0)|(1 << MUX1)|(1 << MUX2);  // ADC7                                
         // |(1 << MUX3); // temper ADC
              
    ADCSRA |= (1 << ADEN) // ADC enable
        |(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0); // CK/128
  
    for (i=0; i<ADC_AVERAGE;i++) {  
      do {ADCSRA |= (1 << ADSC);} // Старт преобразования
      while ((ADCSRA & (1 << ADIF)) == 0); // ждем флаг ADIF 
      result = result + ADCW;
      //result = result + (ADCL|ADCH << 8);
      //_delay_us(10);
      ADCSRA |= (1 << ADIF);    // сбрасываем флаг ADIF      
      ADCSRA &= ~(1 << ADSC);   // Стоп преобразования
    }
    return result / ADC_AVERAGE;
  PrevADCMillis = millis();
 }
}

void setup() {
  InitPorts(); 
  InitDinInd();
  InitTimer2(); 
  ///InitKL_5baud();
  //ReadTrouble(); 

  ///tone(SoundPin, 2014);
  ///delay(DelaySound);
  ///noTone(SoundPin); // Выключаем звук

  sound();
}

void loop() {
  ProcessButton();
  ReadTemperDs18B20();
  Read_ADC();
  ///ProcessKLine(); 
  ProcessDisplay(); 
  ProcessData(); 
  ProcessBeeper();
}

///////////////////////////////
//Функция инициализации Портов
///////////////////////////////
void InitPorts() {
  pinMode(TX,OUTPUT);
  digitalWrite(TX,HIGH);   
  pinMode(BUTTON, INPUT_PULLUP);   
  pinMode(SPEAKER, OUTPUT);
  digitalWrite(SPEAKER,LOW);  
}

////////////////////////
//функция опроса кнопки
////////////////////////
void ProcessButton() {
  PrevButtonState = false; //предыдущее состояние кнопки
    ButtonState = (!digitalRead(BUTTON)); // читаем текущие состояние кнопки по нажатию
    //ButtonState = digitalRead(BUTTON); // читаем текущие состояние кнопки по отжатию
    if (!PrevButtonState && ButtonState && (millis() - PrevButtMillis > 200)) { // была не нажата, стала нажата и с прошлого нажатия прошло 200ms
      PrevButtMillis = millis(); // Запоминаем время первого срабатывания
      ButtonState = true;
      if (++ModeDisp >= MODEDISPMAX) ModeDisp = 0; 
    }
     else  
        PrevButtonState = ButtonState; // не нажата   
}

//////////////////////////////////
// Функция отображения параметров
//////////////////////////////////
void ProcessDisplay() {
CurrentStateMillis = millis(); //записали время текущего отображения параметра

  if (!(StateSelectMode && (CurrentStateMillis - PrevButtMillis) < TIMEDISP))//если не 0 режим и после нажатия прошло время отображения параметра
    ModeDisp = 0; //переходим на 0 режим, температура салона

  if (ForceDisplayVoltage) {    //принудительно отображаем напряжение
    ForceDisplayVoltage = false;
    ModeDisp = 1;
  }
      
  if (ForceDisplayTemper) {    //принудительно отображаем температуру
    ForceDisplayTemper = false;
    ModeDisp = 2;
  }

  if (ForceDisplayCel) {    //принудительно отображаем нагрузку
    ForceDisplayCel = false;
    ModeDisp = 3;
  }

  if (ForceDisplaySpeed) {    //принудительно отображаем скорость
    ForceDisplaySpeed = false;
    ModeDisp = 4;
  }

  if (ForceDisplayRPM) {       //принудительно отображаем обороты
    ForceDisplayRPM = false;
    ModeDisp = 5;
  }
  
  switch (ModeDisp) {
    //температура DS18B20
    case 0:
      StateSelectMode = true;     
      DispTemperDs18B20();
      Digit[0] = 16;
      Dp1 = 0;
      Dp3 = 0; 
      break;  

//напряжение борт. сети
    case 1:
      Volts = Read_ADC() * 100 / 475;   // Read_ADC() * 1024 / 1.1; 
      //Volts = Read_ADC() * (10240 / 11);   // Read_ADC() * 1024 / 1.1;
      //Volts = Volts / 1100;  
      ///Volts = Read_ADC() * 11; 
      ///Volts = Volts / 1024;
      ///Volts = Volts * 22;
       
      if ((Volts%1000/100)==0) Digit[0] = 16;  
      else Digit[0] = Volts%1000/100; // Десятки вольт
      Digit[1] = Volts%100/10;  // Единицы вольт
      Digit[2] = Volts%10;    // 1/10 вольт 
      Digit[3] = 28;  
      Dp1 = 1;
      Dp3 = 0; 
      break; 
    
//температура K-Line
    case 2:   
      unsigned char temper_module;
      temper_module = Temperature >=0 ? Temperature : - Temperature;       
      if (Temperature < 0) Digit[0] = 18;       // "прочерк" 
      else {
        if ((temper_module%1000/100) == 0) Digit[0] = 16; // если 0 то пусто
        else Digit[0] = temper_module%1000/100; // Сотни 
      }        
      Digit[1] = temper_module%100/10; // Десятки 
      Digit[2] = temper_module%10;     // Единицы 
      Digit[3] = 19;                   // "Градус"  
      Dp1 = 0;
      Dp3 = 1;  
      break;  
    
//нагрузка K-Line
    case 3:
      if ((Cel%1000/100) == 0) Digit[0] = 16; // если 0 то пусто
      else Digit[0] = Cel%1000/100;  // Сотни           
      Digit[1] = Cel%100/10;         // Десятки 
      Digit[2] = Cel%10;             // Единицы 
      Digit[3] = 24;                 // "L" 
      Dp1 = 0;
      Dp3 = 0;    
      break; 
      
// скорость K-Line
    case 4:
      if (((Speed)%1000/100) == 0) Digit[0] = 16; // если 0 то пусто
      else Digit[0] = Speed%1000/100;  // Сотни           
      Digit[1] = Speed%100/10;         // Десятки 
      Digit[2] = Speed%10;             // Единицы 
      Digit[3] = 21;                   // "c" 
      Dp1 = 0; 
      Dp3 = 0;   
      break;    
       
//обороты K-Line
    case 5:
      if (Rpm % 10000/1000 == 0) Digit[0] = 16; // если 0 то пусто 
      else Digit[0] = Rpm%10000/1000;         // Тысячи
      Digit[1] = Rpm%1000/100;                // Сотни 
      Digit[2] = Rpm%100/10;                  // Десятки 
      Digit[3] = Rpm%10/1;                    // Единицы 
      Dp1 = 0; 
      Dp3 = 0;  
      break;
  }
}

////////////////////////////////////
// Функция чтения параметров K-Line
////////////////////////////////////
void ProcessKLine() {
  static char index;            //номер команды
  
  if (!(millis() - PrevKlineMillis >= TIMEKLINE)) return;
  
    if (++index>=4) index = 0;
    switch (index) {
      
//температура
      case 0:
        TxBuf(EngCoolTemp,sizeof(EngCoolTemp));           
        delay(TxToRx);          
        if (Serial.available()) {
          for (int i = 0; i < 7; i++) {    
            unsigned char byte_in = Serial.read();
            RxBuffer[i] = byte_in;  
            delay(W3byteIn); //5ms
          }
        } 
        if (RxBuffer[0]==0x83 && RxBuffer[1]==0xF1 && RxBuffer[2]==0x10
          && RxBuffer[3]==0x41 && RxBuffer[4]==0x05) {
          Temperature = RxBuffer[5];
          //Temperature = 0;
          Temperature = Temperature - 0x28;     
        } else {
          RxBuffer[5] = 0;
          Temperature = 0;
        }
        break;   

//Нагрузка
      case 1:
        TxBuf(CalcEngLoad,sizeof(CalcEngLoad)); 
        delay(TxToRx);  
        if (Serial.available()) {
          for (byte i = 0; i < 7; i++) {    
            unsigned char byte_in = Serial.read();
            RxBuffer[i] = byte_in;  
            delay(W3byteIn);
          }
        }      
        if (RxBuffer[0]==0x83 && RxBuffer[1]==0xF1 && RxBuffer[2]==0x10
          && RxBuffer[3]==0x41 && RxBuffer[4]==0x04) {
          //RxBuffer[5] = 128;
          Cel = RxBuffer[5] * 100;   
          Cel = Cel / 255;
          RxBuffer[5] = 0; 
        } else {
          RxBuffer[5] = 0; 
          Cel = 0;  
        }
        break;
            
//скорость 
      case 2:
        TxBuf(VehicleSpeed,sizeof(VehicleSpeed)); 
        delay(TxToRx);  
        if (Serial.available()) {
          for (byte i = 0; i < 7; i++) {    
            unsigned char byte_in = Serial.read();
            RxBuffer[i] = byte_in;  
            delay(W3byteIn);
          }
        }      
        if (RxBuffer[0]==0x83 && RxBuffer[1]==0xF1 && RxBuffer[2]==0x10
          && RxBuffer[3]==0x41 && RxBuffer[4]==0x0D) {  
          Speed = RxBuffer[5];
          //Speed = 79;
          RxBuffer[5] = 0; 
        } else {
          RxBuffer[5] = 0; 
          Speed = 0;  
        }
        break;
        
//обороты  
      case 3:
        TxBuf(EngineRPM,sizeof(EngineRPM));    
        delay(TxToRx);     
        if (Serial.available()) {
          for (byte i = 0; i < 8; i++) {    //7byte
            unsigned char byte_in = Serial.read();
            RxBuffer[i] = byte_in;  
            delay(W3byteIn);
          }
        }     
        if (RxBuffer[0]==0x84 && RxBuffer[1]==0xF1 && RxBuffer[2]==0x10 
            && RxBuffer[3]==0x41 && RxBuffer[4]==0x0C) {        
          Rpm = (256*RxBuffer[5]) + RxBuffer[6]; 
          Rpm = Rpm/4; 
          RxBuffer[5] = 0;
          RxBuffer[6] = 0;         
        } else {
            RxBuffer[5] = 0;
            RxBuffer[6] = 0; 
            Rpm = Rpm/4; 
        }
        break;
      //default: indexKLine = 0;
    }   
    PrevKlineMillis = millis();
}

////////////////////////////
// Функция обработки данных
////////////////////////////
void ProcessData() {    
  if (Temperature >= 110) {ForceBeepCount = 15; ForceDisplayTemper = true;}
  if ((Volts <= 10)&&(Volts >= 15)) {ForceBeepCount = 1; ForceDisplayVoltage = true;}
  if (Temperature == 40) {ForceBeepCount = 5; ForceDisplayTemper = true;}
  if (Speed == 75) {ForceBeepCount = 3; ForceDisplaySpeed = true;}
  if (Rpm >= 3800) {ForceBeepCount = 10; ForceDisplayRPM = true;} 
}

//////////////////////////
// Функция обработки Beep
//////////////////////////
void ProcessBeeper() {
  static char index;
  static char count;
  
  switch (index) {
    case 0: 
      if (!((millis()-PrevBeepMillis) >= BeepMillis)) break; 
        if (ForceBeepCount) {
          count = ForceBeepCount;
          ForceBeepCount = 0;
          PrevBeepMillis = millis(); 
          BeepMillis = 0;       
          index = 1;
        }    
      break;    
   
    case 1:
      if (!((millis()-PrevBeepMillis) >= BeepMillis)) break;
        BEEPER_ON();
        PrevBeepMillis = millis(); 
        BeepMillis = BEEPON;      
        index = 2;
      break;
    
    case 2: 
      if (!((millis()-PrevBeepMillis) >= BeepMillis)) break; 
      BEEPER_OFF();  
        if (--count>0) {
          PrevBeepMillis = millis(); 
          BeepMillis = BEEPOFF; 
          index = 1;   
        }
        else {
          PrevBeepMillis = millis(); 
          BeepMillis = BEEPPAUSE; 
          index = 0;                    
        }
      break;
   }
}

///////////////////////////////////////////////
//Функция инициализации Таймера2 для Дин. Инд.
///////////////////////////////////////////////
void InitTimer2() {
  cli();// Глобально запрещаю прерывания
  TCCR2A = 0;
  TCCR2B = 0;
  TIMSK2 = 0; 
  TCCR2A |= (1<<COM2A0); // Toggle OC2A,No CTC
  TCCR2B |= (1<<CS21)|(1<<CS20);              // Presc. = 32
  //TCCR2B |= (1<<CS22);                      // Presc. = 64
  TIMSK2 |= (1<<TOIE2); // enable timer overflow interrupt
  sei();// Глобально разрешаю прерывания 
}

//////////////////////////////////
// Обработчик прерывания дин. инд.
//////////////////////////////////
ISR(TIMER2_OVF_vect) { 
  RefreshDinInd();
}

///////////////////////////////
//Функция инициализации K-Line
///////////////////////////////
void InitKL_5baud() {
  delay(4000); //ждем перед инициализацией
  digitalWrite(TX,LOW); // start
  delay(200);
  digitalWrite(TX,HIGH); // 1,2
  delay(400);
  digitalWrite(TX,LOW); // 3,4
  delay(400);
  digitalWrite(TX,HIGH); // 5,6
  delay(400);
  digitalWrite(TX,LOW); // 7,8
  delay(400);
  digitalWrite(TX,HIGH); // stop
  delay(200);
//end 5-baud
  
  Serial.begin(10400); //60ms минимум - время настройки 10400
  delay(W1Syncro);     // 50ms (300-timeOut) 
  
//wait syncro 
  while (!(Serial.available()));
  Syncro = Serial.read();   
  if (Syncro == 0x55) MsbToLed(Syncro); 
  else while (1);
  
//wait keys  
  while (!(Serial.available()));
  for (byte i = 0; i < 2; i++) {    //2байта
    KeysBuf[i] = Serial.read();
    delay(W3byteIn); //15
  }
  MsbToLed(KeysBuf[0]); 
  LsbToLed(KeysBuf[1]);  
  delay(W2byteOut); //5 (20-timeOut) key2 0-24работает
  
//send key2   
  Key2 = KeysBuf[1];  
  if (Key2 == 0x8F) Serial.write(~Key2);    //ok            
  else while (1);
  
//получаем эхо отправленного байта Key2
  while (!(Serial.available()));
  unsigned char Clear = Serial.read();  

  while (!(Serial.available()));
  Ready = Serial.read(); 
    
  if (Ready == 0xCC) { 
  }  
  else while (1);
  delay(2000);
}

///////////////////////////////////
//Функция отправки данных по KLine
///////////////////////////////////
void TxBuf(unsigned char *array, unsigned int bufSizeTx) {
  for (int i = 0; i < bufSizeTx; i++) {     
    Serial.write(array[i]); 
    while (!(Serial.available()));
    unsigned char Clear = Serial.read();  
    delay(W2byteOut); 
  }
}
/////////////////////////
//Функция включения BEEP
/////////////////////////
void BEEPER_ON() {
  digitalWrite(SPEAKER,HIGH);  
}

//////////////////////////
//Функция выключения BEEP
//////////////////////////
void BEEPER_OFF() {
  digitalWrite(SPEAKER,LOW);  
}

////////////////////////
//Функция чтения ошибок
////////////////////////
void ReadTrouble() {
  TxBuf(Trouble,sizeof(Trouble));           
  delay(TxToRx);    
  if (Serial.available()) {
    for (int i = 0; i < 11; i++) {    //всего 10
      unsigned char byte_in = Serial.read();
      RxBuffer[i] = byte_in;  
      delay(W3byteIn);
    }
  } 

  char dtc1 = (RxBuffer[5] && 0x0C) >> 6;  
  char dtc2 = (RxBuffer[5] && 0x30) >> 4;
  char dtc3 =  RxBuffer[5] && 0x0F;
  char dtc4 = (RxBuffer[6] && 0xF0) >> 4;
  char dtc5 =  RxBuffer[6] && 0x0F;

  RxBuffer[5] = 0;
  RxBuffer[6] = 0;
  
  if (dtc2||dtc3||dtc4||dtc5) {
    Digit[0] = 14;
    Digit[1] = 22;
    Digit[2] = 30;
  }
  
  //char code = ' ';
  switch (dtc1) {
    case 0x00 :
      //code = 'P';
      Digit[3] = 26;
    break;
    case 0x01 :
      //code = 'C';
      Digit[3] = 12;
    break;
    case 0x02 :
      //code = 'B';
       Digit[3] = 11;
    break;
    case 0x03 :
      //code = 'U';
      Digit[3] = 28;
    break;
  }
  
  delay(1500);  
  Digit[0] = dtc2;
  Digit[1] = dtc3;
  Digit[2] = dtc4;
  Digit[3] = dtc5;
  delay(1500);
}

//////////////////////////
//Функция удаления ошибок
//////////////////////////
/*
void CLRTrouble() {
    TxBuf(ClearTrouble,sizeof(ClearTrouble));           
    delay(TxToRx);    
}
*/

Фото в бортжурнале Chevrolet Rezzo

Подключил свою тарантайку к планшету, поглядел ошибки.
Выдаёт две ошибки:
P0141 — Подогреваемый кислородный датчик 2, банк 1, управление нагревателем — неисправность электрической цепи.
P0172 — Слишком богатая топлевовоздушная смесь, банк 1

Я так понял, первая ошибка может быть связана с лямбда-зондом. А вторая — либо с первой, либо с воздушным фильтром и вообще системой забора воздуха. Мол, маловато воздуха…

Есть мысли, что просто контакты в датчике мандят…
Фильтр надо обязательно поменять…

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

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

OBD-II для диагностики автомобилей: основная информация

Введение

Режимы диагностики

Режим ручного ввода команды запроса диагностической информации.

Надо учитывать, что как далеко не на каждом автомобиле блок управления поддерживает все перечисленные функции, так и не каждый диагностический сканер для OBD-II может дать диагносту возможность использовать все перечисленные режимы.

Используемые протоколы и применяемость OBD-II-диагностики на автомобилях разных марок

2. Посмотреть в информационной базе данных, типа Mitchell-on-Demand и т.п. Однако, это также не абсолютный способ, так как база может содержать неточности, включать информацию по автомобилям, выпущенным для другого рынка и т.п. Естественно, использование специализированных дилерских баз по отдельной марке повышает степень достоверности информации;

3. Использовать сканер, позволяющий определить, какой из OBD-II протоколов используется на машине. Из предлагаемых нами приборов автоматически это сможет сделать Х-431 и OZEN MOByDic 2600. С помощью комплекта ScanTool Вы сможете это сделать вручную путем последовательной смены используемых адаптеров и проверки наличия связи с ЭБУ автомобиля. Если никаких предположений по используемому протоколу нет, то начинать перебор стоит с протокола ISO как наиболее распространенного (либо с протокола, указанного для диагностируемой машины в таблице);

4. Осмотреть диагностический разъем и определить наличие выводов в нем (как правило, присутствует только часть задействованных выводов, а каждый протокол использует свои выводы разъема).

obd2conn

Назначение выводов («распиновка») 16-ти контактного диагностического разъема OBD-II (стандарт J1962):

По наличию выводов можно ориентировочно судить об используемом протоколе при помощи следующей таблицы:

Стандарт Pin 2 Pin 7 Pin 10 Pin 15
ISO-9141 и ISO-14230 Должен присутствовать Должен присутствовать
(если автомобиль использует L-линию диагностики)
PWM (J1850) Должен присутствовать Должен присутствовать
VPW (J1850) Должен присутствовать

Протоколы PWM, VPW идентифицируются отсутствием контакта 7 (K-Line) диагностического разъема.

5. Подавляющее большинство автомобилей используют протоколы ISO. Некоторые исключения:

— большая часть легковых автомобилей и легких грузовиков концерна GM используют протокол SAE J1850 VPW;
— большая часть автомобилей Ford использует протокол J1850 PWM.
— прочие.

Дополнительные сведения об OBD-II диагностике.

Диагностический разъёm OBD-II

Контакты диагностического разъема для используемых протоколов.

Протокол ISO 9141-2 идентифицируется наличием контакта 7 и отсутствием 2 и/или 10 контактов на диагностическом разъеме. Если отсутствует контакт 7, в системе используется протокол SAE J1850 VPW (Variable Pulse Width Modulation) или SAE J1850 PWM (Pulse Width Modulation). Все три протокола обмена данных работают через стандартный кабель OBD-II J1962 connector.

OBD-II TERMINOLOGY This document covers the new standardized OBD-II terms and acronyms.

Источник

Протоколы obd2 по маркам автомобилей

Диагностика бортового оборудования OBD-II

j1962 3

Назначение выводов разьема приведено в таблице. Использование контактов 1, 3, 8, 9, 11-13 стандартом SAE не определо и производили могут использовать их по своему усмотрению.

Контакт Назначение
1 Не определен
2 Положительня линия SAE J1850
3 Не определен
4 Корпус
5 Общий
6 CAN(H)ISO 15765
7 K линия ISO 9141/14230
8 Не определен
9 Не определен
10 Отрицательная линия SAE J1850
11 Не определен
12 Не определен
13 Не определен
14 CAN(L) ISO 15765
15 L линия ISO9141/142300
16 +12 вольт батареи

Что может дать OBD-II? Достаточно много, он позволяет определять и стирать коды неисправности, контролировать параметры работы двигателя в реальном времени, считывать информацию о серийном номере автомобиля и пр. Однако для чип-тюнинга производители используют собственные нестандартные проколы достула к ЭБУ, совместимые по электрических параметрам с ISO 9141/14230, например KW1281 (Audi, Volkswagen, Seat, Skoda), KW71 (BMW), KW82 (Opel). В новых автомобилях используется CAN протокол как для OBD-II так и для чип-тюнинга.

Выводы разъемы для Toyota/Lexus, источник pinoutsguide.com

Поддерживает ли мой автомобиль OBD-II?

Как определить какой протокол поддерживает электронным блоком управления автомобиля? Первое – можно поискать информацию в Инернете, хотя там много неточной и непроверенной информации. К тому же, многие автомобили выпускаются для разных рынков с различными протоколами диагностики. Второе – найти разьем и посмотреть какие контакты в нем присуствуют. Разьем обычно находистя под приборной панелью со стороны водителя. Протокол ISO 914-2 или ISO 14230-4 определяется наличием контакта 7 и отсуствием контактов 2 и 10, как показано в таблице. Замечу, что контакта 15 скорее всего не будет, так как L линия сегодня почти не используется.

Протокол Pin 2 Pin 6 Pin 7 Pin 10 Pin 14
ISO 9141/14230 +
J1850 PWM + +
J1850 VPW +
ISO 15765 CAN + +

EOBD стал стандартом в Европе начиная с 2001 года, а для дизельных двигателей начиная с 2004. Если ваш автомобиль выпущен до 2001 года то он может вообще не поддерживать OBD даже при наличии соответсвуещего разьема! Евросоюз даже оштрафовал Peugeot за не соответвие EOBD стандарту и после 2001 года. Например, Renault Kangoo 99 года не поддерживает EOBD, а Renault Twingo поддерживает! Те же самые автомобили сделанные для других рынков, например Турции, могут тоже не быть совместимыми с OBD протоколом. Вот далеко не полный список ЭБУ до 2001 года которые могут не поддерживать OBD:

OBD II Руководство пользователя

$02 (Freeze Frame)

$03 (Read Stored DTC)

Сканер производит запрос на считывание кодов неисправностей из памяти блока управления, а блок соответственно эти коды либо выдает, либо пишет, что их нет. Вполне традиционная и наиболее употребляемая диагностами всего мира процедура. Для кодов стандарта OBD II была разработана удобная и информативная система обозначений – буква и четыре цифры (см. рис 1). Эту систему безоговорочно приняло большинство автопроизводителей, причем не только для OBD II, но и для ОЕМ-протоколов. Первая позиция (то есть буква) обозначает тип системы – P (Powertrain), C (Chassis), B (Body) и U (Network). На рынке пока не так много автомобилей, у которых токсичность зависит от работы, например кузовных систем (хотя это абсолютно реально!). Как уже говорилось выше, практическое использование протокола OBD II пока в большей степени ориентировано на силовой агрегат, поэтому речь пойдет о кодах группы Р. Вторая позиция отвечает за степень «крутизны» кода. Все коды с нулевым расширением (Р0) являются базовыми (их еще называют Generic). Один и тот же базовый код описывает одинаковую неисправность, вне зависимости, с какого автомобиля производится считывание. Например, код Р0102 означает одну и ту же проблему для любого автомобиля, поддерживающего требования OBD II / EOBD – низкий уровень сигнала датчика расхода воздуха. Сканер уровня GST может считывать и расшифровывать только коды группы P0. Расширенные коды (Р1ххх, Р2ххх и т.п.), даже если имеют одинаковый номер, имеют разную расшифровку для разных производителей. Например, для Mazda код P1101 означает отклонения от нормы уровня сигнала датчика расхода воздуха, а аналогичный код для Mitsubishi – наличие проблем в цепи вакуумного соленоида противо-буксовочной системы. Пока такие коды являются привилегией производителей автомобилей и это, конечно, создает проблемы для независимых СТО. Расшифровка ОЕМ-кодов под силу только весьма продвинутым OBD-II приборам, хотя следует признать, что даже хорошие универсальные сканеры, работающие по заводским протоколам с этой задачей справляются далеко не всегда (дилерские приборы естественно не в счет). Однако постепенно ситуация меняется в лучшую сторону. Третья позиция (или вторая цифра) в обозначении кода призвана идентифицировать определенную функцию, выполняемую блоком управления, либо подсистему блока, а именно: 1 – измерение нагрузки и дозирование топлива; 2 – подача топлива, система наддува; 3 – система зажигания и регистрация пропусков воспламенения смеси; 4 – системы уменьшения токсичности; 5 – система холостого хода, круиз-контроль, система кондиционирования; 6 – внутренние цепи и выходные каскады блока управления; 7 и 8 – трансмиссия (АКП, сцепление и т.п.) Ну и, наконец, четвертая и пятая позиции – это собственно номер кода, идентифицирующий цепь или компонент.

$04 (Clear/information)

$05 (O 2 monitoring test results)

$06 (Monitoring test results for noncontinuously monitored systems)

$07 (Monitoring test results for continuously monitored systems)

$08 (Bidirectional controls)

$09 (Vehicle information)

Описание интерфейса универсального сканера ELM327.
Схема подключения сканера ELM327.
PID’ы Toyota/Lexus.

Источник

Список автомобилей совместимых с ELM 327

Хотите использовать диагностический адаптер, но не знаете подойдет ли он к Вашему авто?

В этом случае мы составили для Вас список автомобилей реально протестированных с нашими адаптерами. Скачать список совместимых с elm327 автомобилей.

Обращаем Ваше внимание, что данный список корректен только для адаптеров с настоящей прошивкой версии 1.5. В чем отличие версий адапетров можно посмотреть в данном видео:

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

Так же Вам может помочь определится с выбором адаптера представленная на фото табличка, которая обычно располагается под капотом автомобиля и подтверждает наличие и поддержку Вашим авто, протокола стандарта OBD 2. Таким образом, если Вы обнаружили ее под своим капотом, можете быть уверены в поддержке данного стандарта.

obd2lab

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

Автосканеры elm327 работают по следующим протоколам:

Диагностические адаптеры ELM327 USB и Bluetooth работают с протоколами:

SAE J1850 VPW (10.4 kbaud)

SAE J1850 PWM (41.6 kbaud)

ISO 14230-4 KWP (5 baud init, 10.4 kbaud)

ISO 9141-2 (5 baud init, 10.4 kbaud)

ISO 15765-4 CAN (29 bit ID, 500 kbaud)

ISO 15765-4 CAN (11 bit ID, 250 kbaud)

ISO 14230-4 KWP (fast init, 10.4 kbaud)

ISO 15765-4 CAN (11 bit ID, 500 kbaud)

ISO 15765-4 CAN (29 bit ID, 250 kbaud)

Диагностические адаптеры поддерживают практически все автомобили с 2000 года выпуска, а так же некоторые более ранние модели. При отсутствии указанного диагностического разъема OBD 2 в Вашем авто, Вы можете воспользоваться представленными на нашем сайте переходниками которые помогут обеспечить совместимость адаптера с Вашим автомобилем.

Источник

Протоколы obd2 по маркам автомобилей

%D0%B5%D0%BB%D0%BC327 %D1%81 %D0%BF%D0%B5%D1%80%D0%B5%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%BC %D0%B1%D0%BB%D1%8E%D1%82%D1%83%D0%B7 %D0%BA%D1%83%D0%BF%D0%B8%D1%82%D1%8CСовместимость elm327 с автомобилями 21.02.2018 13:16

Адаптеры elm327 работают по следующим диагностическим протоколам:

ISO 15765 CAN. В рамках OBDII для elm 327 использует 2 контакта: 6 и 14. Это самый современный протокол передачи данных. Как правило, автомобили моложе 2008 года выпуска диагностируется по нему.

SAE J1850 PWM (Pulse Width Modulation — модуляция ширины импульса) Высокоскоростной протокол, обеспечивает скорость обмена данными до 41,6 Кбайт/с. Он используется в марках Ford, Jaguar и Mazda. По протоколу PWM сигналы передаются по двум проводам, подсоединенным к контактам 2 и 10 диагностического разъема elm327.

SAE J1850 VPW (Variable Pulse Width — переменная ширина импульса). Протокол VPW ппозволяет передавать данные со скоростью до 10,4 Кбайт/с и применяется в автомобилях марок General Motors (GM) и Chrysler. Протокол VPW предусматривает передачу данных по одному проводу, подсоединенному к контакту 2 диагностического разъема.

ISO 9141-2 разработан ISO (Международная организация по стандартизации) и применяется в большинстве европейских и азиатских автомобилей, а также в некоторых автомобилях Chrysler. Используется контакт 7 (К-линия) и опционально контакт 15 (L-линия).

ISO 14230 KWP2000 (Keyword Protocol 2000) практически идентичен ISO 9141. Также использует контакт 7 (К-линия) и опционально 15 (L-линия).

Список моделей автомобилей, диагностируемых по протоколу ISO 15765 CAN

Список моделей автомобилей, диагностируемых по протоколу ISO 9141-2

Acura 2.3Cl 1998
Acura Integra GS-R 1998
Acura Integra Type R 2000
Acura MDX 2003
Acura RSX 2002
Acura RSX Type-S 2002
Alfa Romeo 147 2004
Alfa Romeo 147 2005
Alfa Romeo 156 2.0 JTS 2003
Alfa Romeo 166 1999
Alfa Romeo Spider 2001
Alfa Romeo Spider 2.0 2001
Alfa Romeo Spider 2.0 TS 2001
Astra GL 1.8 2000
Astra GL 1.8 2001
Audi A3 TDI 1999
Audi A4 1997
Audi A4 1998
Audi A4 2000
Audi A4 2001
Audi A4 2001
Audi A6 1998
Audi A6 1999
Audi Cabriolet 1997
BMW 316i 1994
BMW 316I 2003
BMW 318I 1996
BMW 318TI 1998
BMW 320 2002
BMW 320D 2001
BMW 320D 2002
BMW 320Dtouring 2000
BMW 320Td 2003
BMW 323 CI 2000
BMW 325I 2001
BMW 325XI 2002
BMW 328I (E46) 1999
BMW 520I 1997
BMW 528I 1997
BMW 528I 1998
BMW 528IA (E39) 2000
BMW 530D 2000
BMW 540I6 1997
BMW 740I 1997
BMW X5 2002
BMW Z3 2000
BMW Z3 2001
Chevrolet Cavalier 1994
Chevrolet Cavalier 1998
Chevrolet S-10 2000
Chevrolet Tahoe 1997
Chevrolet Tahoe 1998
Chevrolet Tracker ZR2 2001
Chrysler Sebring 2000
Chrysler Town & Country Van 1996
Chrysler Voyager 1995
Chrysler Voyager 1998
Citroen C2 2004
Citroen C3 2002
Citroen C3 2003
Citroen C3 1.4L 2003
Citroen C5 2L 2002
Citroen Evasion 1999
Citroen HDI 2000
Citroen Saxo 2000
Citroen Saxo 2001
Citroen Saxo 2002
Citroen Saxo VTR 8V 1.6I 2001
Citroen Xantia Turbo CT 1997
Citroen Xsara 1999
Citroen Xsara 2000
Citroen Xsara 2000
Citroen Xsara 2000
Citroen Xsara 2000
Citroen Xsara 1.4 Hdi 2004
Citroen Xsara Picasso 2000
Citroen Xsara SX 1.6I 2002
Citroen Xsara VRT 2000
Citroen Xsara VTR 2000
Citroen Xsara VTR 2000
Citroen Xsara VTR 2000
Citroen Xsara VTR 2000
Daewoo Kalos 2004
Daewoo Lanos 1999
Daimler Six 1995
Dodge 3500 1996
Dodge Caravan 1997
Dodge Caravan 2004
Dodge Dakota 1998
Dodge Dakota 1999
Dodge Dakota 2001
Dodge Intrepid 1996
Dodge Intrepid 1997
Dodge Neon 1995
Dodge Ram 1998
Dodge Ram 1500 1996
Dodge Ram 1500 1996
Dodge Ram 1500 1999
Dodge Ram 1500 1999
Dodge Ram 2500 1999
Dodge Stratus 1996
Dodge Stratus 1997
Dodge Stratus R/T 2001
Fiat Coupè 1998
Fiat Marea 1997
Fiat Marea 1999
Fiat Punto 2000
Fiat Punto 2000
Fiat Punto 2001
Fiat Punto 2002
Fiat Punto 1.9 Mjet 2004
Fiat Punto JTD ELX 80 2000
Fiat Scudo 2003
Fiat Seicento 2001
Fiat Stilo 2002
Fiat Stilo 2002
Fiat Stilo 2002
Fiat Ulysse JTD 2001
Ford Galaxy 2004
Ford Mondeo 2001
Ford Probe 1996
Ford Probe 1997
Ford Ranger 1994
Ford Scorpio 1996
Geo Metro 1996
GMC Jimmy 2000
Honda Accord 1998
Honda Accord 1998
Honda Accord 2000
Honda Accord 2002
Honda Accord SE 1997
Honda Civic 1996
Honda Civic 1997
Honda Civic 1997
Honda Civic 1998
Honda Civic 2000
Honda Civic 2001
Honda Civic 2001
Honda Civic 2002
Honda Civic Del Sol 1997
Honda Civic EX 1996
Honda Civic Type R 2003
Honda Jazz 2002
Honda Odyssey 2000
Honda Odyssey 2001
Honda Odyssey 2002
Honda Passport 2000
Honda Prelude 1998
Honda Prelude 2001
Honda S2000 2000
Hyundai Accent 1997
Hyundai Accent 1998
Hyundai Accent 2000
Hyundai Accent (Base) 1996
Hyundai Accent (Sohc) 1996
Hyundai Elantra 1996
Hyundai Elantra 1998
Hyundai Elantra 1998
Hyundai Elantra 2001
Hyundai Lantra 1996
Hyundai Matrix 2002
Hyundai Matrix 1.8 GLS 2002
Hyundai Tiburon 1997
Hyundai Tiburon GS-R/GT (V6) 2003
Infiniti G35 2003
Infiniti G35 2003
Infiniti I30 2000
Infiniti Q45 1997
Infiniti Q45 1999
Infiniti QX4 2000
Isuzu Trooper 3.0 1999
Jaguar XJ6 (X300) 1997
Jaguar XK8 1997
Jaguar XK8 2000
Jeep Cherokee 1998
Jeep Cherokee Sport 1999
Jeep Grand Cherokee 1996
Jeep Grand Cherokee 1997
Jeep Grand Cherokee 1998
Jeep Grand Cherokee 1999
Jeep Grand Cherokee 2000
Jeep Grand Cherokee 2000
Jeep Grand Cherokee 2000
Jeep Liberty 2002
Jeep Wrangler 1998
Jeep Wrangler Sport 1999
Kia Rio 2001
Kia Sedona 2003
Kia Sephia 1999
Kia Sorento 2.5 CRDi 2003
Kia Spectra 2001
Lancia Y 2000
Land Rover Defender TD5 2004
Land Rover Range Rover 1997
Lexus IS2000 2002
Mazda Millenia S 1999
Mazda MPV 1996
Mazda MPV 2002
Mazda MX-5 1999
Mazda MX-5 2003
Mazda MX-5 (Miata) 2003
Mazda Protege 2000
Mazda Protege 2001
Mazda Protege 5 2002
Mcc Smart Fortwo 2002
Mercedes C32 AMG 2001
Mercedes Benz E-320 1998
Mercedes-Benz C200 Kompressor 2003
Mercedes-Benz C230 1997
Mercedes-Benz C230 1998
Mercedes-Benz C230 2000
Mercedes-Benz Class A 2000
Mercedes-Benz E 430 2000
Mercedes-Benz ML 270 Cdi 2000
Mercedes-Benz Sl600 1997
Mercedes-Benz W203 C 2002
Mercury Villager 1996
Mini Cooper 2002
Mini Cooper S 2003
Mits Montero Sport 2000
Mitsubishi Diamante 2001
Mitsubishi Eclipse 1997
Mitsubishi Eclipse 1998
Mitsubishi Eclipse 2000
Mitsubishi Eclipse Spyder 2002
Mitsubishi Galant 2003
Mitsubishi Lancer 1998
Mitsubishi Lancer 1999
Mitsubishi Lancer Evolution 2003
Mitsubishi Lancer Evolution 2003
Mitsubishi Lanser 1997
Mitsubishi Mirage 1999
Mitsubishi Mirage 2001
Mitsubishi Montero 1995
Mitsubishi Montero 2003
Mitsubishi Outlander 2003
Mitsubishi Spcer 2002
Nissan 240 SX 1996
Nissan Altima 1997
Nissan Altima 1999
Nissan Altima 2001
Nissan Altima GXE 1997
Nissan Frontier 1999
Nissan Frontier 2000
Nissan Maxima 1995
Nissan Maxima 1996
Nissan Maxima 1996
Nissan Maxima GLE 1999
Nissan Micra 2003
Nissan Pathfinder 1998
Nissan Pathfinder 2001
Nissan Pathfinder 2002
Nissan Primera 1999
Nissan Primera 1999
Nissan Sentra 1996
Nissan Sentra 2001
Nissan Sentra SE 2000
Nissan Sentra SE-R 2002
Nissan Sentra SpecV 2003
Nissan Terrano 1997
Opel Astra 1997
Opel Astra 2000
Opel Astra 2001
Opel Astra 2004
Opel Astra — F 1997
Opel Astra Convertible 2002
Opel Astra H 2004
Opel Combo 2004
Opel Corsa 2002
Opel Corsa 1.3 CDTi 2004
Opel Corsa B 1994
Opel Frontera 1994
Opel Frontera 1999
Opel Omega 1998
Opel Omega 2001
Opel Vectra 1998
Opel Vectra 2001
Opel Vectra 2001
Opel Vectra B 1996
Opel Vectra B 2.0 1998
Opel Zafira 2001
Opel Zafira 2001
Opel Zafira 2002
Opel Zafira 1.6 16V Ecotec 2001
Peugeot 106 1998
Peugeot 106 2003
Peugeot 2006 Hdi 2004
Peugeot 206 1994
Peugeot 206 2001
Peugeot 206 2001
Peugeot 206 2001
Peugeot 206 2001
Peugeot 206 2003
Peugeot 206 2003
Peugeot 206 2004
Peugeot 206 Gti 2002
Peugeot 206 GTi 180 2003
Peugeot 206 Hdi 2002
Peugeot 306 1998
Peugeot 306 2000
Peugeot 306 2.0 Hdi 2000
Peugeot 306 HDI 2000
Peugeot 306S16 1999
Peugeot 307 2002
Peugeot 307 2004
Peugeot 307 2.0 HDI 90 Hp 2004
Peugeot 406 2001
Peugeot 406 2002
Peugeot 406 HDI 1999
Peugeot Partner 2005
Plymouth Neon 1999
Porsche 911 Carrera 2001
Porsche 996 1998
Renault Clio 2001
Renault Clio 2002
Renault Clio 2002
Renault Clio 2003
Renault Espace 2000
Renault Espace 2001
Renault Espace 2.2 Dt 1998
Renault Kangoo 2002
Renault Kangoo 2003
Renault Laguna 1998
Renault Laguna2 2002
Renault Megane 1998
Renault Megane 1998
Renault Megane 1998
Renault Megane 2000
Renault Megane 2002
Renault Megane 1.9 DTI 2001
Renault Megane Gran Tour 2004
Renault Megane II 2004
Renault RX4 2001
Renault Safrane 2.5 1997
Renault Scenic 2001
Renault Scenic 2003
Renault Scenic 2004
Renault Twingo 1999
Saab 3-Sep 1999
Saab 3-Sep 1999
Saab 5-Sep 2002
Saab 9—5 2000
Saab 9-5 Aero 2003
Saab 900 1997
Saab 900 1997
Saab 900 S 1996
Saab 9000 1998
Saab 9000 1998
Saab 9000CDE 1996
Saturn LW300 2001
Seat Cordoba 1996
Seat Cordoba 1.4 SX 2000
Seat Cordoba TDI 110 CV 1999
Seat Ibiza 2000
Seat Ibiza 2002
Seat Leon 2002
Seat Leon 2004
Seat Leon 2004
Seat Leon 2004
Seat Toledo 2000
Seat Toledo 2002
Skoda Fabia 1994
Skoda Fabia 2003
Skoda Fabia TDi 2004
Skoda Fabia TDi 2004
Skoda Felicia 2000
Skoda Octavia 2002
Skoda Octavia 1.8T 2001
Skoda Octavia 1.8T 2001
Skoda Octavia RS 2004
Skoda Octavia TDi 2004
Skoda Octavia TDi 2004
Smart Full 2000
Smart Passion 2002
Smart Pulse Cabrio 2003
Smart Roadster 2003
Smart Roadster 2003
Subaru 2.5TS 2003
Subaru Forester 1999
Subaru Impreza 1997
Subaru Impreza 2.5RS 2002
Subaru Impreza TS 2002
Subaru Impreza TS 2003
Subaru Impreza WRX 2001
Subaru Impreza WRX 2001
Subaru Impreza WRX 2002
Subaru Impreza WRX 2003
Subaru Legacy 1996
Subaru Legacy 1998
Subaru Legacy 1999
Subaru Legacy 2.5 JTG 2004
Subaru Outback Wagon 2002
SusUKi Jimny 1999
Suzuki Esteem 1996
Suzuki Grand Vitara 1999
Suzuki Grand Vitara 2000
Suzuki Jimny 1.3 2002
Suzuki Sidekick 1997
Suzuki Vitara 1997
Suzuki Vitara 2000
Suzuki X-90 1996
Suzuki table966401Xl7 2.0 HDi 2004
Toyota Avalon 1998
Toyota Avensis 2003
Toyota Camry 1997
Toyota Camry 2000
Toyota Camry 2002
Toyota Camry XLE 2004
Toyota Camry XLE 2004
Toyota Celica GT-S 2000
Toyota Corolla 1994
Toyota Corolla 1998
Toyota Corolla 2002
Toyota Corolla (European) 2002
Toyota Echo 2000
Toyota RAV4 1997
Toyota RAV4 2001
Toyota RAV4 2001
Toyota RV4 2000
Toyota Sienna LE 1999
Toyota Solara 1999
Toyota Solara LE 2000
Toyota Tacoma 2000
Toyota Tacoma 2001
Toyota Tacoma 2002
Toyota Tercel 1999
Toyota Tundra 1997
Toyota Tundra 2000
Toyota Tundra 2001
Toyota Tundra 2001
Toyota Tundra 2003
Toyota Vios 2004
Toyota Yaris 2000
Triumph Sprint ST 955i 2001
Volkswagen Beetle 1999
Volkswagen Beetle 2000
Volkswagen Bora 1999
Volkswagen Bora 2000
Volkswagen Caddy 1994
Volkswagen Caddy 2001
Volkswagen Eurovan Camper 1997
Volkswagen Gol 1999
Volkswagen Golf 1997
Volkswagen Golf 1997
Volkswagen Golf 1998
Volkswagen Golf 2001
Volkswagen Golf 2004
Volkswagen Golf 4 2001
Volkswagen Golf GL 1996
Volkswagen Golf III 1996
Volkswagen Golf IV 1999
Volkswagen Golf IV 2000
Volkswagen Jetta 1996
Volkswagen Jetta 1997
Volkswagen Jetta 2002
Volkswagen Jetta Wagon 2003
Volkswagen Lupo 1999
Volkswagen Multivan(T4/Transporter/Eurovan) 2001
Volkswagen Passat 1996
Volkswagen Passat 1997
Volkswagen Passat 1999
Volkswagen Passat 2001
Volkswagen Passat 2003
Volkswagen Passat 1.9 Tdi 2000
Volkswagen Polo 1997
Volkswagen Polo 2001
Volkswagen Santana IAW 1AVP Marelli 2002
Volkswagen Sharan 1998
Volkswagen TDI 102 Pk 1999
Volkswagen Transporter 2.5 Tdi 2002
Vols Beelt 1999
Volvo 2.5T 1998
Volvo 850 1996
Volvo 850 GLT 1996
Volvo 850 T5 1997
Volvo 850 Turbo 1996
Volvo 850 Wagon 1996
Volvo 960 1996
Volvo C70 HT 1998
Volvo S40 2000
Volvo S40 2001
Volvo S40 1 6 2000
Volvo S40 1.9T 2001
Volvo S40 T4 1999
Volvo S60 2001
Volvo S70 1998
Volvo S70 1998
Volvo S70 1999
Volvo S80 1999
Volvo S80 T6 1999
Volvo T 4 1998
Volvo T5R 1995
Volvo V40 1996
Volvo V40 2000
Volvo V40 2.0 T 1999
Volvo V70 1998
Volvo V70 2000
Volvo V70 2001
Volvo V70 XC 1999
Volvo V70 Bifuel 2002
Volvo V70 T5 2000
Volvo V70R 1998
Volvo XC70 1998
Zastava-Yugo 60EFI 1999

Список моделей автомобилей, диагностируемых по протоколу ISO 14230 KWP2000

Источник

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

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Ошибка 1422 тойота ленд крузер 200
  • Ошибка 1421 тойота рав 4
  • Ошибка 141 hover
  • Ошибка 14094415 ssl anydesk

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии