Появилась идея реализовать визуализатор для данных собираемых автомобильным OBD2 адаптером на базе ELM327 с поддержкой BlueTooth соединения. Хотелось обойтись без использования TorqueLite/Pro и прочих программных компонент, требующих наличие телефона.
Взаимодействие и считывание было решено организовать с помощью Arduino Nano. Платка маленькая, большое число готовых библиотек для реализации задумки, а так же возможно питание от аккумулятора 12-ю вольтами. Т.к ток потребления сравнительно не большой, то перегрева внутреннего стабилизатора не должно быть. В крайнем случае можно поставить внешний стабилизатор до 7 вольт с радиатором, а далее уже внутренний стабилизатор на плате справится без перегрева.
Для взаимодействия был выбран модуль BlueTooth HC05/06. Все имелось в наличии, поэтому поле для экспериментов было открыто.
По задумке управляться устройство должно следующим способом:
- сенсорная кнопка, нет дребезга и не требует усилий при нажатии.
- переключатели, для отключения питания и принудительного сброса сохраненных настроек.
Первым делом возник вопрос, а ка же проверять работоспособность схемы и программы, не гонять же постоянно автомобиль. И решение было найдено, есть программа эмулятор, которая успешно запустилась под Windows 10. Программа называется OBDSim - https://icculus.org/obdgpslogger/obdsim.html.
Выглядит при запуске примерно вот так:
И может подцепиться при запуске к COM порту. Запускать нужно в командном окне, командой:
obdsim.exe -w COM9
ну или тем COM портом, который создался при сопряжении с блутуз адаптером. Сам процесс сопряжения показан на видео в конце статьи.
Изначально была проведена операция сопряжения obdsim с TorqueLite, чтоб убедиться, что сопряжение работает и команды посылаемые в obdsim и ответы, воспринимаются корректно. Испытания прошли успешно, программа показала, что все изменения на телефоне воспринимаются корректно и любой изменение датчика в obdsim тут же отображается в TorqueLite.
Это был первый этап - проверка. Второй этап - компьютер с obdsim выступает в роли мастера, а arduino nano в связке с HC06(который может быть только в роли slave) в роли ведомого.
Для arduino nano была набросана простая программа с использованием ELMDuino и вновь симуляция закончилась успехом. Весь процесс соединения и работы устройства показан на видео в конце статьи.
И третий этап - это окончательная реализация визуализатора на HC05 в режиме master.
Сразу было решено, что сопрягать ELM327 и визуализатор нужно в автоматическом режиме, т.е перевод HC05 в режим приема команд должен сам микроконтроллер.
Была найдена библиотека, которая с небольшими изменениями (перевел ее с Serial, на SoftwareSerial) отлично заработала в проекте.
Окончательная схема получилась такая:
и примерно так выглядит на макетке:
только аккумулятор 12В.
На HC05 я напаял два проводка на выходы 34 - CMD и выход 11 - RESET.
И эти проводки были подсоединены к микроконтроллеру для перевода HC05 в режим передачи данных или в режим приема команд, а так же для жесткого сброса (hardReset).
В режиме команд МК посылает HC05 следующие команды:
AT+INIT
AT+ORGL
AT+ROLE=1
AT+RESET
AT+INIT
AT+RMAAD
AT+CMODE=1
AT+INQM=0,6,20
AT+CLASS=0
AT+INQ
Данный набор команд ищет все видимые устройства и по очереди показывает MAC адреса данных блутуз устройств на дисплее.
Если за время отображения адреса нажать на сенсорную кнопку, то адрес запишется в постоянную память микроконтроллера и HC05 будут отправлены следующие команды:
AT+INQC
AT+RESET
AT+INIT
AT+CMODE=0
AT+PSWD=XXXX
AT+RESET
AT+INIT
AT+PAIR=XXXXXX,XX,XXXX,30
AT+BIND=XXXXXX,XX,XXXX
AT+LINK=XXXXXX,XX,XXXX
После данного набора команд в Windows 10 появляется окошко с запросом пароля и устанавливается сопряжение. В автомобиле же в ELM327 просто устанавливается сопряжение. Работа данного устройства также показана в видео в конце статьи.
Далее HC05 сбрасывается командой HardReset и переводится в режим обмена данными. С этого момента перебираются различные скорости для SoftwareSeria от 4800 до 38400.
Как только сопряжение визуализатора и ELM327 или obdsim произошло, сразу отображается дисплей с отображаемым параметром:
Короткое однократное нажатие на сенсорную кнопку переключает следующий отображаемый параметр.
Долгое нажатие на сенсорную кнопку (более 5 сек, в этот момент светодиод начинает мигать) отображает экран со всеми доступными для считывания параметрами:
При выключении запоминается какой параметр отображался и на какой скорости осуществлялась связь с ELM327.
На текущий момент вот доступные для считывания параметры OBD2:
{ VEHICLE_SPEED, string5, NULL, string5_1 },
{ ENGINE_RPM, string4, NULL, string4_1 },
{ ENGINE_LOAD, string0, NULL, string0_1 },
{ ENGINE_COOLANT_TEMP, string1, NULL, string1_1 },
{ FUEL_PRESSURE, string2, NULL, string2_1 },
{ INTAKE_MANIFOLD_ABS_PRESSURE, string3_0, string3_1, string3_2 },
{ TIMING_ADVANCE, string6, NULL, string6_1 },
{ INTAKE_AIR_TEMP, string7, NULL, string7_1 },
{ MAF_FLOW_RATE, string8, NULL, string8_1 },
{ THROTTLE_POSITION, string9, NULL, string9_1 },
{ RUN_TIME_SINCE_ENGINE_START, string10, NULL, string10_1 },
{ DISTANCE_TRAVELED_WITH_MIL_ON, string11_0, string11_1, string11_2 },
{ FUEL_RAIL_PRESSURE, string12_0, string12_1, string12_2 },
{ FUEL_RAIL_GUAGE_PRESSURE, string13_0, string13_1, string13_2 },
{ FUEL_TANK_LEVEL_INPUT, string14, NULL, string14_1 },
{ ABS_BAROMETRIC_PRESSURE, string15, NULL, string15_1 },
{ CONTROL_MODULE_VOLTAGE, string16, NULL, string16_1 },
{ ABS_LOAD_VALUE , string17, NULL, string17_1 },
{ RELATIVE_THROTTLE_POSITION, string18, NULL, string18_1 },
{ AMBIENT_AIR_TEMP, string19, NULL, string19_1 },
{ ETHONOL_FUEL_PERCENT, string20, NULL, string20_1 },
{ RELATIVE_ACCELERATOR_PEDAL_POS, string21_0, string21_1, string21_2 },
{ ENGINE_OIL_TEMP, string22, NULL, string22_1 },
{ FUEL_INJECTION_TIMING, string23, NULL, string23_1 },
Вот сам код для Arduino IDE. Для сборки необходимо установить библиотеки:
- Adafruit_GFX_Library
- Adafruit_SSD1306
- BluetoothHC05 - https://github.com/BayRepoOrg/Bluetooth_HC05
- ELMDuino
- U8g2_for_Adafruit_GFX
- U8g2
- GFX_Library_for_Arduino
Все библиотеки есть в стандартном менеджере библиотек, кроме BluetoothHC05, которая скачивается с указанного репозитория.
Для сброса запомненных данных: адреса блутуз устройства и скорости, нужно отключить питание визуализатора, и законнектить переключателем присоединенным к ножке d12 контроллера на землю и включить визуализатор, данные мгновенно будут стерты из памяти. Обратное отключение питания и отключения земли от ножки D12 вернет МК в стандартное рабочее состояние и он снова начнет искать доступные BlueTooth устройства.
Видео моделирования: