CAN анализаторы Магазин диагностического оборудования, ключей зажигания для автомобилей. Автомобильная диагностика, obd сканеры, адаптеры.

CAN анализаторы Магазин диагностического оборудования, ключей зажигания для автомобилей. Автомобильная диагностика, obd сканеры, адаптеры. ОБД2

Разработка панели приборов на основе raspberry pi и 7″ дисплея

В качестве аппаратной части я выбрал Raspberry Pi. Была идея использовать Android планшет, но показалось, что на Raspberry Pi будет проще и быстрее. В итоге докупил официальный 7″ дисплей, и сделал CAN шилд из модуля TJA1050 Niren.

OBD2 штекер использовал от старого ELM327 адаптера.

Используются контакты: CAN_L, CAN_H, 12, GND.

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

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

Напильником довел лист черного пластика до размера крышки бардачка, к нему прикрепил бутерброд и дисплей. Для прототипа сойдет, а 3D модель с крышкой для дисплея и всеми нужными крепежами уже в разработке.

Что такое система диагностики автомобилей obd ii – автосканеры.ру

История диагностики с OBD II начинается в 50-х гг. прошлого века, когда правительство США вдруг обнаружило, что поддерживаемое им автомобилестроение в конечном счете ухудшает экологию. Вначале они не знали, что с этим делать, а затем стали создавать различные комитеты для оценки ситуации, годы работы которых и многочисленные оценки привели к появлению законодательных актов. Производители, изображая, что подчиняются этим актам, на самом деле не выполняли их, пренебрегая необходимыми тестовыми процедурами и стандартами. В начале 70-х законодатели предприняли новое наступление, и опять их усилия были проигнорированы.

И только в 1977 г. ситуация начала меняться. Наступил энергетический кризис и спад производства, и это потребовало от производителей решительных действий по спасению самих себя. Департамент по контролю за воздушной средой (Air Resources Board, ARB) и Агентство по защите окружающей среды (Environment Protection Agency, EPA) пришлось воспринимать всерьёз.


На этом фоне и развивалась
концепция диагностики OBD II. В прошлом каждый производитель использовал собственные системы и способы контроля выбросов. Чтобы изменить такое положение, Ассоциация автомобильных инженеров (Society of Automotive Engineers, SAE), предложила несколько стандартов. Можно считать, что рождение OBD произошло в тот момент, когда ARB сделало обязательными многие стандарты SAE в Калифорнии для автомобилей начиная с 1988 г. выпуска.

Первоначально система диагностики OBD IIбыла совсем не сложной. Она относилась к датчику кислорода, системе рециркуляции выхлопного газа (EGR), системе подачи топлива и блоку управления двигателем (ECM) в той части, которая касается превышения норм для выхлопных газов. Система не требовала единообразия от производителей. Каждый из них реализовывал собственную процедуру контроля выхлопов и диагностики. Системы мониторинга выхлопов не были эффективными, поскольку их создали как дополнение к автомобилям, уже находящимся в производстве. Автомобили, исходная конструкция которых не предусматривала мониторинга выхлопных газов, часто не удовлетворяли принятым нормативам. Производители таких автомобилей делали то, что требовали ARB и EPA, но не более. Поставим себя на место независимого автосервиса. Тогда нам пришлось бы иметь уникальный диагностический прибор, описания кодов и инструкции по ремонту для автомобилей каждого производителя. В таком случае автомобиль невозможно было бы хорошо отремонтировать, если вообще удалось бы справиться с ремонтом.


Правительство США оказалось в осаде со всех сторон, начиная с автосервисов и заканчивая защитниками чистого воздуха. Все требовали вмешательства EPA. В результате для создания широкого перечня процедур и стандартов использовались идеи ARB и стандарты SAE. К 1996 г. все производители, продающие автомобили в США, должны были выполнять эти требования.


Так появилось второе поколение системы бортовой диагностики: On-Board Diagnostics II, или OBD II.


Как видим, концепция OBD II не была разработана в одночасье — она развивалась в течение многих лет. Вновь подчеркнем, что диагностика на основе OBD II — это не система управления двигателем, а набор правил и требований, которые должен соблюдать каждый производитель для того, чтобы система управления двигателем удовлетворяла федеральным нормам по составу выхлопных газов. Для лучшего понимания OBD II мы должны рассматривать ее по частям. Когда мы приходим к врачу, он не изучает наше тело целиком, а обследует различные органы. И только после этого результаты осмотра собираются воедино. Так мы и поступим при изучении OBD II. Опишем теперь те составляющие, которые должна иметь система OBD II для обеспечения стандартизации.



