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

Выбор подключения


Изначально необходимо пояснить что для подключения к авто будет использоваться 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, что говорит о том, что у вас не получится подключиться к автомобилям, которые используют эти протоколы.

Подключение


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

  • Подключение к адаптеру (Bluetooth, WIFI)
  • Отправка инициализационных команд (инициализационной строки)

Если с организацией подключения все понятно. Принцип работы такой же как и у любого Bluetooth/WIFI чата. То для того чтоб понять как отправлять инициализационную строку, необходимо изучить какие команды существуют, а также какие функции они выполняют.

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 не удалось, тогда адаптер начинает автоматический подбор протокола.

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

initializeCommands
        = Arrays.asList("ATZ", "ATL0", "ATE1", "ATH1", "ATAT1", "ATSTFF", "ATDP", "ATSP0");

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

Так же желательно обратить внимание на команду 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]

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

  • 0100 \\ запрос
  • BB1E3211 \\ ответ от авто

Переводим ответ от автомобиля в двоичную систему счисления

BB1E3211(16) > 10111011000111100011001000010001(2)

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



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

	01, 03, 04, 05, 07, 08, 0C, 0D, 0E, 0F, 13, 14, 17, 1C, 20

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

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


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

  • 03 – Для отображения сохраненных кодов ошибок
  • 0A – Для отображения постоянных кодов ошибок.

Так как и с остальными командами ошибки автомобиля приходят в закодированном виде, соответственно, как и в остальных командах их нужно раскодировать чтоб получить необходимую информацию. Приведу пример работы декодирования ошибки. Код:

private final static char[] dtcLetters = {'P', 'C', 'B', 'U'};
private final static char[] hexArray = "0123456789ABCDEF".toCharArray();
 
private void performCalculations(String fault) {
    final String result = fault;
    String workingData = "";
    int startIndex = 0;
    troubleCodesArray.clear();

    try {
        if (result.contains("43")) {
            workingData = result.replaceAll("^43|[\r\n]43|[\r\n]", "");
        } else if (result.contains("47")) {
            workingData = result.replaceAll("^47|[\r\n]47|[\r\n]", "");
        }
        for(int begin=startIndex; begin < workingData.length(); begin += 4) {
            String dtc = "";
            byte b1 = 
		    Utility.hexStringToByteArray(workingData.charAt(begin));
            int ch1 = ((b1 & 0xC0) >> 6);
            int ch2 = ((b1 & 0x30) >> 4);
            dtc += dtcLetters[ch1];
            dtc += hexArray[ch2];
            dtc += workingData.substring(begin + 1, begin + 4);

            if (dtc.equals("P0000")) {
                continue;
            }
            troubleCodesArray.add(dtc);
        }
    } catch (Exception e) {
        Log.e(TAG, "Error: " + e.getMessage());
    }
}

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

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

Первый символ:



Второй символ:



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



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



Код ошибки: P103E

Эпилог


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

Матвиенко Александр, Хоссейн Фахр.

