Bu uygulamamızda MCP2515 CANBUS modülünü Arduino UNO geliştirme kartıyla kullanacağız. CAN(Controlled Area Network), bir mikrodenetleyicin ve çevre birimlerinin bir ana cihaza veya bir bilgisayara ihtiyaç duymadan iletişim kurmasını sağlayan bir veri yolu standardıdır. MCP2515 CAN Veri Yolu Denetleyicisi, CAN Protokolü sürüm 2.0B’yi destekleyen ve 1 Mbps’de iletişim için kullanılabilen basit bir modüldür. Komple bir iletişim sistemi kurmak için iki CAN Bus Modülüne ihtiyacınız olacak. Robert Bosch GmbH tarafından geliştirilen CAN, bir kontrol ünitesi ile bileşenleri arasında iletişim için otomobillerde kullanılan başlıca protokoldür. Örneğin, Motor Kontrol Ünitesi bir otomobilde kullanılan büyük bir kontroldür. Bu ünite, hava akımı, basınç, sıcaklık, vana kontrolü, hava kontrolü için motorlar vb. gibi birçok sensöre ve aktüatöre bağlanmıştır. Bu modüller ve kontrol ünitesi arasındaki iletişim CAN Bus üzerindendir. Arduino kütüphanemizi buradan indirebiliriz.

Özellikler:

  • CAN 2.0B protokolünü destekler, haberleşme hızı 1Mb/s
  • Yüksek hızlı TJA1050 CAN transceiver entegresi kullanır
  • Genişletilebilir CAN arayüz için SPI bağlantısı
  • 8 MHz kristal osilatör
  • 120 Ω terminal direnci(opsiyonel)
  • Ölçüler : 40×28mm
  • Çalışma Sıcaklığı: 85 ℃ – 40 ℃

Pin Dizilimi:

  • VCC :5V güç girişi
  • GND : Ground
  • CS : SPI SLAVE select pin (Active low)(Dijital 9 numaralı pin)
  • SO : SPI master input slave output lead (MISO)
  • SI : SPI master output slave input lead (MOSI)
  • SCLK: SPI clock pin (SCLK)
  • INT: MCP2515 interrupt pin

Malzeme Listesi:

Devre Şeması:

Arduino Verici Kodu:

#include <mcp_can.h>
#include <SPI.h>
#define buton 8
#define SPI_CS_PIN 9
const int ledHIGH = 1;
const int ledLOW = 0;
unsigned char Led_Yak[8] = {ledHIGH, 1, 2, 3,4,5,6,7};
unsigned char Led_Sondur[8] = {ledLOW, 1, 2, 3,4,5,6,7};
MCP_CAN CAN(SPI_CS_PIN);
void setup()
{
Serial.begin(9600);
pinMode(buton, INPUT);
while (CAN_OK != CAN.begin(CAN_500KBPS))//can bus : baudrate = 500k
{
Serial.println("CAN BUS Shield Baslatma Hatası");
Serial.println("CAN BUS Shield Tekrar Baslatılıyor…");
delay(100);
}
Serial.println("CAN BUS Shield Baslatması Basarılı!");
}
void loop()
{
Serial.println("In loop"); // send data: id = 0x70, standard frame, data len = 8, stmp: data buf
int buton_1 = digitalRead(buton);
if (buton_1 == HIGH)
{
CAN.sendMsgBuf(0x70, 0, 8, Led_Yak);
}
else if (buton_1 == LOW)
{
CAN.sendMsgBuf(0x70, 0, 8, Led_Sondur);
}
delay(1000);
}

Arduino Alıcı Kodu:

#include <SPI.h>
#include <mcp_can.h>
#define SPI_CS_PIN 9
#define LED 8
MCP_CAN CAN(SPI_CS_PIN);
void setup()
{
Serial.begin(9600);
pinMode(LED,OUTPUT);
while (CAN_OK != CAN.begin(CAN_500KBPS)) //can bus : baudrate = 500k
{
Serial.println("CAN BUS Shield Baslatma Hatasi");
Serial.println("CAN BUS Shield Tekrar Baslatiliyor…");
delay(100);
}
Serial.println("CAN BUS Shield Baslatmasi Basarili!");
}
void loop()
{
unsigned char len = 0;
unsigned char buf[8]={0,0,0,0,0,0,0,0};
if(CAN_MSGAVAIL == CAN.checkReceive())
{
CAN.readMsgBuf(&len, buf);
unsigned long canId = CAN.getCanId();
Serial.println("—————————–");
Serial.print("Verici ID: 0x");
Serial.println(canId, HEX);
for(int i = 0; i<len; i++)
{
Serial.print(buf[i]);
Serial.print("\t");
digitalWrite(LED, buf[0]);
delay(100);
}
Serial.println();
}
}

6 YORUMLAR

  1. Merhabalar, arduinoyu hem alıcı hem verici olarak kullanmak istersek ne gibi değişiklikler yapmamız gerekir acaba?
    bilgi verebilir misiniz

    • Merhabalar,
      Arduino’yu hem alıcı hemde verici olarak kullanabilirsiniz. Burada yapmanız gereken alıcı da bulunan kodları verici’ye verici de bulunan kodları (alma-gönderme komutlarını) adapte etmek olacaktır.

  2. Merhaba projenizi uyguluyorum emeğinize sağlık fakat Led sürekli yanıp sönüyor benim istediğim butona basılı iken yansın değilken sönsümin. Yardımcı olmanız mümkün mü

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz