สารบัญ:

โปรโตคอล CAN - ใช่ เราทำได้!: 24 ขั้นตอน
โปรโตคอล CAN - ใช่ เราทำได้!: 24 ขั้นตอน

วีดีโอ: โปรโตคอล CAN - ใช่ เราทำได้!: 24 ขั้นตอน

วีดีโอ: โปรโตคอล CAN - ใช่ เราทำได้!: 24 ขั้นตอน
วีดีโอ: 6 สิ่งที่มือใหม่ในการออกกำลังกายมักทำผิดพลาด 2024, กรกฎาคม
Anonim
Image
Image
ทรัพยากรที่ใช้
ทรัพยากรที่ใช้

อีกเรื่องที่ผู้ติดตามช่อง YouTube ของฉันแนะนำเมื่อเร็วๆ นี้คือโปรโตคอล CAN (Controller Area Network) ซึ่งเป็นสิ่งที่เราจะมุ่งเน้นในวันนี้ สิ่งสำคัญคือต้องอธิบายว่า CAN เป็นโปรโตคอลการสื่อสารแบบอนุกรมพร้อมกัน ซึ่งหมายความว่ามีการซิงโครไนซ์ระหว่างโมดูลที่เชื่อมต่อกับเครือข่ายโดยสัมพันธ์กับจุดเริ่มต้นของแต่ละข้อความที่ส่งไปยังบัส เราจะเริ่มต้นด้วยการแนะนำแนวคิดพื้นฐานของโปรโตคอล CAN และทำการประกอบอย่างง่ายด้วย ESP32 สองตัว

ในวงจรของเรา ESP สามารถทำหน้าที่เป็นทั้ง Master และ Slave คุณสามารถส่งไมโครคอนโทรลเลอร์หลายตัวพร้อมกันได้ เนื่องจาก CAN จะจัดการกับการชนกันของทุกสิ่งโดยอัตโนมัติ ซอร์สโค้ดของโครงการนี้ง่ายมาก ตรวจสอบออก!

ขั้นตอนที่ 1: ทรัพยากรที่ใช้

  • สองโมดูลของ ESP WROOM 32 NodeMcu
  • ตัวรับส่งสัญญาณ CAN สองตัวจาก WaveShare
  • จัมเปอร์สำหรับการเชื่อมต่อ
  • เครื่องวิเคราะห์ลอจิกสำหรับการจับภาพ
  • สาย USB สามเส้นสำหรับ ESP และตัววิเคราะห์
  • บิดคู่ 10 เมตร ทำหน้าที่รถบัส

ขั้นตอนที่ 2: CAN (เครือข่ายพื้นที่ควบคุม)

CAN (เครือข่ายพื้นที่ควบคุม)
CAN (เครือข่ายพื้นที่ควบคุม)
  • ได้รับการพัฒนาโดย Robert Bosch GmbH ในปี 1980 เพื่อรองรับอุตสาหกรรมยานยนต์
  • มีการแพร่หลายในช่วงหลายปีที่ผ่านมาเนื่องจากความแข็งแกร่งและความยืดหยุ่นในการใช้งาน ใช้กับอุปกรณ์ทางทหาร เครื่องจักรกลการเกษตร ระบบอัตโนมัติทางอุตสาหกรรมและในอาคาร หุ่นยนต์ และอุปกรณ์ทางการแพทย์

ขั้นตอนที่ 3: CAN - คุณสมบัติ

สามารถ - คุณสมบัติ
สามารถ - คุณสมบัติ
สามารถ - คุณสมบัติ
สามารถ - คุณสมบัติ
  • การสื่อสารแบบอนุกรมสองสาย
  • ข้อมูลที่เป็นประโยชน์สูงสุด 8 ไบต์ต่อเฟรม โดยสามารถแตกแฟรกเมนต์ได้
  • ที่อยู่ที่ส่งไปยังข้อความไม่ใช่ไปยังโหนด
  • การกำหนดลำดับความสำคัญให้กับข้อความและการส่งต่อข้อความ "ถูกระงับ"
  • ความสามารถในการตรวจจับและส่งสัญญาณผิดพลาดอย่างมีประสิทธิภาพ
  • ความสามารถแบบมัลติมาสเตอร์ (ทุกโหนดสามารถร้องขอการเข้าถึงบัสได้)
  • ความสามารถ Multicast (หนึ่งข้อความสำหรับผู้รับหลายคนพร้อมกัน)
  • อัตราการถ่ายโอนสูงถึง 1Mbit / s บนบัส 40 เมตร (ลดอัตราตามความยาวของบัสบาร์ที่เพิ่มขึ้น)
  • ความยืดหยุ่นของการกำหนดค่าและการแนะนำโหนดใหม่ (สูงสุด 120 โหนดต่อบัส)
  • ฮาร์ดแวร์มาตรฐาน ราคาประหยัด และความพร้อมใช้งานที่ดี
  • โปรโตคอลที่มีการควบคุม: ISO 11898

