RisalDash RisalDash

دليل · CAN · OBD-II

اقرأ بيانات سيارتك الحية عبر ESP32 وناقل CAN

كل سيارة صُنعت منذ نحو عام 2008 تتحدث عبر CAN من خلال منفذ OBD-II. يحتوي ESP32 بالفعل على متحكم CAN مدمج (تسمّيه Espressif باسم TWAI)، فكل ما تضيفه هو مُرسِل مستقبِل SN65HVD230 بدولار واحد — وبإمكانك بثّ عدد اللفات ودرجة حرارة سائل التبريد والسرعة وعشرات القيم الأخرى إلى لوحة التحكم الخاصة بك.

CANTWAIOBD-IIESP32SN65HVD230السيارات

إذا كان تحكيم CAN (المسيطر/المتنحّي) والزوج التفاضلي جديدَين عليك، فابدأ بـ قسم CAN في الشرح التفاعلي للنواقل — هذه المقالة هي المتابعة العملية لاستخراج البيانات فعليًا من مركبة.

لماذا يُعدّ ESP32 مثاليًا لهذا

التوصيل بمنفذ 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.
ESP32 موصّل بمحوّل CAN من نوع SN65HVD230 — TWAI TX إلى CTX وCRX إلى TWAI RX بجهد 3.3 فولت وCANH وCANL إلى ناقل السيارة / OBD-II
توصيل SN65HVD230: ‏TWAI TX ← CTX، ‏CRX ← TWAI RX عند 3.3 فولت، وCANH/CANL إلى طرفي OBD-II رقم 6 و14. مبنيّ في BoardLab.

الطرف 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 بدلًا من ذلك، على الناقل الفيزيائي نفسه.

السلامة والمزالق

من هنا تفصلك خطوة صغيرة عن لوحة قيادة سيارة مستضافة ذاتيًا: مرّر القيم المُفكّكة إلى بضع أدوات عرض، ويقدّم ESP32 مجموعة عدّادات حيّة عبر Wi-Fi — دون سحابة ودون تطبيق.

شاهد تحكيم CAN (المسيطر/المتنحّي) يُحرّك بايتًا، مباشرةً.