MCP2515 CANBUS

1enjoy

Üye
Katılım
1 Aralık 2024
Mesajlar
55
1747481320605.png



şemam bu şekilde sck pinlerini çıkardığımda master dan slaveye veri gönderemiyorum


C++:
#include <SPI.h>
#include <mcp_can.h>

const int SPI_CS_PIN = 15; // ESP8266 için CS pini (D8)
MCP_CAN CAN(SPI_CS_PIN);

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

  SPI.begin();

  if (CAN.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ) == CAN_OK) {
    Serial.println("CAN bus başlatıldı (250 kbps)");
    CAN.setMode(MCP_NORMAL);
  } else {
    Serial.println("Başlatılamadı, program durdu");
    while (1);
  }
}

void loop() {
  byte data[8] = {10, 20, 30, 40, 50, 60, 70, 80};

  if (CAN.sendMsgBuf(0x100, 0, 8, data) == CAN_OK) {
    Serial.println("Mesaj gönderildi");
  } else {
    Serial.println("Gönderme başarısız");
  }
  delay(1000);
}


C++:
#include <SPI.h>
#include <mcp_can.h>

const int SPI_CS_PIN = 10; // Arduino Nano için CS pini
MCP_CAN CAN(SPI_CS_PIN);

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

  SPI.begin();

  if (CAN.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ) == CAN_OK) {
    Serial.println("CAN bus başlatıldı (250 kbps)");
    CAN.setMode(MCP_NORMAL);
  } else {
    Serial.println("Başlatılamadı, program durdu");
    while (1);
  }
}

void loop() {
  unsigned long id;
  byte len = 0;
  byte buf[8];

  if (CAN.checkReceive() == CAN_MSGAVAIL) {
    CAN.readMsgBuf(&id, &len, buf);

    Serial.print("Mesaj alındı. ID: 0x");
    Serial.print(id, HEX);
    Serial.print(" Uzunluk: ");
    Serial.print(len);
    Serial.print(" Veri: ");
    for (byte i = 0; i < len; i++) {
      Serial.print(buf[i], DEC);
      Serial.print(" ");
    }
    Serial.println();
  }
}


SADECE ESP32 yerine ESP8266 ile deniyorum şu anda esp32 kargoda
 

Ekler

  • 1747480737926.png
    1747480737926.png
    56.2 KB · Görüntüleme: 7
Son düzenleme:
Normalde SCK pini kullanılmaması mı lazım?
 
Bu kütüphaneyi mi kullanıyorsunuz?

Kod'da hata 5 hangi aşamada çıktısının gönderilmesine dair bir şey bulanadım. Kodu güncelleyin.
Kütüphanede hatanın nereden geldiğine bakılabilir.

p.s. Arduino kutuphaneleri kullanmıyorum.
 
canbus veri gönderilmesi için karşı tarafta gönderilen adrese uygun bir alıcı olması lazım. ancak bu şekilde alıcı ACK paketi üretir ve verici de mesaj gönderildi olarak algılar.

canbus hattında mcp2515 lerden sonra bir de can transreceiver entegresi olacak. can hatları bağlı ve iki uçtan 120 ohm ile sonlandırılmış olmalı. ayrıca iki tarafta da aynı baudrate set edilmeli
 
canbus veri gönderilmesi için karşı tarafta gönderilen adrese uygun bir alıcı olması lazım. ancak bu şekilde alıcı ACK paketi üretir ve verici de mesaj gönderildi olarak algılar.

canbus hattında mcp2515 lerden sonra bir de can transreceiver entegresi olacak. can hatları bağlı ve iki uçtan 120 ohm ile sonlandırılmış olmalı. ayrıca iki tarafta da aynı baudrate set edilmeli
Bu kütüphaneyi mi kullanıyorsunuz?

Kod'da hata 5 hangi aşamada çıktısının gönderilmesine dair bir şey bulanadım. Kodu güncelleyin.
Kütüphanede hatanın nereden geldiğine bakılabilir.

p.s. Arduino kutuphaneleri kullanmıyorum.


1747489485163.png


burdaki jumperi attım
MASTER
C++:
#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN0(D8); // D8 = GPIO15, CS pini

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

  // MCP2515 başlatılıyor
  if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
    Serial.println("MCP2515 Başarıyla Başlatıldı!");
  } else {
    Serial.println("MCP2515 Başlatılamadı...");
    while (1);
  }

  CAN0.setMode(MCP_NORMAL); // Normal çalışma modu
}

