دليل · CAN · OBD-II
اقرأ بيانات سيارتك الحية عبر ESP32 وناقل CAN
كل سيارة صُنعت منذ نحو عام 2008 تتحدث عبر CAN من خلال منفذ OBD-II. يحتوي ESP32 بالفعل على متحكم CAN مدمج (تسمّيه Espressif باسم TWAI)، فكل ما تضيفه هو مُرسِل مستقبِل SN65HVD230 بدولار واحد — وبإمكانك بثّ عدد اللفات ودرجة حرارة سائل التبريد والسرعة وعشرات القيم الأخرى إلى لوحة التحكم الخاصة بك.
إذا كان تحكيم CAN (المسيطر/المتنحّي) والزوج التفاضلي جديدَين عليك، فابدأ بـ قسم CAN في الشرح التفاعلي للنواقل — هذه المقالة هي المتابعة العملية لاستخراج البيانات فعليًا من مركبة.
لماذا يُعدّ ESP32 مثاليًا لهذا
- متحكم TWAI (CAN) مدمج — لا حاجة إلى وحدة MCP2515 عبر SPI، فالطرفية موجودة على الشريحة نفسها.
- لكن أطراف ESP32 أحادية الطرف، بينما CAN تفاضلي، لذا ما زلت بحاجة إلى
مُرسِل مستقبِل. يعمل
SN65HVD230بجهد 3.3 فولت، وهو ما يتوافق بسلاسة مع ESP32 (بينما MCP2551 يعمل بـ 5 فولت ويتطلب مواءمة للمستويات).
التوصيل بمنفذ OBD-II
SN65HVD230 ESP32
---------- -----
CTX / D (TX) <-- TWAI TX (مثال GPIO5)
CRX / R (RX) --> TWAI RX (مثال GPIO4)
VCC --> 3V3 // مُرسِل مستقبِل بجهد 3.3 فولت — مثالي لـ ESP32
GND --> GND
CANH / CANL --> OBD-II الأطراف 6 (H) و 14 (L)
// ناقل السيارة مُنهى بالفعل — لا تُضِف مقاومة 120 Ω على منفذ OBD.
الطرف 6 في OBD-II هو CAN-H، والطرف 14 هو CAN-L، والطرف 16 يمنحك 12 فولت دائمة (استخدم محوّلًا خافضًا إلى 5 فولت لـ ESP32). يحتوي ناقل السيارة على مقاومتَي إنهاء 120 Ω بالفعل — وإضافة مقاومتك على المنفذ ستُحمّله فوق طاقته.
قراءة الإطارات (الاستماع فقط)
استخدم driver/twai.h المدمج. أهمّ إعداد على الإطلاق هو
TWAI_MODE_LISTEN_ONLY: فهو يتيح لك الاستقبال دون أن تقود الناقل إطلاقًا،
بحيث يستحيل عليك فيزيائيًا التشويش على السيارة. معدّل البتات لـ OBD-II هو 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); // قراءة فقط = آمن
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();
}
} شغّل ذلك والمحرك يعمل وسترى سيلًا من الإطارات — كل وحدة تُثرثر. الآن يكفي أن تطلب قيمًا محدّدة.
طلب قيمة — معرّفات OBD-II PID
OBD-II هو طبقة طلب/استجابة فوق CAN. ترسل استعلامًا إلى المعرّف 0x7DF (مثلًا الوضع
01، والـ PID 0x0C = عدد لفات المحرك) وتردّ عليك وحدة التحكم ECU على
0x7E8. تُفكّ شيفرة عدد اللفات بالمعادلة (A*256 + B) / 4 من بايتات الاستجابة.
استبدل الـ PID بـ 0x05 (درجة حرارة سائل التبريد)، أو 0x0D (السرعة)، وهكذا —
فقائمة الـ PID قياسية. أمّا للشاحنات والمعدّات الثقيلة فيكون J1939 فوق CAN بدلًا من ذلك،
على الناقل الفيزيائي نفسه.
السلامة والمزالق
- ابقَ في وضع الاستماع فقط ما لم تكن تعرف حقًا ما تفعله. فالكتابة إلى ناقل مركبة حيّ قد تُربك الوحدات — لا تُجرِّب أبدًا على سيارة متحركة.
- يجب أن يتطابق معدّل البتات — 500 kbit/s لمعظم منافذ OBD-II؛ فالمعدّل الخاطئ يعني صفرًا من الإطارات أو عاصفة أخطاء.
- المُرسِل المستقبِل إلزامي — لا توصّل CAN-H/L مباشرةً بمنفذ GPIO.
- لا مقاومات إنهاء إضافية على منفذ OBD؛ فالسيارة توفّرها بالفعل.
- رشّح المعرّفات التي تهمّك فقط بعد أن يعمل كل شيء — فالناقل الخام مزدحم.
من هنا تفصلك خطوة صغيرة عن لوحة قيادة سيارة مستضافة ذاتيًا: مرّر القيم المُفكّكة إلى بضع أدوات عرض، ويقدّم ESP32 مجموعة عدّادات حيّة عبر Wi-Fi — دون سحابة ودون تطبيق.
شاهد تحكيم CAN (المسيطر/المتنحّي) يُحرّك بايتًا، مباشرةً.