Серия статей «Пишем 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 будет опубликован в последней статье серии.


























