Чтение параметров ЭБУ по CAN-шине через python-can
Что такое OBD-II PID
OBD-II — стандартный диагностический интерфейс, обязательный для всех автомобилей с 2001 года. Через него можно читать параметры двигателя в реальном времени: обороты, температуру, нагрузку и сотни других.
PID (Parameter ID) — числовой код параметра. Например, 0x0C — обороты двигателя, 0x05 — температура охлаждающей жидкости.
Подключение
Нужен ELM327-совместимый адаптер или CAN-интерфейс (например, PEAK PCAN-USB). На Linux socketcan работает из коробки:
sudo ip link set can0 type can bitrate 500000
sudo ip link set up can0
python-can
import can
bus = can.interface.Bus(channel='can0', bustype='socketcan')
# Запрос оборотов двигателя (PID 0x0C)
msg = can.Message(
arbitration_id=0x7DF,
data=[0x02, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00],
is_extended_id=False
)
bus.send(msg)
response = bus.recv(timeout=1.0)
if response:
rpm = ((response.data[3] * 256) + response.data[4]) / 4
print(f'RPM: {rpm}')
Расшифровка ответа
ЭБУ отвечает на ID 0x7E8. Формула для каждого PID своя — смотри в стандарте SAE J1979 или на Wikipedia в разделе OBD-II PIDs.
Ограничения
Не все параметры доступны через стандартный OBD-II. Проприетарные данные (адаптация, кодирование блоков) требуют знания протокола конкретного производителя — UDS или KWP2000.