Автомобильные диагностические сканеры по протоколу OBD II :


    ELM327 USB это последняя версия популярного адаптера для диагностики автомобилей по протоколу OBDII. Осущетвляет диагностику по все протоколам OBDII (включая CAN). Работает при подключении к ПК через USB.


      


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


      


    Адаптер “Сканматик” служит для подключения персонального компьютера к диагностическому разъему автомобиля при работе с программой СКАНМАТИК. Объединяет в себе все протоколы OBD-2, протокол CAN, а так же поддерживает полную диагностику всех отечественных автомобилей.

Основная функция диагностического разъема (в OBD II он называется диагностическим разъемом связи — Diagnostic Link Connector, DLC) заключается в том, чтобы обеспечить связь диагностического сканера с блоками управления, совместимыми с OBD II. Разъем DLC должен соответствовать стандартам SAE J1962. Согласно этим стандартам, разъем DLC обязан занимать определенное центральное положение в автомобиле. Он должен находиться в пределах 16 дюймов от рулевого колеса. Производитель может разместить DLC в одном из восьми мест, определённых EPA. Каждый контакт разъема имеет свое назначение. Функции многих контактов отданы на усмотрение производителям, однако эти контакты не должны использоваться блоками управления, совместимыми с OBD II. Примерами систем, применяющих такие разъемы, являются SRS (дополнительная ограничительная система) и ABS (антиблокировочная система колес).

img_1[1].jpg

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


Диагностический разъем изображен на рис. 1. Как видим, он имеет заземление и подсоединён к источнику питания (контакты 4 и 5 относятся к заземлению, а контакт 16 — к питанию). Это сделано для того, чтобы сканеру не требовался внешний источник питания. Если при подсоединении сканера питание на нем отсутствует, то необходимо в первую очередь проверить контакт 16 (питание), а также контакты 4 и 5 (заземление). Обратим внимание на буквенно-цифровые символы: J1850, CAN и ISO 9141-2. Это стандарты протоколов, разработанные SAE и ISO (Международная организация по стандартизации).



Производители могут делать выбор среди этих стандартов для обеспечения связи при диагностике. Каждому стандарту соответствует определённый контакт. Например, связь с автомобилями марки Ford реализуется через контакты 2 и 10, а с автомобилями GM — через контакт 2. В большинстве азиатских и европейских марок используется контакт 7, а в некоторых — также контакт 15. Для понимания OBD II не имеет значения, какой протокол рассматривается. Сообщения, которыми обмениваются диагностический прибор и блок управления, всегда одинаковы. Различны лишь способы передачи сообщений.


Стандартные протоколы связи для диагностики 


 


Итак, система OBD II распознает несколько различных протоколов. Здесь мы обсудим только три из них, которые используются в автомобилях, выпускаемых в США. Это протоколы J1850-VPW, J1850-PWM и ISO1941. Все блоки управления автомобиля связаны с кабелем, называемым диагностической шиной, в результате чего образуется сеть. К этой шине можно подключить диагностический сканер. Такой сканер отправляет сигналы конкретному блоку управления, с которым он должен обмениваться сообщениями, и получает ответные сигналы от этого блока управления. Обмен сообщениями продолжается до тех пор, пока сканер не прекратит сеанс связи или не будет отсоединен.



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

img_2[1].jpg

Классификация протоколов

Ассоциация автомобильных инженеров (SAE) определила три различных класса протоколов:
  • протокол класса A, 
  • протокол класса B 
  • протокол класса C


Протокол класса A — самый медленный из трех; он может обеспечивать скорость 10 000 байт/с или 10 Кбайт/с. В стандарте ISO9141 используется протокол класса A.
Протокол класса B в 10 раз быстрее; он поддерживает обмен сообщениями со скоростью 100 Кбайт/с. Стандарт SAE J1850 представляет собой протокол класса B.
Протокол класса C обеспечивает скорость 1 Мбайт/c. Наиболее широко используемый стандарт класса C для автомобилей — это протокол CAN (Controller Area Network — сеть зоны контроллеров).

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

Протокол ISO9141 

 


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


Протокол J1850 VPW 
 


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



С точки зрения дилетанта,
OBD II использует стандартный диагностический коммуникационный протокол, так как Агентство по защите окружающей среды (EPA) потребовало, чтобы автосервисы получили стандартный способ, позволяющий качественно диагностировать и ремонтировать автомобили без затрат на покупку дилерского оборудования. Перечисленные протоколы будут более подробно описаны в последующих публикациях.


