Серия статей «Пишем ELM327-совместимый адаптер на PIC18F25K80»
Дисклеймер. ELM327 — зарегистрированный продукт компании ELM Electronics. Эта серия описывает самостоятельную реализацию совместимого командного интерфейса в учебных целях и не является оригинальной микросхемой ELM Electronics. Проект не предназначен для коммерческого использования под именем «ELM327».
Вводная статья: зачем читать эту серию и что мы будем строить
OBD-II: главный диагностический разъём современных легковых автомобилей
Если вы когда-нибудь приезжали на техосмотр или к механику, вы, скорее всего, видели, как он достаёт небольшое устройство, вставляет его под торпедо и смотрит в ноутбук. Этот разъём — OBD-II (On-Board Diagnostics, версия II). С 1996 года он обязателен для всех легковых автомобилей, продаваемых в США, с 2001 — для бензиновых, а с 2004 — для дизельных легковых в Европе (стандарт EOBD). Сегодня OBD-II / EOBD присутствует в подавляющем большинстве легковых автомобилей на ключевых рынках. Грузовики, автобусы и спецтехника — отдельная история: у них другие разъёмы (9-pin Deutsch), другие протоколы (J1939), другое напряжение борт-сети (24 В) и другие требования к защите.
Через этот разъём можно прочитать коды ошибок (те самые «check engine»), посмотреть живые данные с датчиков — обороты двигателя, температуру охлаждающей жидкости, давление турбины, лямбда-зонды, скорость — и даже сбросить ошибки после ремонта.
[Рисунок 1: Расположение OBD-II разъёма под рулевой колонкой] ___________ | OBD-II | | 16 pin | |___________| ^ └── обычно под торпедо слева от руля
Звучит просто. Но внутри — несколько несовместимых друг с другом протоколов, которые появлялись в разное время у разных производителей. CAN, K-line, J1850, ISO 9141 — каждый требует своего физического уровня, своей процедуры инициализации, своего формата кадров.
Именно поэтому появился ELM327.
Что такое ELM327
ELM327 — это микросхема канадской компании ELM Electronics, выпущенная в начале 2000-х. Внутри — маленький микроконтроллер с прошивкой, которая:
-
Принимает простые текстовые команды через UART — так называемые AT-команды (по аналогии с модемами Hayes)
-
Транслирует их в нужный протокол шины автомобиля
-
Возвращает ответ тоже в виде читаемых ASCII-строк
Диагностическая программа на телефоне или ноутбуке не знает ничего про CAN или K-line. Она просто отправляет строку 0100\r (запрос PID 00, поддерживаемые параметры) и получает обратно что-то вроде 41 00 BE 3E B8 10\r\n>. ELM327 берёт на себя всю грязную работу с шиной.
[Рисунок 2: Место ELM327 в цепочке] Телефон/ноутбук (Torque, OBD Fusion, любая диагностика) | Bluetooth или USB/WiFi | [ ELM327-совместимый адаптер ] <── наша прошивка | ┌─────┴─────┐ CAN K-line J1850 шина шина шина │ │ │ ЭБУ двигателя, АКПП, ABS, подушки...
Команды ELM327 — это отдельный небольшой язык. Несколько примеров:
|
Команда |
Смысл |
|---|---|
|
|
Сброс адаптера |
|
|
Версия прошивки |
|
|
Установить протокол ISO 15765-4 CAN 11-бит 500 кбит/с |
|
|
Включить заголовки фреймов |
|
|
Отправить OBD запрос: поддерживаемые PID 01-20 |
Всего спецификация ELM327 v2.3 определяет более 100 AT-команд и 13 протоколов шин. Наша реализация охватывает набор команд, достаточный для прохождения ELM Scan Adapter Validator и работы целевых диагностических приложений.
Проблема: значительная часть дешёвых «ELM327» на рынке — клоны с неполной реализацией
Поищите «ELM327 Bluetooth» на любом маркетплейсе. Дешёвые Bluetooth-адаптеры стоят на порядок дешевле профессиональных устройств (OBDLink, Kiwi), но значительная часть из них — клоны на дешёвых микроконтроллерах с частичной реализацией протокола. Это не оригинальная микросхема ELM Electronics.
Типичные проблемы клонов:
-
Поддерживают только CAN, на K-line машинах не работают вообще
-
Сообщают версию
ELM327 v1.5илиv2.1, хотя реализация неполная -
AT-команды возвращают мусор или не работают вовсе
-
Теряют соединение по Bluetooth под нагрузкой
-
Не сохраняют настройки между сессиями
Профессиональные адаптеры (Kiwi 3, OBDLink MX+) существенно дороже, но содержат нормальную прошивку. Их недостаток: прошивку нельзя изменить под свои нужды.
Зачем писать своё
Причина 1: Понять, как это работает
Диагностика — это не магия. Это конкретные протоколы с конкретными тайм-аутами и процедурами. Написав адаптер с нуля, вы будете точно знать, почему машина не отвечает, почему инициализация занимает 3 секунды, что значит «BUS INIT: ERROR».
Причина 2: Полный контроль
Хотите поддержку нестандартных PID? Особый формат вывода? Логирование на SD-карту? Всё это невозможно в закрытых устройствах, но тривиально, когда прошивка ваша.
Причина 3: Bluetooth-адаптер со своей идентификацией
Если вы разрабатываете диагностическое приложение, вам нужен адаптер с предсказуемым поведением. Свой адаптер = отсутствие сюрпризов от обновлений стороннего firmware.
Причина 4: Учебная задача мирового класса
Реализация ELM327 затрагивает практически все аспекты embedded-разработки: прерывания, UART, CAN, bit-banging, EEPROM, конечные автоматы, тайминги на уровне микросекунд, совместимость протоколов. Лучшей учебной задачи для начинающего embedded-разработчика трудно придумать.
Что мы будем строить
В этой серии мы разберём готовую рабочую ELM327 v2.3-совместимую прошивку, написанную на C для микроконтроллера PIC18F25K80 в среде MPLAB X / XC8.
Прошивка реализует:
-
ELM327 v2.3-совместимый набор AT-команд, достаточный для прохождения ELM Scan Adapter Validator и работы целевых приложений
-
ISO 15765-4 (CAN OBD) — 11/29-бит, 500/250 кбит/с, включая ISO-TP многофреймовый обмен
-
ISO 9141-2 — 5-baud slow init, K-line
-
ISO 14230-4 (KWP2000) — fast init и 5-baud init
-
SAE J1850 PWM и VPW — логика протокола реализована в коде; требует отдельного физического уровня (MC33390 и аналоги), не входит в базовый BOM
-
SAE J1939 — программная поддержка CAN 29-бит кадров; для грузовиков нужна аппаратная версия под 24 В и 9-pin Deutsch разъём
-
Bluetooth через модуль HC-05 с автонастройкой (Android/Windows; для iOS нужен BLE или Wi-Fi модуль)
-
Полное сохранение настроек в EEPROM
-
Диагностические счётчики и отладочные команды
[Рисунок 3: Блок-схема прошивки] ┌─────────-─────┐ │ HC-05 BT │ │ (или UART) │ └──────┬────────┘ │ UART 38400 ┌──────▼────────┐ │ Кольцевой │ │ буфер + эхо │ <- ISR └──────┬────────┘ │ ┌──────▼────────┐ │ at_dispatch() │ <- главный парсер AT-команд └──────┬────────┘ │ ┌────────────┼─────────────┐ │ │ │┌────▼───┐ ┌────▼────┐ ┌────▼──────────────────┐│ CAN │ │ K-line │ │ J1850 bitbang ││module │ │ bitbang │ │ * только логика кода │└────────┘ └─────────┘ │ * физ.уровень не в BOM│ └───────────────────────┘
Прошивка проходит тест совместимости ELM Scan Adapter Validator (ELM 2.3). В последней главе подробно разберём результаты тестирования, что именно проверялось и какие незначительные расхождения с оригинальным поведением остаются (они не мешают работе целевых приложений).
Требуемые знания
Серия рассчитана на начинающих embedded-разработчиков. Мы предполагаем, что вы:
-
Знаете основы C (указатели, структуры, битовые операции)
-
Слышали про микроконтроллеры и регистры периферии
-
Имеете общее представление о том, что такое UART и SPI
Знания CAN, K-line, J1850, ISO-TP не требуются — мы объясним каждый протокол с нуля, начиная с физического уровня.
Что вам понадобится для практики
Готовый dev-kit (собранная плата с PIC18F25K80, TJA1050, K-line драйвером и HC-05) доступен для приобретения — подробности в комментариях к статье.
|
Компонент |
Примечание |
|---|---|
|
PIC18F25K80 |
Основной МК. Доступен в DIP-28 |
|
PIC18F26K80 |
Альтернатива с большей Flash |
|
TJA1050 |
CAN трансивер |
|
Драйвер K-line (LIN) |
Например, L9637D или TJA1020 |
|
HC-05 |
Bluetooth модуль |
|
PICkit 3/4 |
Программатор |
|
MPLAB X + XC8 |
Бесплатный компилятор |
|
OBD-II J1962 male connector или пиг-тейл |
Для подключения к машине |
Структура серии
|
# |
Статья |
Тема |
|---|---|---|
|
0 |
Эта статья |
Обзор серии |
|
1 |
Глава 1 |
Выбор железа и конфигурация МК |
|
2 |
Глава 2 |
Архитектура прошивки: главный цикл, ISR, структуры |
|
3 |
Глава 3 |
UART и Bluetooth: буферизация и автонастройка HC-05 |
|
4 |
Глава 4 |
Таймеры, EEPROM и системные утилиты |
|
5 |
Глава 5 |
CAN шина: инициализация, отправка, приём, фильтры |
|
6 |
Глава 6 |
ISO-TP: многофреймовый обмен поверх CAN |
|
7 |
Глава 7 |
K-line: ISO 9141 и KWP2000 от физики до протокола |
|
8 |
Глава 8 |
J1850 PWM и VPW |
|
9 |
Глава 9 |
Диспетчер протоколов и OBD-запросы |
|
10 |
Глава 10 |
Парсер AT-команд |
|
11 |
Глава 11 |
Тестирование совместимости с ELM327 |
Полный исходный код со схемами и проектом MPLAB X будет опубликован в последней статье серии.
ссылка на оригинал статьи https://habr.com/ru/articles/1052304/