Arduino и MCP2515: принцип работы, подключение, схема, код
CAN (Controlled Area Network) – это стандарт шины, который позволяет микроконтроллеру и его периферийным устройствам обмениваться данными без необходимости использования хост-устройства или компьютера. Протокол CAN, разработанный Robert Bosch GmbH, в основном используется в автомобилях для связи между блоком управления и его компонентами.

Например, блок управления двигателем является основным средством управления, используемым в автомобиле. Этот блок подключен ко многим датчикам и исполнительным механизмам, таким как механизмы контроля потока воздуха, давления, температуры, управления клапанами, двигатели для контроля воздуха и т. д. Связь между этими модулями и блоком управления осуществляется через шину CAN. В этом проекте мы узнаем о модуле контроллера CAN MCP2515, о том, как связать контроллер шины CAN MCP2515 с Arduino, и, наконец, о том, как обеспечить связь между двумя платами Arduino с помощью двух контроллеров CAN MCP2515 и самого протокола CAN.
Модуль MCP2515
Контроллер шины CAN MCP2515 – это простой модуль, который поддерживает протокол CAN версии 2.0B и может использоваться для связи со скоростью 1 Мбит/с. Для того, чтобы настроить полную систему связи, вам потребуется два модуля шины CAN. Модуль, используемый в проекте, показан на рисунке ниже.

Этот конкретный модуль основан на ИС контроллера CAN MCP2515 и ИС приемопередатчика TJA1050. Микросхема MCP2515 представляет собой автономный контроллер CAN и имеет встроенный интерфейс SPI для связи с микроконтроллерами. Что касается микросхемы TJA1050, она действует как интерфейс между ИС контроллера MCP2515 и физической шиной CAN.
MCP2515 – это основной контроллер, который состоит из трех основных подкомпонентов: модуля CAN, логики управления и блока SPI. Модуль CAN отвечает за передачу и прием сообщений на шине CAN. Логика управления управляет настройкой и работой MCP2515, взаимодействуя со всеми блоками. Блок SPI отвечает за интерфейс связи SPI.
На следующем рисунке показана схема CAN-модуля MCP2515, а также показано, как микросхема MCP2515 и TJA1050 подключены к модулю.

Схема подключения Arduino и MCP2515
На следующем рисунке показана принципиальная схема подключения модуля CAN MCP2515 с Arduino и связь между двумя Arduino по протоколу CAN.

Код программы для взаимодействия Arduino и MCP2515
Прежде чем углубляться в код, вам необходимо скачать библиотеку для модуля MCP2515. Есть много библиотек, но здесь мы использовали эту: https://github.com/Seeed-Studio/CAN_BUS_Shield. Загрузите ее и поместите извлеченное содержимое в каталог библиотек Arduino. Поскольку сеть CAN включает в себя модуль передатчика и модуль приемника, код также делится на код передатчика и код приемника.
Код передатчика CAN
#include <SPI.h>
#include <mcp_can.h>
const int spiCSPin = 10;
int ledHIGH = 1;
int ledLOW = 0;
MCP_CAN CAN(spiCSPin);
void setup()
{
Serial.begin(115200);
while (CAN_OK != CAN.begin(CAN_500KBPS))
{
Serial.println("CAN BUS init Failed");
delay(100);
}
Serial.println("CAN BUS Shield Init OK!");
}
unsigned char stmp[8] = {ledHIGH, 1, 2, 3, ledLOW, 5, 6, 7};
void loop()
{
Serial.println("In loop");
CAN.sendMsgBuf(0x43, 0, 8, stmp);
delay(1000);
}
Код приемника CAN
#include <SPI.h>
#include "mcp_can.h"
const int spiCSPin = 10;
const int ledPin = 2;
boolean ledON = 1;
MCP_CAN CAN(spiCSPin);
void setup()
{
Serial.begin(115200);
pinMode(ledPin,OUTPUT);
while (CAN_OK != CAN.begin(CAN_500KBPS))
{
Serial.println("CAN BUS Init Failed");
delay(100);
}
Serial.println("CAN BUS Init OK!");
}
void loop()
{
unsigned char len = 0;
unsigned char buf[8];
if(CAN_MSGAVAIL == CAN.checkReceive())
{
CAN.readMsgBuf(&len, buf);
unsigned long canId = CAN.getCanId();
Serial.println("-----------------------------");
Serial.print("Data from ID: 0x");
Serial.println(canId, HEX);
for(int i = 0; i<len; i++)
{
Serial.print(buf[i]);
Serial.print("\t");
if(ledON && i==0)
{
digitalWrite(ledPin, buf[i]);
ledON = 0;
delay(500);
}
else if((!(ledON)) && i==4)
{
digitalWrite(ledPin, buf[i]);
ledON = 1;
}
}
Serial.println();
}
}
Работа этого проекта очень проста, так как вся работа выполняется библиотеками (SPI и CAN). Поскольку CAN является связью на основе сообщений, вам необходимо отправить сообщение в диапазоне от 0 до 8 байтов.

В этом проекте передатчик отправляет сообщение 1 1 2 3 0 5 6 7. Это сообщение передается по шине CAN, и получатель получает это сообщение, что отображается на его последовательном мониторе. Кроме того, 0-й и 4-й биты, то есть 1 и 0 в вышеуказанной последовательности, извлекаются приемником отдельно и включают и выключают светодиод, подключенный к контакту 2 платы Arduino.
© digitrode.ru