Інтерфейс OBD II через Bluetooth
Модуль HC-05 дозволяє зробити головне або ведене підключення до сумісного пристрою Bluetooth (теоретично HC-06, який є лише веденим).
HC-05 пілотується в команді AT. Він використовує 3,3 В, тому будьте обережні, якщо ви використовуєте його з 5 В ардуіно. У 3,3 В це дуже підходить для карти STM32F401RE (тієї, яку я використовую).

HC-05 має 2 режими роботи:
- режим AT, який дозволяє вам його налаштувати,
- режим даних або прозорий режим, що дозволяє передавати дані безпосередньо через послідовне посилання.
Для вибору одного з 2-х режимів модуль має штифт під назвою KEY, що дозволяє перемикатися з одного режиму на інший. У нашому випадку ми повинні запустити модуль в режимі AT, після чого після підключення Bluetooth модуль автоматично переключиться в режим даних. Тоді не потрібно повертатися в режим AT, оскільки ми будемо підключені до пристрою OBD та у діалозі з автомобілем.
- Режим AT: ключ = 1
- Режим даних: ключ = 0
| Існує 2 версії картки HC-05: одна із шпилькою "КЛЮЧ" і друга без. краще придбати модуль з цим штифтом. Якщо у вашого модуля його немає, вам слід припаяти провід на з'єднувальному штифті самого модуля Bluetooth: (контакт 34 вгорі праворуч) | |
Щоб встановити з’єднання, потрібно отримати адресу Mac модуля Bluetooth, з яким ви хочете спілкуватися.
Тоді послідовність, що виконується в команді AT (KEY = 1), така:
Сценарій підключення до модуля Bluetooth
Кожен рядок повинен закінчуватися знаком "\ r \ n", інакше команди не будуть враховані модулем HC-05.
В кінці цієї серії команд, якщо адреса Mac є правильною (тут 88: 18: 56: 68: 98: EB), ви повинні бути підключені до вашого підлеглого модуля Bluetooth HC-06 або іншого (тут Модуль OBD і, зокрема, ELM327).
Відтепер ви повинні перейти в прозорий режим, а саме, щоб спілкуватися з віддаленим веденим модулем, ви повинні встановити штифт "KEY" на 0.
OBD та ELM327
ELM327 - це мікросхема, присвячена протоколу OBD. Він використовується для інтерфейсу різних шин роз'єму OBD до єдиного послідовного каналу зв'язку.
ELM327 працює в 2 режимах:
- Режим AT: це конкретні команди для налаштування ELM327 (наприклад, конфігурації використовуваного протоколу CAN) або для запиту певних конкретних параметрів, таких як напруга акумулятора, наприклад
- Режим OBD: це особливий синтаксис, який дозволяє читати/записувати значення OBD. Ці команди будуть використовуватися для зчитування швидкості, об/хв двигуна тощо.
Першим кроком є ініціалізація ELM327:
| Перш ніж ви зможете спілкуватися з ELM327 і він може ініціалізувати протокол з комп'ютером вашого автомобіля, бажано запустити автомобіль. На одних автомобілях двигун повинен бути запущений, на інших достатньо запалювання в режимі аксесуарів. |
Для спілкування з комп’ютером потрібно вказати протокол, який буде використовуватися, який повинен бути протоколом транспортного засобу. У випадку з моїм Renault Lagune 2 це протокол 5 (FAST).
- 0 - Автоматичний
- 1 - ШІМ SAE J1850 (41,6 кБод)
- 2 - SAE J1850 VPW (10,4 кБод)
- 3 - ISO 9141-2 (5 бодів, 10,4 кБод)
- 4 - ISO 14230-4 KWP (5 бодів, 10,4 кБод)
- 5 - ISO 14230-4 KWP (швидкий ввід, 10,4 кБод)
- 6 - ISO 15765-4 CAN (11-бітний ID, 500 кбод)
- 7 - ISO 15765-4 CAN (29 біт ID, 500 кБод)
- 8 - ISO 15765-4 CAN (11-бітний ідентифікатор, 250 кбод)
- 9 - ISO 15765-4 CAN (29 біт ID, 250 кбод)
- A - SAE J1939 CAN (29-бітний ідентифікатор, 250 * кбод)
- B - КОРИСТУВАЧ1 МОЖЕ (11 * бітовий ідентифікатор, 125 * бод)
- C - КОРИСТУВАЧ2 МОЖЕ (11 * бітовий ідентифікатор, 50 * бод)
| ELM327 має команду, яка повідомляє йому про автоматичний пошук протоколу для використання. Зі свого боку, цей режим ніколи не працював і спричиняв безлад у шині, а комп’ютер вказував помилкові несправності. Просте вимкнення запалювання та повторне запалювання автомобіля відновлює роботу комп'ютера, воно не руйнує (за тим, що я спостерігав) |
Команди для відправки:
Сценарій ініціалізації ELM327
Щоразу, коли надсилається команда, яка закінчується на "\ n", ELM327 повертає свою відповідь у текстовому форматі та закінчує цю відповідь знаком ">". Це підказка, що вказує на те, що можна надіслати нове замовлення.
Після завершення ініціалізації ми можемо перейти до серйозних питань: читання інформації про БД.
Ви можете шукати в документі ELM327 протокол на сторінці 30-31, щоб краще зрозуміти, але ось короткий виклад:
Щоб прочитати дані OBD, ви повинні знати, в якому режимі ви хочете працювати: (інформація взята з wikipedia):
- 01 Показати поточні дані
- 02 Показати дані про заморожування кадру
- 03 Показати збережені діагностичні коди несправностей
- 04 Очищення діагностичних кодів несправностей та збережених значень
- 05 Результати випробувань, моніторинг датчика кисню (лише CAN)
- 06 Результати випробувань, моніторинг інших компонентів/системи (результати випробувань, моніторинг датчика кисню лише для CAN)
- 07 Показати очікувані діагностичні коди несправностей (виявлено під час поточного або останнього циклу водіння)
- 08 Керування роботою бортового компонента/системи
- 09 Запитуйте інформацію про транспортний засіб
- 0A Постійні діагностичні коди несправностей (DTC) (очищені DTC)
У нашому випадку ми хочемо бачити лише значення на даний момент. Тож ми залишаємось у режимі 1.
Щоб запитувати параметри, ви повинні знати PID (ідентифікатор параметра). Існує відкритий (непатентований) список ПІД, які можна прочитати (див. Сторінку Вікіпедії):
Ось невеликий список PID, які я використовую:
- 0C: частота обертання двигуна (об/хв)
- 0D: Швидкість транспортного засобу
- 11: Положення акселератора
Щоб запитати систему та запитати у неї значення, потрібно надіслати рядок:
У наведеному тут прикладі ми запитуємо положення акселератора (PID 0x11) в режимі 1. ELM327 повертає значення 35 = 0x35 = 53%. Одиниця виміру, кількість байтів та значення значень вказані на сторінці вікіпедії.
Тож просто автоматизуйте дані, які ви хочете переглянути, інтерпретувати та відобразити як завгодно.
Тепер давайте подивимося на частину дисплея на екрані ILI9341.
320x240 РК-екран ILI9341
Щоб відобразити швидкість і щоб її було видно в транспортному засобі, я вирішив взяти кольоровий РК-дисплей 320x240 з драйвером ili9341.
Рішення було прийнято на основі кількох критеріїв.
- Шина SPI (на мікроконтролері буде використано лише кілька контактів
- Бібліотеки широко доступні в мережі
- Легко придбати (ebay, miniinthebox, dealextrem або на французьких сайтах електронної комерції)
- Можливість наявності версій із сенсорним екраном або без нього
- Зазвичай також включає зчитувач карток SD
Для швидкого створення прототипу я вибрав бібліотеку Tilen зі stm32f4-discovery
Сам екран виглядає так:
Існує кілька версій цього екрану: (верхня версія без сенсорного екрану, нижня повна версія).
Роз'єми різні, довше у версії TouchScreen, щоб надати доступ до контактів контролера TouchScreen.
Ми також бачимо, що у двох версіях є інтерфейс для SD-карти. Це може бути корисно для зберігання даних (файлів журналів, файлів зображень тощо), з якими ця тема буде розглянута пізніше.
Екран управляється за допомогою SPI та деяких додаткових сигналів:
- SCK: годинник SPI
- MOSI: рядок даних, надісланих від мікроконтролера
- MISO: рядок для зчитування даних мікроконтролером (не використовується)
- CS: вибір чіпа
- D/C: рядок, який вказує, чи слід надсилати команду або дані
- RESET: скидання дисплея
ILI9341 має набір команд, наприклад, надсилати піксельні кольорові дані, визначати ділянки ділянки, вибирати орієнтацію екрана. Щоб надіслати замовлення та його дані, виконайте наступну процедуру:
1. Встановіть CS = 0
2. Встановіть D/C = 0 (для відправки команди)
3. Відправте 8 біт номера замовлення за допомогою SPI
Якщо є дані для надсилання:
5. Надсилайте дані за допомогою SPI один за одним
6. Зв'язок закривається, встановивши CS = 1.
Передача даних, якщо має бути передано кілька даних, може бути здійснена за допомогою DMA STM32.
Я раджу прочитати код Тілена, який дуже добре написаний і який покаже вам спосіб ініціалізації ILI9341 для створення дисплеїв.
Незважаючи на все, я зробив вдосконалення та доповнення до бібліотеки Tilen (яку Tilen потім інтегрував у свій код):
- З одного боку, щоб мати більшу швидкість для дисплеїв, оскільки відображення цифри займало кілька сотень мілісекунд, тому проходження через DMA
- інакше не додавати функції відображення піктограм, а отже, оптимізовано, оскільки моє програмне забезпечення відсутнє.
Ви знайдете інформацію в цій статті з прикладом коду.
Відображення інформації
Інформація, яку повідомляє OBD, - це швидкість автомобіля та значення тахометра.
Ця інформація відображається у 2 формах:
- Швидкість у вигляді великих цифр
- Тахометр у вигляді кольорової смуги, що переходить від зеленого до червоного через жовтий, для позначення зони допуску частоти обертання двигуна.
Для цифр спідометра це фактично серія монохромних зображень 80х120. Це не шрифт величезних символів, а зображення (від 0 до 9), створені у Gimp та експортовані у форматі XBM.
Кожен біт в 1 відповідає кольоровій точці, а 0 - чорній.
Тому для відображення швидкості ми відображатимемо на екрані максимум 3 цифри.
Отже, для кожної зміни передачі ми замінюємо стару цифру на нову. Немає стирання, але перепишіть його в тому ж положенні на екрані, щоб уникнути непотрібного часу стирання і, перш за все, дефекту відображення між стираним часом і переписаним часом, може скластися враження, що цифра блимає.
Для тахометра це той самий принцип відображення зображення.
Різниця полягає в тому, що в залежності від значення лічильника обертів частина відображається "пропорційно" значенню:
якщо врахувати, що смужка лічильника досягає червоного при 5000 об/хв, тоді 5000 = повне зображення, 0 = нічого на зображенні, 2500 = половина.
Так само, як і для цифр, враховуючи форму смуги, немає необхідності стирати, а потім відображати частину.
Для оптимізації відображення ми відображаємо кольорові значення кожного пікселя до "значення" тахометра (зліва направо), а потім доповнюємо фоновими пікселями (отже, чорними в моєму випадку), щоб стерти праву частину зображення які не повинні відображатися.
Глобальне впровадження
Всі ці елементи були об’єднані, щоб зробити щось не надто погане.
Програмне забезпечення обертається навколо FreeRtos як планувальник завдань:
- Завдання, яке керує зв'язком з модулем bluetooth, від ініціалізації BlueTooth до зв'язку з OBD
- Завдання відображення, яке приймає повідомлення від завдання OBD. Він бере на себе інформацію про швидкість та тахометр.
Час виконання команд OBD виконується кожні 50 мс.
Індикація змінюється лише за необхідності, тобто лише за умови зміни швидкості. Якщо ми залишаємося на швидкості 50 км/год протягом 10 хв., То завдання дисплея отримуватиме інформацію про швидкість кожні 500 мс,.
Ось результат проекту у відео.
Ви помітите, що я додав GPS, який, зі свого боку, служить лише для того, щоб вказати компас орієнтації автомобіля по відношенню до півночі, а також дає висоту (дисплей у верхньому лівому та правому кутах).
На цьому проект закінчується, тому що, коли я пишу і допрацьовую статтю, я міняю машину. Я зможу відновити компоненти для чогось іншого.
Будь ласка, сміливо коментуйте та задавайте питання на цю тему.