byte data[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};

void loop() {
  byte sndStat = CAN0.sendMsgBuf(0x100, 0, 8, data); // ID = 0x100
  if (sndStat == CAN_OK) {
    Serial.println("Mesaj Başarıyla Gönderildi!");
  } else {
    Serial.println("Mesaj Gönderilemedi...");
  }
  delay(1000); // 1 saniyede bir gönder
}




SLAVE

C++:
#include <mcp_can.h>
#include <SPI.h>

#define CAN0_INT 2  // INT pini D2
MCP_CAN CAN0(10);   // CS pini D10

long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];

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

  // MCP2515 başlatılıyor
  if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) {
    Serial.println("MCP2515 Başarıyla Başlatıldı!");
  } else {
    Serial.println("MCP2515 Başlatılamadı...");
    while (1);
  }

  CAN0.setMode(MCP_NORMAL);     // Normal çalışma modu
  pinMode(CAN0_INT, INPUT);     // INT pini girdi olarak ayarlanır

  Serial.println("CAN Alıcı Hazır...");
}

void loop() {
  if (!digitalRead(CAN0_INT)) {
    CAN0.readMsgBuf(&rxId, &len, rxBuf);

    Serial.print("Gelen Mesaj - ID: 0x");
    Serial.print(rxId, HEX);
    Serial.print("  Veri: ");
    for (byte i = 0; i < len; i++) {
      Serial.print("0x");
      Serial.print(rxBuf[i], HEX);
      Serial.print(" ");
    }
    Serial.println();
  }
}


Sorun hala aynı
 
Kodlarınızda master için 8Mhz, slave için 16Mhz ayarlarını kullandınız. Bunu bilerek kullandıysanız bu mesajı göz ardı edebilirsiniz. Gözünüzden kaçan bir durum ise bu durumu (modül üstündeki xtall değeri ile koddaki aynı olmalı) dikkate alın.

C:
 if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) { // master 8MHZ
  
 if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) { // slave 16MHZ
 
canbus veri gönderilmesi için karşı tarafta gönderilen adrese uygun bir alıcı olması lazım. ancak bu şekilde alıcı ACK paketi üretir ve verici de mesaj gönderildi olarak algılar.

canbus hattında mcp2515 lerden sonra bir de can transreceiver entegresi olacak. can hatları bağlı ve iki uçtan 120 ohm ile sonlandırılmış olmalı. ayrıca iki tarafta da aynı baudrate set edilmeli
Abi senden canbus tutorial bekliyoruz. Bizim için güzel bir kaynak olur.
 
ESP8266 elimde fazlaca bulunduğu ve Wi-Fi özelliği sayesinde ileride kablosuz projelerde kullanabileceğim için tercih ettim. Ancak ESP8266 sadece 3.3V ile çalıştığından, MCP2515 CAN modülüyle doğrudan haberleştirmekte sorun yaşadım. MCP2515 genellikle 5V ile çalıştığı ve sinyal seviyeleri de buna göre ayarlandığı için, doğrudan bağlantı kararsızlığa neden oldu. Bu problemi çözmek için MCP2515 ile ESP8266 arasındaki bağlantıya bir adet level shifter (seviye dönüştürücü) modül ekledim. Bu sayede iletişim sağladım. Böylece ESP8266 ile CAN bus haberleşmesini sorunsuz şekilde gerçekleştirdim.
 
Abi senden canbus tutorial bekliyoruz. Bizim için güzel bir kaynak olur.
çok tutorial hazırlayacak bir durum da yok aslında.

başlarda beni uğraştıran konu rs485 gibi sadece bir transreceiverdan paket gönderip skopta görmeyi beklemiştim ama karşıda senkron bir alıcı olmadığında bus üzerinde iletişim oluşmuyor bunun yerine çok çok kısa bir pulse gönderiyor tx yapan node. bu kısım kafa karıştırıcı. yani bir canbus denemesi yapılacaksa en az 2 node olmalı ve alıcı taraftaki nodun adres filtrelerinde gönderenin ID aralığı tanımlı olmalı.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
7,747
Mesajlar
128,881
Üyeler
3,124
Son üye
adnancoskun

Son kaynaklar

Son profil mesajları

Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Back
Top