Комментарии (57)


  1. DMGarikk
    21.03.2019 18:31
    +3

    А где достать список соответствия пидов и вообще описание режимов?
    и

    03 – Для отображения сохраненных кодов ошибок
    0A – Для отображения постоянных кодов ошибок.

    а ещё какие бывают?
    ==
    Чуть бы ещё подробностей, поскольку тема гораздо глубже чем просто прочитать циферки. есть автомобили которые ODB2 поддерживают очень урезанно но при желании отдают расширенные данные но на неописанные стандартом запросы и хотя ELM может отправлять такие запросы но почти ни одна программа этого не умеет поскольку авторы дальше мануала из интернета не ходили


  1. cat_crash
    21.03.2019 19:17
    +1

    Делитанский вопрос — но насколько далек CAN от ODB2? Что большего умеет CAN по сравнению с OBD?


    1. aivs
      21.03.2019 20:13
      -1

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


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


      1. lorc
        21.03.2019 20:54
        +1

        Просто в автомобиле может быть несколько CAN-шин. На одной может висет магнитола, кондиционер и CD-ченджер, на второй — контроллер двигателя и электронный стояночный тормоз, а третья — торчать в OBD2.


      1. degroeg
        21.03.2019 21:18
        +4

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

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

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

        Т.е. кодируя запросы к контроллеру по ODB2-протоколу и передовая их по CAN-шине, можно:

        • заставить его сделать себе диагностику
        • выдать информацию о контроллере, машине (например если VIN)
        • перепрошить / проапдейтить software, bootloader контроллера
        • перекодировать / пеменять параметры


        1. vin2809
          21.03.2019 23:08

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

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

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


    1. lorc
      21.03.2019 20:52
      +1

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

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


      1. ZetaTetra
        22.03.2019 12:57

        Есть ещё LIN, но он менее распространен:
        https://en.m.wikipedia.org/wiki/Local_Interconnect_Network


  1. Londoner
    21.03.2019 19:35
    +3

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

    А никто не пробовал написать fuzzer для этого протокола, чтоб можно было расковырять полный набор команд для имеюшейся марки/модели?


    1. wtpltd
      21.03.2019 22:05
      +2

      Через ODB можно не только считывать, но и командовать. Как минимум сброс ошибок, это команда. Раз есть одна, могут быть и другие.
      Не боитесь фаззингом закирпичить авто?


  1. Tsvetik
    21.03.2019 21:42

    А можно через OBD2 получать в реальном времени данные от автомобиля?
    Меня интересует скорость, поворот руля, обороты, текущая передача. Может, что-то еще.


    1. wtpltd
      21.03.2019 22:03

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

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


      1. striver
        21.03.2019 22:15

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


        1. kababok
          21.03.2019 22:33

          а зачем? :)


          1. striver
            21.03.2019 22:52

            Я знаю случаи, когда используется устройство, и цена его более 100 у.е. Хочу сравнить.


            1. kababok
              21.03.2019 22:55

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

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


              1. striver
                21.03.2019 23:00

                Это понятно, что можно и крыло от Боинга запихнуть. Просто… цена в ± 20 раз… дешевле. Но, хочу уточнить, то GPS-трекер + данные по топливу/обороты/напряжение АКБ/чего хотите, то и выводите… данные передаются через интрернет почти в реальном времени в районе 1 минуты… на сервер, а потом уже в клиент для пользователей.


              1. vin2809
                21.03.2019 23:14

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

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


                1. striver
                  21.03.2019 23:22

                  Программы давно написаны + есть абонплата.


                1. kababok
                  21.03.2019 23:23

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


        1. kababok
          21.03.2019 23:28

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


          https://www.peak-system.com/PCAN-USB.199.0.html?&L=1


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


          1. striver
            21.03.2019 23:40

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


          1. esaulenka
            21.03.2019 23:43

            А чем оно лучше банального CAN-Hacker (в тех его инкарнациях, которые не теряют пакеты)?


            1. kababok
              22.03.2019 00:31

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


              1. esaulenka
                22.03.2019 10:10
                +1

                Ну, по моему опыту, софтина имени canhack.de вполне работоспособна. Железка (FTDI + AVR + SPI-to-CAN + CAN PHY) на больших нагрузках любит терять пакеты, но если настроить фильтры или слушать медленную шину, всё работает. Стоит на порядок (!) меньше.
                В итоге железку я переделал (на основе STM'ки, там и USB поприличнее, и CAN нормальный). Осталось продолжить работу над собственной софтиной (с блэкдже… скриптами и фаззерами)…


                1. cat_crash
                  22.03.2019 18:03

                  Почему не взяли готовый CANtact? Там есть и железо и ПО для железа.


                  1. esaulenka
                    22.03.2019 18:39

                    Ну, свой велосипед роднее :-)
                    Железка «сама» получилась методом выкидывания 90% кода из того устройства, которым я занимаюсь бОльшую часть рабочего времени (и поэтому она вряд-ли попадёт в открытый доступ).
                    А софтину пришлось делать, т.к. для исследований нужна была логика вида «запомнить пакет А, при получении пакета Б сложить байт 1 из А и байт 2 из Б и отправить обратно». Кто такое предоставляет (бесплатно или недорого), я не знаю.
                    Надо б это всё допилить до удобного состояния и выложить, авось не у одного меня руки чешутся… ;-)


                    1. cat_crash
                      22.03.2019 19:28

                      Почесал бы ваши руки ))) Вот только пошел по легкому пути — игрась с готовым Cantact + SocketCAN. Хотя честно сказать игра получается пока так себе…


        1. esaulenka
          21.03.2019 23:37

          пример чего? «свисток китайский 5-баксовый» в связке с андроидом (на андроиде какая-нибудь Torque Pro) действительно умеет отправлять в стандартные запросы (см. википедию) и действительно показывать скорость/обороты/температуру/мгновенный расход.


          1. kababok
            21.03.2019 23:40

            Но какое практическое применение сего? :)


            1. HellKaim
              22.03.2019 09:41

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


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


            1. Whuthering
              22.03.2019 11:44

              — Чтение и сброс ошибок ЭБУ.
              — Более точный контроль расхода.


          1. striver
            21.03.2019 23:40

            пример чего?
            Устройства.


            1. esaulenka
              22.03.2019 11:23

              Если разговор о моём устройстве, то это ELM327 Bluetooth adapter, купленный на алиэкспрессе лет 5 назад (ссылка не сохранилась). Клон, разумеется, но т.к. никакого rocket science внутри нет, клон работоспособный.
              Я, правда, не очень понимаю, как Вам эта информация поможет.
              И именно такое же устройство описывается в статье.


              1. striver
                22.03.2019 12:04

                Мде, я понял в чем моя проблема, я почему-то пропустил момент, где было сказано, какое устройство… нужно было просто идти спать… Это разные устройства. Да, через блутус подключается… для передачи данных с помощью симки — это другое.


        1. wtpltd
          22.03.2019 03:15

          Пример чего?
          Свистка? «ELM 327 bluetooth» в поиск.
          Софта? В сторе гуглить ODB.
          По ODB эти свистки работают нормально. Но этим все не ограничивается. Есть плюшки помимо. И вот тут эти пятибаксовые работать не будут.
          Хотите про, платите за про.


          1. andrey_ssh
            22.03.2019 03:26

            Лучше гуглить не ODB, а OBD (On Board Diagnostic) — шансов будет больше.


          1. striver
            22.03.2019 09:47

            Пример чего?
            Я цитировал. Автор что-то использовал, мог бы и пример привести на чем проверял.


      1. Tsvetik
        21.03.2019 22:16
        +1

        А где искать список параметров?


    1. esaulenka
      21.03.2019 23:15

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

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


      1. degroeg
        22.03.2019 01:12

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

        Я не буду утверждать, что это на всех машинах так, но на тех с которыми я работаю, те сигналы, которые отдаются на Diagnostic-CAN/OBD-разъем, записываются в контроллере в отдельные ячейки памяти. Поэтому:

        • то что читается с OBD — это отложенные (delayed) значения. Т.е. никакого RealTime (ESP, руль и т.д.)
        • колличество таких сигналов очень ограниченно
        • по каждому идут споры, должен ли электрик в мастерской или клиент этот сигнал видеть



        1. degroeg
          22.03.2019 09:18

          … те сигналы, которые отдаются на Diagnostic-CAN/OBD-разъем, записываются в контроллере в отдельные ячейки памяти. Поэтому:…
          поправлю сам себя — по Diagnostic-CAN конечно бегают и «обычные» CAN сигналы, вернее те, которые GateWay пропускает.
          Те сигналы, про которые я писал (т.н. StroredData) — это несколько из другой оперы.


          1. kababok
            22.03.2019 13:03

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


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


          1. kababok
            22.03.2019 13:21

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


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


    1. mikelavr
      22.03.2019 12:29

      Все машины разные, гарантированного набора данных просто нет.
      Вы можете примерно ориентироваться на то, что есть на приборной панели. Эти данные передаются через моторный 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


  1. kababok
    21.03.2019 22:52

    В общем одна из наиболее практичных книг для OBD в DIY вот эта:

    books.google.de/books?id=59l2DwAAQBAJ&printsec=frontcover&dq=OBD+Fahrzeugdiagnose+in+der+Praxis&hl=de&sa=X&ved=0ahUKEwjg3vqH2pPhAhUC2KQKHXBBAIoQ6AEIJTAA#v=onepage&q=OBD%20Fahrzeugdiagnose%20in%20der%20Praxis

    Но на немецком, да. :)

    P.S. lingvo — честно могу порекомендовать. Она ещё и хорошо оформлена и свёрстана — читать приятно и плотность практических полезностей высока.


  1. esaulenka
    21.03.2019 22:55

    в версии v2.1 отсутствует поддержка протоколов J1850 PWM и J1850 VPW, что говорит о том, что у вас не получится подключиться

    … к некоторым старым автомобилям.
    Последнее время (лет 10) в разъеме диагностики есть 500-й CAN, и стандартная диагностика работает именно по нему.


  1. kababok
    22.03.2019 00:33

    Интересующимся — вот там, в самом низу комментариев, накидал в среду ссылок для самообразования:


    https://m.habr.com/ru/post/438142/


  1. GeorgKDeft
    22.03.2019 18:26

    А вот интересно остались отдельные сканеры не по OBD протоколу?

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


    1. esaulenka
      22.03.2019 18:46

      В изобилии. Все «родные» фирменные сканеры — закрытые и свои собственные. Разъем чаще всего используется тот же самый (для удобства сервисников), но шина может быть соседняя (на стандартный разъем могут выводить 2 CAN-шины и какой-нибудь KLine) и протокол свой собственный (хотя часто очень похожий на стандартный).
      Т.е. минимальный набор параметров отдают все и всегда (потому что по закону положено), а всё остальное — только за деньги…


  1. ntfs1984
    22.03.2019 20:13
    +1

    Для диагностики использовать можно, для реалтаймовых проектов — не особо.

    Я у себя вводил каждый необходимый мне датчик и исполнительное устройство в RPI через прослойку на Arduino.

    image

    image

    Конечно сложнее чем подключить OBD-сканнер, зато открываются возможности для тех маневров которые раньше не были доступны: открывать и заводить удаленно, в том числе и по таймеру (curl 'http://192.168.1.6/?startengine=1'), оставлять индикацию фар, заводить без ключа, глушить удаленно в любой точке страны, благодарить аварийкой с одной кнопки, считать расход газа с бензином и выводить сколько км осталось точное напряжение и примерное время до критичного разряда аккумулятора и еще много фич по принципу «чего бы еще такого придумать».

    Даже ЭБУ пробовал имитировать, но ни Малинка ни Ардуинка с этим не справляются, слишком низкие должны быть задержки и точные временные периоды. Стоит форсунке включиться на 100мс позже, и двигатель тройнет, а если два таких сбоя случатся один за одним, то двигатель заглохнет.
    Так что лучше туда не лезть вообще.


    1. Mogwaika
      22.03.2019 20:16

      А ПЛИСина не справится с обработкой чего-то типа ЭБУ?
      Вы свои эксперименты где-то описывали? Интересно было бы почитать.


      1. ntfs1984
        22.03.2019 20:41

        Нет, к сожалению нигде не описывал.

        Насчет обработки, я думаю что справилась бы даже AVR'ка или STM'ка, но программировать бы ее пришлось более низкоуровнево, нежели программируется Ардуина. Никаких digitalread\digitalwrite. Ну и коммутацию делать не реле, а полевиками, или хотя бы твердотельниками.

        Очень много по проводам ходит наводок. Практически каждый датчик нужно было подключать через оптопару и вводить несколько программных костылей. Например если с датчика вращения коленвала (RPM) пришло более 4 импульсов за 100мс, то проигнорировать это значение (потому что это наводка, и в перерасчете оно бы дало 15000 RPM) и взять текущее значение из предыдущего.

        Хотя в целом там особо ловить нечего, в том ЭБУ. Пересчитывание датчиков и дергание форсунками и дроссельной заслонкой. Это система двигателя, не машины.

        UPD:
        Копаясь в этой системе, я как раз пришел к выводу, что электрокары лучше. И не потому что электричество дешевле. А тупо потому что современный ДВСник без электричества все равно никуда не поедет, а в электрокаре при этом будет в два раза меньше деталей, а в сэкономленное под капотом место можно будет набить поролона и использовать его как буферную подушку при лобовом столкновении, хе-хе.


        1. Mogwaika
          22.03.2019 20:52

          А вы релёй форсунками рулили???


      1. esaulenka
        23.03.2019 15:52

        ЭБУ не особо быстрая штука, на самом деле. Её до сих пор на 16-битных процессорах иногда делают (примечание 1: процессор специализированный. примечание 2: в большинстве случаев сейчас используются 32-битники).
        Если вопрос «как самому сделать ЭБУ» интересен, можете погуглить «rusEFI». Просто как пример, что на коленке можно создать что-то работоспособное.


    1. esaulenka
      23.03.2019 16:04

      Ну это разные проекты, на самом деле. Мы тут выше обсуждали, что можно достать, просто подключившись к шине, а Вы предлагаете половину проводки перерезать. Управлять замками и моргать аварийкой методом прикручивания горсти релюшек умеет любой установщик автосигнализаций, это недостаточно айтишный метод :-)
      А вот про запуск без ключа я б послушал. Или на нексии (?) иммобилайзера штатного не было?


      1. Mogwaika
        23.03.2019 20:42

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