Хакаем CAN шину авто. Виртуальная панель приборов / Хабр

Хакаем CAN шину авто. Виртуальная панель приборов / Хабр ОБД2

Введение в компьютерную диагностику, подходы к реализации технологии

Диагностика автомобиля с помощью телефона, ПК или ноутбука — далеко не новшество современном мире. Первые зародыши технологии появились 40 лет назад, когда в 1980-м компания Дженерал Моторс предусмотрела на своих авто интерфейс для диагностики ALDL. Его целью был контроль состояния всей электронной части машины и ECM-протокола.

Аббревиатура OBD дословно расшифровывается как On-Board Diagnostics или бортовая диагностика.

Официально система OBD-1 запущена в 1991 году, а спустя пять лет специалисты создали единый протокол для диагностики, действующий и в 2020 году — OBD-2.

Он используется для авто, которые производятся в Канаде и США. В Японии и Европе имеются другие аналоги — EOBD и JOBD соответственно.

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

Тип OBD-2 считается стандартным, что позволяет подключать к нему разные устройства для снятия информаций с бортового компьютера. Для проверки применяется специальный сканер, ПО и компьютер (ноутбук).

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

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

После получения информации автовладелец принимает решение по ремонту и его стоимости. Информация, полученная таким путем, отличается высокой точностью и позволяет сэкономить время на диагностику машины.

Система управления двигателем: основные компоненты, принцип работы

Главный элемент системы управления силовым узлом — ЭБУ. Аббревиатура расшифровывается, как «Электронный Блок Управления».

Задача контроллера состоит в сборе информации от многочисленных датчиков с последующей обработкой полученных сведений и передачей команд исполнительным элементам.

ЭБУ является неизменным элементом бортовой сети машины. Он постоянно обменивается данными с АБС, АКПП, системами безопасности и стабилизации, круиз- и климат-контролем.

Код ошибки:  elm327 v2.2 на АлиЭкспресс — купить онлайн по выгодной цене

Информация передается по шине типа CAN, объединяющей электронные и цифровые устройства машины в общий интерфейс. Такой принцип работы позволяет ЭБУ контролировать процессы, которые происходят в автомобиле.

Базовые функции ЭБУ:

  1. Контроль и управление подачей горючего в двигателях инжекторного типа.
  2. Оптимизация работы зажигания.
  3. Регулирования фаз газораспределения.
  4. Анализ компонентов выхлопных газов.
  5. Регулирование температуры и ее поддержание на оптимальном уровне.
  6. Контроль работы системы рециркуляции газов и т. д.

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

Также в контроллере предусмотрена система, информирующая человека о поломках или сбоях в работе. Об ошибке свидетельствует зажигание лампочки Check Engine.

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

Подробно разобраться как это работает можно на примерах:

Что в автомобиле можно проверить с помощью компьютерной диагностики

По описанию ЭБУ можно сделать краткие выводы, чем именно полезна диагностика, и что можно проверить с помощью ноутбука, сканера и ПО.

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

Диагностика автомобиля с помощью ноутбука позволяет проверить следующие элементы авто:

  1. Двигатель. Проверка необходима при перегреве мотора, повышении расхода топлива, сбоях в работе, проблемах с пуском или появлении посторонних шумов. Не обойтись без диагностики при появлении ошибки Check Engine на приборной панели. С помощью компьютера можно посмотреть скорость ХХ, производительность мотора, позицию заслонки дросселя и число оборотов. Своевременное выполнение работ позволяет вовремя внести изменения в машину и избежать дорогого ремонта. Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
  2. АКПП. Компьютерная диагностика помогает определить состояние коробки-автомат. Работа выполняется при трудностях с включением какой-либо скорости, появлении шумов и сбоях в работе, симптомах течи масла и т. д. Во время работ считываются коды ошибок ЭБУ, собираются и контролируются параметры температурных датчиков, анализируется позиция ручки АКПП и т. д.
  3. Подвеска. Во время компьютерной диагностики с помощью ноутбука можно изучить состояние ходовой автомобиля. Проверка необходима при появлении гула или стука в подвеске, чрезмерном износе шин, странном гуле при движении, ошибках в работе ABS и т. д.
  4. Возможна проверка и других электронных систем, все зависит от конкретной марки автомобиля.
Код ошибки:  Причины загорания чека двигателя на газели

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

Многие продавцы «глушат» лампочку Check Engine, чтобы она не отпугивала покупателей. Своевременная проверка позволяет выявить проблему и отказаться от сделки с недобросовестным продавцом.

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

1 iso11898-2 или can-high speed.

Классическая витая пара нагруженная с обоих концов резисторами 120 Ом.
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
В этом случае уровни на шине CAN выглядят так:
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
В этом случае уровни на шине CAN выглядят так:
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр

Для такой реализации сети используются как правило обычные CAN трансиверы в 8 выводном корпусе, аналоги PCA82C250, TJA1050 и им подобные. Работает такая конфигурация на скоростях 500 кбитс и выше. (Но могут быть исключения) .

2 iso11898-3 или can-low speed или faut tolerant can

В этом варианте используется та же витая пара, но линии CAN-Low и CAN-High подтянуты к напряжению питания и массе соответственно.
Подробное описание FT-CAN по ссылке
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Подробнее в нашей статье о FT-CAN – ссылка.
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Подробнее в нашей статье о FT-CAN – ссылка.
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр

Fault tolerant CAN обычно используется для низкоскоростного обмена между блоками управления относящимися к сегменту сети СалонКомфортМультимедиа.

ВАЖНО: При подключении к шине Faul tolerant CAN, подключать терминальный резистор 120 Ом между линиями CAN-High и CAN-Low НЕ НУЖНО !

Delphipro

Сканер DelphiPRO применяется для диагностики легковых и грузовых авто, а также автобусов, изготовленных в период с 1996 по 2021 года. В группу поддерживаемых моделей входят и отечественные авто.

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

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

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

В качественных адаптерах установлены реле NEC производства Японии, а также CAN фильтры.

