Qo'llanma · CAN · OBD-II
ESP32 va CAN shina bilan avtomobilning jonli ma'lumotlarini o'qing
Taxminan 2008-yildan beri ishlab chiqarilgan har qanday avtomobil OBD-II porti orqali CAN tilida gaplashadi. ESP32 da o'rnatilgan CAN kontroller allaqachon bor (Espressif uni TWAI deb ataydi), shuning uchun qo'shishingiz kerak bo'lgan yagona narsa — bir dollarlik SN65HVD230 transiveri, va siz aylanishlar sonini, sovutish suyuqligi haroratini, tezlikni va o'nlab boshqa qiymatlarni o'z dashboardingizga oqim qilib uzatishingiz mumkin.
Agar CAN ning dominant/retsessiv arbitraji va differensial juftligi siz uchun yangilik bo'lsa — interaktiv shina tushuntirishining CAN bo'limidan boshlang. Bu post — avtomobildan ma'lumotni haqiqatda chiqarib olish bo'yicha amaliy davomi.
Nega ESP32 bunga ideal
- O'rnatilgan TWAI (CAN) kontroller — MCP2515 SPI moduli kerak emas, periferiya chipning o'zida.
- Lekin ESP32 pinlari bir uchli (single-ended), CAN esa differensial, shuning uchun
baribir transiver kerak.
SN65HVD2303.3 V da ishlaydi, bu ESP32 bilan toza mos keladi (MCP2551 esa 5 V da ishlaydi va daraja moslashuvini talab qiladi).
OBD-II portiga ulanish
SN65HVD230 ESP32
---------- -----
CTX / D (TX) <-- TWAI TX (mas. GPIO5)
CRX / R (RX) --> TWAI RX (mas. GPIO4)
VCC --> 3V3 // 3.3 V transiver — ESP32 uchun ideal
GND --> GND
CANH / CANL --> OBD-II pinlari 6 (H) va 14 (L)
// Avtomobil shinasi allaqachon terminatsiyalangan — OBD portiga 120 Om QO'YMANG.
OBD-II pin 6 — bu CAN-H, pin 14 — CAN-L, pin 16 esa doimiy 12 V quvvat beradi (ESP32 uchun buck konverter orqali 5 V gacha tushiring). Avtomobil shinasida allaqachon o'zining 120 Om terminatorlari bor — portga o'zingiznikini qo'shsangiz uni ortiqcha yuklaysiz.
Kadrlarni o'qish (faqat tinglash)
O'rnatilgan driver/twai.h dan foydalaning. Eng muhim sozlama —
TWAI_MODE_LISTEN_ONLY: u shinaga hech qachon chiqmasdan qabul qilish
imkonini beradi, shuning uchun avtomobilga jismonan halaqit bera olmaysiz. OBD-II uchun bit tezligi —
500 kbit/s.
#include "driver/twai.h"
void setup() {
Serial.begin(115200);
twai_general_config_t g = TWAI_GENERAL_CONFIG_DEFAULT(
GPIO_NUM_5, GPIO_NUM_4, TWAI_MODE_LISTEN_ONLY); // faqat o'qish = xavfsiz
twai_timing_config_t t = TWAI_TIMING_CONFIG_500KBITS(); // OBD-II = 500 kbit/s
twai_filter_config_t f = TWAI_FILTER_CONFIG_ACCEPT_ALL();
twai_driver_install(&g, &t, &f);
twai_start();
}
void loop() {
twai_message_t msg;
if (twai_receive(&msg, pdMS_TO_TICKS(1000)) == ESP_OK) {
Serial.printf("ID 0x%03X [%d] ", msg.identifier, msg.data_length_code);
for (int i = 0; i < msg.data_length_code; i++)
Serial.printf("%02X ", msg.data[i]);
Serial.println();
}
} Buni yoqilgan dvigatel bilan ishga tushiring va kadrlar oqimini ko'rasiz — har bir modul "gaplashadi". Endi faqat aniq qiymatlarni so'rashingiz kerak.
Qiymat so'rash — OBD-II PID lar
OBD-II — bu CAN ustidagi so'rov/javob qatlami. Siz 0x7DF ID ga so'rov yuborasiz (masalan,
rejim 01, PID 0x0C = dvigatel aylanishlari soni) va ECU 0x7E8 da
javob beradi. Aylanishlar soni javob baytlaridan (A*256 + B) / 4 sifatida hisoblanadi.
PID ni 0x05 (sovutish suyuqligi harorati), 0x0D (tezlik) va hokazolarga
almashtiring — PID ro'yxati standart. Yuk mashinalari va og'ir texnika uchun CAN ustida
J1939 ishlaydi — o'sha jismoniy shinaning o'zi.
Xavfsizlik va tuzoqlar
- Listen-only rejimida qoling, agar nima qilayotganingizni aniq bilmasangiz. Jonli avtomobil shinasiga yozish modullarni chalkashtirishi mumkin — hech qachon harakatlanayotgan mashinada tajriba o'tkazmang.
- Bit tezligi mos kelishi shart — ko'pchilik OBD-II uchun 500 kbit/s; noto'g'ri tezlik = nol kadr yoki xatolar bo'roni.
- Transiver majburiy — CAN-H/L ni to'g'ridan-to'g'ri GPIO ga ulamang.
- Qo'shimcha terminatsiya yo'q OBD portida; avtomobil uni ta'minlaydi.
- Ishlagach, faqat sizga kerak bo'lgan ID larga filtr qo'ying — xom shina band.
Bu yerdan o'zingiz hostlaydigan avto dashboardigacha bir qadam qoldi: dekodlangan qiymatlarni bir nechta vidjetga uzating va ESP32 Wi-Fi orqali jonli asboblar panelini xizmat qiladi — bulutsiz, ilovasiz.
CAN ning dominant/retsessiv arbitraji baytni qanday harakatlantirishini jonli ko'ring.