在汽车和工业应用领域中,多个微控制器之间的可靠通信至关重要。控制器区域网络(CAN)BUS协议已成为可满足此类需求的强大解决方案。该博客文章深入研究了CAN BUS协议的基本原理,并演示了如何将MCP2515 CAN控制器与Arduino集成,从而使您的项目中无缝通信。
总线可以协议什么?
控制器区域网络(CAN)总线是强大的车辆总线标准,旨在允许微控制器和设备在没有主机计算机的情况下相互通信。 CAN BUS在1980年代由Bosch开发,已成为汽车系统的标准,但也广泛用于工业自动化和其他嵌入式系统。
CAN BUS协议的关键功能包括:
- 多主配置: 在没有中央控制器的情况下,多个节点可以在同一总线上通信。
- 消息优先级: 消息根据其标识符确定优先级,以确保首先传输关键数据。
- 错误检测: 强大的错误检测机制,包括CRC检查和确认位,可提高可靠性。
- 高速通信: 支持高达1 Mbps的数据速率,适用于实时应用。
这些功能使CAN BUS非常适合多个设备有效,可靠地通信的情况,例如在车辆发动机管理系统,工业自动化和机器人技术中。
引入MCP2515 CAN控制器
MCP2515是一个独立的控制器区域网络(CAN)控制器,该控制器通过串行外围接口(SPI)与微控制器接口。它处理复杂的CAN协议,使开发人员可以专注于高级应用程序逻辑。 MCP2515的主要功能包括:
- 支持标准和扩展可以帧。
- 内置错误处理和过滤机制。
- 与包括Arduino在内的各种微控制器的兼容性。
- 低功耗,使其适用于嵌入式系统。
通过将MCP2515与Arduino集成,您可以在项目中添加CAN Bus功能,从而与其他启用罐头的设备或网络进行通信。
用Arduino设置MCP2515
首先,您需要以下组件:
- Arduino董事会(例如Arduino Uno)
- MCP2515 CAN模块(通常带有TJA1050 CAN收发器)
- 跳线
- 面包板(可选)
这是使用您的Arduino设置MCP2515的分步指南:
1。将MCP2515接线到Arduino
将MCP2515模块连接到Arduino,如下所示:
- VCC 到 5V 在Arduino上
- gnd 到 gnd 在Arduino上
- CS 到 引脚10 在Arduino上
- SCK 到 引脚13 在Arduino上
- SI (Mosi)到 引脚11 在Arduino上
- 所以 (味o) 引脚12 在Arduino上
- int 到 引脚2 在Arduino上
Arduino MCP2515
------- -------
5V ------> VCC
GND ------> GND
Pin 10 ------> CS
Pin 13 ------> SCK
Pin 11 ------> SI (MOSI)
Pin 12 ------> SO (MISO)
Pin 2 ------> INT
2。安装所需的库
要与MCP2515通信,您将需要 MCP_CAN 图书馆。通过Arduino Library Manager安装它:
- 打开Arduino IDE。
- 导航到 草图>包括库>管理库...
- 搜索 MCP_CAN 并安装 MCP_CAN Cory J. Fowler的图书馆。
3。上传示例代码
这是使用MCP2515和Arduino发送和接收可以发送可以发送和接收消息的基本示例:
发送罐头消息
// Include the necessary libraries
#include
#include "mcp_can.h"
// Define the CS pin
#define CAN0_CS 10
// Initialize the CAN controller
MCP_CAN CAN0(CAN0_CS);
void setup() {
Serial.begin(115200);
while (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) != CAN_OK) {
Serial.println("CAN BUS Shield init fail");
Serial.println(" Init CAN BUS Shield again");
delay(100);
}
Serial.println("CAN BUS Shield init ok!");
CAN0.setMode(MCP_NORMAL);
}
void loop() {
byte data[] = {0x00, 0xFF, 0xAA, 0x55, 0x33, 0x66, 0x99, 0xCC};
// Send data: CAN ID = 0x100, data length = 8
if (CAN0.sendMsgBuf(0x100, 0, 8, data) == CAN_OK) {
Serial.println("Message Sent Successfully!");
} else {
Serial.println("Error Sending Message...");
}
delay(1000);
}
收到罐头消息
// Include the necessary libraries
#include
#include "mcp_can.h"
// Define the CS pin
#define CAN0_CS 10
// Initialize the CAN controller
MCP_CAN CAN0(CAN0_CS);
void setup() {
Serial.begin(115200);
while (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) != CAN_OK) {
Serial.println("CAN BUS Shield init fail");
Serial.println(" Init CAN BUS Shield again");
delay(100);
}
Serial.println("CAN BUS Shield init ok!");
CAN0.setMode(MCP_NORMAL);
}
void loop() {
unsigned long canId;
byte len = 0;
byte buf[8];
// Check if data has been received
if (CAN0.checkReceive() == CAN_MSGAVAIL) {
CAN0.readMsgBuf(&canId, &len, buf);
Serial.print("CAN ID: 0x");
Serial.println(canId, HEX);
Serial.print("Data: ");
for (int i = 0; i < len; i++) {
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println();
}
}
在发送草图中,Arduino传输带有ID的CAN消息 0x100
每一秒。接收草图会聆听传入的罐头消息,并将ID和数据打印到串行监视器上。
与Arduino一起使用CAN BUS的应用
与Arduino集成的CAN总线为超出汽车系统以外的许多应用程序打开了。一些受欢迎的用例包括:
- 机器人技术: 启用多个电机控制器和传感器之间的通信。
- 工业自动化: 促进不同机械和控制单元之间的数据交换。
- 家庭自动化: 在统一网络中连接各种智能设备。
- 数据采集系统: 从多个传感器收集和处理数据有效。
结论
CAN BUS协议具有其可靠性和效率,是在众多嵌入式系统中进行通信的骨干。通过使用Arduino使用MCP2515 CAN控制器,开发人员可以轻松地将CAN BUS功能整合到其项目中。无论您是从事汽车系统,工业自动化还是复杂的机器人技术,都可以理解和利用可以大大增强系统的通信框架。
通过提供的全面指南和示例,您有能力启动将CAN BUS集成到您的下一个Arduino项目中。愉快的编码!