Возможности:

  1. Диагностика легковых и грузовых авто. Устройство DelphiPRO работает почти с 50 марками авто, произведенных в Америке, Азии и Европы.
  2. Обнуление сервисных интервалов.
  3. Работа с протоколами OBD-2/ EOBD ISO11898-2 CAN, SAE J1850 VPW, SAE J2411, ISO9141-2, SAE J1850 PWM, SAE J1708.
  4. Получение данных и сброс кодов диагностики.
  5. Получение информации по VIN коду.
  6. Контроль параметров с выводом на экран в режиме онлайн.
  7. Внесение изменений в ЭБУ и т. д.
Код ошибки:  Best value 10 elm327 – Great deals on 10 elm327 from global 10 elm327 sellers | Ranking Keywords on AliExpress

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

Для работы потребуется ПК или ноутбук, кабель или Блютуз.

Vag адаптеры для диагностики автомобиля

Не менее популярное решение — VAG адаптеры, которые применяются на СТО и подойдут для изучения авто своими руками.

Они используются для решения следующих задач:

  • диагностика разных систем авто;
  • считывание и сброс ошибок мотора;
  • проверка блоков ГУР, АБС и ЭУР;
  • контроль работы всех систем машины;
  • сброс накопленных ошибок;
  • изменение параметров мотора, бортового компьютера и трансмиссии.

VAG адаптер отличается простым интерфейсом и наличием подробной инструкции, что позволяет сделать диагностику своими руками и без посещения СТО.

Устройство поддерживает следующие автомобили:

  1. Старые иномарки до 2000-х годов выпуска.
  2. Авто отечественного производства — Ауди, Фольксваген, Шкода и Сеат (должны быть выпущен в период с 1990 до 2005 года).

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

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

Сканер делается на базе FTDI-чипа, поддерживающий все блоки машины.

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

Адаптеры, существующие на рынке

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

Основные типы:

  1. ELM OBD2 — удобные в применении сканеры, работающие на чипе ELM 327, предназначенные для самостоятельного чтения ошибок машины и их устранения без посещения СТО. Оригинальные адаптеры этой серии поставляются с микропроцессором типа Microchip PIC18F25k80, диском программного обеспечения, списком неисправностей и уроками по проведению диагностики. Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
  2. VAG COM адаптеры — устройства, предназначенные для проверки немецких автомобилей группы VAG. Такие девайсы применяются профессионалами на СТО, но могут использоваться и обычными автовладельцами в условиях гаража. Достаточно поставить на компьютер необходимую программу. Хакаем CAN шину авто. Виртуальная панель приборов / ХабрХакаем CAN шину авто. Виртуальная панель приборов / ХабрХакаем CAN шину авто. Виртуальная панель приборов / Хабр
  3. Мультимарочные сканеры — универсальные устройства, справляющиеся с проверкой большинства современных марок автомобилей. Во время диагностики можно проверить и стереть коды поломок, сбросить сервисные интервалы, отобразить характеристики системы, кодировать ЭБУ и активировать специальный режим, изучить состояние исполнительных устройств. Кроме того, с их помощью можно имитировать команды от датчиков и контролировать изменения в системе.
    Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
    Launch Creader 3001 RUS
  4. Дилерские сканеры — профессиональный вариант устройств для диагностики автомобиля, позволяющий выполнить комплексную проверку. Такие автосканеры работают только с машинами определенной марки.
    Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
    iCarsoft i905 — автосканер для Toyota / Lexus

Как видно, рынок автомобильных сканеров для диагностики весьма широк. При этом не все оборудование подходит для самостоятельной проверки машины в гаражных условиях.

Инструкция по диагностике авто с помощью ноутбука в 10 шагов

Процесс диагностики ТС с помощью Scan Tool Pro достаточно прост, чтобы сделать работу своими руками и не привлекать к помощи работников СТО.

Проделайте следующие шаги:

  1. Подготовьте ноутбук и установите на него необходимое программное обеспечение. Сразу после этого введите активационный ключ для получения доступа ко всем функциям. Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
  2. Скопируйте папку с названием «ru» в папку /locate для получения русскоязычного интерфейса. Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
  3. Войдите в программу и в перечне доступных языков выберите русский. Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
  4. Подключите сканер к разъему OBD-2 или используйте для этого переходник, о котором упоминалось ранее в статье. Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
  5. Включите на ноутбуке возможность соединения по Bluetooth и соединитесь с V-Link. Первоначальный пароль, если он не менялся, будет 0000 или 1234. Попробуйте оба варианта. Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
  6. Определите COM для подключения адаптера. В приведенном примере используется COM5. Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
  7. Перезагрузите программу, а после перейдите в раздел Установки, а там войдите в категорию Связь. Сделайте выбор в пользу ручных настроек.
  8. В раскрывшемся перечне поменяйте COM1 на COM5, а после жмите ОК. Хакаем CAN шину авто. Виртуальная панель приборов / ХабрХакаем CAN шину авто. Виртуальная панель приборов / ХабрХакаем CAN шину авто. Виртуальная панель приборов / Хабр
  9. Кликните на кнопку «Соединить» и выждите, пока не начнется процесс синхронизации. Если работа сделана правильно, в конце отображается отчет.
  10. Изучите Таблицу оперативных данных на факт текущих параметров датчиков и контролируйте работоспособность систем машины. Перейдите в раздел «Коды ошибок» для изучения особенностей обозначений и их расшифровки. Хакаем CAN шину авто. Виртуальная панель приборов / ХабрХакаем CAN шину авто. Виртуальная панель приборов / ХабрХакаем CAN шину авто. Виртуальная панель приборов / Хабр

Как видно из инструкции, процесс диагностики автомобиля не должен вызывать трудностей даже в случае, если работа делается самостоятельно. Главное — установить ПО на ноутбук и правильно подключить сканер к диагностическому разъему транспортного средства.

Кабель и переходники для obd-2

В автомобилях после 1996 года выпуска, как правило, установлены привычные разъемы на 16 контактов (OBD-2). Но встречаются и другие типы разъемов со следующими наименованиями — OBD-1, OBD, ALLD, GM и другие.

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

