# OBD2 Emulator Эмулятор ECU для тестирования бортовых компьютеров через CAN-шину. Поддерживает стандарт SAE J1979 (OBD-II PIDs) поверх ISO 15765-4 (CAN). ## Возможности - **Динамическая симуляция** — реалистичное поведение автомобиля - **Множество PIDs** — поддержка основных OBD2 параметров - **Сценарии движения** — холостой ход, город, трасса, прогрев - **Автонастройка CAN** — автоматическое поднятие физических и виртуальных интерфейсов ## Поддерживаемые PIDs (Mode 01) | PID | Название | Единицы | |-----|----------|---------| | 04 | Engine Load | % | | 05 | Coolant Temperature | °C | | 0C | Engine RPM | rpm | | 0D | Vehicle Speed | km/h | | 0F | Intake Air Temperature | °C | | 10 | MAF Air Flow Rate | g/s | | 11 | Throttle Position | % | | 1F | Run Time | s | | 2F | Fuel Tank Level | % | | 46 | Ambient Temperature | °C | | 5C | Oil Temperature | °C | | 5E | Fuel Rate | L/h | | ... | и другие | | ## Установка ```bash # Клонирование cd obd2_emulator # Виртуальное окружение python3 -m venv venv source venv/bin/activate # Linux # Зависимости pip install -r requirements.txt ``` ## Использование ### Базовый запуск (виртуальный CAN) ```bash # Запуск с vcan0 (автоматически создаётся) python src/main.py --interface vcan0 --scenario city ``` ### Физический CAN интерфейс ```bash # Использование can1 (например, второй канал 2CH CAN HAT) python src/main.py --interface can1 --bitrate 500000 --scenario highway ``` ### Параметры командной строки ``` -i, --interface CAN интерфейс (can0, can1, vcan0) [default: vcan0] -b, --bitrate Скорость CAN в bps [default: 500000] -s, --scenario Сценарий (idle, warmup, city, highway, acceleration) --status-interval Интервал обновления статуса [default: 1.0] --no-status Отключить вывод статуса --debug Включить отладочный вывод ``` ## Сценарии | Сценарий | Описание | |----------|----------| | `idle` | Холостой ход, машина стоит | | `warmup` | Прогрев холодного двигателя | | `city` | Городской цикл (разгон/торможение, 0-50 км/ч) | | `highway` | Трасса (круиз 110-120 км/ч) | | `acceleration` | Тест ускорения (полный газ) | | `dynamic_city` | Продвинутый городской цикл | | `manual` | Ручное управление | ## Архитектура ``` ┌─────────────────────────────────────────────────────────────┐ │ OBD2 Emulator │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ CAN │◄──►│ OBD2 │◄──►│ Vehicle │ │ │ │ Interface │ │ Protocol │ │ Simulator │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ ▲ │ │ │ │ │ │ ▼ ┌───────┴───────┐ │ │ ┌─────────────┐ │ Scenario │ │ │ │ can0/can1 │ │ Manager │ │ │ │ vcan0 │ └───────────────┘ │ │ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ## Тестирование с бортовым компьютером ### Настройка на Raspberry Pi 5 с 2CH CAN HAT ```bash # Терминал 1: Запуск эмулятора на can1 python src/main.py -i can1 -s city # Терминал 2: Запуск бортового компьютера на can0 # (ваш проект can_sniffer или OBD2 клиент) ``` ### Тест с виртуальным CAN ```bash # Терминал 1: Эмулятор python src/main.py -i vcan0 -s highway # Терминал 2: Тестовый запрос RPM cansend vcan0 7DF#0201 0C 00 00 00 00 00 00 # Терминал 3: Мониторинг ответов candump vcan0 | grep 7E8 ``` ## OBD2 протокол ### Формат запроса (CAN ID: 0x7DF) ``` Byte 0: Length (количество значащих байт) Byte 1: Mode (01 = текущие данные) Byte 2: PID Bytes 3-7: Padding (0x00) Пример запроса RPM: 7DF#02 01 0C 00 00 00 00 00 ``` ### Формат ответа (CAN ID: 0x7E8) ``` Byte 0: Length Byte 1: Mode + 0x40 (41 для Mode 01) Byte 2: PID Bytes 3+: Data Пример ответа RPM 3000: 7E8#04 41 0C 2E E0 00 00 00 RPM = (0x2E * 256 + 0xE0) / 4 = 3000 ``` ## Лицензия MIT