Лампочка индикации неисправностей 
 


Когда система управления двигателем обнаруживает проблему с составом выхлопных газов, на приборном щитке загорается надпись Check Engine (“Проверьте двигатель”). Этот индикатор называется лампочкой индикации неисправностей (Malfunction Indication Light — MIL). Индикатор обычно выдает следующие надписи: Service Engine Soon (“Отрегулируйте двигатель в ближайшее время”), Check Engine (“Проверьте двигатель”) и Check (“Выполните проверку”).


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


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



Для того чтобы
проверить функционирование индикатора OBD II MIL, следует включить зажигание (когда на приборном щитке загораются все индикаторы). При этом загорается и индикатор MIL. Спецификация OBD II требует, чтобы этот индикатор горел некоторое время. Некоторые производители делают так, чтобы индикатор оставался включенным, а другие — чтобы он выключался по истечении определенного промежутка времени. При запуске двигателя и отсутствии в нем неисправностей лампочка “Check Engine” должна погаснуть.

Код ошибки:  Решение проблемы кода неисправности P0335: расшифровка, причины, сброс

Лампочка “Check Engine” не обязательно загорается при первом появлении неисправности. Срабатывание этого индикатора зависит от того, насколько серьезна неисправность. Если она считается серьезной и ее устранение не терпит отлагательств, лампочка загорается немедленно. Такая неисправность относится к разряду активных (Active). В случае если устранение неисправности может быть отложено, индикатор не горит и неисправности присваивается сохраняемый статус (Stored). Для того чтобы такая неисправность стала активной, она должна проявиться в течение нескольких драйв-циклов. Обычно драйв-циклом считается процесс, при котором холодный двигатель запускается и работает до достижения нормальной рабочей температуры (при этом температура охлаждающей жидкости должна быть 122 градуса по Фаренгейту).


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


Альфа-указатель DTC 

 


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

Первый символ принято называть альфа-указателем DTC. Этот символ указывает, в какой части автомобиля обнаружена неисправность. Выбор символа (P, B, C или U) определяется диагностируемым блоком управления. Когда получен ответ от двух блоков, используется буква для блока с более высоким приоритетом.

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

  •     P (двигатель и трансмиссия); 
  •     B (кузов); 
  •     С (шасси); 
  •     U (сетевые коммуникации). 

Стандартный набор диагностических кодов ошибок (DTC) 
 


В OBD II неисправность описывается с помощью диагностических кодов неисправностей (Diagnostic Trouble Code — DTC). Коды DTC в соответствии со спецификацией J2021 представляют собой комбинацию одной буквы и четырех цифр. На рис. 3 показано, что означает каждый символ. Рис. 3. Код ошибки


Типы кодов
 
 

Второй символ — наиболее противоречивый. Он показывает, что определил код. 0 (известный как код P0). Базовый, открытый код неисправности, определенный Ассоциацией автомобильных инженеров (SAE). 1 (или код P1). Код неисправности, определяемый производителем автомобиля. Большинство сканеров не могут распознавать описание или текст кодов P1. Однако такой сканер, как, например, Hellion, способен распознать большинство из них. Ассоциация SAE определила исходный перечень диагностических кодов ошибок DTC. Однако производители стали говорить о том, что у них уже есть собственные системы, при этом ни одна система не похожа на другую. Система кодов для автомобилей Mercedes отличается от системы Honda, и они не могут использовать коды друг друга. Поэтому ассоциация SAE пообещала разделить стандартные коды (P0) и коды производителей (P1).

Система, в которой обнаружена неисправность 
 

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

    Топливно-воздушная система.

  •     Топливная система (например, инжекторы). 

    Система зажигания.

  •     Вспомогательная система ограничения выбросов, например: клапан рециркуляции выхлопных газов (Exhaust Gas Recirculation System — EGR), система впуска воздуха в выпускной коллектор двигателя (Air Injection Reaction    System — AIR), каталитический конвертер или система вентиляции топливного бака (Evaporative Emission System — EVAP). 
  •     Система управления скоростным режимом или холостым ходом, а также соответствующие вспомогательные системы. 
  •     Бортовая компьютерная система: модуль управления двигателем (Power-train Control Module — PCM) или сеть зоны контроллеров (CAN). 
  •     Трансмиссия или ведущий мост.  