Базовые варианты:

  1. 12 Pin ALDL. Количество контактов — 16. Применяется для коммутации OBD-2 в автомобилях производства GM GMC Chevrolet. Разъем имеет стандарт ALDL. SKU: 12P16P-GM, а также СКП: 030915083218.
  2. 12 Pin to 16 Pin OBD2. Применяется для силовых кабелей Митсубиши и Хендай. На напряжение 12V. SKU: 12P16P-MITSUBISHI-ВАТТ-CLIP-CABLE.
  3. Гнездо Opel Vauxhall на 10 контактов. Тип SKU: 10P16P-OPEL, СКП: 030915083249.
  4. 14 Pin OBD1 до 16 Pin OBD2 для машин Nissan Infiniti. Их можно распознать по следующим обозначениям. SKU: 14P16P-NISSAN, СКП: 030915083324.
  5. 12 Pin OBD1 до 16 Pin OBD2 для машин Рено. Распознавательные знаки — SKU: 12P16P-RENAULT, СКП: 030915083317.

Перед диагностикой автомобиля через ноутбук изучите тип разъема, количество контактов и их назначения. Учтите, что этот параметр зависит от модели авто и конфигурации самого разъема.

В некоторых случаях придется покупать отдельный кабель для проведения диагностических работ.

Переходники и удлинители obd-2, существующие на рынке

С помощью переходников OBD-2 доступна диагностика автомобиля с применением современных устройств без OBD-разъема.

Устройства подходят для автомобилей Ауди, Хонда, Мерседес Бенц, Ауди, Опель, Ниссан, Митсубиси, ВАЗ и другие.

Основные виды переходников перечислены ниже.

  • GM12 pin — OBD2. Подходит для машин Шевроле, Дэу, ЗАЗ и ВАЗ.
  • ГАЗ 12 pin — OBD2. Применяется для авто УАЗ и ГАЗ, используется 12 контактов.
  • Набор переходников AutoCom для легковых автомобилей. Для людей, которые профессионально занимаются диагностикой, может пригодится комплект оборудования в него входит следующий набор — VAG 2 2 pin -> OBD-2 (для Ауди, Шкода, Сеат и Фольксваген), BENZ 38 pin -> OBD-2 (для Мерседес Бенц), BMW ADS 20 pin -> OBD-2 (для БМВ), FIAT 3 pin -> OBD-2 (для Альфа Ромео, Фиал и Лянчиа), OPEL 10 pin -> OBD-2 (для Опель), PSA 2 pin -> OBD2 (для Пежо и Ситроен), PSA 30 pin -> OBD-2 (для Пежо и Ситроен).
  • Набор переходников AutoCom для грузовых авто. В комплектацию входит 7 pin Knorr Wabco Trailer Cable, а также другие комплектующие — 12 pin MAN Cable, pin IVECO Cable, 16 pin SCANIA Cable, 12 pin Renault Cable, 8 pin VOLVO Cable, 37 pin MAN Cable, BENZ Cable.
  • VAG 2×2 – OBD-2. Подходит для машин VAG группы, выпущенных до 1997-го. В комплектацию входит две фишки — диагностические линии K и L, а также 12 В питания с «землей». Каждая из фишек подписана, предусмотрены засечки от неправильного подключения.
  • Kia 20pin – OBD-2. Используется для диагностики авто марки Киа. Имеет 20 разъемов. Сам разъем находится в подкапотном пространстве. В некоторых моделях можно использовать сканер ELM327, но с помощью упомянутого адаптера.
  • Ford 7pin — OBD-2 — для диагностики автомобилей Форд, Линкольн и Меркури. В основном применяется для старых машин марки Форд, выпущенных в период с 1985 по 1995 года.
  • Mercedes 38 pin – OBD-2 — предназначен для диагностики автомобилей Мерседес, сошедших с конвейера в период с 1994 до 2002 года. Имеет 38 контактов в разъеме.
  • Mercedes 14 pin — OBD-2 — передник с разъемом на 14 контактов для OBD-2. Предназначен для проверки авто марок Фольксваген, Мерседес Бенц (Спринтер, Актрос и Атего).
  • Nissan 14 pin – OBD-2 — устройство для диагностики машин марки Ниссан старых годов выпуска, имеющих гнездо на 14 контактов.
  • Toyota 22 pin Japan – OBD-2 — переходник для диагностики авто, выпускаемых на японском рынке до появления OBD-2 стандарта.
  • Toyota 17 pin – OBD-2 — применяется для машин Тойота с диагностическим OBD-разъемом на 17 контактов.
  • BMW 20 pin – OBD-2 — помогает в диагностике авто БМВ, произведенных до 2020 года.
  • Honda / Acura 3 pin – OBD-2 — переходник для машин от производителя Акура и Хонда, имеющих 3-pin разъем. Его покупка позволяет выполнить диагностику старых моделей.
  • Honda / Acura 5 pin – OBD-2 — используется для диагностики машин Хонда более раннего модельного ряда. Подходит для подключения авто с 16 контактами к моделям, имеющих 5-разъемную колодку.
  • Subaru 9 pin – OBD-2 — применяется для машин Субару и обеспечивает переход с 9-разъемной на 16-разъемную группу. Такой тип OBD устанавливался на Субару, выпускаемы в период 1993-2001 года.
  • Renault 12 pin – OBD-2 — переходник, позволяющий подключить сканер между авто с 12 и 16 пинами. Подходит для проверки автомобилей Рено.
  • Mazda 17 pin – OBD-2 — подходит для диагностики автомобилей Мазда, имеющих 17-разъемную колодку. С его помощью можно смело применять современные сканеры.
  • Mitsubishi / Hyundai 12 pin — применяется для авто марок Хендай и Митсубиси, выпущенных в период 1989-1998 год. Имеют колодку с 12 контактами.
  • Opel / Vauxhall 10 pin – OBD-2 — предназначен для диагностики Вауксхолл и Опель. Автомобили должны быть выпущены до 1996-го. Их особенность — наличие прямоугольного разъема с 10 контактами.
  • Fiat, Lancia, Alfa Romeo 3 pin – OBD-2 — используется для машин марок Альфа Ромео, Ланчиа и Фиат, имеющих 3-пиновое гнездо, а также зажимы типа «крокодил» для внешнего питания.
  • Peugeot, Citroen 30 pin — OBD-2 — предназначен для диагностики Ситроен и Пежо, вышедших с конвейера до 1997 года.
  • Cummins 9 pin (КАМАЗ, КАВЗ, ПАЗ) – OBD-2 — используется для диагностики машин КАВЗ, КАМАЗ и ПАЗ. Обеспечивает переход с 9-ти на 16-пиновый разъем.
  • Volvo 8 pin – OBD-2. Переходник для применения на грузовых машина Вольво с 8-контактной колодкой.
  • Iveco 30 pin – OBD-2 — используется для подключения оборудования с 30-пиновый на 16-контактный разъем. Применяется для диагностики автомобилей Ивеко.
  • SCANIA / DAF-16 pin — удобный инструмент, обеспечивающий переход между старыми колодками Скания или Даф на новые типы разъемов для проведения диагностических работ.
  • OBD-2 1.5 метра — удлинитель на 1,5 м, предназначенный для подключения разъема к сканеру.
  • OBD2 20 см — еще один удлинитель, предназначенный для применения в условиях ограниченного доступа к разъему. Имеется распайка всех 16 контактов.
  • Переходник с OBD-2 на RS232 COM.

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

