Arduino ve MCP2515 ile CAN Bus Haberleşme (Transmitter & Receiver)

👤 Yazar: ozcan 📅 Tarih: 23.07.2026 08:05 👁️ Görüntüleme: 17

Arduino ve MCP2515 ile CAN Bus Haberleşme (Transmitter & Receiver)

CAN Bus (Controller Area Network), otomotiv ve endüstriyel otomasyon alanlarında yüksek gürültü bağışıklığı ve güvenilirlik sağlayan difransiyel bir haberleşme protokolüdür. Şemadaki bağlantıda görüldüğü üzere, iki adet MCP2515 CAN Kontrolcü + TJA1050 Transceiver modülü, SPI arayüzü üzerinden Arduino Uno'lara bağlanarak çift bükümlü kablo (Twisted Pair) ile CAN_H ve CAN_L hatları üstünden haberleşir.

arduino ile mcp2525 can haberleşme şeması

Pin Bağlantı Şeması (SPI & CAN Hattı):
  • VCC → Arduino 5V (Kırmızı)
  • GND → Arduino GND (Siyah)
  • CS (Chip Select) → Arduino Dijital Pin 10 (Mavi)
  • SO (MISO) → Arduino Dijital Pin 12 (Mor)
  • SI (MOSI) → Arduino Dijital Pin 11 (Turuncu)
  • SCK (Clock) → Arduino Dijital Pin 13 (Kahverengi)
  • INT (Interrupt) → Arduino Dijital Pin 2 (Gri)
  • CAN Bus Hattı: Modüller arası CAN_H → CAN_H (Sarı), CAN_L → CAN_L (Yeşil) bağlantısı yapılmalı ve her iki uçtaki 120Ω sonlandırma jumper'ları (J1) takılı olmalıdır.

1. AŞAMA: Verici (Transmitter) Arduino Kodları

#include <SPI.h>
#include <mcp2515.h>

// MCP2515 nesnesi (CS pini 10)
MCP2515 mcp2515(10);

// CAN Frame Yapısı
struct can_frame canMsg;

void setup() {
  Serial.begin(115200);

  // MCP2515 Donanım İlklendirmesi
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ); // Modül kristaliniz 8MHz ise MCP_8MHZ, 16MHz ise MCP_16MHZ yapın
  mcp2515.setNormalMode();

  // Gönderilecek CAN Paket Ayarları
  canMsg.can_id  = 0x0F6; // Standart CAN Kimliği (ID)
  canMsg.can_dlc = 8;     // Veri Uzunluğu (Data Length Code - 8 Bayt)
  canMsg.data[0] = 0x01;  // Örnek Komut / Veri Baytları
  canMsg.data[1] = 0x02;
  canMsg.data[2] = 0x00;
  canMsg.data[3] = 0x00;
  canMsg.data[4] = 0x00;
  canMsg.data[5] = 0x00;
  canMsg.data[6] = 0x00;
  canMsg.data[7] = 0x00;

  Serial.println("CAN Bus Verici (Transmitter) Hazır...");
}

void loop() {
  // Sayaç olarak data[2] baytını her döngüde artıralım
  canMsg.data[2]++;

  // CAN Paketi Gönderimi
  if (mcp2515.sendMessage(&canMsg) == MCP2515::ERROR_OK) {
    Serial.print("Paket Gönderildi! ID: 0x");
    Serial.print(canMsg.can_id, HEX);
    Serial.print(" | Değer: ");
    Serial.println(canMsg.data[2]);
  } else {
    Serial.println("Hata: CAN Paketi Gönderilemedi!");
  }

  delay(1000); // 1 saniye aralıklarla paket gönder
}

2. AŞAMA: Alıcı (Receiver) Arduino Kodları

#include <SPI.h>
#include <mcp2515.h>

// MCP2515 nesnesi (CS pini 10)
MCP2515 mcp2515(10);

// Gelen CAN Paketi için Frame Yapısı
struct can_frame canMsg;

void setup() {
  Serial.begin(115200);

  // MCP2515 Donanım İlklendirmesi
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ); // Verici ile aynı baud rate ve kristal frekansı
  mcp2515.setNormalMode();

  Serial.println("CAN Bus Alıcı (Receiver) Dinleniyor...");
}

void loop() {
  // Veri Hattında Paket Var mı Kontrol Et
  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
    Serial.print("Paket Alındı -> ID: 0x");
    Serial.print(canMsg.can_id, HEX);
    Serial.print(" | DLC: ");
    Serial.print(canMsg.can_dlc);
    Serial.print(" | Veri: ");

    // Gelen 8 Bayt Veriyi Seri Monitör'e Döküyoruz
    for (int i = 0; i < canMsg.can_dlc; i++) {
      Serial.print(canMsg.data[i], HEX);
      Serial.print(" ");
    }
    Serial.println();
  }
}

Çalışma Mantığı ve Donanım Konfigürasyonu

MCP2515 donanımını sorunsuz bir şekilde haberleştirmek için dikkat edilmesi gereken kritik detaylar şunlardır:

  • Kristal Frekansı (8MHz vs 16MHz): Piyasada bulunan MCP2515 modüllerinin çoğunda 8.000 MHz kristal bulunur (Y3 osilatörü üzerinde yazar). Kod içerisindeki setBitrate(CAN_500KBPS, MCP_8MHZ) satırında kristal değerinizin doğru seçildiğinden emin olun, aksi halde SPI haberleşse bile CAN bus üzerinde frame yakalayamazsınız.
  • Sonlandırma Dirençleri (J1 Jumper): CAN bus mimarisinde sinyal yansımalarını önlemek için hattın her iki uç noktasına 120Ω sonlandırma direnci koymak şarttır. Görseldeki modüller üzerinde bulunan J1 Place a jumper noktalarındaki jumper başlıklarının takılı olduğundan emin olun.
  • CAN ID ve Öncelik: CAN protokolünde veri mesaj bazlı iletilir. Düşük ID numarasına sahip paketler (örneğin 0x001), yüksek ID numaralı paketlere (örneğin 0x7FF) kıyasla hatta her zaman daha yüksek önceliğe sahiptir.

Kodu derlemeden önce Arduino IDE içerisindeki Kütüphane Yöneticisi üzerinden autowp üreticisinin autowp-mcp2515 kütüphanesini yüklediğinizden ve Seri Monitör hızını 115200 baud olarak seçtiğinizden emin olun.

💬 Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
↑ Sayfa Başı
📞 İletişim ✉ E-Posta Gönder 🟥 YouTube
© 2026 Yenidir.com
Yenidir CMS V0.1