ขั้นตอนที่ 4: วงจรที่ใช้

วงจรที่ใช้
วงจรที่ใช้

ที่นี่ฉันมีเครื่องรับส่งสัญญาณ มีหนึ่งด้านและเชื่อมต่อด้วยสายไฟคู่หนึ่ง ฝ่ายหนึ่งมีหน้าที่ส่งและอีกฝ่ายรับข้อมูล

ขั้นตอนที่ 5: แรงดันไฟฟ้าของสายส่ง (การตรวจจับส่วนต่าง)

แรงดันไฟฟ้าของสายส่ง (การตรวจจับส่วนต่าง)
แรงดันไฟฟ้าของสายส่ง (การตรวจจับส่วนต่าง)

ใน CAN บิตที่โดดเด่นคือศูนย์

Line Differential Detection ช่วยลดความไวต่อสัญญาณรบกวน (EFI)

ขั้นตอนที่ 6: CAN มาตรฐานและรูปแบบเฟรม

CAN มาตรฐานและรูปแบบเฟรม
CAN มาตรฐานและรูปแบบเฟรม

รูปแบบมาตรฐานพร้อมตัวระบุ 11 บิต

ขั้นตอนที่ 7: CAN มาตรฐานและรูปแบบเฟรม

CAN มาตรฐานและรูปแบบเฟรม
CAN มาตรฐานและรูปแบบเฟรม

รูปแบบเพิ่มเติมพร้อมตัวระบุ 29 บิต

ขั้นตอนที่ 8: CAN มาตรฐานและรูปแบบเฟรม

สิ่งสำคัญคือต้องสังเกตว่าโปรโตคอลคำนวณ CRC แล้วและส่งสัญญาณ ACK และ EOF ซึ่งเป็นสิ่งที่โปรโตคอล CAN ได้ทำไปแล้ว สิ่งนี้รับประกันได้ว่าข้อความที่ส่งจะไม่มาถึงในทางที่ผิด เนื่องจากหากเกิดปัญหาใน CRC (Redundant Cyclic Check หรือ Redundancy Check) ซึ่งเหมือนกับหมายเลขตรวจสอบข้อมูล CRC จะถูกระบุ

ขั้นตอนที่ 9: สี่ประเภทของเฟรม (เฟรม)

สี่ประเภทของเฟรม (เฟรม)
สี่ประเภทของเฟรม (เฟรม)

สิ่งสำคัญคือต้องสังเกตว่าโปรโตคอลคำนวณ CRC แล้วและส่งสัญญาณ ACK และ EOF ซึ่งเป็นสิ่งที่โปรโตคอล CAN ได้ทำไปแล้ว สิ่งนี้รับประกันได้ว่าข้อความที่ส่งจะไม่มาถึงในทางที่ผิด เนื่องจากหากเกิดปัญหาใน CRC (Redundant Cyclic Check หรือ Redundancy Check) ซึ่งเหมือนกับหมายเลขตรวจสอบข้อมูล CRC จะถูกระบุ

สี่ประเภทของเฟรม (เฟรม)

การส่งและรับข้อมูลใน CAN ขึ้นอยู่กับเฟรมสี่ประเภท ประเภทของเฟรมจะถูกระบุโดยการเปลี่ยนแปลงในบิตควบคุมหรือแม้กระทั่งโดยการเปลี่ยนแปลงกฎการเขียนเฟรมสำหรับแต่ละกรณี

  • Data Frame: ประกอบด้วยข้อมูลตัวส่งสัญญาณสำหรับเครื่องรับ
  • Remote Frame: นี่คือคำขอข้อมูลจากโหนดใดโหนดหนึ่ง
  • กรอบข้อผิดพลาด: เป็นเฟรมที่ส่งโดยโหนดใด ๆ เมื่อระบุข้อผิดพลาดในบัสและสามารถตรวจพบได้โดยโหนดทั้งหมด
  • Overload Frame: ทำหน้าที่ชะลอการรับส่งข้อมูลบนบัสเนื่องจากข้อมูลโอเวอร์โหลดหรือล่าช้าบนโหนดอย่างน้อยหนึ่งโหนด

