แบบฝึกหัดนี้ที่ฉันให้ในการประชุม Embedded Linux พยายามตอบคำถามโดยให้ลิงก์ไปยังคำอธิบายโดยละเอียดเพิ่มเติมของหัวข้อที่ได้รับการแก้ไขและการใช้ตัวอย่างที่เป็นประโยชน์ในการขับรถขับเคลื่อน 4 มิติโดยที่ Arduino Mini Pro ทำหน้าที่เป็นทาสและควบคุมล้ออิสระ 4 ตัว . เอกสารต้นฉบับสามารถพบได้ที่นี่
หมายเหตุ: คำตอบนี้กำลังดำเนินการอยู่ในขณะที่ฉันปรับไฮไลต์จากลิงค์
แอปพลิเคชันทั่วไปของบัส I2C
ในกรณีที่มีตัวควบคุมบัสหลายตัวอุปกรณ์ต่อพ่วงจะถูกจัดกลุ่มตามความเร็ว
การแนะนำอย่างรวดเร็วเกี่ยวกับบัส I2C - คุณสมบัติหลัก
- รถบัสอนุกรม
- 2 บรรทัดเท่านั้น: Serial CLock และ Serial DAta (บวกกราวด์)
- 4 ความเร็ว: 100kHz, 400kHz, 1MHz, 3.2MHz
- โดยปกติแล้ว 1 อุปกรณ์หลักและ 1 ทาสขึ้นไป
- การสื่อสารเริ่มต้นโดยอุปกรณ์หลักเสมอ
- ผู้เชี่ยวชาญหลายคนสามารถอยู่ร่วมกันบนรถบัสเดียวกันได้ (ต้นแบบหลายคน)
- Open-Drain: ทั้ง SDA และ SCL ต้องการตัวต้านทานแบบ pull-up
- “ การยืดนาฬิกา”
- ต้นแบบควบคุม SCL แต่สลาฟสามารถกดค้างไว้ได้ (เพราะท่อระบายน้ำเปิด) หากจำเป็นต้องปรับความเร็ว
- ต้นแบบต้องตรวจสอบสถานการณ์นี้
- ทาสสามารถติดขัดและติดขัดบัส: จำเป็นต้องรีเซ็ตบรรทัดจากต้นแบบไปยังทาส
- โดยทั่วไปการกำหนดแอดเดรส 7 บิต แต่ยังรองรับ 10 บิต
- โปรโตคอลลอจิคัล: ไม่ได้ระบุระดับแรงดันไฟฟ้าจริงและขึ้นอยู่กับการใช้งานของแต่ละบุคคล เช่น 1.8V / 3.3V / 5.0V
URL อ้างอิง:
ตัวอย่างการกำหนดค่าบัส
ลักษณะของพิธีสาร (ประยุกต์)
- 2 ประเภทข้อความ: อ่านและเขียน
- Start / Stop bit - แสดงเป็น“ [“ และ“]” ในคำตอบที่เหลือ
- ที่อยู่: 7 หรือ 10 บิต
- R / W บิต: R = 1 / W = 0 ใช้เพื่อแยกประเภทของข้อความที่ส่ง
- ข้อมูลบนรถบัส: (ที่อยู่ << 1 | R / W)
- ลงทะเบียนเป็นตัวจัดการข้อมูลภายในอุปกรณ์ที่เลือก
ตัวอย่างของปริมาณการใช้รถบัส
ทาสที่กำหนดเอง
เหตุใดจึงต้องสร้าง I2C ที่กำหนดเอง
- เซ็นเซอร์ / แอคชูเอเตอร์ที่ต้องการไม่สามารถใช้งานได้กับอินเตอร์เฟส I2C
- มีที่อยู่เฉพาะน้อยกว่าที่จำเป็นกว่าทาสที่ต้องการ
- ฟังก์ชั่นที่กำหนดเองที่ต้องการบนทาส:
- ปฏิกิริยากึ่งอิสระต่อสิ่งเร้า
- การกรอง / การประมวลผลข้อมูลอินพุตล่วงหน้า
- การเพิ่มประสิทธิภาพพลังงาน:“ ศูนย์กลางเซ็นเซอร์” ที่กำหนดเองจะดูแลทำความสะอาดในขณะที่โปรเซสเซอร์หลักไม่ได้ทำงาน
- การตอบสนองต่ออินพุตแบบเรียลไทม์
- [จินตนาการของคุณที่นี่]
วิธีการออกแบบทาส I2C ที่กำหนดเอง?
- กำหนดข้อกำหนด (ดูสไลด์ก่อนหน้า)
- เลือกไมโครคอนโทรลเลอร์หรือไมโครโปรเซสเซอร์
- เลือกตัวกำหนดตารางเวลาหรือระบบปฏิบัติการ (ถ้ามี)
- กำหนดโปรโตคอลย่อยการสื่อสาร:
- กำหนดพารามิเตอร์และคำสั่งที่จะแลกเปลี่ยน
- จัดระเบียบพวกเขาเป็น "ลงทะเบียน" และเลือกที่อยู่ฟรี
การออกแบบของ I2C Master
เกณฑ์การออกแบบที่สำคัญ:
- น้ำหนัก / ขนาด
- กำลังการคำนวณที่จำเป็นและเวลาแฝงเฉลี่ย
- อุปกรณ์ที่เหมือนพีซี
- อุปกรณ์สมองกลฝังตัว
- ภาษาการเขียนโปรแกรมที่ต้องการ: ตีความ vs รวบรวม
- ความพร้อมใช้งานของบัส / gpios สำหรับการขับขี่ทาส:
- GPIOs เท่านั้น: bitbang โปรโตคอล
- I2C: แอปพลิเคชันพื้นที่ผู้ใช้เทียบกับเคอร์เนลไดรเวอร์
- ไม่มีอินเตอร์เฟส GPIOs / I2C: อะแดปเตอร์ USB เป็น I2C
การดีบัก: หารและพิชิต
ควบคุมรถบัสโดยตรงด้วยอุปกรณ์เฉพาะกิจ ตัวอย่าง:
โจรสลัดรถบัส
- ส่วนใหญ่มีวัตถุประสงค์เพื่อการพัฒนา
- สามารถสูดอากาศทั้งบัสและขับได้
- ส่วนต่อประสานคอนโซลผ่านพอร์ตอนุกรม (ttyACM) รวมถึงมาโครหรือการเข้าถึงโดยทางโปรแกรมสำหรับภาษาการเขียนโปรแกรมหลายภาษา
- ตัวต้านทานแรงดึงและแรงดันในตัว (5V / 3.3V)
- รองรับโปรโตคอลอื่น ๆ อีกมากมาย
- ข้อมูลอ้างอิง: Wikipedia , หน้าหลัก
อะแดปเตอร์ USB เป็น I2C
- รอยเท้าขนาดเล็ก
- เหมาะสำหรับการติดตั้งถาวร
- ไม่จำเป็นต้องมีการเชื่อมต่อพิเศษในโฮสต์: มันสามารถใช้เพื่อเชื่อมต่อกับพีซีทั่วไป
- ตัวแปรที่มีอยู่ที่รองรับ SPI ด้วย
- ไม่มีอินเตอร์เฟสคอนโซลเฉพาะโปรโตคอลไบนารีซีเรียล
- ต้องใช้โปรโตคอลเสื้อคลุม
- การอ้างอิง: โปรโตคอล
sigrok และ pulseview
โลโก้ sigrok (องค์ประกอบ bakend)
ตัวอย่าง pulseview (visualizer)
ตัวอย่างของเครื่องวิเคราะห์ลอจิกต่ำ
- มาตรฐานแบบพฤตินัยสำหรับการวัดด้วยพีซีบน linux (แต่มีในระบบปฏิบัติการอื่นด้วย)
- รองรับการวิเคราะห์เชิงตรรกะขอบเขตและเมตรที่หลากหลาย
- โปรโตคอลถอดรหัสต่างๆรวมถึง I2C
- มีประโยชน์สำหรับการแสดงภาพสัญญาณเชิงตรรกะและการดีบักข้อผิดพลาดของโปรโตคอล
- แม้แต่ตอนจบที่ต่ำมาก HW ราคาไม่แพงก็สามารถสร้างมิติใหม่ให้กับการดีบั๊ก
- ข้อมูลอ้างอิง: sigrok , pulseview , ฮาร์ดแวร์ที่รองรับ
ตัวอย่าง: การบังคับทิศทางแบบสี่ล้อ
ต้นแบบที่สร้างขึ้นโดยใช้ Arduino Mini Pro 2 ตัว
ตัวอย่างทาสทำอะไรในตัวอย่าง?
ทาส I2C:
- ควบคุมปริมาณของแรงบิดที่ใช้กับแต่ละล้อ
- ควบคุมทิศทางแต่ละล้อหมุน
- วัดความเร็วการหมุนของแต่ละล้อผ่านตัวเข้ารหัสแสง (Odometer)
- เปิดเผยพารามิเตอร์ด้านบนไปยัง I2C Master
บล็อกไดอะแกรมระดับสูงของ I2C Slave
- มีพิน / ฟังก์ชั่นเพียงพอสำหรับล้อแต่ละอัน:
- 1 เอาต์พุต PWM พร้อมการกำหนดค่ารอบการทำงานแบบอิสระ
- 1 GPIO สำหรับการลงทะเบียนอินพุตมาตรวัดระยะทางเป็น IRQ
- 2 GPIO สำหรับการเลือก:
- ข้างหน้า
- ย้อนกลับ
- ว่าง
- ล็อค
- I2C HW block สำหรับการแลกเปลี่ยน i2c ที่ถูกขัดจังหวะ
- พินเฉพาะสำหรับการเขียนโปรแกรมด้วย SPI
- รอยเท้าขนาดเล็ก
- ราคาถูก.
- เค้าโครงบอร์ดของโคลนที่แสดงในรูปภาพนั้นได้รับการปรับให้เหมาะสำหรับการติดตั้งบนซ็อกเก็ต DIL
การเลือกระบบปฏิบัติการ: ChibiOS
- RTOS: การจองงานงานเซมาฟอร์ระบบไดนามิก ฯลฯ
- รอยเท้าขนาดเล็ก: ลิงก์ใช้รหัส / ข้อมูลเท่านั้น
- ความแตกต่างระหว่าง RTOS และ BSP ผ่าน HAL
- GPLv3 สำหรับการใช้ที่ไม่ใช่เชิงพาณิชย์
- พัฒนาอย่างแข็งขัน แต่เป็นผู้ใหญ่แล้ว
- รองรับ 8bit AVR
อย่างไรก็ตามมีการรองรับ BSP ที่ จำกัด สำหรับ AVR ขาด: - ไดรเวอร์ขัดจังหวะสำหรับ AVR GPIO (เพิ่ม) - I2C รองรับโหมด AVR slave (กำหนดเอง) ซึ่งจะต้องมีการพัฒนาแยกกันเป็นส่วนหนึ่งของเสียงหึ่งๆ SW สำหรับ AVR
การกำหนดพารามิเตอร์การสื่อสาร
สำหรับแต่ละล้อ:
วัฏจักรหน้าที่ของสัญญาณ PWM ที่ใช้ในการขับเคลื่อน - 1 ไบต์ 0xFF = แรงบิดสูงสุด / 0x00 = ไม่มีแรงบิด
ทิศทางการหมุน - 1 ไบต์
- 0x00 = ไม่ได้ใช้งาน
- 0x01 = ย้อนกลับ
- 0x02 = ไปข้างหน้า
- 0x03 = ถูกล็อค
ระยะเวลาเฉลี่ยระหว่างสล็อตของตัวเข้ารหัสออปติคัล - 2 ไบต์
- การเขียนสิ่งใดก็ตามที่รีเซ็ตการวัด
ดัชนีพารามิเตอร์ - 1 แทะ:
- 0 = รอบการทำงาน
- 1 = ทิศทาง
- 2 = ระยะเวลาเฉลี่ย
ดัชนีล้อ - 1 แทะ:
- 0 = ด้านหลังซ้าย
- 1 = ด้านหลังขวา
- 2 = ด้านหน้าขวา
- 3 = ด้านหน้าซ้าย
- 4 = ทั้งหมด
โปรโตคอลย่อย: การกำหนดรีจิสเตอร์
รูปแบบการลงทะเบียน: 0xαβ
- α = ดัชนีพารามิเตอร์ - β = ดัชนีล้อ
ที่อยู่ (เลือกโดยพลการ): 0x10
รูปแบบ Pirate Bus:
- [= บิตเริ่มต้น -] = บิตสุดท้าย - r = อ่านไบต์ - ที่อยู่ครั้งที่ 2 (กะซ้าย 1) สำหรับ R / W บิต
ตัวอย่าง - ในรูปแบบบัสโจรสลัด
[i2c_addr reg_addr = (parm, wheel) reg_value]
[0x20 0x20 0x02] Left Rear Forward
[0x20 0x21 0x01] Right Rear Backward
[0x20 0x22 0x01] Right Front Backward
[0x20 0x23 0x02] Left Front Forward
[0x20 0x14 0xFF] Wheels set to max torque
รถหมุนตามเข็มนาฬิกา