Obd2 своими руками на ардуино

Опубликовано: 15.05.2024

Его комментарии к переработке:

1.вся проводка и соединение всех модулей и узлов сохранены из первоначального проекта.(кроме подключения блутуз модуля, он теперь на серийном порте «1»)

2.программа жестко заточена под ардуино МЕГА 2560. на серийном порте «0» присутствует Дебаг при условии раскоментирования дефайна.

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

4.добавлена функция восстановления связи в случае разрыва соединения (параметром потери связи служит отсутствие оборотов двигателя).

5.для работы требуется библиотека OBD.h вложенная в архив с проектом, этот экземпляр имеет несколько изменений от оригинала который можно скачать из интернета, и без неё скорее всего проект не будет работать или будет нестабилен.
папку нужно скопировать в папку " \Documents\Arduino\libraries"

Android приложение со всеми нюансами в Google Play: OliviaDrive

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

image

image

image

image

image

image

image

image

Список требуемых деталей для сборки БК

image

2) LCD2004 жк-модуль

image

3) Модуль Bluetooth HC-05


4) OBD ELM327 Bluetooth сканер


5) Резистор 10 кОм подстроечный, бипер для звука, 2 кнопки для смены экранов, провода для соединений, корпус

Настройка блютуз модуля HC-05 для работы

Подпаиваем провода к пинам блютуза: (картинку с выходами смотреть в описании требуемых деталей)


void loop()
<
if (BTSerial.available())
Serial.write(BTSerial.read());
if (Serial.available())
BTSerial.write(Serial.read());
>

После успешной загрузки скетча открываем: Сервис->Монитор порта. Далее снизу ставим скорость 9600 бод и NL+CR вместе.

Далее вводим команды по одной и нажимаем [Послать]. После каждого ввода должен быть ответ ok.

Заметьте, что mac-адрес вида: «AA:BB:CC:11:22:33» вводится как «AABB,CC,112233». MAC- адрес своего модуля ELM327 можете посмотреть, подключившись для начала на него со своего мобильника. (Стандартные пароли обычно: 1234, 6789, 0000).

Всё, настройка модуля Bluetooth закончена.

Теперь нужно собрать схему Arduino + блютуз + LCD-экран

Схема:

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

3. Подключаем дополнительную кнопку для переключения экранов с данными.

[1 кнопка]: один конец от нормально-открытой кнопки подключаем в GND ардуино, а второй конец в пин 10.
[2 кнопка]: GND + пин 9.

Бипер для звуковых предупреждений подключить по следующей схеме "+" к пину 13, а минус к GND ардуино.

Заливаем скетч в Arduino с помощью Aduino IDE 1.0.6 (использовал эту версию).

Нужно будет обязательно учесть три переменных:

Управление

Скетч:

Все, идем в машину, вставляем ELM327 в порт, ардуину в зарядку для авто и проверяем.

OBD-II диагностика на Arduino

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

Пример работы arduino с софтверным Serial Port:

SoftwareSerial mySerial = SoftwareSerial ( rxPin , txPin );
byte pinState = 0 ;

void setup ()
<
pinMode ( rxPin , INPUT );
pinMode ( txPin , OUTPUT );
mySerial . begin ( 9600 );
>

void loop () <
char someChar = mySerial . read ();
mySerial .print( someChar );
>

SoftwareSerial mySerial = SoftwareSerial ( rxPin , txPin );
char command ; //Terminal Commands

// pid 0x20 to 0x3F
4 , 2 , 2 , 2 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 1 , 1 , 1 , 1 ,
1 , 2 , 2 , 1 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 2 , 2 , 2 , 2 ,

// pid 0x40 to 0x4E
4 , 8 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2
>;

void setup () <
pinMode ( rxPin , INPUT );
pinMode ( txPin , OUTPUT );
digitalWrite ( txPin , HIGH );
delay ( 500 );
pinMode ( K_IN , INPUT );
pinMode ( K_OUT , OUTPUT );
pinMode ( 13 , OUTPUT );
mySerial . begin ( 9600 );
mySerial . println ( "-=Arduino OBD2 Terminal=-" );
>

void loop () <
command = mySerial . read ();
switch ( command ) <
case '1' :
obdConnect ();
break;
case '2' :
mySerial . println ( "MIL Selected" );
get_pid ( 0x01 , str , & tempLong );
break;
case '3' :
mySerial . println ( "RPM Selected" );
get_pid ( 0x03 , str , & tempLong );
break;
case '4' :
mySerial . println ( "MAF Selected" );
get_pid ( 0x10 , str , & tempLong );
break;
>
>


