Mục lục:
- Bước 1: Tài nguyên được sử dụng
- Bước 2: CÓ THỂ (Mạng vùng điều khiển)
- Bước 3: CÓ THỂ - Tính năng
- Bước 4: Mạch được sử dụng
- Bước 5: Điện áp đường truyền (Phát hiện sai lệch)
- Bước 6: Định dạng khung và tiêu chuẩn CAN
- Bước 7: Định dạng khung và tiêu chuẩn CAN
- Bước 8: Định dạng khung và tiêu chuẩn CAN
- Bước 9: Bốn loại khung (khung)
- Bước 10: Mạch - Chi tiết kết nối
- Bước 11: Mạch - Thu thập dữ liệu
- Bước 12: Mạch - Thu thập dữ liệu
- Bước 13: Mạch - Thu thập dữ liệu
- Bước 14: Thư viện Arduino - CÓ THỂ
- Bước 15: Github
- Bước 16: Mã nguồn máy phát
- Bước 17: Mã nguồn: Loop (), Gửi gói CAN 2.0 tiêu chuẩn
- Bước 18: Mã nguồn: Loop (), Gửi gói CAN 2.0 mở rộng
- Bước 19: Mã nguồn người nhận
- Bước 20: Mã nguồn: Loop (), Lấy gói và Kiểm tra Định dạng
- Bước 21: Nguồn: Loop (), Kiểm tra xem đó có phải là gói từ xa không
- Bước 22: Mã nguồn: Vòng lặp (), Độ dài dữ liệu được yêu cầu hoặc nhận
- Bước 23: Mã nguồn: Loop (), Nếu dữ liệu được nhận, nó sẽ in
- Bước 24: Tải xuống tệp
2025 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2025-01-23 15:15
Một chủ đề khác được những người theo dõi kênh YouTube của tôi đề xuất gần đây là giao thức CAN (Mạng vùng điều khiển), đây là điều chúng ta sẽ tập trung vào hôm nay. Điều quan trọng cần giải thích rằng CAN là một giao thức truyền thông nối tiếp đồng thời. Điều này có nghĩa là sự đồng bộ giữa các mô-đun được kết nối với mạng được thực hiện liên quan đến thời điểm bắt đầu của mỗi thông điệp được gửi đến bus. Chúng tôi sẽ bắt đầu bằng cách giới thiệu các khái niệm cơ bản của giao thức CAN và thực hiện lắp ráp đơn giản với hai ESP32.
Trong mạch của chúng tôi, các ESP có thể hoạt động như cả Master và Slave. Bạn có thể có nhiều bộ vi điều khiển truyền đồng thời, vì CAN tự động xử lý sự va chạm của mọi thứ. Mã nguồn của dự án này siêu đơn giản. Kiểm tra nó ra!
Bước 1: Tài nguyên được sử dụng
- Hai mô-đun của ESP WROOM 32 NodeMcu
- Hai bộ thu phát CAN từ WaveShare
- Jumper để kết nối
- Máy phân tích logic để nắm bắt
- Ba cáp USB cho ESP và máy phân tích
- 10 mét đôi xoắn để làm xe buýt
Bước 2: CÓ THỂ (Mạng vùng điều khiển)
- Nó được phát triển bởi Robert Bosch GmbH vào những năm 1980 để phục vụ ngành công nghiệp ô tô.
- Nó đã trở nên phổ biến trong những năm qua do tính mạnh mẽ và tính linh hoạt của việc thực hiện. Nó đang được sử dụng với thiết bị quân sự, máy móc nông nghiệp, tự động hóa công nghiệp và tòa nhà, người máy và thiết bị y tế.
Bước 3: CÓ THỂ - Tính năng
- Giao tiếp nối tiếp hai dây
- Tối đa 8 byte thông tin hữu ích cho mỗi khung hình, có thể phân mảnh
- Địa chỉ hướng đến tin nhắn chứ không phải đến nút
- Chỉ định mức độ ưu tiên cho các tin nhắn và chuyển tiếp các tin nhắn "tạm dừng"
- Khả năng phát hiện và báo hiệu lỗi hiệu quả
- Khả năng đa chủ (tất cả các nút có thể yêu cầu truy cập xe buýt)
- Khả năng đa hướng (một tin nhắn cho nhiều người nhận cùng một lúc)
- Tốc độ truyền lên đến 1Mbit / s trên bus 40 mét (giảm tốc độ khi tăng chiều dài thanh cái)
- Tính linh hoạt của cấu hình và giới thiệu các nút mới (lên đến 120 nút trên mỗi xe buýt)
- Phần cứng tiêu chuẩn, chi phí thấp và tính khả dụng tốt
- Giao thức được điều chỉnh: ISO 11898
Bước 4: Mạch được sử dụng
Ở đây, tôi có Máy thu phát. Mỗi bên có một cái và chúng được nối với nhau bằng một cặp dây. Một người chịu trách nhiệm gửi và người kia nhận dữ liệu.
Bước 5: Điện áp đường truyền (Phát hiện sai lệch)
Trong CAN, bit chiếm ưu thế là Zero.
Phát hiện sai lệch dòng làm giảm độ nhạy tiếng ồn (EFI)
Bước 6: Định dạng khung và tiêu chuẩn CAN
Định dạng tiêu chuẩn với số nhận dạng 11 bit
Bước 7: Định dạng khung và tiêu chuẩn CAN
Định dạng mở rộng với mã định danh 29-bit
Bước 8: Định dạng khung và tiêu chuẩn CAN
Điều quan trọng cần lưu ý là một giao thức đã tính toán CRC và gửi tín hiệu ACK và EOF, đây là những thứ đã được thực hiện bởi giao thức CAN. Điều này đảm bảo rằng tin nhắn được gửi sẽ không đến sai cách. Điều này là do nếu nó đưa ra một vấn đề trong CRC (Kiểm tra chu kỳ dự phòng hoặc Kiểm tra dự phòng), giống như một chữ số kiểm tra thông tin, nó sẽ được xác định bởi CRC.
Bước 9: Bốn loại khung (khung)
Điều quan trọng cần lưu ý là một giao thức đã tính toán CRC và gửi các tín hiệu ACK và EOF, là những thứ đã được thực hiện bởi giao thức CAN. Điều này đảm bảo rằng tin nhắn được gửi sẽ không đến sai cách. Điều này là do nếu nó đưa ra một vấn đề trong CRC (Kiểm tra chu kỳ dự phòng hoặc Kiểm tra dự phòng), giống như một chữ số kiểm tra thông tin, nó sẽ được xác định bởi CRC.
Bốn loại khung (khung)
Việc truyền và nhận dữ liệu trong CAN dựa trên bốn loại khung. Các loại khung sẽ được xác định bằng các biến thể trong các bit điều khiển hoặc thậm chí bằng các thay đổi trong quy tắc viết khung cho từng trường hợp.
- Khung dữ liệu: Chứa dữ liệu máy phát cho (các) máy thu
- Khung từ xa: Đây là yêu cầu dữ liệu từ một trong các nút
- Khung lỗi: Nó là một khung được gửi bởi bất kỳ nút nào khi xác định lỗi trong bus và có thể được phát hiện bởi tất cả các nút
- Khung quá tải: Phục vụ trì hoãn lưu lượng truy cập trên xe buýt do quá tải dữ liệu hoặc chậm trễ trên một hoặc nhiều nút.
Bước 10: Mạch - Chi tiết kết nối
Bước 11: Mạch - Thu thập dữ liệu
Bước sóng thu được cho CAN tiêu chuẩn với ID 11 bit
Bước 12: Mạch - Thu thập dữ liệu
Bước sóng thu được cho CAN mở rộng với ID 29-bit
Bước 13: Mạch - Thu thập dữ liệu
Dữ liệu do bộ phân tích logic thu được
Bước 14: Thư viện Arduino - CÓ THỂ
Tôi hiển thị ở đây hai tùy chọn nơi bạn có thể cài đặt Thư viện trình điều khiển CAN
Trình quản lý thư viện Arduino IDE
Bước 15: Github
github.com/sandeepmistry/arduino-CAN
Bước 16: Mã nguồn máy phát
Mã nguồn: Bao gồm và Thiết lập ()
Chúng tôi sẽ bao gồm thư viện CAN, bắt đầu nối tiếp để gỡ lỗi và bắt đầu bus CAN ở tốc độ 500 kbps.
#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inicia gỡ lỗi para nối tiếp while (! Serial); Serial.println ("Bộ truyền CAN"); // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja Possível iniciar o controlador while (1); }}
Bước 17: Mã nguồn: Loop (), Gửi gói CAN 2.0 tiêu chuẩn
Sử dụng tiêu chuẩn CAN 2.0, chúng tôi gửi một gói hàng. ID 11 bit xác định thông báo. Khối dữ liệu phải có tối đa 8 byte. Nó bắt đầu gói với ID 18 trong hệ thập lục phân. Nó đóng gói 5 byte và đóng hàm.
void loop () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bits e Idifica a mensagem (prioridade, evento) // o bloco de dados deve riduir até 8 byte Serial.println ("Enviando pacote …”); CAN.beginPacket (0x12); // id 18 em hexadecimal CAN.write ('h'); // 1º byte CAN.write ('e'); // byte 2º CAN.write ('l'); // byte 3º CAN.write ('l'); // byte 4º CAN.write ('o'); // byte 5º CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); chậm trễ (1000);
Bước 18: Mã nguồn: Loop (), Gửi gói CAN 2.0 mở rộng
Trong bước này, ID có 29 bit. Nó bắt đầu gửi 24 bit ID và một lần nữa, gói 5 byte và thoát.
// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e Idifica a mensagem (prioridade, evento) // o bloco de dados deve riduir até 8 byte Serial.println ("Enviando pacote estendido…"); CAN.beginExtendedPacket (0xabcdef); // id 11259375 decimal (abcdef em hexa) = 24 bit preenchidos até aqui CAN.write ('w'); // 1º byte CAN.write ('o'); // byte 2º CAN.write ('r'); // byte 3º CAN.write ('l'); // byte 4º CAN.write ('d'); // byte 5º CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); chậm trễ (1000); }
Bước 19: Mã nguồn người nhận
Mã nguồn: Bao gồm và Thiết lập ()
Một lần nữa, chúng tôi sẽ bao gồm thư viện CAN, bắt đầu nối tiếp để gỡ lỗi và bắt đầu bus CAN ở 500 kbps. Nếu xảy ra lỗi, lỗi này sẽ được in ra.
#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inicia gỡ lỗi para nối tiếp while (! Serial); Serial.println ("Bộ thu nhận CÓ THỂ"); // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja Possível iniciar o controlador while (1); }}
Bước 20: Mã nguồn: Loop (), Lấy gói và Kiểm tra Định dạng
Chúng tôi đã cố gắng kiểm tra kích thước của gói nhận được. Phương thức CAN.parsePacket () cho tôi biết kích thước của gói này. Vì vậy, nếu chúng tôi có một gói, chúng tôi sẽ kiểm tra xem gói đó có được gia hạn hay không.
void loop () {// Tenta Verificar o tamanho do acotevenuebido int packSize = CAN.parsePacket (); if (packetSize) {// Se temos um pacote Serial.println ("Recebido pacote."); if (CAN.packetExtended ()) {// verifyfica se o pacote é estendido Serial.println ("Estendido"); }
Bước 21: Nguồn: Loop (), Kiểm tra xem đó có phải là gói từ xa không
Tại đây, chúng tôi kiểm tra xem gói nhận được có phải là yêu cầu dữ liệu hay không. Trong trường hợp này, không có dữ liệu.
if (CAN.packetRtr ()) {// Verifica se o pacote é um pacote remoto (Requisição de dados), neste caso não há dados Serial.print ("RTR"); }
Bước 22: Mã nguồn: Vòng lặp (), Độ dài dữ liệu được yêu cầu hoặc nhận
Nếu gói nhận được là một yêu cầu, chúng tôi chỉ ra độ dài được yêu cầu. Sau đó, chúng tôi nhận được Mã độ dài dữ liệu (DLC), cho biết độ dài của dữ liệu. Cuối cùng, chúng tôi chỉ ra độ dài nhận được.
Serial.print ("Pacote com id 0x"); Serial.print (CAN.packetId (), HEX); if (CAN.packetRtr ()) {// se o pacote Reição, indicamos o comprimento solicitado Serial.print ("e requsitou o comprimento"); Serial.println (CAN.packetDlc ()); // obtem o DLC (Data Length Code, que indica o comprimento dos dados)} else {Serial.print ("e comprimento"); // aqui somente indica o comprimento Recbido Serial.println (packetSize);
Bước 23: Mã nguồn: Loop (), Nếu dữ liệu được nhận, nó sẽ in
Chúng tôi in (trên màn hình nối tiếp) dữ liệu, nhưng chỉ khi gói nhận được không phải là một yêu cầu.
// Imprime os dados somente se o pacote thubido não foi de yêu cầu trong khi (CAN.available ()) {Serial.print ((char) CAN.read ()); } Serial.println (); } Serial.println (); }}
Bước 24: Tải xuống tệp
NS
Đề xuất:
Đánh thức tôi - Đồng hồ báo thức thông minh: 6 bước
Wake Me Up - Đồng hồ báo thức thông minh: Hãy đánh thức tôi là một chiếc đồng hồ báo thức thông minh cũng có thể được sử dụng như một chiếc đèn thông minh. Đèn led tích hợp mô phỏng ánh sáng tự nhiên chiếu vào phòng của bạn. Điều này cho phép bạn bắt đầu ngày mới một cách bình tĩnh và tự nhiên. Đồng hồ báo thức cũng được trang bị segme 4 * 7
Làm thế nào tôi đã giúp pin của Netbook của tôi!: 4 bước
Tôi đã giúp pin của Netbook của mình như thế nào!: Tôi vừa khám phá ra phần mềm tuyệt vời này từ dấu phải cho phép pin của tôi kéo dài hơn mỗi lần sạc và cũng để netbook chạy mát hơn rất nhiều. netbook dell model 3147
Làm thế nào tôi sửa chữa máy tính xách tay chết của tôi trong hơn hai năm: 8 bước
Làm thế nào tôi sửa chữa máy tính xách tay chết của tôi trong hơn hai năm: Lưu ý ** vui lòng bỏ phiếu nếu bạn đánh giá cao dự án này, cảm ơn bạn Tôi biết nó đáng để sửa chữa và chia sẻ tất cả các sửa chữa
Màn hình Nextion - Giải thích về giao diện và giao thức với PIC và Arduino: 10 bước
Màn hình Nextion | Giải thích về giao diện và giao thức với PIC và Arduino: Nextion Display rất dễ sử dụng và giao diện dễ dàng với bộ điều khiển vi mô. sẽ hành động trên để hiển thị
Làm thế nào để tải nhạc từ trang web ALMOST BẤT KỲ (Haha) (Miễn là bạn có thể nghe được thì bạn có thể nhận được nó Được thôi nếu nó được nhúng vào Flash mà bạn có thể không có khả
Làm thế nào để tải nhạc từ trang web ALMOST BẤT KỲ (Haha) (Miễn là bạn có thể nghe nó thì bạn có thể nhận được nó … Được thôi nếu nó được nhúng vào Flash mà bạn có thể không có khả năng) EDITED !!!!! Thông tin bổ sung: nếu bạn đã từng truy cập vào một trang web và nó phát một bài hát mà bạn thích và muốn nó thì đây là hướng dẫn cho bạn, không phải lỗi của tôi nếu bạn làm hỏng thứ gì đó (chỉ có cách là nếu bạn bắt đầu xóa nội dung mà không có lý do ) tôi đã có thể tải nhạc cho