159 lines
6.1 KiB
Markdown
159 lines
6.1 KiB
Markdown
# 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
|