Расшифровка диагностических кодов протокола obd-2

Сегодня коды неисправности подведены к единому стандарту для упрощения процесса диагностики и определения неисправности автомобилей разных марок. Впервые стандарт появился в Соединенных Штатах в 1996-м, а в Европе в 2001-м. В России он применяется ориентировочно с 2006 года.

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

Для примера рассмотрим код P0257. Он состоит из двух элементов — буквы и четырех цифр.

1-й символ.

Первая буква может быть четырех видов:

  1. P (Powertrain). Свидетельствует о наличии проблем в коробке передач или моторе.
  2. C (Chassis). Этот код ошибки показывает на неисправности в шасси, а именно ABS, блокировке дифференциала, системе антизаноса.
  3. B (Body). Наличие такой буквы в коде свидетельствует о сбоях в работе кондиционера, климат-контроля, подушек безопасности или люков.
  4. U (Network). Код неисправности дает информацию о сбоях в сети блоков управления, трудностях связи между ними.

В нашем примере код начинается на букву P, что свидетельствует о проблемах в КПП или двигателе.

2-й символ.

Сразу после буквы можно увидеть цифровой ряд.

Первое число может быть двух видов:

  • «0» — свидетельствует о том, что это общий код неисправности для OBD-2, характерный для всех производителей. Иными словами, наименование будет идентичным для различных марок авто, будь это БМВ, Тойота или другие.
  • «1» — индивидуальный код, характерный для конкретного производителя. Появление такой цифры после числового обозначения требует внимательно подойти к интерпретации ошибки. На практике возможны совпадения, но в 8 из 10 случаев у каждой марки индивидуальные обозначения. Они указываются на специальном или английском языке.

В приведенном примере после P стоит цифра два, что свидетельствует о наличии стандартного кода.

3-й символ.

По третьему значению в коде можно понять, в каком именно узле возникла проблема.

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

  1. Система подачи топлива или воздуха.
  2. То же самое.
  3. Система зажигания.
  4. Дополнительный контроль.
  5. ХХ (холостой ход).
  6. Электронный блок управления и его цепочки.
  7. Трансмиссия.
  8. То же самое.

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

4-й и 5-й символ.

Последние две цифры — порядковый номер выпавшего кода ошибки применительно к текущей диагностике автомобиля. Начинается от 01 и далее. В нашем примере речь идет о 57-й ошибке.

Сканер

Устройство подключается к разъему и покупается под конкретную марку/модель машины.

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

Примером такого устройства может послужить мультимарочный диагностический сканер Rokodil ScanX.

Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Rokodil ScanX

Сканер надежен в работе и совместим с большинством бензиновых автомобилей начиная с 1993 года выпуска и дизельных с 1996.

Подключение осуществляется через блютуз версии 4.2 к любому устройству на базе iOS, Android или Windows.

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

При покупке б/у авто будет полезным функция отображения VIN автомобиля и его реального пробега.

Учитывая невысокую стоимость, затраты на приобретение устройства окупятся за 1-2 поездки на СТО.

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

По своей сути адаптер — переходник между ЭБУ и ноутбуком, применяемым для компьютерной диагностики. Его задача в том, чтобы получить, расшифровать и передать данные в понятном виде.

Особую популярность у автомобилистов получили автосканеры работающие на чипе ELM327.

Сканеры на базе чипа elm327

Адаптеры ELM327 пользуются спросом у автовладельцев, желающих самостоятельно проверить автомобиль обойтись без посещения СТО. Они позволяют проверить машину с помощью ПК, ноутбуков и других устройств. Функционал оборудования зависит от применяемого ПО.

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

Базовые функции:

  1. Диагностика мотора и системы подачи топлива.
  2. Считывание и изучение кодов ошибок.
  3. Проверка электроники транспортного средства.
  4. Выявление поломки контролирующих датчиков.
  5. Сброс ошибок и т. д.

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

Применение сканера позволяет изучить состояние системы подачи топлива, увидеть положение заслонки дросселя и измерить скорость машины.

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

Поддерживаемые протоколы:

  1. ISO 9141-2. Применяются для автомобилей Хонда, ВАЗ, ГАЗ, Тойота, Ниссан, Мерседес, Инфинити, Порше, БМВ, Лексус и т. д.
  2. ISO 15765-4 (CAN) подходят для машин Рено, Ягуар, Форд, Фольксваген, Опель, Ауди, Мазда, Сааб, Вольво, Порше, Пежо, Рено, Опель и других.
  3. ISO 14230-4 (KWP2000) — протокол, поддерживаемый автомобилями Хендай, Дэу, Киа и т. д.
  4. J1850 VPW подходит для машин Шевроле, Бьюик, Додж, Исузу, Кадиллак, Крайслер и Дженерал Моторс.
  5. J1850 PWM — совместим с Форд, Мазда и Линкольн.