int obdConnect () <
mySerial . println ( "Attempting ECU initialization. " );
if ( iso_init () == 0 ) <
mySerial . println ( "PASS" );
return 0 ;
>
else <
mySerial . println ( "FAIL" );
return 1 ;
>
>

serial_tx_off (); //disable UART so we can "bit-Bang" the slow init.
serial_rx_off ();
delay ( 3000 ); //k line should be free of traffic for at least two secconds.


digitalWrite ( K_OUT , HIGH ); // drive K line high for 300ms
delay ( 300 );

// send 0x33 at 5 bauds

digitalWrite ( K_OUT , LOW ); // start bit
delay ( 200 );

b = 0x33 ;
for ( byte mask = 0x01 ; mask != 0 ; mask <<= 1 )
<
if ( b & mask )
digitalWrite ( K_OUT , HIGH );
else
digitalWrite ( K_OUT , LOW );
delay ( 200 );
>

digitalWrite ( K_OUT , HIGH ); // stop bit + 60 ms delay
delay ( 260 );


Serial . begin ( 10400 ); // switch now to 10400 bauds


byte i = 0 ; // wait for 0x55 from the ECU (up to 300ms)
while( i < 3 && ! iso_read_byte (& b )) <
i ++;
>
mySerial . println ( b , BYTE );
if( b != 0x55 ) <
return 1 ;
>

iso_read_byte (& b );
mySerial . println ( b , BYTE ); // wait for kw1 and kw2
iso_read_byte (& b );
mySerial . println ( b , BYTE );
iso_write_byte (

kw2 (invert of last keyword)
iso_read_byte (& b );
mySerial . println ( b , BYTE ); // ECU answer by 0xCC (

0x33)
if( b != 0xCC )
return 1 ;

void serial_rx_off () <
UCSR0B &=

void serial_tx_off () <
UCSR0B &=

( _BV ( TXEN0 ));
delay ( 20 ); //allow time for buffers to flush
>

void serial_rx_on () <
Serial . begin ( 10400 );
>


boolean iso_read_byte ( byte * b )
<
int readData ;
boolean success = true ;
byte t = 0 ;

while( t != READ_ATTEMPTS && ( readData = Serial . read ())==- 1 ) <
delay ( 1 );
t ++;
>
if ( t >= READ_ATTEMPTS ) <
success = false ;
>
if ( success )
<
* b = ( byte ) readData ;
>

void iso_write_byte ( byte b )
<
serial_rx_off ();
Serial .print( b );
delay ( 10 );
serial_rx_on ();
>


byte iso_checksum ( byte * data , byte len )
<
byte i ;
byte crc ;

for( i = 0 ; i < len + 6 ; i ++)
<
if ( iso_read_byte ( buf + i ))
<
dataSize ++;
>
>

memcpy ( data , buf + 5 , len );
delay ( 55 ); //guarantee 55 ms pause between requests
return dataSize ;
>

iso_write_data ( cmd , 2 ); // send command, length 2

if (! iso_read_data ( buf , reslen )) // read requested length, n bytes received in buf
<
mySerial . println ( "ISO Read Data Error." );
return false ;
>

mySerial .print( "Return Value " );
mySerial .print( pid , DEC );
mySerial .print( " : " );
mySerial . println (* ret );


Некоторое время назад мне удалось немного посидеть за рулём C6 Corvette, оснащённого индикатором на лобовом стекле (ИЛС или HUD) – и мне это очень понравилось. Возможность видеть скорость и обороты двигателя, не отрывая глаз от дороги, делает вождение приятнее.

И с тех пор я хотел сделать ИЛС для своего автомобиля. Разбираясь с применением OBD2 и Arduino для хака автомобилей, я решил сделать себе этот прибор с нуля. Представляю вам материал, который поможет вам сделать свой собственный экземпляр.




Шаг 1: Напечатать корпус на 3D-принтере и собрать

OLED-дисплей можно приклеить куда угодно на ИЛС – главное, чтобы проводов хватило.

Шаг 2: изготовить плату и всё спаять


Эти файлы можно использовать для заказа готовой платы в сервисах типа JLCPCB.

