Cách xây dựng xe buýt CAN với Breadboard và Arduino
Bus Mạng Khu vực Bộ điều khiển (CAN) là một giao thức truyền thông mạnh mẽ và đáng tin cậy được sử dụng rộng rãi trong nhiều ứng dụng công nghiệp, ô tô và hàng không vũ trụ. Nó được thiết kế để truyền dữ liệu giữa các bộ vi điều khiển và thiết bị qua mạng CAN bus. Có thể bạn chưa biết điều này, nhưng đó là thứ đằng sau những bản mod bảng điều khiển ô tô điên rồ mà bạn thấy trên mạng xã hội.
Chúng tôi sẽ hướng dẫn bạn cách xây dựng bus CAN với mô-đun MCP2515 CAN bằng Arduino và breadboard. Chúng ta cũng sẽ xem qua thư viện Arduino CAN và trình bày cách gửi và nhận dữ liệu qua bus CAN.
Mục Lục
Xe buýt CAN là gì?
Bus CAN là một giao thức truyền thông nối tiếp được Bosch phát triển vào những năm 1980. Nó được sử dụng rộng rãi trong các ứng dụng khác nhau vì độ tin cậy và độ bền cao. Nó cho phép truyền dữ liệu giữa các thiết bị ở tốc độ cao với độ trễ tối thiểu chỉ qua hai đường: CAN Cao và CAN Thấp.
Năm 1994, CAN bus đã trở thành một tiêu chuẩn quốc tế (ISO 11898) được thiết kế đặc biệt để trao đổi dữ liệu nối tiếp nhanh chóng giữa các bộ điều khiển điện tử trong các ứng dụng ô tô. Hãy xem hướng dẫn toàn diện của chúng tôi về xe buýt CAN là gì và vai trò của nó trong các hệ thống ô tô để biết thêm chi tiết.
Một trong những lý do khiến CAN bus trở nên phổ biến là do các tính năng phát hiện và sửa lỗi của nó. Giao thức có thể phát hiện và sửa lỗi trong quá trình truyền dữ liệu. Điều này làm cho nó trở nên lý tưởng cho các ứng dụng mà tính toàn vẹn của dữ liệu là rất quan trọng, chẳng hạn như trong tự động hóa công nghiệp.
Biết Mô-đun CAN MCP2515
Mô-đun Bộ điều khiển Bus CAN MCP2515 là một thiết bị cung cấp hỗ trợ đặc biệt cho Giao thức CAN phiên bản 2.0B được sử dụng rộng rãi. Mô-đun này lý tưởng cho việc liên lạc ở tốc độ dữ liệu cao lên tới 1Mbps.
IC MCP2515 là bộ điều khiển CAN độc lập với Giao diện SPI cho phép giao tiếp với nhiều loại vi điều khiển. Mặt khác, IC TJA1050 hoạt động như một giao diện giữa IC điều khiển CAN MCP2515 và bus CAN vật lý.
Để thuận tiện hơn, có một nút nhảy cho phép bạn gắn đầu cuối 120 ohm, giúp việc kết nối dây của bạn với thiết bị trở nên dễ dàng hơn. CAN_H & TÔI CÓ THỂ vít để giao tiếp với các mô-đun CAN khác.
Tính năng |
Sự chỉ rõ |
---|---|
máy thu phát |
TJA1050 |
giao diện vi điều khiển |
SPI (cho phép tích hợp xe buýt Multi CAN) |
Dao động tinh thể |
8MHz |
chấm dứt |
120Ω |
Tốc độ |
1Mbps |
Sự tiêu thụ năng lượng |
Hoạt động ở chế độ chờ hiện tại thấp |
Kích thước |
40x28mm |
Công suất nút |
Hỗ trợ tối đa 112 nút |
Bạn có thể nhận thêm thông tin từ biểu dữ liệu MCP2515 trong trường hợp bạn cần mô-đun này cho một dự án nâng cao hơn.
Cấu trúc tin nhắn CAN
Cấu trúc thông báo CAN bao gồm nhiều phân đoạn, nhưng phân đoạn quan trọng nhất đối với dự án này là mã định danh và dữ liệu. Số nhận dạng, còn được gọi là CAN ID hoặc Số nhóm tham số (PGN), xác định các thiết bị trên mạng CAN và độ dài của số nhận dạng có thể là 11 hoặc 29 bit, tùy thuộc vào loại giao thức CAN được sử dụng.
Trong khi đó, dữ liệu đại diện cho dữ liệu điều khiển/cảm biến thực tế được truyền đi. Dữ liệu có thể dài từ 0 đến 8 byte và Mã độ dài dữ liệu (DLC) cho biết số lượng byte dữ liệu hiện có.
Thư viện Bus Arduino MCP2515 CAN
Thư viện này thực hiện các CÓ THỂ V2.0B giao thức, có thể hoạt động ở tốc độ lên đến 1Mbps. Nó cung cấp một giao diện SPI có thể hoạt động ở tốc độ lên đến 10MHz đồng thời hỗ trợ cả dữ liệu tiêu chuẩn (11-bit) và dữ liệu mở rộng (29-bit). Hơn nữa, nó đi kèm với hai bộ đệm nhận, cho phép lưu trữ tin nhắn ưu tiên.
Đang khởi tạo CAN Bus
Đây là mã thiết lập mà bạn sẽ cần để khởi tạo bus CAN:
#include <SPI.h>
#include <mcp2515.h>MCP2515 mcp2515(10);
void setup() {
while (!Serial);
Serial.begin(9600);
SPI.begin();
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}
Thao tác này khởi tạo MCP2515 với tốc độ bit CAN là 500Kbps và tần số bộ dao động là 8MHz.
MCP2515 CÓ THỂ Chế Độ Hoạt Động
Có ba chế độ hoạt động được sử dụng với bộ điều khiển MCP2515 CAN bus:
- setNormalMode(): đặt bộ điều khiển để gửi và nhận tin nhắn.
- setLoopbackMode(): đặt bộ điều khiển gửi và nhận tin nhắn, nhưng tin nhắn mà nó gửi cũng sẽ được chính nó nhận.
- setListenOnlyMode(): đặt bộ điều khiển chỉ nhận tin nhắn.
Đây là các lệnh gọi chức năng được sử dụng để đặt chế độ hoạt động của bộ điều khiển bus MCP2515 CAN.
mcp2515.setNormalMode();
mcp2515.setLoopbackMode();
mcp2515.setListenOnlyMode();
Gửi dữ liệu qua CAN Bus
Để gửi tin nhắn qua bus CAN, hãy sử dụng gửiMsgBuf() phương pháp:
unsigned char data[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, data);
Điều này sẽ gửi một tin nhắn với ID 0x01 và tải trọng dữ liệu của {0x01, 0x02, 0x03, 0x04}. Tham số đầu tiên là CAN ID, tham số thứ hai là mức độ ưu tiên của tin nhắn, tham số thứ ba là độ dài của tải trọng dữ liệu và tham số thứ tư là chính tải trọng dữ liệu.
Các gửiMsgBuf() phương thức trả về một giá trị cho biết tin nhắn đã được gửi thành công hay chưa. Bạn có thể kiểm tra giá trị này bằng cách gọi checkError() phương pháp:
if (CAN.checkError()) {
Serial.println("Error sending message.");
}
Thao tác này sẽ kiểm tra xem có lỗi xảy ra trong quá trình truyền tin nhắn hay không và in thông báo lỗi nếu cần.
Nhận dữ liệu từ CAN Bus
Để nhận tin nhắn qua bus CAN, bạn có thể sử dụng readMsgBuf() phương pháp:
unsigned char len = 0;
unsigned char buf[8];
unsigned char canID = 0;if (CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId();
}
Điều này kiểm tra xem có tin nhắn nào trên bus CAN hay không và sau đó đọc tin nhắn vào buf mảng. Độ dài của tin nhắn được lưu trữ trong len biến và ID của tin nhắn được lưu trữ trong canID Biến đổi.
Sau khi nhận được tin nhắn, bạn có thể xử lý tải trọng dữ liệu nếu cần. Ví dụ: bạn có thể in tải trọng dữ liệu lên màn hình nối tiếp:
Serial.print("Received message with ID ");
Serial.print(canID, HEX);
Serial.print(" and data: ");for (int i = 0; i < len; i++) {
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println();
Thao tác này sẽ in ID của tin nhắn đã nhận và tải trọng dữ liệu tới màn hình nối tiếp.
Cách kết nối Bộ thu phát CAN Bus với Breadboard
Để xây dựng một bus CAN để kết nối hai thiết bị trong dự án ví dụ này, bạn sẽ cần:
- Hai bộ vi điều khiển (hai bảng Arduino Nano cho ví dụ này)
- Hai mô-đun MCP2515 CAN
- một breadboard
- dây nhảy
- Mô-đun màn hình LCD I2C 16×2
- Cảm biến siêu âm HC-SR04
Đối với ví dụ dự án này, bốn thư viện được sử dụng trong bản phác thảo Arduino. Có thư viện NewPing, cung cấp giao diện dễ sử dụng cho cảm biến Siêu âm, cũng như thư viện SPI, tạo điều kiện giao tiếp giữa bo mạch Arduino và bộ điều khiển bus MCP2515 CAN. Thư viện LiquidCstall_I2C được sử dụng cho mô-đun hiển thị.
Cuối cùng, có thư viện mcp2515 để giao tiếp với chip MCP2515, cho phép chúng ta dễ dàng truyền dữ liệu qua mạng CAN bus.
Cài đặt phần cứng (Ví dụ HC-SR04)
Trong dự án này sử dụng cảm biến HC-SR04 và màn hình LCD, một bo mạch Arduino Nano sẽ đóng vai trò là bộ thu, trong khi Arduino kia sẽ đóng vai trò là bộ gửi. Kết nối các thành phần người gửi của bạn theo sơ đồ nối dây bên dưới:
Đây là sơ đồ cho mạch thu:
Cuối cùng, kết nối hai nút với nhau bằng cách sử dụng CAN_H Và TÔI CÓ THỂ các dòng như hình vẽ:
Khi kết nối các mô-đun, điều quan trọng là phải đảm bảo rằng điện áp nguồn nằm trong phạm vi quy định và THỂ H Và TÔI CÓ THỂ chân được kết nối đúng với xe buýt.
Lập trình Mô-đun MCP2515 CAN Bus
Lưu ý rằng khi lập trình mô-đun MCP2515, điều quan trọng là sử dụng tốc độ bit chính xác để đảm bảo liên lạc thành công với các thiết bị CAN khác trên mạng.
Mã người gửi:
#include <MCP2515.h>
#include <SPI.h>
#include <NewPing.h>MCP2515 mcp2515(10);
const byte trigPin = 3;
const byte echoPin = 4;
NewPing sonar(trigPin, echoPin, 200);
struct can_frame canMsg;
void setup() {
Serial.begin(9600);
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}
void loop() {
unsigned int distance = sonar.ping_cm();
canMsg.can_id = 0x036;
canMsg.can_dlc = 8;
canMsg.data[0] = distance;
canMsg.data[1] = 0x00;
canMsg.data[2] = 0x00;
canMsg.data[3] = 0x00;
canMsg.data[4] = 0x00;
canMsg.data[5] = 0x00;
canMsg.data[6] = 0x00;
canMsg.data[7] = 0x00;
mcp2515.sendMessage(&canMsg);
delay(100);
}
Mã người nhận:
#include <mcp2515.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>MCP2515 mcp2515(10);
LiquidCrystal_I2C lcd(0x27,16,2);
struct can_frame canMsg;
void setup() {
Serial.begin(9600);
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("MUO CAN TUTORIAL");
delay(3000);
lcd.clear();
}
void loop() {
if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK)
{
int distance = canMsg.data[0];
lcd.setCursor(0,0);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print("cm ");
}
}
Đưa các dự án Arduino của bạn lên một tầm cao mới
Sự kết hợp giữa CAN bus và Arduino cung cấp một nền tảng mạnh mẽ để xây dựng hoặc học các mạng truyền thông tinh vi được sử dụng trong các ứng dụng khác nhau. Mặc dù nó có vẻ là một đường cong học tập dốc, nhưng việc thiết lập của riêng bạn trên bảng mạch bánh mì là một cách khá tiện dụng để tìm hiểu về cách sử dụng mạng xe buýt CAN trong các dự án DIY phức tạp.