ขั้นตอนที่ 10: วงจร - รายละเอียดของการเชื่อมต่อ

วงจร - รายละเอียดการเชื่อมต่อ
วงจร - รายละเอียดการเชื่อมต่อ

ขั้นตอนที่ 11: วงจร - การเก็บข้อมูล

วงจร - การเก็บข้อมูล
วงจร - การเก็บข้อมูล

ความยาวคลื่นที่ได้รับสำหรับ CAN มาตรฐานที่มี 11 บิต ID

ขั้นตอนที่ 12: วงจร - การเก็บข้อมูล

วงจร - การเก็บข้อมูล
วงจร - การเก็บข้อมูล

ความยาวคลื่นที่ได้รับสำหรับ CAN แบบขยายที่มีรหัส 29 บิต

ขั้นตอนที่ 13: วงจร - การเก็บข้อมูล

วงจร - การเก็บข้อมูล
วงจร - การเก็บข้อมูล

ข้อมูลที่ได้รับจากตัววิเคราะห์ลอจิก

ขั้นตอนที่ 14: ห้องสมุด Arduino - CAN

ห้องสมุด Arduino - CAN
ห้องสมุด Arduino - CAN

ฉันแสดงสองตัวเลือกที่นี่ซึ่งคุณสามารถติดตั้ง CAN Driver Library

Arduino IDE Library Manager

ขั้นตอนที่ 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

ขั้นตอนที่ 16: รหัสที่มาของเครื่องส่งสัญญาณ

ซอร์สโค้ด: รวมและตั้งค่า ()

เราจะรวมไลบรารี CAN เริ่มซีเรียลสำหรับการดีบัก และเริ่ม CAN บัสที่ 500 kbps

#include // รวม biblioteca สามารถทำให้การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); //inicia ดีบัก para แบบอนุกรมในขณะที่ (!Serial); Serial.println ("ตัวส่งสัญญาณสามารถ"); // เริ่มต้นหรือ barramento สามารถ 500 kbps ถ้า (!CAN.begin (500E3)) { Serial.println ("Falha ao iniciar o controlador CAN"); //caso não seja possível iniciar o controlador ในขณะที่ (1); } }

ขั้นตอนที่ 17: รหัสที่มา: วน () การส่งแพ็คเก็ต CAN 2.0 มาตรฐาน

เราใช้มาตรฐาน CAN 2.0 ในการส่งพัสดุ รหัส 11 บิตระบุข้อความ บล็อกข้อมูลต้องมีขนาดไม่เกิน 8 ไบต์ มันเริ่มต้นแพ็กเก็ตด้วย ID 18 ในเลขฐานสิบหก มันแพ็ค 5 ไบต์และปิดฟังก์ชัน

