สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ฉันเรียน CAN มาสามสัปดาห์แล้ว และตอนนี้ฉันได้กรอกใบสมัครเพื่อตรวจสอบผลการเรียนรู้ของฉันแล้ว ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ Arduino เพื่อใช้การสื่อสาร CANBUS หากคุณมีข้อเสนอแนะใด ๆ ยินดีที่จะฝากข้อความไว้
เสบียง:
ฮาร์ดแวร์:
- Maduino Zero CANBUS
- DHT11 โมดูลอุณหภูมิและความชื้น
- 1.3" I2C OLED 128x64- สีน้ำเงิน
- สายเคเบิล DB9 ถึง DB9 (ตัวเมียกับตัวเมีย)
- ดูปองท์ ไลน์
ซอฟต์แวร์:
Arduino IDE
ขั้นตอนที่ 1: CANBUS คืออะไร
เกี่ยวกับ CAN
CAN (Controller Area Network) เป็นเครือข่ายการสื่อสารแบบอนุกรมที่สามารถรับรู้การควบคุมแบบเรียลไทม์แบบกระจาย ได้รับการพัฒนาสำหรับอุตสาหกรรมยานยนต์เพื่อแทนที่ชุดสายไฟที่ซับซ้อนด้วยบัสแบบสองสาย
โปรโตคอล CAN กำหนด Data Link Layer และส่วนหนึ่งของ Physical Layer ในโมเดล OSI
โปรโตคอล CAN เป็นมาตรฐาน ISO ที่มี ISO11898 และ ISO11519 ISO11898 เป็นมาตรฐานการสื่อสารความเร็วสูง CAN ด้วยความเร็วในการสื่อสาร 125kbps-1Mbps ISO11519 เป็นมาตรฐานการสื่อสารความเร็วต่ำ CAN ที่มีความเร็วในการสื่อสารน้อยกว่า 125kbps
ที่นี่เรามุ่งเน้นไปที่ CAN ความเร็วสูง
ISO-11898 อธิบายว่าข้อมูลถูกส่งผ่านระหว่างอุปกรณ์บนเครือข่ายอย่างไรและสอดคล้องกับ Open Systems Interconnection model (OSI) ที่กำหนดไว้ในแง่ของเลเยอร์ การสื่อสารจริงระหว่างอุปกรณ์ที่เชื่อมต่อด้วยสื่อทางกายภาพถูกกำหนดโดยชั้นทางกายภาพของแบบจำลอง
- แต่ละหน่วย CAN ที่เชื่อมต่อกับบัสสามารถเรียกได้ว่าเป็นโหนด หน่วย CAN ทั้งหมดเชื่อมต่อกับบัสที่ปลายแต่ละด้านด้วยตัวต้านทาน 120 Ω เพื่อสร้างเครือข่าย รถบัสประกอบด้วยสาย CAN_H และ CAN_L ตัวควบคุม CAN กำหนดระดับบัสตามความแตกต่างของระดับพลังงานของสายไฟทั้งสองสาย ระดับบัสแบ่งออกเป็นระดับที่โดดเด่นและด้อยซึ่งต้องเป็นหนึ่งในนั้น ผู้ส่งส่งข้อความไปยังผู้รับโดยทำการเปลี่ยนแปลงที่ระดับบัส เมื่อเส้นลอจิก "และ" ถูกดำเนินการบนบัส ระดับที่โดดเด่นคือ "0" และระดับถอยกลับคือ "1"
- ในสถานะที่โดดเด่น แรงดันไฟฟ้าของ CAN_H อยู่ที่ประมาณ 3.5V และแรงดันไฟฟ้าของ CAN_L อยู่ที่ประมาณ 1.5V ในสถานะถอย แรงดันไฟฟ้าของทั้งสองสายจะอยู่ที่ประมาณ 2.5V
- สัญญาณมีความแตกต่างกัน นั่นคือสาเหตุที่ CAN ได้รับการคุ้มกันสัญญาณรบกวนที่แข็งแกร่งและความทนทานต่อข้อผิดพลาด สัญญาณดิฟเฟอเรนเชียลที่สมดุลช่วยลดการเชื่อมต่อสัญญาณรบกวนและช่วยให้มีอัตราการส่งสัญญาณสูงผ่านสายเคเบิลคู่บิดเกลียว กระแสในแต่ละสายสัญญาณจะเท่ากันแต่ไปในทิศทางตรงกันข้ามและส่งผลให้เกิดการยกเลิกสนามซึ่งเป็นกุญแจสำคัญในการปล่อยเสียงรบกวนต่ำ การใช้ตัวรับดิฟเฟอเรนเชียลแบบบาลานซ์และสายเคเบิลคู่บิดเบี้ยวช่วยเพิ่มการปฏิเสธโหมดทั่วไปและการป้องกันสัญญาณรบกวนสูงของ CAN บัส
CAN ตัวรับส่งสัญญาณ
CAN Transceiver มีหน้าที่ในการแปลงระหว่างระดับลอจิกและสัญญาณทางกายภาพ แปลงสัญญาณลอจิคัลเป็นระดับดิฟเฟอเรนเชียลหรือสัญญาณฟิสิคัลเป็นระดับลอจิคัล
ตัวควบคุม CAN
ตัวควบคุม CAN เป็นองค์ประกอบหลักของ CAN ซึ่งรับรู้ฟังก์ชันทั้งหมดของดาต้าลิงค์เลเยอร์ในโปรโตคอล CAN และสามารถแก้ไขโปรโตคอล CAN ได้โดยอัตโนมัติ
MCU
MCU มีหน้าที่ควบคุมวงจรฟังก์ชันและตัวควบคุม CAN ตัวอย่างเช่น พารามิเตอร์ตัวควบคุม CAN จะเริ่มต้นเมื่อโหนดเริ่มทำงาน เฟรม CAN จะถูกอ่านและส่งผ่านตัวควบคุม CAN เป็นต้น
ขั้นตอนที่ 2: เกี่ยวกับ CAN Communications
เมื่อบัสไม่ได้ใช้งาน โหนดทั้งหมดสามารถเริ่มส่งข้อความได้ (การควบคุมแบบหลายมาสเตอร์) โหนดที่เข้าถึงบัสก่อนจะได้รับสิทธิ์ในการส่ง (โหมด CSMA/CA) เมื่อหลายโหนดเริ่มส่งพร้อมกัน โหนดที่ส่งข้อความ ID ที่มีลำดับความสำคัญสูงจะได้รับสิทธิ์ในการส่ง
ในโปรโตคอล CAN ข้อความทั้งหมดจะถูกส่งในรูปแบบคงที่ เมื่อบัสไม่ได้ใช้งาน ทุกยูนิตที่เชื่อมต่อกับบัสสามารถเริ่มส่งข้อความใหม่ได้ เมื่อมีเซลล์มากกว่าสองเซลล์เริ่มส่งข้อความพร้อมกัน ลำดับความสำคัญจะถูกกำหนดตามตัวระบุ ID ไม่ได้แสดงถึงที่อยู่ปลายทางของการส่ง แต่เป็นลำดับความสำคัญของข้อความที่เข้าถึงรถบัส เมื่อเซลล์มากกว่าสองเซลล์เริ่มส่งข้อความพร้อมกัน แต่ละบิตของ ID ปลอดดอกเบี้ยจะถูกตัดสินทีละตัว หน่วยที่ชนะอนุญาโตตุลาการสามารถส่งข้อความต่อไปได้ และหน่วยที่แพ้การอนุญาโตตุลาการจะหยุดส่งและรับงานทันที
CAN บัสเป็นบัสประเภทออกอากาศ ซึ่งหมายความว่าโหนดทั้งหมดสามารถ 'ได้ยิน' การส่งสัญญาณทั้งหมดได้ โหนดทั้งหมดจะรับทราฟฟิกทั้งหมดอย่างสม่ำเสมอ ฮาร์ดแวร์ CAN จัดให้มีการกรองในเครื่องเพื่อให้แต่ละโหนดสามารถตอบสนองต่อข้อความที่น่าสนใจเท่านั้น
ขั้นตอนที่ 3: เฟรม
อุปกรณ์ CAN ส่งข้อมูลผ่านเครือข่าย CAN ในแพ็กเก็ตที่เรียกว่าเฟรม CAN มีสี่ประเภทเฟรม:
- กรอบข้อมูล: กรอบที่มีข้อมูลโหนดสำหรับการส่ง
- เฟรมระยะไกล: เฟรมที่ร้องขอการส่งตัวระบุเฉพาะ
- กรอบข้อผิดพลาด: เฟรมที่ส่งโดยโหนดใด ๆ ที่ตรวจพบข้อผิดพลาด
- โอเวอร์โหลดเฟรม: เฟรมเพื่อฉีดการหน่วงเวลาระหว่างข้อมูลหรือเฟรมระยะไกล
กรอบข้อมูล
data frames มีสองประเภทคือแบบมาตรฐานและแบบขยาย
ความหมายของฟิลด์บิตของรูปคือ:
- SOF–บิตเริ่มต้นของเฟรมเดียวที่โดดเด่น (SOF) ทำเครื่องหมายจุดเริ่มต้นของข้อความ และใช้เพื่อซิงโครไนซ์โหนดบนบัสหลังจากไม่ได้ใช้งาน
- ตัวระบุ-ตัวระบุมาตรฐาน CAN 11 บิตกำหนดลำดับความสำคัญของข้อความ ยิ่งค่าไบนารีต่ำ ลำดับความสำคัญก็จะยิ่งสูงขึ้น
- RTR–บิตคำขอส่งระยะไกลเดียว (RTR)
- IDE–บิตส่วนขยายตัวระบุเดี่ยวที่โดดเด่น (IDE) หมายความว่าตัวระบุ CAN มาตรฐานที่ไม่มีส่วนขยายกำลังถูกส่ง
- R0–บิตสงวนไว้ (สำหรับการใช้งานที่เป็นไปได้โดยการแก้ไขมาตรฐานในอนาคต)
- DLC–รหัสความยาวข้อมูล 4 บิต (DLC) มีจำนวนไบต์ของข้อมูลที่ส่ง
- ข้อมูล – ข้อมูลแอปพลิเคชันสามารถส่งข้อมูลได้สูงสุด 64 บิต
- CRC– การตรวจสอบแบบวนซ้ำแบบวนซ้ำ (CRC) แบบวนซ้ำ 16 บิต (15 บิตบวกตัวคั่น) มีการตรวจสอบ (จำนวนบิตที่ส่ง) ของข้อมูลแอปพลิเคชันก่อนหน้าสำหรับการตรวจจับข้อผิดพลาด
- ACK–ACK คือ 2 บิต บิตหนึ่งคือบิตการตอบรับ และบิตที่สองเป็นตัวคั่น
- EOF– ฟิลด์ end-of-frame (EOF) 7 บิตนี้ทำเครื่องหมายจุดสิ้นสุดของเฟรม CAN (ข้อความ) และปิดใช้งาน bitstuffing ซึ่งบ่งชี้ว่ามีข้อผิดพลาดในการบรรจุเมื่อโดดเด่น เมื่อระดับตรรกะเดียวกัน 5 บิตเกิดขึ้นต่อเนื่องกันระหว่างการทำงานปกติ ระดับตรรกะที่ตรงกันข้ามจำนวนเล็กน้อยจะถูกยัดเข้าไปในข้อมูล
- IFS– พื้นที่ระหว่างเฟรม 7 บิต (IFS) นี้มีเวลาที่คอนโทรลเลอร์ต้องการเพื่อย้ายเฟรมที่ได้รับอย่างถูกต้องไปยังตำแหน่งที่เหมาะสมในพื้นที่บัฟเฟอร์ข้อความ
อนุญาโตตุลาการ
ในสถานะไม่ได้ใช้งานของบัส หน่วยที่เริ่มส่งข้อความก่อนจะได้รับสิทธิ์ในการส่ง เมื่อหลายหน่วยเริ่มส่งพร้อมกัน แต่ละหน่วยที่ส่งจะเริ่มที่บิตแรกของส่วนอนุญาโตตุลาการ หน่วยที่มีจำนวนสูงสุดของระดับที่โดดเด่นของเอาต์พุตต่อเนื่องสามารถส่งต่อไปได้
ขั้นตอนที่ 4: ความเร็วและระยะทาง
CAN บัสเป็นบัสที่เชื่อมต่อหลายยูนิตพร้อมกัน ในทางทฤษฎีไม่มีการจำกัดจำนวนยูนิตที่สามารถเชื่อมต่อได้ อย่างไรก็ตาม ในทางปฏิบัติ จำนวนยูนิตที่สามารถเชื่อมต่อได้นั้นถูกจำกัดด้วยการหน่วงเวลาบนบัสและโหลดไฟฟ้า ลดความเร็วในการสื่อสาร เพิ่มจำนวนยูนิตที่สามารถเชื่อมต่อได้ และเพิ่มความเร็วในการสื่อสาร จำนวนยูนิตที่สามารถเชื่อมต่อได้ลดลง
ระยะการสื่อสารสัมพันธ์ผกผันกับความเร็วในการสื่อสาร และยิ่งระยะการสื่อสารไกล ความเร็วในการสื่อสารก็จะยิ่งน้อยลง ระยะทางที่ไกลกว่านั้นอาจเป็น 1 กม. ขึ้นไป แต่ความเร็วนั้นน้อยกว่า 40kps
ขั้นตอนที่ 5: ฮาร์ดแวร์
โมดูล Maduino Zero CAN-BUS เป็นเครื่องมือที่พัฒนาโดย Makerfabs สำหรับการสื่อสาร CANbus ซึ่งใช้ Arduino พร้อมตัวควบคุม CAN และตัวรับส่งสัญญาณ CAN เพื่อสร้างพอร์ต CAN-bus ที่พร้อมใช้งาน
- MCP2515 เป็นตัวควบคุม CAN แบบสแตนด์อโลนที่ใช้ข้อกำหนด CAN สามารถส่งและรับข้อมูลทั้งแบบมาตรฐานและแบบขยายและเฟรมระยะไกลได้
- อินเทอร์เฟซ MAX3051 ระหว่างตัวควบคุมโปรโตคอล CAN และสายไฟจริงของสายบัสในเครือข่ายพื้นที่ควบคุม (CAN) MAX3051 ให้ความสามารถในการส่งสัญญาณส่วนต่างไปยังบัสและความสามารถในการรับส่วนต่างไปยังตัวควบคุม CAN
ขั้นตอนที่ 6: การเชื่อมต่อ
เชื่อมต่อโมดูล DHT11 กับโมดูล Maduino Zero CAN-BUS ด้วยสายไฟเพื่อใช้เป็นเครื่องมือเพื่อรองรับการสื่อสาร CAN ในทำนองเดียวกัน เชื่อมต่อจอแสดงผลกับโมดูลเพื่อรับข้อมูลและแสดงผล
การเชื่อมต่อระหว่าง Maduino Zero CANBUS และ DHT11:
Maduino Zero CANBUS -- DHT11
3v3 ------ VCC GND ------ GND D10 ------ ข้อมูล
การเชื่อมต่อระหว่าง Maduino Zero CANBUS และ OLED:
Maduino Zero CANBUS -- OLED
3v3 ------ VCC GND ------ GND SCL ------ SCL SDA ------ SDA
ใช้สาย DB9 เพื่อเชื่อมต่อโมดูล Maduino Zero CANBUS ทั้งสองโมดูล
ขั้นตอนที่ 7: รหัส
MAX3051 เสร็จสิ้นการแปลงระดับส่วนต่างเป็นสัญญาณตรรกะ MCP2515 ทำหน้าที่ CAN ให้สมบูรณ์ เช่น การเข้ารหัสและถอดรหัสข้อมูล MCU จำเป็นต้องเริ่มต้นคอนโทรลเลอร์และส่งและรับข้อมูลเท่านั้น
- Github:
- หลังจากติดตั้ง Arduino แล้ว ไม่มีแพ็คเกจรองรับบอร์ด (Arduino zero) ที่จำเป็นต้องติดตั้ง
- เลือกเครื่องมือ -> บอร์ด -> ผู้จัดการบอร์ด ค้นหา "Arduino zero" และติดตั้ง "บอร์ด Arduino SAMD"
- เลือก Tools ->Board -> Arduino Zero (Native USB Port) เลือก Tools -> Port -> com…
- หลังจากได้รับโปรแกรมจาก GitHub คุณต้องตรวจสอบให้แน่ใจว่าไฟล์ทั้งหมดอยู่ในไดเร็กทอรีโครงการ ซึ่งประกอบด้วยไฟล์ไลบรารีที่รองรับ CANBUS
- ติดตั้งไลบรารีเซ็นเซอร์ DHT โดย Adafruit ซึ่งใช้ในการขับเคลื่อน DHT11 เพื่อให้ได้อุณหภูมิและความชื้น
- ใช้ที่อยู่อื่นเพื่อส่งอุณหภูมิและความชื้นแยกกันในรหัส Test_DHT11.ino
CAN.sendMsgBuf(0x10, 0, stmp1.length(), stmp_send1);
ล่าช้า (500); CAN.sendMsgBuf(0x11, 0, stmp2.length(), stmp_send2); ล่าช้า (500);
“0x10” หมายถึงรหัสข้อความ, “0” คือเฟรมมาตรฐาน, “stmp1.length()” หมายถึงความยาวของข้อความ, “stmp_send1” คือข้อมูลที่ส่ง
- ในโค้ด Test_OLED.ino ข้อความทั้งหมดบน CANBUS จะได้รับจากการสอบถามและข้อมูลที่จำเป็นจะแสดงบน OLED
- อัปโหลดโปรแกรม Maduino-CANbus-RS485/Test_DHT11_OLED/Test_DHT11/Test_DHT11.ino ไปยังโมดูลที่เชื่อมต่อกับเซ็นเซอร์ และอัปโหลดโปรแกรม Maduino-CANbus RS485/Test_DHT11_OLED/Test_OLED/Test_OLED.ino ไปยังโมดูลอื่นที่เชื่อมต่อกับ OLED
ขั้นตอนที่ 8: แสดง
เปิดโมดูลทั้งสอง อุณหภูมิและความชื้นจะแสดงบนจอแสดงผล