Skip to content

Latest commit

 

History

History
146 lines (100 loc) · 5.23 KB

File metadata and controls

146 lines (100 loc) · 5.23 KB

🕵️‍♂️ Bölüm 4: Hata Yönetimi ve OBD-II (Araç Diyagnostiği)

Endüstriyel sistemlerin "Mavi Ekran" vermeye hakkı yoktur. Bir sensör bozulursa, bütün fabrika durmamalıdır. CAN Bus, bozuk cihazı tespit edip ağdan atma (Bus Off) yeteneğine sahiptir.

Ayrıca bu bölümde, OBD-II portu üzerinden aracınızın motor devrini ve hızını nasıl okuyacağınızı göreceğiz.


4.1 Hata Durumları: Sarı Kart ve Kırmızı Kart 🟨🟥

Her CAN kontrolcüsünün içinde bir "Hata Sayacı" (Error Counter) vardır.

  • TEC: Transmit Error Counter (Gönderme Hatası)
  • REC: Receive Error Counter (Alma Hatası)

Sistem 3 aşamadan geçer:

  1. Error Active (Sağlıklı): Hata sayacı < 127. Cihaz normal çalışır, hataya rastlarsa "Error Flag" (6 adet Dominant bit) basıp herkesi uyarır.
  2. Error Passive (Sarı Kart): Hata sayacı > 127. Cihaz artık o kadar güvenilmezdir ki, hata bulsa bile bağırmasına izin verilmez. Sadece sessizce not alır.
  3. Bus Off (Kırmızı Kart): Hata sayacı > 255.
    • Kontrolcü kendini tamamen kapatır.
    • Hattan elektriksel olarak kopar (Logic 1 / Recessive modunda kalır).
    • Yazılım müdahalesi (Reset) olmadan bir daha konuşamaz.

🛠️ Saha Senaryosu: Eğer cihazınız bir çalışıp bir duruyorsa, muhtemelen "Bus Off" durumuna düşüyordur. twai_initiate_recovery() komutu ile onu hayata döndürebilirsiniz.


4.2 OBD-II Nedir? 🚗

OBD (On-Board Diagnostics), 2001 sonrası tüm araçlarda standart olan bir protokoldür. Aslında CAN Bus üzerinde çalışan bir "Soru-Cevap" katmanıdır.

  • Request (Soru) ID: 0x7DF (Bu ID'ye atılan mesajı motor beyni dinler).
  • Response (Cevap) ID: 0x7E8 (Genellikle motor beyninin cevabı).

Standart İstek Paketi (8 Byte)

Byte 0 Byte 1 Byte 2 Byte 3-7
Uzunluk Servis (Mode) PID (Kod) Boş
0x02 0x01 (Canlı Veri) 0x0C (RPM) 0x55 (Önemsiz)

4.3 Örnek: Araçtan Motor Devrini (RPM) Okuma 🏎️

Motor devrini okumak için PID 0x0C kullanılır.

Adım 1: İsteği Gönder (Request)

ID: 0x7DF -> Data: 02 01 0C 00 00 00 00 00

Adım 2: Cevabı Çöz (Response)

Araçtan şöyle bir cevap gelir: ID: 0x7E8 -> Data: 04 41 0C 1A F8 00 00 00

  • 04: 4 Byte dolu.
  • 41: Servis 01'e cevap (01 + 40 = 41).
  • 0C: İstenen PID (RPM).
  • 1A F8: Asıl Değer (Hex).

Formül: $$RPM = \frac{(A \times 256) + B}{4}$$

$$RPM = \frac{(0x1A \times 256) + 0xF8}{4} = \frac{(26 \times 256) + 248}{4} = 1726 \text{ devir/dk}$$

sequenceDiagram
    participant ESP32 as ESP32 (Tester)
    participant ECU as Araç Beyni (ECU)

    Note over ESP32: İstek: Service 01, PID 0C (RPM)
    ESP32->>ECU: ID: 0x7DF [02 01 0C 00...]
    
    Note over ECU: Veriyi Hesaplar
    ECU-->>ESP32: ID: 0x7E8 [04 41 0C 1A F8...]
    
    Note over ESP32: Formülü Uygula: ((A*256)+B)/4
    Note over ESP32: Sonuç: 1726 RPM
Loading

4.4 Pratik Kod (OBD-II Okuyucu) 💻

Aşağıdaki kod, her saniye araca "Hızın kaç?" diye sorar. (Hız PID: 0x0D)

void getVehicleSpeed() {
    // 1. İsteği Hazırla
    twai_message_t tx_msg;
    tx_msg.identifier = 0x7DF; // Broadcast Request ID
    tx_msg.extd = 0;           // Standart 11-bit
    tx_msg.data_length_code = 8;
    
    tx_msg.data[0] = 0x02; // Data Uzunluğu (Mode + PID)
    tx_msg.data[1] = 0x01; // Service 01 (Show Current Data)
    tx_msg.data[2] = 0x0D; // PID 0D (Vehicle Speed)
    
    // Geri kalanlar 0x55 (Padding)
    for(int i=3; i<8; i++) tx_msg.data[i] = 0x55; 

    // 2. Gönder
    twai_transmit(&tx_msg, pdMS_TO_TICKS(100));

    // 3. Cevabı Bekle (Timeout: 100ms)
    twai_message_t rx_msg;
    if (twai_receive(&rx_msg, pdMS_TO_TICKS(100)) == ESP_OK) {
        // Cevap 0x7E8'den mi geldi? Ve PID 0x0D mi?
        if (rx_msg.identifier == 0x7E8 && rx_msg.data[2] == 0x0D) {
            int speed = rx_msg.data[3]; // Hız için formül sadece 'A'
            printf("Araç Hızı: %d km/h\n", speed);
        }
    }
}

✅ CAN Serisi Özeti

Tebrikler! Artık CAN Bus dünyasına hakimsiniz.

  1. Fiziksel: 120 Ohm direnci unutma. Diferansiyel sinyal gürültüden etkilenmez.
  2. Arbitration: ID'si küçük olan (0x000) her zaman kazanır, büyük olan susar.
  3. Filtre: Mask ve Code kullanarak işlemciyi gereksiz yükten kurtar.
  4. Hata: "Bus Off" yiyen cihazı initiate_recovery ile kurtar.
  5. OBD-II: 0x7DF'ye sor, 0x7E8'den cevabı al, formüle koy.


Bölüm 3: Entegrasyon Menüye Dön Destek Ol