CanBus MPC2515 Modülü Kullanımı ve Uygulanması

Bugün sizlerle birlikte Canbus modülünün kullanımını ve incelemesini yapacağız.Hepsinden önce Canbus nedir? Bunun hakkında konuşalım. Canbus  elektronik cihazların haberleşmesi için oluşturulmuş bir protokoldür.Bu protokol Bosch firması tarafından geliştirilmiştir.Canbus iki kısıma ayrılmaktadır. Canbus  2.0A ve 2.0B olarak ayrılmaktadır.Bunların arasındaki fark ise bitseldir. Can 2.0A 11 bit iken 2.0B ise 29 bittir. Canbus araçlarda bir standart haberleşme protokolü olarak belirlenmiştir.Araçlarda 2.0B türü kullanılmaktadır.Bu protokolün hataya uğrama ihtimali 1000 yılda birdir.Özellikle büyük kablo karmaşasından kurtulmamızı sağlamaktadır.Günümüz araçlarında  kullanılmaktadır.

Canbus'un çalışma mantığı şu şekildedir.Her bir modül belli bir id'ye sahiptir.Oluşturulan mesajlar bu id ile birlikte yollanmaktadır.Bu mesajların belirli bir önceliği vardır.Önceliklerine göre mesajlar iletilmektedir.Ani bir olay gerçekleştiyse ilk olarak bu mesaj iletilmektedir.Örnek verecek olursak araçta mesajlar Canbus ile iletilmektedir.Arabanın kaza anında airbaglerin açılması için bütün mesajlar durdulur.İlk olarak airbaglerin açılma mesajları iletilmektedir.Şimdi sıra geldi bu yapıyı nasıl kuracağız ve kodunu nasıl yazacağız?Bu yapıda kullanılacak modüller şu şekildedir:

  • İki adet arduino 
  • 2 adet MCP2515 CanBus modülü 
  • Erkek ve Dişi Kablo 
Bağlantıları arduino modülün spi haberleşme pinlerine takacağız ve daha sonrasında MCP2515 Canbus modülün Hıgh  çıkışını diğer Canbus modülün Hıgh kısmına baglayacagız.Low çıkışını Low çıkışına  baglayacagız.Daha sonra ise  Arduino programlama kısmına geçeceğiz.İlk önce yapmamız gereken linkdeki kütüphaneyi indirip  Arduino kütüphanemize eklememiz gerekmektedir.
Link...
Daha sonra iki adet kod yazmamız gerekmektedir.Bunlardan birisi gönderici tarafına yazacağız. Diğer kısmına ise alıcı tarafında yazacağız.Kodlar aşağıda yer almaktadır.

Yollayıcı Kodu


#include <math.h>
#include <mcp_can.h>
#include <SPI.h>

int deger=A6;
int eleman=13;
int ledPin = 13;
int EP =6;

const int SPI_CS_PIN = 53;
long unsigned int txID = 0x1881BAFA;
long unsigned int ID1=0x188BBABA;
long unsigned int ID2=0x18BEBABA;

 //Bu id yapısı 29 biti desteklemektedir. Basamaklar birden buyuk degildir.

unsigned char stmp[8];
unsigned char stmp1[8];
unsigned char stmp2[8];

int kontrol;
//MCP olusturuldu ve deger olarak SCk degeri girildi.SCK degeri 53 olarak belirlenmistir.
MCP_CAN CAN(SPI_CS_PIN);
int sensorpin=A1;
int sensor2pin=A2;


long TP_init(){
  delay(10);
  long measurement=pulseIn (EP, HIGH);  //Oynaması beklenmekterdi
  
  return measurement; 
}

double termometre(int gelen_deger) {
  double Temperature;
  Temperature = log(10000.0*((1024.0/gelen_deger-1))); 
  Temperature = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temperature * Temperature ))* Temperature );
  Temperature = 272.15-Temperature;            // Kelvin Celceusa cevirmek için kullanmaktayız.
   //Temp = (Temp * 9.0)/ 5.0 + 32.0; //Fahreneytı dereceye cevirmek için kullanmkatayız.
   return Temperature;
   
}
int  ldrIsik(){
  
  return analogRead(deger);
}


