first commit
This commit is contained in:
158
README.md
Normal file
158
README.md
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user