first commit

This commit is contained in:
2026-01-29 17:16:42 +03:00
commit f54778528e

158
README.md Normal file
View 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