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.
- İki adet arduino
- 2 adet MCP2515 CanBus modülü
- Erkek ve Dişi Kablo
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...
0 Yorumlar
Bizimle fikirlerinizi paylaşabilirsiniz.