void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
  pinMode(EP, INPUT);
  pinMode(eleman,OUTPUT);
    while (CAN_OK != CAN.begin(CAN_250KBPS))              // Can ok ise 250Kps ile veri yollanılmaktadır.
    {
         Serial.println("Can Bus cevap vermeyi kesti");
        Serial.println("Tekrardan Baglantı Kurulmaya Calisiliyor...");
        delay(400);  
    }
    Serial.println("Can Bus ile baglanti kuruldu");
}

void loop() {
long measurement =TP_init();
int titret=(int)measurement;
Serial.print("Titresim ");
Serial.println(titret);

int readVal=analogRead(sensorpin);
int  temp =  (int)termometre(readVal);
Serial.println("Sicaklik ");
Serial.println(temp);

int ldr_isik=ldrIsik();
Serial.print("LDR isik ");
Serial.println(ldr_isik);

String isik_deger=String(ldr_isik,HEX);
String sicaklik_deger=String(temp,HEX);
String titret_deger=String(titret,HEX);

  sicaklik_deger.toCharArray(stmp,8);
  CAN.sendMsgBuf(txID,1,8,stmp);
  
  titret_deger.toCharArray(stmp1,8);
  CAN.sendMsgBuf(ID1,1,8,stmp1);

  isik_deger.toCharArray(stmp2,8);
  CAN.sendMsgBuf(ID2,1,8,stmp2);

Serial.println();
delay(100);
}


Alıcı Kodu


// 1st CAN Network - CAN RECEIVE

#include <SPI.h>
#include <mcp_can.h>
#include <Wire.h>

long unsigned int rxId;

unsigned long rcvTime;

unsigned char len = 0;
unsigned char buf[8];


const int SPI_CS_PIN = 10;


MCP_CAN CAN(SPI_CS_PIN);                                    //CS pinini ayarlamaktayız.

void setup()
{
    Serial.begin(115200);
    Wire.begin(9600);
    pinMode(3,OUTPUT);
    while (CAN_OK != CAN.begin(CAN_250KBPS))              // Baund hızını 500 olarak belirledik
    {
        Serial.println("Canbus da hata oluştu.");
        Serial.println("Tekrardan baglanılmaya calısılıyor....");
        delay(500);
    }    
    Serial.println("Can Bus Modulu Baslatılıyor!!!!");
    Serial.println("Time\t\tPGN\t\tByte0\tByte1\tByte2\tByte3\tByte4\tByte5\tByte6\tByte7"); 
    digitalWrite(3,LOW);   
}


void loop()
{
    
    if(CAN_MSGAVAIL == CAN.checkReceive())            // Verilerin gelip gelmediği kontrol edilmektedir.
    {
        rcvTime = millis();
        CAN.readMsgBuf(&len, buf);    // veriler okunamktadır.Len verinin uzunlugudur.Veri is e buf degeridir.

        rxId= CAN.getCanId();

        Serial.print(rcvTime);
        Serial.print("\t\t");
        Serial.print("0x");
        Serial.print(rxId, HEX);
        Serial.print("\t");

        for(int i = 0; i<len; i++)    // Veri yazılmakrtadır....
        {
            if(buf[i] > 15){
            Serial.print("0x");
              Serial.print(buf[i], HEX);    
            }
            
          else{
              Serial.print("0x0");
              Serial.print(buf[i], HEX);
          } 
            
            Serial.print("\t");
         
          
        }
         int  decimal_answer = (int)strtol(buf, NULL, 16);
        Serial.println();
    }
      
}


Daha fazla bilgi için takipte kalmayı ve youtube kanalımıza abone olmayı unutmayınız...
CanBus MPC2515 Modülü Kullanımı ve Uygulanması

Yorum Gönder

0 Yorumlar