پروتکل ارتباطی CAN یکی از قویترین پروتکل های ارتباطی است که به صورت گسترده ای در صنایع و همچنین ECU ماشین ها به کار گرفته می شود . در ارتباط CAN تنها از دو سیم جهت انتقال دیتا استفاده می شود ، به همین سبب هزینه پیاده سازی آن بسیار پایین تر از سایر پروتکل ها است . در بسیاری از میکروکنترلر ها واحد های سخت افزاری جهت ارتباط CAN وجود ندارد . ماژول MCP2515 یک مبدل SPI به CAN و بلعکس است که این قابلیت را دارد تا از میکروکنترلر های فاقد واحد CAN ، جهت ارتباط با باس های CAN استفاده نمود . به راحتی توسط این ماژول می توان از طریق میکروکنترلر ها با انواع ECU خودرو و همچنین کامپیوتر های صنعتی ارتباط برقرار کرد . این ماژول دارای پین هدر هایی جهت اتصال تغذیه و میکروکنترلر و نیز دارای ترمینال خروجی CAN است .
مشخصات :
- مبدل 0B یه SPI و برعکس
- دارای نرخ انتقال تا حداکثر 1Mbps
- دارای پین هدر های تغذیه و SPI
- دارای ترمینال اتصال به باس CAN
- دارای تغذیه 5 ولتی
از این ماژول می توان در کاربرد های زیر استفاده نمود :
- ECU خودرو ها
- ارتباط CAN توسط میکروکنترلر ها
- تجهیزات نظامی
- تجهیزات صنعتی
- تجهیزات ارتباط با سیم با فاصله زیاد
- خانه های هوشمند
پین های ماژول MCP2515 :
راه اندازی ماژول MCP2515 توسط آردوینو :
در مثال زیر با استفاده از کتابخانه ACAN2515 بین دو ماژول MCP2515 دیتا به صورت CAN انتقال و نتایج در Serial Monitor آردوینو IDE نمایش داده می شود .
کد های مدار فرستنده دیتا :
#include <SPI.h> //Library for using SPI Communication
#include <mcp2515.h> //Library for using CAN Communication
#include <DHT.h> //Library for using DHT sensor
#define DHTPIN A0
#define DHTTYPE DHT11
struct can_frame canMsg;
MCP2515 mcp2515(10);
DHT dht(DHTPIN, DHTTYPE); //initialize object dht for class DHT with DHT pin with STM32 and DHT type as DHT11
void setup(){
while (!Serial);
Serial.begin(9600);
SPI.begin(); //Begins SPI communication
dht.begin(); //Begins to read temperature & humidity sensor value
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz
mcp2515.setNormalMode();
}
void loop(){
int h = dht.readHumidity(); //Gets Humidity value
int t = dht.readTemperature(); //Gets Temperature value
canMsg.can_id = 0x036; //CAN id as 0x036
canMsg.can_dlc = 8; //CAN data length as 8
canMsg.data[0] = h; //Update humidity value in [0]
canMsg.data[1] = t; //Update temperature value in [1]
canMsg.data[2] = 0x00; //Rest all with 0
canMsg.data[3] = 0x00;
canMsg.data[4] = 0x00;
canMsg.data[5] = 0x00;
canMsg.data[6] = 0x00;
canMsg.data[7] = 0x00;
mcp2515.sendMessage(&canMsg); //Sends the CAN message
delay(1000);
}
کد های مدار گیرنده :
#include <SPI.h> //Library for using SPI Communication
#include <mcp2515.h> //Library for using CAN Communication
struct can_frame canMsg;
MCP2515 mcp2515(10); // SPI CS Pin 10
void setup() {
SPI.begin(); //Begins SPI communication
Serial.begin(9600); //Begins Serial Communication at 9600 baud rate
mcp2515.reset();
mcp2515.setBitrate(CAN_50KBPS,MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz
mcp2515.setNormalMode(); //Sets CAN at normal mode
}
void loop(){
if ((mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) && (canMsg.can_id == 0x036)){
int x = canMsg.data[0];
int y = canMsg.data[1];
Serial.print("Kelembaban: ");
Serial.print(x);
Serial.print(" Suhu: ");
Serial.println(y);
}
}


