Серия статей «Пишем ELM327-совместимый адаптер на PIC18F25K80»

от автора

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

  1. Принимает простые текстовые команды через UART — так называемые AT-команды (по аналогии с модемами Hayes)

  2. Транслирует их в нужный протокол шины автомобиля

  3. Возвращает ответ тоже в виде читаемых 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 — это отдельный небольшой язык. Несколько примеров:

Команда

Смысл

ATZ

Сброс адаптера

ATI

Версия прошивки

ATSP6

Установить протокол ISO 15765-4 CAN 11-бит 500 кбит/с

ATH1

Включить заголовки фреймов

0100

Отправить 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/