สารบัญ:
- ขั้นตอนที่ 1: ทรัพยากรที่ใช้
- ขั้นตอนที่ 2: CAN (เครือข่ายพื้นที่ควบคุม)
- ขั้นตอนที่ 3: CAN - คุณสมบัติ
- ขั้นตอนที่ 4: วงจรที่ใช้
- ขั้นตอนที่ 5: แรงดันไฟฟ้าของสายส่ง (การตรวจจับส่วนต่าง)
- ขั้นตอนที่ 6: CAN มาตรฐานและรูปแบบเฟรม
- ขั้นตอนที่ 7: CAN มาตรฐานและรูปแบบเฟรม
- ขั้นตอนที่ 8: CAN มาตรฐานและรูปแบบเฟรม
- ขั้นตอนที่ 9: สี่ประเภทของเฟรม (เฟรม)
- ขั้นตอนที่ 10: วงจร - รายละเอียดของการเชื่อมต่อ
- ขั้นตอนที่ 11: วงจร - การเก็บข้อมูล
- ขั้นตอนที่ 12: วงจร - การเก็บข้อมูล
- ขั้นตอนที่ 13: วงจร - การเก็บข้อมูล
- ขั้นตอนที่ 14: ห้องสมุด Arduino - CAN
- ขั้นตอนที่ 15: Github
- ขั้นตอนที่ 16: รหัสที่มาของเครื่องส่งสัญญาณ
- ขั้นตอนที่ 17: รหัสที่มา: วน () การส่งแพ็คเก็ต CAN 2.0 มาตรฐาน
- ขั้นตอนที่ 18: ซอร์สโค้ด: วนซ้ำ () การส่ง Extended CAN 2.0 Package
- ขั้นตอนที่ 19: ตัวรับซอร์สโค้ด
- ขั้นตอนที่ 20: รหัสที่มา: วนซ้ำ (), การรับแพ็คเกจและตรวจสอบรูปแบบ
- ขั้นตอนที่ 21: ที่มา: วนซ้ำ () ตรวจสอบเพื่อดูว่าเป็นแพ็คเกจระยะไกลหรือไม่
- ขั้นตอนที่ 22: รหัสที่มา: วนซ้ำ () ร้องขอหรือรับความยาวของข้อมูล
- ขั้นตอนที่ 23: รหัสที่มา: วนซ้ำ () หากได้รับข้อมูลแล้วจะพิมพ์
- ขั้นตอนที่ 24: ดาวน์โหลดไฟล์
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-23 15:12
อีกเรื่องที่ผู้ติดตามช่อง YouTube ของฉันแนะนำเมื่อเร็วๆ นี้คือโปรโตคอล CAN (Controller Area Network) ซึ่งเป็นสิ่งที่เราจะมุ่งเน้นในวันนี้ สิ่งสำคัญคือต้องอธิบายว่า CAN เป็นโปรโตคอลการสื่อสารแบบอนุกรมพร้อมกัน ซึ่งหมายความว่ามีการซิงโครไนซ์ระหว่างโมดูลที่เชื่อมต่อกับเครือข่ายโดยสัมพันธ์กับจุดเริ่มต้นของแต่ละข้อความที่ส่งไปยังบัส เราจะเริ่มต้นด้วยการแนะนำแนวคิดพื้นฐานของโปรโตคอล CAN และทำการประกอบอย่างง่ายด้วย ESP32 สองตัว
ในวงจรของเรา ESP สามารถทำหน้าที่เป็นทั้ง Master และ Slave คุณสามารถส่งไมโครคอนโทรลเลอร์หลายตัวพร้อมกันได้ เนื่องจาก CAN จะจัดการกับการชนกันของทุกสิ่งโดยอัตโนมัติ ซอร์สโค้ดของโครงการนี้ง่ายมาก ตรวจสอบออก!
ขั้นตอนที่ 1: ทรัพยากรที่ใช้
- สองโมดูลของ ESP WROOM 32 NodeMcu
- ตัวรับส่งสัญญาณ CAN สองตัวจาก WaveShare
- จัมเปอร์สำหรับการเชื่อมต่อ
- เครื่องวิเคราะห์ลอจิกสำหรับการจับภาพ
- สาย USB สามเส้นสำหรับ ESP และตัววิเคราะห์
- บิดคู่ 10 เมตร ทำหน้าที่รถบัส
ขั้นตอนที่ 2: CAN (เครือข่ายพื้นที่ควบคุม)
- ได้รับการพัฒนาโดย Robert Bosch GmbH ในปี 1980 เพื่อรองรับอุตสาหกรรมยานยนต์
- มีการแพร่หลายในช่วงหลายปีที่ผ่านมาเนื่องจากความแข็งแกร่งและความยืดหยุ่นในการใช้งาน ใช้กับอุปกรณ์ทางทหาร เครื่องจักรกลการเกษตร ระบบอัตโนมัติทางอุตสาหกรรมและในอาคาร หุ่นยนต์ และอุปกรณ์ทางการแพทย์
ขั้นตอนที่ 3: CAN - คุณสมบัติ
- การสื่อสารแบบอนุกรมสองสาย
- ข้อมูลที่เป็นประโยชน์สูงสุด 8 ไบต์ต่อเฟรม โดยสามารถแตกแฟรกเมนต์ได้
- ที่อยู่ที่ส่งไปยังข้อความไม่ใช่ไปยังโหนด
- การกำหนดลำดับความสำคัญให้กับข้อความและการส่งต่อข้อความ "ถูกระงับ"
- ความสามารถในการตรวจจับและส่งสัญญาณผิดพลาดอย่างมีประสิทธิภาพ
- ความสามารถแบบมัลติมาสเตอร์ (ทุกโหนดสามารถร้องขอการเข้าถึงบัสได้)
- ความสามารถ Multicast (หนึ่งข้อความสำหรับผู้รับหลายคนพร้อมกัน)
- อัตราการถ่ายโอนสูงถึง 1Mbit / s บนบัส 40 เมตร (ลดอัตราตามความยาวของบัสบาร์ที่เพิ่มขึ้น)
- ความยืดหยุ่นของการกำหนดค่าและการแนะนำโหนดใหม่ (สูงสุด 120 โหนดต่อบัส)
- ฮาร์ดแวร์มาตรฐาน ราคาประหยัด และความพร้อมใช้งานที่ดี
- โปรโตคอลที่มีการควบคุม: ISO 11898
ขั้นตอนที่ 4: วงจรที่ใช้
ที่นี่ฉันมีเครื่องรับส่งสัญญาณ มีหนึ่งด้านและเชื่อมต่อด้วยสายไฟคู่หนึ่ง ฝ่ายหนึ่งมีหน้าที่ส่งและอีกฝ่ายรับข้อมูล
ขั้นตอนที่ 5: แรงดันไฟฟ้าของสายส่ง (การตรวจจับส่วนต่าง)
ใน CAN บิตที่โดดเด่นคือศูนย์
Line Differential Detection ช่วยลดความไวต่อสัญญาณรบกวน (EFI)
ขั้นตอนที่ 6: CAN มาตรฐานและรูปแบบเฟรม
รูปแบบมาตรฐานพร้อมตัวระบุ 11 บิต
ขั้นตอนที่ 7: 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
ฉันแสดงสองตัวเลือกที่นี่ซึ่งคุณสามารถติดตั้ง CAN Driver Library
Arduino IDE Library Manager
ขั้นตอนที่ 15: 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
ฉันไม่
แนะนำ:
แอมป์กีตาร์ Pringles Can 7 ขั้นตอน
แอมป์กีตาร์ Pringles Can: บางครั้งฉันอยากหยิบกีตาร์ไฟฟ้ามาเล่นริฟไม่กี่ตัวโดยไม่ต้องตั้งค่าแอมป์ปกติ ฉันเลยอยากสร้างแอมป์กีตาร์ราคาถูก ประกอบง่าย และเรียบง่ายมาก: The Pringles Can Amp
มาตรวัดรอบ/สแกนด้วย Arduino, OBD2 และ CAN Bus: 8 ขั้นตอน
มาตรวัดรอบ/การสแกนโดยใช้ Arduino, OBD2 และ CAN Bus: เจ้าของ Toyota Prius (หรือรถยนต์ไฮบริด/รุ่นพิเศษอื่นๆ) จะรู้ว่าแผงหน้าปัดของพวกเขาอาจไม่มีแป้นหมุนสองสามหน้าปัด! prius ของฉันไม่มีรอบเครื่องยนต์หรือมาตรวัดอุณหภูมิ หากคุณเป็นคนที่ชอบแสดง คุณอาจต้องการทราบสิ่งต่าง ๆ เช่น การกำหนดเวลาล่วงหน้าและ
แฮ็กรถของคุณด้วย Wio Terminal และ CAN Bus: 7 ขั้นตอน
แฮ็กรถของคุณด้วย Wio Terminal และ CAN Bus: หากคุณมีความเข้าใจเกี่ยวกับการเขียนโปรแกรม CAN Bus และ Arduino และต้องการแฮ็กรถของคุณ คำแนะนำนี้สามารถให้วิธีแก้ปัญหาแก่คุณได้ สำหรับสาเหตุที่คุณต้องการแฮ็กรถของคุณ ฉัน ไม่รู้สิ แต่นี่เป็นสิ่งที่น่าสนใจจริงๆ โปรนี้
กุญแจพวงมาลัยไปยังอะแดปเตอร์สเตอริโอในรถยนต์ (CAN Bus -> Key1): 6 ขั้นตอน
กุญแจพวงมาลัยเป็นอะแดปเตอร์สเตอริโอในรถยนต์ (CAN Bus -> Key1): ไม่กี่วันหลังจากซื้อรถมือสอง ฉันพบว่าไม่สามารถเล่นเพลงจากโทรศัพท์ผ่านสเตอริโอในรถยนต์ได้ สิ่งที่น่าผิดหวังยิ่งกว่านั้นคือรถมีบลูทูธ แต่อนุญาตเฉพาะการโทรด้วยเสียง ไม่สามารถใช้เพลงได้ มีพอร์ต USB ของ Windows Phone ด้วย แต่ฉัน
โปรโตคอล Ritter 8341C วิศวกรรมย้อนกลับสำหรับ ESP3866: 5 ขั้นตอน
Reverse Engineering Ritter 8341C Protocol สำหรับ ESP3866: สวัสดี @all สำหรับระบบอัตโนมัติในบ้านขนาดเล็กของฉันเอง ฉันใช้ซ็อกเก็ตควบคุมหลัก 433 MHz ฉันเป็นเจ้าของ 3 ชุดพร้อมสวิตช์ DIP เพื่อปรับที่อยู่ สิ่งเหล่านี้ทำงานได้ดี แต่บางครั้ง (หนึ่งหรือสองปี) ที่แล้ว ฉันซื้อซ็อกเก็ตหนึ่งชุดจาก "ritter&quo