Шаг 3: внешнее подключение





  1. Используя приведённую схему, найдите и отрежьте провод 12 В в середине.
  2. Зачистите его концы.
  3. Отрежьте и зачистите два красных провода, длиной такой же, как от контакта 12 В OBD2 до выключателя ИЛС.
  4. Отрежьте и зачистите 1 красный и 1 чёрный провода, длиной такой же, как от контактов питания OBD2 до клеммной колодки платы.
  5. Припаяйте провода 12 В так, чтобы выключатель ИЛС управлял пиатнием и ELM327, и платы.
  6. Используя приведённую выше схему OBD2, припаяйте чёрный провод к контакту GND OBD2, а другой его конец соедините с клеммной колодкой платы.

Затем подсоедините 3 контакта на плате под названием LED PWR к потенциометру сбоку ИЛС. Наконец, подсоедините разъём JST-мама к OLED дисплею.

Шаг 4: подготовьте и установите пластик ИЛС

  1. Возьмите плексигласовый диск, отражающую плёнку, маркер и ножницы.
  2. Используйте плексигласовый диск и маркер, чтобы нарисовать на отражающей плёнке круг.
  3. Ножницами вырежьте круг.
  4. Наклейте вырезанный круг с одной стороны плексигласового диска.
  5. Вставьте его в разъём ИЛС (отражающей плёнкой к водителю).

Шаг 5: закачать код


Не забудьте установить SD-карту в Teensy. Вы сможете записывать на неё скорость машины и обороты двигателя в формате CSV. Потом можно будет использовать, например, python, для построения графиков; привожу построенные мною графики.

Шаг 6: демонстрация

  • «Если моя машина мешает»
  • «Музыка, Навигация, Проекционные дисплеи – развитие мультимедиа в авто»
  • «Вековая история развития автомобильной безопасности»
  • Разработка под Arduino
  • DIY или Сделай сам
  • Транспорт

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

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

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

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

  • Скопировать ссылку
  • Facebook
  • Twitter
  • ВКонтакте
  • Telegram
  • Pocket

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

  • 20 декабря 2020 в 16:39

3D-индикатор крена и тангажа для HUD на Three.js

«История HUD»: от Второй мировой до первой голограммы

Камеры, HUD и WTF: улучшаем юзабилити следующей VR-игры

Заказы

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

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

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

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

p.s. давно мечтаю сделать такоеже, но меня останавливает то что я не хочу лишних девайсов на торпеде (сразу отпадают лежащие сверху индикаторы) или както её пилить чтобы скрыть его ниже… помню была мысль сделать стекло прячущимся в воздуховоде печки и делать проекцию на него

А у BMW и Lexus на стекло выводится.
Китайцы на Али продают много готовых таких штуковин, которые выводят на стекло, при чем с наклоном цифр всё в порядке. Ищите по ключевому слову HUD.

45к) на E60 например.

Хм. Получается все подобные девайсы на рынке туфта? Или там безбожные деньги дерут именно за оптику?

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

HUD

Выглядит, как УГ. И им, скорее всего, является.
Интересно было увидеть это ночью.

И ещё ESP32, в которой мощностей вычислительных на три ардуины залпом :-)

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

п.7.3. перечня неисправностей.

BarsMonster более продвинутыми версиями HUD занимается, но воз, как говорится «и ныне там»:
Автомобильные HUD в общем и WayRay Navion в частности
habr.com/ru/company/wayray/blog/397277

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

Наверное, не по теме, но есть готовые подобные решения. Я пару лет назад купил себе, кажется «Parkcity SR-03» (загуглите, не реклама)

Всё в одном маленьком корпусе, никаких «соплей», нормально проецируется прямо на лобовое стекло (без плёнок). Девайсинку тупо приклеил на двусторонний скотч к торпеде — выглядит компактно и аккуратно. Фото/видео под рукой нет, если кому интересно — скину в личку.

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

Не соглашусь с вами: отражение прекрасно видно почти всегда, за исключением двух случаев: днём при ясной погоде и солнце «в лоб» и в поляризационных очках.
В этих случаях нужно присматриваться (и то — видно!)

Возможно, конечно, это я такой «глазастый» (но это не точно!)

Повторюсь, мне нет смысла это «впарить», я просто делюсь опытом эксплуатации!
Причём, обсуждаем гаджет в контексте устройства, описанного в статье. По моему мнению, описанный мной девайс более «юзер-френдли» и не так чужеродно выглядит в салоне!
Ну и комментарий мой больше адресован лентяям, типа меня — кому важен результат, а не процесс (DIY).

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






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

Все эти значения рассчитываются компьютером двигателя автомобиля, а для считывания данных просто требуется сканер.
Есть различные коммерческие решения, таким как Scan Gauge. Также можно использовать сканеры ELM327 работающий через Bluetooth. Популярными моделями являются Carista , BlueDriver или обычный диагностический сканер Innova / Bosch.