Сканер ELM327 — универсальный прибор, используемый для компьютерной диагностики ТС своими руками без обращения на СТО.

С его помощью можно проверить машины разных производителей:

  1. Отечественные — Шевроле Нива, ВАЗ, ЛАДА, ГАЗ, Ланос, Сенс, Славута (инжектор).
  2. Зарубежные с бензиновыми моторами — Ауди, Акура, Альфа Ромео, БМВ, Астра, Бьюик, Шевроле, Чери, Крайслер, Ситроен, Дача, Дэу, Додж, Кровн Виктория, Даймлер Сикс, Фиат, Форд, Джили, Хонда, Греат Вол, GMC, Хендай, Инфинити, Исузу, Киа, Джип, Ягуар, Киа, Мазда, Лексус, Линкольн, Лянчия, Мерседес, Митсубиши, Ниссан, Опель, Олдсмобил, Пежо, Рено, Порш, Понтиак, Плеймоут, Ровер, Сааб, Сатурн, Шкода, Сеат, Смарт, Ссанг Йонг, Субару, Сузуки, Тойота, Триумф, Фольскваген и Вольсов.
  3. Зарубежные с дизельными моторами — БМВ, Альфа Ромео, Ауди, Шевроле, Фиат, Ситроен, Форд, Джип, Исузу, ГрейтВол, Хонда, Киа, Мазда, Лэнд Ровер, Мерседес Бенц, Ниссан, Сузуки, Ссанг Йонг, Опель, Пежо, Рено, Сеат, Фольксваген, Вольво и Виннабеджо.

Упомянутый список ориентировочный, а отсутствие в нем вашей марки авто не означает, что она не поддерживается ELM327.

Скорости работы can шины

CAN на разных автомобилях и в разных сегментах сети может работать на разных скоростях.

Названия сегментов сети: Мотор, Шасси, Комфорт, Салон – условны!  У Каждого автопроизводителя свои названия этих участков сети!

  • Группа VAG:  Моторшасси – 500 кбитс, Комфорт – 100 кбитс и с 2021 года шина Комфорт может иметь скорость 500 кбитс., Диагностика: 500 кбитс.
  • BMW: МоторШасси – 500кбитс, Комфорт – 100 кбитс и с 2021 года шина Комфорт может иметь скорость 500 кбитс., Диагностика: 500 кбитс.
  • Mercedes-Benz: МоторШасси – 500 кбитс, Комфорт 83.333 кбитс, 250 кбитс, Диагностика: 500 кбитс.
  • Ford, Mazda:  МоторШасси – 500 кбитс, Комфорт 125 кбитс.  (Для Ford может быть больше вариантов)
  • KIAHyundai: МоторШасси – 500 кбитс, Комфорт 125 кбитс, 500 кбитс, Мультимедиа:  125 кбитс, 500 кбитс., Диагностика: 500 кбитс.
  • GM: МоторШасси – 500 кбитс, Комфорт: 33.333 кбитс, 95.2 кбитс, Диагностика: 500 кбитс.
  • Toyota, Nissan, Honda, Subaru, Suzuki: 500 кбитс (может использоваться гейтвей)
  • Mitsubishi: МоторШасси: 500 кбитс, СалонКомфорт – 83.333 кбитс, 250 кбитс, Диагностика: 500 кбитс.
  • Volvo:  МоторШасси: 500 кбитс, СалонКомфорт – 500 кбитс,  125 кбитс, Диагностика: 500 кбитс.
  • Renault: 500 кбитс
  • Peugeot: МоторШасси – 500 кбитс, Комфорт 125 кбитс.
  • Lada: 500 кбитс
  • Коммерческая и специальная техника: Стандарт J1939 250 или 500 кбитс.

Софт панели приборов на python и kivy (ui framework)

Параллельно со сборкой самой панели приборов я вел разработку приложения для отображения информации с датчиков. В самом начале я не планировал какой либо дизайн.

Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Первая версия панели приборов

По мере разработки решил визуализировать данные более наглядно. Хотел гоночный дизайн, а получилось, что-то в стиле 80-х.

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

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

Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Третья версия панели приборов

Ранее, я никогда не разрабатывал графические приложения под Linux поэтому не знал с чего начать. Вариант на вебе простой в разработке, но слишком много лишних компонентов: иксы, браузер, nodejs, хотелось быстрой загрузки. Попробовав Qt PySide2 я понял, что это займет у меня много времени, т.к. мало опыта.

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

import can
import os
import sys
from threading import Thread
import time

os.environ['KIVY_GL_BACKEND'] = 'gl'
os.environ['KIVY_WINDOW'] = 'egl_rpi'

from kivy.app import App
from kivy.properties import NumericProperty
from kivy.properties import BoundedNumericProperty
from kivy.properties import StringProperty
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.widget import Widget
from kivy.uix.scatter import Scatter
from kivy.animation import Animation

messageCommands = {
    'GET_DOORS_COMMAND': 0x220D,
    'GET_OIL_TEMPERATURE' : 0x202F,
    'GET_OUTDOOR_TEMPERATURE' : 0x220C,
    'GET_INDOOR_TEMPERATURE' : 0x2613,
    'GET_COOLANT_TEMPERATURE' : 0xF405,
    'GET_SPEED' : 0xF40D,
    'GET_RPM' : 0xF40C,
    'GET_KM_LEFT': 0x2294,
    'GET_FUEL_LEFT': 0x2206,
    'GET_TIME': 0x2216
}

bus = can.interface.Bus(channel='can0', bustype='socketcan')
Полный код панели в одном python файле

# -*- coding: utf-8 -*-

import can
import os
import sys
from threading import Thread
import time

os.environ['KIVY_GL_BACKEND'] = 'gl'
os.environ['KIVY_WINDOW'] = 'egl_rpi'

from kivy.app import App
from kivy.properties import NumericProperty
from kivy.properties import BoundedNumericProperty
from kivy.properties import StringProperty
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.widget import Widget
from kivy.uix.scatter import Scatter
from kivy.animation import Animation