Индивидуальный код ошибки 
 

Четвертый и пятый символы нужно рассматривать совместно. Они обычно соответствуют старым кодам ошибок OBDI. Эти коды, как правило, состоят из двух цифр. В системе OBD II также берутся эти две цифры и вставляются в конец кода ошибки — так ошибки легче различать.


Теперь, когда мы ознакомились с тем, как формируется стандартный набор диагностических кодов ошибок (DTC), рассмотрим в качестве примера
код DTC P0301. Даже не глядя на текст ошибки, можно понять, в чем она состоит.


Буква P говорит о том, что ошибка возникла в двигателе. Цифра 0 позволяет заключить, что это базовая ошибка. Далее следует цифра 3, относящаяся к системе зажигания. В конце мы имеем пару цифр 01. В данном случае эта пара цифр говорит нам о том, в каком цилиндре имеет место пропуск зажигания. Собирая все эти сведения воедино, мы можем сказать, что возникла неисправность двигателя с пропусками зажигания в первом цилиндре. Если бы выдавался код ошибки P0300, это означало бы, что имеются пропуски зажигания в нескольких цилиндрах и система управления не может определить, какие именно цилиндры неисправны.


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

Программное обеспечение, управляющее процессом самодиагностики, называется по-разному. Производители автомобилей Ford и GM именуют его администратором диагностики (Diagnostic Executive), а Daimler Chrysler — диспетчером задач (Task Manager). Это набор программ, совместимых с OBD II, которые выполняются в блоке управления двигателем (PCM) и наблюдают за всем, что происходит вокруг. Блок управления двигателем — самая настоящая рабочая лошадка! В течение каждой микросекунды он выполняет огромное количество вычислений и должен определять, когда следует открывать и закрывать инжекторы, когда нужно подавать напряжение на катушку зажигания, каково должно быть опережение угла зажигания и т. д. Во время этого процесса программное обеспечение OBD II проверяет, все ли перечисленные характеристики соответствуют нормам.


Это программное обеспечение:

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


Как показывает этот перечень, для того чтобы программное обеспечение выполняло возложенные на него задачи, оно должно обеспечивать и завершать работу мониторов в системе управления двигателем. Что же такое монитор? Его можно рассматривать как тест, выполняемый системой OBD II в блоке управления двигателем (PCM) для оценки правильности функционирования компонентов, ответственных за состав выбросов.


Согласно OBD II, имеется 2 типа мониторов: 

  •     непрерывный монитор (работает все время, пока выполняется соответствующее условие); 
  •     дискретный монитор (срабатывает один раз в течение поездки). 


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


Стандартизация названий компонентов 

 


В любой области существуют различные названия и жаргонные словечки для обозначения одного и того же понятия. Возьмем, к примеру, код ошибки. Некоторые называют его кодом, другие — ошибкой, третьи — “штуковиной, которая сломалась”. Обозначение DTC — это и есть ошибка, код или “штуковина, которая сломалась”.


До появления OBD II каждый производитель придумывал свои имена компонентам автомобиля. Очень трудно было понять терминологию Ассоциации автомобильных инженеров (SAE) тому, кто пользовался названиями, принятыми в Европе. Теперь же благодаря OBD II во всех автомобилях должны использоваться стандартные имена компонентов. Жизнь стала намного легче для тех, кто ремонтирует автомобили и заказывает запасные части. Как всегда, когда во что-то вмешивается правительственная организация, сокращения и жаргон стали обязательными. Ассоциация SAE выпустила стандартизованный список терминов для компонентов автомобиля, относящихся к OBD II. Этот стандарт называется J1930. Сегодня по дорогам ездят миллионы автомобилей, в которых применяется система OBD II. Нравится это кому-то или нет — OBD II влияет на жизнь каждого человека, делая более чистым воздух вокруг нас. Система OBD II позволяет разрабатывать универсальные методики ремонта автомобилей и по-настоящему интересные технологии.

Поэтому можно смело сказать, что OBD II — мостик в будущее автомобилестроения.

Код ошибки:  bmw e46 obd2 scanner на АлиЭкспресс — купить онлайн по выгодной цене

Тема: 

Автосканеры по протоколу OBD 2

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

Доставка в любой регион РФ без предоплаты.
При предоплате стоимость пересылки всего 350 рублей. Все товары отправляем Первым классом – ускоренная авиа почта.

