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.

#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
}
#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();
}
}
MCP2515 donanımını sorunsuz bir şekilde haberleştirmek için dikkat edilmesi gereken kritik detaylar şunlardır:
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.J1 Place a jumper noktalarındaki jumper başlıklarının takılı olduğundan emin olun.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.
Henüz yorum yapılmamış. İlk yorumu siz yapın!