messageCommands = {
    'GET_DOORS_COMMAND': 0x220D,
    'GET_OIL_TEMPERATURE' : 0x202F,
    'GET_OUTDOOR_TEMPERATURE' : 0x220C,
    'GET_INDOOR_TEMPERATURE' : 0x2613,
    'GET_COOLANT_TEMPERATURE' : 0xF405,
    'GET_SPEED' : 0xF40D,
    'GET_RPM' : 0xF40C,
    'GET_KM_LEFT': 0x2294,
    'GET_FUEL_LEFT': 0x2206,
    'GET_TIME': 0x2216
}

bus = can.interface.Bus(channel='can0', bustype='socketcan')

class PropertyState:
    def __init__(self, last, current):
        self.last = last
        self.current = current

    def lastIsNotNow(self):
        return self.last is not self.current

class CanListener(can.Listener):
    def __init__(self, dashboard):
        self.dashboard = dashboard
        self.speedStates = PropertyState(None,None)
        self.rpmStates = PropertyState(None,None)
        self.kmLeftStates = PropertyState(None,None)
        self.coolantTemperatureStates = PropertyState(None,None)
        self.oilTempratureStates = PropertyState(None,None)
        self.timeStates = PropertyState(None,None)
        self.outDoorTemperatureStates = PropertyState(None,None)
        self.doorsStates = PropertyState(None,None)
        self.carMinimized = True

    def on_message_received(self, message):
	 messageCommand = message.data[3] | message.data[2] << 8

        if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_SPEED']:
            self.speedStates.current = message.data[4]
            if self.speedStates.lastIsNotNow():
                self.dashboard.speedometer.text = str(self.speedStates.current)
                self.speedStates.last = self.speedStates.current

        if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_RPM']:
            self.rpmStates.current = message.data[5] | message.data[4] << 8
            if self.rpmStates.lastIsNotNow():
                self.dashboard.rpm.value = self.rpmStates.current/4
                self.rpmStates.last = self.rpmStates.current
        if message.arbitration_id == 0x35B:
            self.rpmStates.current = message.data[2] | message.data[1] << 8
            if self.rpmStates.lastIsNotNow():
                self.dashboard.rpm.value = self.rpmStates.current/4
                self.rpmStates.last = self.rpmStates.current

        if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_KM_LEFT']:
            self.kmLeftStates.current = message.data[5] | message.data[4] << 8
            if self.kmLeftStates.lastIsNotNow():
                self.dashboard.kmLeftLabel.text = str(self.kmLeftStates.current)
                self.kmLeftStates.last = self.kmLeftStates.current

        if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_COOLANT_TEMPERATURE']:
            self.coolantTemperatureStates.current = message.data[4]
            if self.coolantTemperatureStates.lastIsNotNow():
                self.dashboard.coolantLabel.text = str(self.coolantTemperatureStates.current-81)
                self.coolantTemperatureStates.last = self.coolantTemperatureStates.current

        if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_OIL_TEMPERATURE']:
            self.oilTempratureStates.current = message.data[4]
            if self.oilTempratureStates.lastIsNotNow():
                self.dashboard.oilLabel.text = str(self.oilTempratureStates.current-58)
                self.oilTempratureStates.last = self.oilTempratureStates.current

        if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_TIME']:
            self.timeStates.current = message.data[5] | message.data[4] << 8
            if self.timeStates.lastIsNotNow():
                self.dashboard.clock.text = str(message.data[4])   ":"   str(message.data[5])
                self.timeStates.last = self.timeStates.current

        if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_OUTDOOR_TEMPERATURE']:
            self.outDoorTemperatureStates.current = float(message.data[4])
            if self.outDoorTemperatureStates.lastIsNotNow():
                self.dashboard.outDoorTemperatureLabel.text = str((self.outDoorTemperatureStates.current - 100)/2)
                self.outDoorTemperatureStates.last = self.outDoorTemperatureStates.current

        if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_DOORS_COMMAND']:
            self.doorsStates.current = message.data[4]
            if self.doorsStates.lastIsNotNow():
                self.doorsStates.last = self.doorsStates.current
                self.dashboard.car.doorsStates=message.data[4]

                # all doors closed -> minimize car
                if self.doorsStates.current == 0x55:
                    self.dashboard.minimizeCar()
                    self.carMinimized = True
                else:
                    if self.carMinimized:
                        self.dashboard.maximizeCar()
                        self.carMinimized = False
          
class Dashboard(FloatLayout):
    def __init__(self,**kwargs):
        super(Dashboard,self).__init__(**kwargs)

        # Background
        self.backgroundImage = Image(source='bg.png')
        self.add_widget(self.backgroundImage)

        # RPM
        self.rpm = Gauge(file_gauge = "gauge512.png", unit = 0.023, value=0, size_gauge=512, pos=(0,0))
        self.add_widget(self.rpm)
        self.rpm.value = -200

        # Speedometer
        self.speedometer = Label(text='0', font_size=80, font_name='hemi_head_bd_it.ttf', pos=(0,-15))
        self.add_widget(self.speedometer)

        # KM LEFT
        self.kmLeftLabel = Label(text='000', font_name='Avenir.ttc', halign="right", text_size=self.size, font_size=25, pos=(278,233))
        self.add_widget(self.kmLeftLabel)

        # COOLANT TEMPEARATURE
        self.coolantLabel = Label(text='00', font_name='hemi_head_bd_it.ttf', halign="right", text_size=self.size, font_size=27, pos=(295,-168))
        self.add_widget(self.coolantLabel)

        # OIL TEMPERATURE
        self.oilLabel = Label(text='00', font_name='hemi_head_bd_it.ttf', halign="right", text_size=self.size, font_size=27, pos=(-385,-168))
        self.add_widget(self.oilLabel)

        # CLOCK
        self.clock = Label(text='00:00', font_name='Avenir.ttc', font_size=27, pos=(-116,-202))
        self.add_widget(self.clock)

        # OUTDOOR TEMPERATURE
        self.outDoorTemperatureLabel = Label(text='00.0', font_name='Avenir.ttc', halign="right", text_size=self.size, font_size=27, pos=(76,-169))
        self.add_widget(self.outDoorTemperatureLabel)

        # CAR DOORS
        self.car = Car(pos=(257,84))
        self.add_widget(self.car)

    def minimizeCar(self, *args):
        print("min")
        anim = Animation(scale=0.5, opacity = 0, x = 400, y = 240, t='linear', duration=0.5)
        anim.start(self.car)

        animRpm = Animation(scale=1, opacity = 1, x = 80, y = -5, t='linear', duration=0.5)
        animRpm.start(self.rpm)

    def maximizeCar(self, *args):
        print("max")
        anim = Animation(scale=1, opacity = 1, x=257, y=84, t='linear', duration=0.5)
        anim.start(self.car)

        animRpm = Animation(scale=0.5, opacity = 0, x = 80, y = -5, t='linear', duration=0.5)
        animRpm.start(self.rpm)


