Mục lục:

Giao thức CAN - Có, Chúng tôi có thể !: 24 bước
Giao thức CAN - Có, Chúng tôi có thể !: 24 bước

Video: Giao thức CAN - Có, Chúng tôi có thể !: 24 bước

Video: Giao thức CAN - Có, Chúng tôi có thể !: 24 bước
Video: Lập Di Chúc Có Cần Chữ Ký Của Tất Cả Các Con Không? | LuatVietnam 2024, Tháng bảy
Anonim
Image
Image
Tài nguyên được sử dụng
Tài nguyên được sử dụng

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)

CAN (Mạng vùng điều khiển)
CAN (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

CÓ THỂ - Tính năng
CÓ THỂ - Tính năng
CÓ THỂ - Tính năng
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

Mạch đã sử dụng
Mạch đã 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)

Điện áp đường truyền (Phát hiện sai lệch)
Đ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 khung và tiêu chuẩn CAN
Đị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 khung và tiêu chuẩn CAN
Đị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)

Bốn loại khung (khung)
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

Mạch - Chi tiết về kết nối
Mạch - Chi tiết về kết nối

Bước 11: Mạch - Thu thập dữ liệu

Mạch - Thu thập dữ liệu
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

Mạch - Thu thập dữ liệu
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

Mạch - Thu thập dữ liệu
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Ể

Thư viện Arduino - CÓ THỂ
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
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

PDF

NS

Đề xuất: