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.
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:
- 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.
- 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.
- 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.
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ı).
| Byte 0 | Byte 1 | Byte 2 | Byte 3-7 |
|---|---|---|---|
| Uzunluk | Servis (Mode) | PID (Kod) | Boş |
0x02 |
0x01 (Canlı Veri) |
0x0C (RPM) |
0x55 (Önemsiz) |
Motor devrini okumak için PID 0x0C kullanılır.
ID: 0x7DF -> Data: 02 01 0C 00 00 00 00 00
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:
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
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);
}
}
}Tebrikler! Artık CAN Bus dünyasına hakimsiniz.
- Fiziksel: 120 Ohm direnci unutma. Diferansiyel sinyal gürültüden etkilenmez.
- Arbitration: ID'si küçük olan (0x000) her zaman kazanır, büyük olan susar.
- Filtre: Mask ve Code kullanarak işlemciyi gereksiz yükten kurtar.
- Hata: "Bus Off" yiyen cihazı
initiate_recoveryile kurtar. - OBD-II:
0x7DF'ye sor,0x7E8'den cevabı al, formüle koy.