class Car(Scatter):
    carImage = StringProperty("car362/car.png")

    driverDoorClosedImage = StringProperty("car362/driverClosedDoor.png")
    driverDoorOpenedImage = StringProperty("car362/driverOpenedDoor.png")

    passangerDoorClosedImage = StringProperty("car362/passangerClosedDoor.png")
    passangerDoorOpenedImage = StringProperty("car362/passangerOpenedDoor.png")

    leftDoorClosedImage = StringProperty("car362/leftClosedDoor.png")
    leftDoorOpenedImage = StringProperty("car362/leftOpenedDoor.png")

    rightDoorClosedImage = StringProperty("car362/rightClosedDoor.png")
    rightDoorOpenedImage = StringProperty("car362/rightOpenedDoor.png")

    doorsStates = NumericProperty(0)

    size = (286, 362)

    def __init__(self, **kwargs):
        super(Car, self).__init__(**kwargs)

        _car = Image(source=self.carImage, size=self.size)

        self.driverDoorOpened = Image(source=self.driverDoorOpenedImage, size=self.size)
        self.passangerDoorOpened = Image(source=self.passangerDoorOpenedImage, size=self.size)
        self.leftDoorOpened = Image(source=self.leftDoorOpenedImage, size=self.size)
        self.rightDoorOpened = Image(source=self.rightDoorOpenedImage, size=self.size)

        self.driverDoorClosed = Image(source=self.driverDoorClosedImage, size=self.size)
        self.passangerDoorClosed = Image(source=self.passangerDoorClosedImage, size=self.size)
        self.leftDoorClosed = Image(source=self.leftDoorClosedImage, size=self.size)
        self.rightDoorClosed = Image(source=self.rightDoorClosedImage, size=self.size)

        self.add_widget(_car)
        self.add_widget(self.driverDoorOpened)
        self.add_widget(self.passangerDoorOpened)
        self.add_widget(self.leftDoorOpened)
        self.add_widget(self.rightDoorOpened)

        self.bind(doorsStates=self._update)

    def _update(self, *args):
        driverDoorStates = self.doorsStates&1
        passangerDoorStates = self.doorsStates&4
        leftDoorStates = self.doorsStates&16
        rightDoorStates = self.doorsStates&64
        if driverDoorStates != 0:
            try:
                self.remove_widget(self.driverDoorOpened)
                self.add_widget(self.driverDoorClosed)
            except:
                pass
        else:
            try:
                self.remove_widget(self.driverDoorClosed)
                self.add_widget(self.driverDoorOpened)
            except:
                pass
        if passangerDoorStates != 0:
            try:
                self.remove_widget(self.passangerDoorOpened)
                self.add_widget(self.passangerDoorClosed)
            except:
                pass
        else:
            try:
                self.remove_widget(self.passangerDoorClosed)
                self.add_widget(self.passangerDoorOpened)
            except:
                pass
        if leftDoorStates != 0:
            try:
                self.remove_widget(self.leftDoorOpened)
                self.add_widget(self.leftDoorClosed)
            except:
                pass
        else:
            try:
                self.remove_widget(self.leftDoorClosed)
                self.add_widget(self.leftDoorOpened)
            except:
                pass
        if rightDoorStates != 0:
            try:
                self.remove_widget(self.rightDoorOpened)
                self.add_widget(self.rightDoorClosed)
            except:
                pass
        else:
            try:
                self.remove_widget(self.rightDoorClosed)
                self.add_widget(self.rightDoorOpened)
            except:
                pass

class Gauge(Scatter):
    unit = NumericProperty(1.125)
    zero = NumericProperty(116)
    value = NumericProperty(10) #BoundedNumericProperty(0, min=0, max=360, errorvalue=0)
    size_gauge = BoundedNumericProperty(512, min=128, max=512, errorvalue=128)
    size_text = NumericProperty(10)
    file_gauge = StringProperty("")

    def __init__(self, **kwargs):
        super(Gauge, self).__init__(**kwargs)

        self._gauge = Scatter(
            size=(self.size_gauge, self.size_gauge),
            do_rotation=False, 
            do_scale=False,
            do_translation=False
            )

        _img_gauge = Image(source=self.file_gauge, size=(self.size_gauge, self.size_gauge))

        self._needle = Scatter(
            size=(self.size_gauge, self.size_gauge),
            do_rotation=False,
            do_scale=False,
            do_translation=False
            )

        _img_needle = Image(source="arrow512.png", size=(self.size_gauge, self.size_gauge))


        self._gauge.add_widget(_img_gauge)
        self._needle.add_widget(_img_needle)

        self.add_widget(self._gauge)
        self.add_widget(self._needle)

        self.bind(pos=self._update)
        self.bind(size=self._update)
        self.bind(value=self._turn)

    def _update(self, *args):
        self._gauge.pos = self.pos
        self._needle.pos = (self.x, self.y)
        self._needle.center = self._gauge.center

    def _turn(self, *args):
        self._needle.center_x = self._gauge.center_x
        self._needle.center_y = self._gauge.center_y
        a = Animation(rotation=-self.value*self.unit   self.zero, t='in_out_quad',duration=0.05)
        a.start(self._needle)