Мастер решил сделать сканер самостоятельно и установить его в свой автомобиль на постоянной основе.

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

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

Шина CAN - это протокол дифференциальной связи. Это означает, что для нее нужно всего два провода. Обычно это витая пара. Мы будем получать доступ к устройству через порт OBD. Если вы решите повторить самоделку, то вам не обязательно понимать, как этот протокол работает на фундаментальном уровне, но вы должны понимать его достаточно, чтобы иметь возможность писать или изменять код Arduino.
Почти каждый автомобиль сегодня имеет порт OBD II. Все они имеют одинаковый электрический разъем под панелью приборов. Однако существуют совершенно разные протоколы связи в зависимости от производителя автомобиля. Любой автомобиль, проданный в США после 2008 года, использует шину CAN ISO 15765 и именно его мастер будет использовать.



OBD-сканер на базе Arduino




Шаг второй: схема подключения
Питаться устройство будет от блока предохранителей. Конкретно он берет питание от цепи стеклоочистителя. Можно использовать любую цепь главное, чтобы она отключалась при вытаскивании ключа из замка зажигания. В противном случае устройство может посадить аккумуляторную батарею автомобиля.

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





Шаг четвертый: предохранитель и понижающий преобразователь
Изначально мастер подключил Ардуино к бортовой сети автомобиля 12 В без понижающего преобразователя. К сожалению устройство долго не проработало и сгорело. Тогда он установил понижающий преобразователь.

Подключает Vin- понижающего преобразователя к заземлению OBD. Подключает Vin + понижающего преобразователя к 12 В автомобиля (через предохранитель).

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





Шаг пятый: Arduino
Дальше нужно все смонтировать.
Мастер использует плату Teensy 4.0. Если будет использована другая плата, то распиновка может отличатся. Подключает напрямую контакты к плате CAN модуля:
MOSI (slave in)
MISO (slave out)
SS (chip select/slave select)
CLK (clock)
Возможно понадобиться подтягивающий резистор для интерфейса i2c.
Дисплей: подключайтесь напрямую (при условии, что используется тот же OLED-дисплей, что и у мастера) -
SDA (serial data)
SCL (serial clock)

Для питания дисплея подключает Vcc и GND. Эти четыре провода мастер установил в один разъем. Дисплей будет установлен на передней панели авто и при необходимости его можно будет снимать.

Друзья. Я в программировании новичок. Осваиваю потихоньку ардуино.
Есть идея по проекту, но пока не знаю как её реализовать. Если вам будет интересно и будет, чем помочь, буду очень признателен.
Стартуем.
Итак, в современных авто есть протокол диагностики OBD2. В специальный разъем вставляется диагностический прибор и смотрятся показания датчиков, ошибок и т.д. Есть модное устройство диагностический адаптер ELM327 - компактная коробочка которая вставляется в разъем OBD2. ELM327 имеет беспроводной интерфейс и может либо по блютусу либо по вайфаю связываться с андроид устройством. А уже на андроид устройстве запускается программа, коих есть большой выбор, и на экране можно в онлайн режиме видеть и показания скорости и оборотов и топлива и т.д.
У меня есть советский мотоцикл Урал. Несложно догадаться, что никакого ЭБУ с протоколом OBD2 там нет. Там примитивный карбюраторный двигатель и минимум электроники.
Что я хочу: создать на базе ардуино подобие ЭБУ, которое посредством простейших датчиков будет собирать данные по скорости, оборотам , температуре двигателя, напряжения в бортсети, включение света и поворотников, уровня топлива. А дальше как в иномарке
- Привязываем ELM327 к спроектированному ЭБУ а на андроид устройстве в красивой программе в виде спидометра и тахометра наблюдаем эмуляцию приборной панели. Родной советский спидометр я предполагаю выкинуть, поставить хороший держатель смартфона и перед поездкой устанавливать смартфон. Эдакая съемная приборная панль в стиле 21 века.
Я видел проекты как ардуино считывает с ELM327, но как ELM327 считывает с ардуино я не видел. В этом и вся проблема в реализации моей идеи. А собрать все датчики в кучу и превратить их показания в нули и единицы я, думаю, смогу.

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

JollyBiber аватар

А зачем тут протокол OBD2 (даже забыв про то что там все идет практически "открытым" текстом)? Чтобы можно было считать ошибки и показания на сервис-центре мерседес?

Читайте также: