Files
obd_emulator/README.md
2026-01-29 17:16:42 +03:00

159 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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