class requestsLoop(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
        self.start()

    canCommands = [
        can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_DOORS_COMMAND'] >> 8, messageCommands['GET_DOORS_COMMAND'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
        can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_SPEED'] >> 8, messageCommands['GET_SPEED'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
        can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_KM_LEFT'] >> 8, messageCommands['GET_KM_LEFT'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
        can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_RPM'] >> 8, messageCommands['GET_RPM'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
        can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_OIL_TEMPERATURE'] >> 8, messageCommands['GET_OIL_TEMPERATURE'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
        can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_FUEL_LEFT'] >> 8, messageCommands['GET_FUEL_LEFT'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
        can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_OUTDOOR_TEMPERATURE'] >> 8, messageCommands['GET_OUTDOOR_TEMPERATURE'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
        can.Message(arbitration_id=0x746, data=[0x03, 0x22, messageCommands['GET_INDOOR_TEMPERATURE'] >> 8, messageCommands['GET_INDOOR_TEMPERATURE'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
        can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_COOLANT_TEMPERATURE'] >> 8, messageCommands['GET_COOLANT_TEMPERATURE'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
        can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_TIME'] >> 8, messageCommands['GET_TIME'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False)
    ]

    def run(self):
        while True:
            for command in self.canCommands:
                bus.send(command)
                time.sleep(0.005)

class BoxApp(App):
    def build(self):
        dashboard = Dashboard();
        listener = CanListener(dashboard)
        can.Notifier(bus, [listener])

        return dashboard
        
if __name__ == "__main__":
    # Send requests
    requestsLoop()

    _old_excepthook = sys.excepthook
    def myexcepthook(exctype, value, traceback):
        if exctype == KeyboardInterrupt:
            print "Handler code goes here"
        else:
            _old_excepthook(exctype, value, traceback)
    sys.excepthook = myexcepthook

    # Show dashboard
    BoxApp().run()


Алгоритм работы следующий, используется 3 потока:

  1. В главном потоке работаем с графическими элементы (спидометр, тахометр, часы, температуры и др) на экране
  2. Во втором потоке каждые 5 мс делаем опрос следующего датчика
  3. В третьем потоке слушаем CAN шину, получив ответ парсим его и обновляем соответствующий графический элемент

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

Проект цифровой панель приборов открытый. Рад буду предложениям и комментариям!

Универсальный переключаемый диагностический кабель kkl-line

Кабель — адаптер K-Line USB позволяет подключать ПК, ноутбук и планшет к большинству автомобилей со стандартным диагностическим разъёмом OBDII. Предназначен для диагностики работы и сброса ошибок различных систем авто.

Отличается от множества подобных кабелей применением чипа-конвертера FTDI (работающий с нестандартной скоростью приёма-передачи 10400) и наличием переключателя, позволяющего подцепляться к различным контактам OBDII для расширения применяемости адаптера на разных авто. Полезной особенностью такого адаптера является возможность диагностировать не только ECU (ЭБУ), но и многие SRS (AirBag), некоторые ABS, BCM и т.д — главное, чтобы они имели K-Line и была под рукой соответствующая программа.

У данного продавца эти кабели закончились, но можно легко их найти, например тут
https://o-b-d.ru/item/item/4000333741050.html
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр

Корпус сделан из полупрозрачной синей пластмассы, довольно прочный
Кабель USB достаточно длинный — 1,5м.
Красный индикатор горит при подключении к бортсети и слегка подмигивает при обмене информацией.
На диске ничего ценного не обнаружено — там лежат драйвера 2004г, VAG COM 2004г и FiatECUScan16.
Число программ, работающих с этим кабелем великое множество, например: CASCADE, Вася Диагност, ScanMaster, OpenDiagPro, OBD Scan Tech, TECU, Diagnostic Tool, EasyOBDII, Digimoto, Chip tuning, PCMSCAN, KWP_D, Tiggo Diag и др.
С бортсетью 24V кабель несовместим.

Без разборки конечно-же не обошлось
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Сделан адаптер вполне прилично.

Реальная схема кабеля.
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
U1 — конвертер USB — COM TTL (FT232RL)
U2 — компаратор для преобразования уровней (LM393)

Китайцы и тут умудрились привычно накосячить.
1. Неверно обозначили контакты подключения в правом положении переключателя. Вместо 12/13 реально подключены 11/12
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
Поправлено
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр

2. Неверно организован порог переключения входных компараторов. Вместо положенных по спецификациям ISO 9141 и ISO 14230 для K и L линий — 70% от бортового питания (около 8,5В) зафиксировали его на 65% от питания USB (3,1В). Т.е. фактически использовали уровни для древнего протокола ALDL от GM. Вероятно это сделано для повышения совместимости со старыми ЭБУ от GM в ущерб стабильности, хотя в большинстве случаев, такая схема будет работать нормально. Более правильным было-бы добавить переключатель 5/12B. Для исправления косяка, выпаял SMD резистор R9 и запаял обычный на 2кОм следующим образом:
Хакаем CAN шину авто. Виртуальная панель приборов / Хабр
В некоторых случаях, устройство будет нормально работать и без переделки, а если не будет — паяльник в руки…

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

4. Линии K и L абсолютно идентичны, т.е. если линию K поменять местами с линией L — ничего не измениться. Тут Китайцы чего-то перемудрили, ибо L-Line работает всегда только на передачу информации, причём с линии RTS. Можно считать, что в этом адаптере вместо L-Line поставили ещё одну K-Line по логике ИЛИ, жёстко посадив её на 15pin OBDII
Современные авто L-Line уже не используют, поэтому переделывать не стал.

Неоригинальность чипа FTDI FT232RL установить не удалось — адаптер работает как со старыми, так и с новыми оригинальными драйверами под WinXP x86 и Win8.1 x86
На всякий случай — старые драйвера
yadi.sk/d/LjLgjU5Ndri6z
Новые драйвера ставятся автоматически

После установки драйверов в свойствах уменьшаем время ожидания с 16мсек до 10мсек, после чего необходимо перезагрузить ПК. После этого, адаптер работает более стабильно.

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

Оцените статью
OBD
Добавить комментарий