* Обращаем ваше внимание на то, что данный интернет-сайт носит исключительно информационный характер и ни при каких условиях не является публичной офертой, определяемой положениями Статьи 437 (2) Гражданского кодекса РФ.


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

О компьютерной диагностике

Диагностическое оборудование или, как часто говорят, автосканер – незаменимый инструмент для ремонта автомобиля. В продаже имеются мультимарочные диагностические сканеры, диагностические комплексы для автосервиса, оборудование для диагностики грузового транспорта, диагностические комплексы для диагностики мототехники, оригинальные мультимарочные сканеры Launch (Лаунч), марочные адаптеры для диагностики, программаторы одометров, приборы для прописывания новых ключей, оборудование для чип тюнинга, переходники на OBD2 и т.д.

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

Второй тип покупателей – это люди покупающие Диагностическое оборудование для бизнеса. Мы продаем диагностические комплексы на базе ноутбука или планшетного компьютера, которые могут работать более чем с 70 марками автомобилей. Подход к каждому клиенту строго индивидуален. Ситуация: Человек решил открыть открыть диагностический пост в своем автосервисе, но ни опыта, ни оборудования у него нет, как и желания тратить большую сумму, так как не известна рентабельность затеи открытия диагностического поста.
Наша работа – определить регион проживания клиента, автомобили каких марок наиболее востребованы в данном регионе и другие немаловажные вопросы. Мы понимаем, что угодили
клиенту, когда он в очередной раз делает заказ на нашем сайте.

О ключах зажигания
Также наш магазин предлагает огромный выбор автомобильных ключей зажигания. В продаже более 650 видов различных ключей зажигания: Оригинальные выкидные ключи,
выкидные ключи под переделку из простого в выкидной, смарт ключи, болванки простых ключей, чипы иммобилайзера для ключей, а также различные запчасти для ключей, 
такие, как сменные лезвия, логотипы, батарейки и т.д. Если у Вас возникли трудности при выборе ключа зажигания – мы осуществляем подбор ключей зажигания по фотографии, просто
пришлите фото Вашего ключа нам на почту mail@o-b-d.ru

Гарантии и Акции

Благодаря проверенным поставщикам качество нашей продукции на высоком уровне, процент нисправного оборудования крайне мал. На все диагностическое оборудование мы предоставляем “нашу” гарантию от 6 месяцев.

Все клиенты, делающие повторный заказ в нашем магазине, получают гарантированную скидку 5% (при оформлении последующего заказа в графе Доп.информация укажите номер предыдущего заказа)

С Уважением, команда o-b-d.ru

Can сниффер из arduino uno


Чтобы послушать, что отправляет VCDS в CAN шину я собрал сниффер на макетке из Arduino и модуля MCP2515 TJA1050 Niren.

Схема подключения следующая:

Видео работы цифровой панели приборов на базе raspberry pi

ОБНОВЛЕНО 24.06.2021

Компьютер автомобиля obd2 на алиэкспресс — купить онлайн по выгодной цене

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

Код ошибки:  Инструкция для программы scanmaster

Закажите компьютер автомобиля obd2 онлайн с доставкой по России: товары с пометкой Plus доступны с ускоренной доставкой и улучшенными условиями возврата.

На Алиэкспресс компьютер автомобиля obd2 всегда в наличии в большом ассортименте: на площадке представлены как надежные мировые бренды, так и перспективные молодые.

Подслушиваем запросы с помощью диагностической системы vag-com (vcds)

Описание VCDS с официального сайта

Приложение на телефон виртуальная панель приборов

CAN анализаторы Магазин диагностического оборудования, ключей зажигания для автомобилей. Автомобильная диагностика, obd сканеры, адаптеры.
CAN анализаторы Магазин диагностического оборудования, ключей зажигания для автомобилей. Автомобильная диагностика, obd сканеры, адаптеры.
Если есть желание поддержать проект, то вот ссылка на приложение, принимаю любые замечания и предложения!
VAG Virtual Cockpit
CAN анализаторы Магазин диагностического оборудования, ключей зажигания для автомобилей. Автомобильная диагностика, obd сканеры, адаптеры.

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


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

CAN анализаторы Магазин диагностического оборудования, ключей зажигания для автомобилей. Автомобильная диагностика, obd сканеры, адаптеры.
Первая версия панели приборов

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

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

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

CAN анализаторы Магазин диагностического оборудования, ключей зажигания для автомобилей. Автомобильная диагностика, obd сканеры, адаптеры.
Третья версия панели приборов

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

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

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

Adblock
detector