void loop () { // Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bits e identifica a mensagem (prioridade, evento) //o bloco de dados deve possuir até 8 ไบต์ Serial.println ("Enviando pacote … "); CAN.beginแพ็คเก็ต(0x12); //id 18 em เลขฐานสิบหก CAN.write('h'); //1º ไบต์ CAN.write('e'); ///2º ไบต์ CAN.write('l'); ///3º ไบต์ CAN.write('l'); ///4º ไบต์ CAN.write('o'); ///ไบต์ 5º CAN.endPacket(); //encerra o pacote para envio Serial.println("Enviado."); ล่าช้า (1000);

ขั้นตอนที่ 18: ซอร์สโค้ด: วนซ้ำ () การส่ง Extended CAN 2.0 Package

ในขั้นตอนนี้ ID มี 29 บิต มันเริ่มส่ง ID 24 บิตและอีกครั้งแพ็ค 5 ไบต์และออก

//Usando CAN 2.0 Estendido //Envia um pacote: o id tem 29 bits e identifica a mensagem (prioridade, evento) //o bloco de dados deve possuir até 8 ไบต์ Serial.println("Enviando pacote estendido…"); CAN.beginExtendedPacket(0xabcdef); //id 11259375 ทศนิยม (abcdef em hexa) = 24 บิต preenchidos até aqui CAN.write('w'); //1º ไบต์ CAN.write('o'); ///2º ไบต์ CAN.write('r'); ///3º ไบต์ CAN.write('l'); ///4º ไบต์ CAN.write('d'); ///ไบต์ 5º CAN.endPacket(); //encerra o pacote para envio Serial.println("Enviado."); ล่าช้า (1000); }

ขั้นตอนที่ 19: ตัวรับซอร์สโค้ด

ซอร์สโค้ด: รวมและตั้งค่า ()

อีกครั้ง เราจะรวมไลบรารี CAN เริ่มซีเรียลเพื่อดีบัก และเริ่ม CAN บัสที่ 500 kbps หากเกิดข้อผิดพลาดขึ้น ข้อผิดพลาดนี้จะถูกพิมพ์ออกมา

#include // รวม biblioteca สามารถทำให้การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); //inicia ดีบัก para แบบอนุกรมในขณะที่ (!Serial); Serial.println ("ตัวรับสามารถ"); // เริ่มต้นหรือ barramento สามารถ 500 kbps ถ้า (! CAN.begin (500E3)) { Serial.println ("Falha ao iniciar o controlador CAN"); //caso não seja possível iniciar o controlador ในขณะที่ (1); } }

ขั้นตอนที่ 20: รหัสที่มา: วนซ้ำ (), การรับแพ็คเกจและตรวจสอบรูปแบบ

เราพยายามตรวจสอบขนาดของแพ็กเก็ตที่ได้รับ วิธี CAN.parsePacket () แสดงขนาดของแพ็คเกจนี้ ดังนั้นหากเรามีแพ็คเกจ เราจะตรวจสอบว่ามีการขยายเวลาหรือไม่

วงเป็นโมฆะ () {// การตรวจสอบยืนยัน o tamanho ทำ acote recebido int packetSize = CAN.parsePacket (); if (packetSize) { // Se temos um pacote Serial.println ("Recebido pacote."); ถ้า (CAN.packetExtended()) { //verifica se o pacote é estendido Serial.println ("Estendido"); }

ขั้นตอนที่ 21: ที่มา: วนซ้ำ () ตรวจสอบเพื่อดูว่าเป็นแพ็คเกจระยะไกลหรือไม่

ที่นี่ เราตรวจสอบว่าแพ็กเก็ตที่ได้รับนั้นเป็นคำขอข้อมูลหรือไม่ ในกรณีนี้ไม่มีข้อมูล

ถ้า (CAN.packetRtr ()) { // Verifica se o pacote é um pacote remoto (Requisição de dados), neste caso não há dados Serial.print ("RTR"); }

ขั้นตอนที่ 22: รหัสที่มา: วนซ้ำ () ร้องขอหรือรับความยาวของข้อมูล

หากแพ็กเก็ตที่ได้รับเป็นคำขอ เราจะระบุความยาวที่ร้องขอ เราจะได้ Data Length Code (DLC) ซึ่งระบุความยาวของข้อมูล สุดท้ายเราระบุความยาวที่ได้รับ

Serial.print("รหัส com 0x"); Serial.print(CAN.packetId(), HEX); ถ้า (CAN.packetRtr ()) {// se o pacote recebido é de requisição, indicamos o comprimento solicitado Serial.print (" e requsitou o comprimento "); Serial.println(สามารถ.packetDlc()); //obtem o DLC (รหัสความยาวข้อมูล, que indica o comprimento dos dados) } else { Serial.print (" e comprimento "); // aqui somente indica หรือ comprimento recebido Serial.println(packetSize);

ขั้นตอนที่ 23: รหัสที่มา: วนซ้ำ () หากได้รับข้อมูลแล้วจะพิมพ์

เราพิมพ์ (บนจอภาพแบบอนุกรม) ข้อมูล แต่ถ้าแพ็กเก็ตที่ได้รับไม่ใช่คำขอเท่านั้น

//Imprime os dados somente se o pacote recebido não foi de requisição while (CAN.available()) { Serial.print((char)CAN.read()); // ปรับปรุงระบบปฏิบัติการ } Serial.println(); } Serial.println(); } }

ขั้นตอนที่ 24: ดาวน์โหลดไฟล์

ไฟล์ PDF

ฉันไม่

แนะนำ: