CAN Bus, araçlarda ve endüstriyel makinelerde birçok kontrol ünitesinin iki tel (CAN_H ve CAN_L) üzerinden güvenilir şekilde haberleşmesini sağlayan diferansiyel bir veri yoludur. Her mesajın bir kimliği (ID) vardır; aynı anda gönderilen mesajlardan ID'si küçük olan önceliklidir ve hiçbir veri kaybolmaz. Hattın iki ucuna 120 ohm sonlandırma direnci konur. Arduino'ya MCP2515 denetleyici ve bir CAN alıcı-verici (transceiver) içeren modülle bağlanır.
Modern bir otomobilde motor, şanzıman, ABS, gösterge paneli ve kapı modülleri sürekli birbirleriyle konuşur ve bu konuşmanın büyük kısmı tek bir iki telli hat üzerinden yapılır: CAN Bus. Aynı teknoloji tarım makinelerinde, endüstriyel robotlarda, elektrikli bisikletlerde ve batarya sistemlerinde de kullanılır. Bu rehberde CAN Bus'ın nasıl çalıştığını ve Arduino ile nasıl kullanıldığını anlatıyoruz.
CAN Bus nedir?
CAN (Controller Area Network), Bosch tarafından araçlar için geliştirilmiş, çok sayıda kontrol ünitesinin (düğümün) merkezî bir bilgisayar olmadan aynı hat üzerinden haberleşmesini sağlayan seri bir veri yoludur. CAN_H ve CAN_L adlı iki tel üzerinden diferansiyel sinyalle çalışır; bu sayede elektriksel gürültüye karşı çok dayanıklıdır.
CAN Bus nasıl çalışır?
CAN'de mesajlar alıcının adresiyle değil, içeriği tanımlayan bir kimlikle (ID) gönderilir; hattaki her düğüm tüm mesajları duyar ve yalnızca ilgilendiği ID'leri işler.
- Öncelik (arbitrasyon): İki düğüm aynı anda göndermeye başlarsa, ID'si küçük olan mesaj kazanır ve kesintisiz devam eder; diğer düğüm göndermeyi bırakıp daha sonra tekrar dener. Böylece çakışmada veri kaybolmaz.
- ID uzunluğu: Standart CAN 11 bitlik, genişletilmiş CAN 29 bitlik ID kullanır.
- Veri: Klasik CAN mesajı en fazla 8 bayt veri taşır; CAN FD ile 64 bayta kadar çıkar.
- Hata kontrolü: Her mesajda CRC ve onay biti bulunur; hatalı düğümler kendini hattan otomatik olarak ayırabilir.
- Hız: Kısa hatlarda 1 Mbit/s'ye kadar; araçlarda 500 kbit/s ve 250 kbit/s yaygındır.
CAN Bus hattı nasıl kurulur?
| Kural | Açıklama |
|---|---|
| Bükümlü çift kablo | CAN_H ve CAN_L birlikte bükülür |
| Hat topolojisi | Düğümler tek bir ana hatta, kısa dallarla bağlanır |
| Sonlandırma | Hattın yalnızca iki ucuna 120 Ω direnç |
| Hız uyumu | Tüm düğümler aynı bit hızında çalışmalı |
Sonlandırma doğruysa, enerji kesikken CAN_H ile CAN_L arası multimetreyle yaklaşık 60 Ω ölçülür (iki 120 Ω paralel). Benzer diferansiyel hat mantığını RS485 rehberimizde de anlattık.
CAN Bus Arduino'ya nasıl bağlanır?
Arduino'da CAN denetleyicisi bulunmadığı için SPI ile bağlanan MCP2515 denetleyicisi ve bir CAN alıcı-verici (TJA1050, MCP2551 gibi) içeren hazır modül kullanılır.
- Modülün SPI pinlerini bağlayın: CS → D10, SI (MOSI) → D11, SO (MISO) → D12, SCK → D13, INT → D2, VCC → 5V, GND → GND.
- Modülün CAN_H ve CAN_L klemenslerini hatta bağlayın; modül hattın ucundaysa kart üzerindeki sonlandırma jumper'ını takın.
- Arduino'da bir MCP2515 kütüphanesi kurun. Modülün üzerindeki kristalin frekansını (genellikle 8 MHz ya da 16 MHz) ve hattın bit hızını kodda doğru ayarlayın; yanlış kristal ayarı haberleşmeyi tamamen engeller.
- Önce iki modülle masa üzerinde bir gönderici ve bir alıcı deneyin: biri belirli bir ID ile veri göndersin, diğeri gelen ID ve veriyi seri monitöre yazsın.
Örnek ürünler: MCP2515 CAN Bus modülü, kendi kartınız için MCP2515 denetleyici entegresi ve MCP2551 SMD ya da MCP2551 DIP alıcı-verici. Seri cihazları CAN'e bağlamak için TTL-CAN dönüştürücü kullanılabilir.
ESP32'de dahili CAN (TWAI)
ESP32'nin içinde CAN ile uyumlu TWAI adlı bir denetleyici bulunur; MCP2515'e gerek kalmadan yalnızca bir alıcı-verici entegresiyle CAN hattına bağlanabilir. Alıcı-vericinin 3,3V uyumlu olmasına dikkat edilmelidir. ESP32 hakkında bilgi için ESP32 başlangıç rehberimize bakın.
Araçlarda CAN Bus ve OBD-II
Birçok araçta OBD-II teşhis soketinin 6. pini CAN_H, 14. pini CAN_L'dir. Bu soket üzerinden motor devri, hız ve hata kodları gibi standart veriler okunabilir. Araç CAN hattına yalnızca okuma amaçlı ve dikkatle bağlanın; hatta yanlış ya da kontrolsüz mesaj göndermek araç sistemlerinin hatalı çalışmasına yol açabilir. Deneme ve öğrenme için araç yerine masa üzerinde kurulan bir test hattı kullanmak en güvenli yoldur.
Sık sorulan sorular
CAN Bus ne işe yarar?
CAN Bus, araçlarda ve makinelerde çok sayıda kontrol ünitesinin az kabloyla, güvenilir ve öncelikli şekilde haberleşmesini sağlar. Kablo demetini küçültür ve sistemlerin birbirinin verisini paylaşmasına olanak tanır.
CAN Bus ile RS485 farkı nedir?
İkisi de diferansiyel iki telli hatlardır. RS485 yalnızca fiziksel katmanı tanımlar ve genellikle ana-bağımlı protokollerle (Modbus) kullanılır. CAN ise mesaj önceliği, hata kontrolü ve çok ustalı (multi-master) erişimi donanım düzeyinde içerir.
CAN hattında neden 120 ohm direnç kullanılır?
120 Ω, CAN kablosunun karakteristik empedansına yakındır. Hattın iki ucuna konduğunda sinyal yansımalarını önler ve hattın boşta doğru seviyeye dönmesini sağlar.
MCP2515 modülü neden haberleşmiyor?
En sık nedenler kodda yanlış kristal frekansı, bit hızının hattaki diğer cihazlarla aynı olmaması, eksik sonlandırma ve CAN_H ile CAN_L'nin ters bağlanmasıdır.
CAN FD nedir?
CAN FD, klasik CAN'in geliştirilmiş sürümüdür. Mesaj başına 64 bayta kadar veri taşır ve veri bölümünü daha yüksek hızda gönderebilir. Kullanılması için tüm düğümlerin CAN FD'yi desteklemesi gerekir.
Özet
- CAN Bus, CAN_H ve CAN_L ile çalışan diferansiyel bir veri yoludur.
- Mesajlar ID ile gönderilir; küçük ID önceliklidir ve çakışmada veri kaybolmaz.
- Hattın iki ucuna 120 Ω konur; CAN_H-CAN_L arası yaklaşık 60 Ω ölçülür.
- Arduino'ya MCP2515 + alıcı-verici modülüyle bağlanır; kristal ve hız ayarı doğru olmalıdır.
- Araç hattına yalnızca dikkatle ve okuma amaçlı bağlanılmalıdır.