commit f54778528e3064e85f398acd7146065ea98fa745 Author: Alexander Poletaev Date: Thu Jan 29 17:16:42 2026 +0300 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..987ce6e --- /dev/null +++ b/README.md @@ -0,0 +1,158 @@ +# 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