ชมรมโดรน

2. ภาพรวมระบบ

คอมพิวเตอร์ Arduino รีโมท และ Flight Controller ต่อกันอย่างไร

ก่อนเขียนโค้ดบรรทัดแรก ต้องรู้ก่อนว่าโค้ดของเราไปอยู่ตรงไหน และคำสั่งเดินทางยังไงกว่าจะถึงมอเตอร์ เรื่องนี้ตอบคำถามเรื่อง "ทำไมต้องมี Arduino" และ "ทำไมโดรนไม่ทำตามทันที"

เส้นทางของคำสั่งตั้งแต่คอมพิวเตอร์และรีโมทไปถึงมอเตอร์โค้ดจากคอมพิวเตอร์อัปโหลดลง Arduino บนโดรน Arduino ส่งคำสั่งทาง I2C ให้ Flight Controller ซึ่งสั่งมอเตอร์ รีโมทส่งปุ่มมาทางคลื่น 2.4 GHzคอมพิวเตอร์Arduino IDE เขียนโค้ดรีโมทก้านโยก + ปุ่ม KEYArduino บนโดรนเก็บโค้ดภารกิจของเราFlight Controller (FC)เซ็นเซอร์ + ทรงตัวESC + มอเตอร์ ×4หมุนใบพัดUSB Type-Cคำสั่งปุ่มจากรีโมท + ความสูงI2C (สาย 2 เส้น)คลื่น 2.4 GHz
เส้นทางของคำสั่ง ลูกศรฟ้า = คำสั่งจาก Arduino ลงไปที่ FC ลูกศรแดง = ข้อมูลที่ FC ส่งกลับ (ปุ่มรีโมท ความสูง)

1. ห้าชิ้นส่วน

ตำแหน่งกล้อง ไฟสถานะ และแบตเตอรี่บนโดรน
ตำแหน่งกล้อง ไฟสถานะ และแบตเตอรี่บนโดรน (หมายเลขตามภาพ: 1 กล้อง 2 ไฟสถานะหน้า 3 แบตเตอรี่ 4 ไฟสถานะท้าย)

1. คอมพิวเตอร์ เป็นที่เขียนโค้ดด้วย Arduino IDE แล้วอัปโหลดผ่านสาย USB Type-C ไปลง Arduino บนโดรน เสร็จแล้วถอดสายได้ โค้ดอยู่ในบอร์ดต่อไปแม้ปิดเครื่อง

2. Arduino (บนโดรน) เก็บโค้ดภารกิจของเรา เช่น "ไปข้างหน้า 250 ซม. แล้วปล่อยลูกบอล" มันไม่ได้ควบคุมมอเตอร์ตรงๆ แค่เขียนคำสั่งลงกล่องข้อความขนาด 6 ไบต์

3. Flight Controller (FC) ตัวกลางลำที่ติดเซ็นเซอร์ มาอ่านกล่องข้อความจาก Arduino ผ่านสาย I2C แล้วแปลงเป็นรอบมอเตอร์ ทรงตัวตลอดเวลา และส่งค่าความสูงกลับไปให้ Arduino

4. ESC + มอเตอร์ 4 ตัว ESC เป็นวงจรที่รับสัญญาณจาก FC แล้วจ่ายกำลังให้มอเตอร์ตามจังหวะที่ต้องการ

5. รีโมท ส่งคลื่น 2.4 GHz ไปหา FC ใช้บังคับเองหรือกดปุ่มเพื่อสั่งให้ Arduino เริ่มภารกิจ (KEY1–KEY14) ระยะสัญญาณสูงสุด 100 เมตร

2. คำสั่ง 1 บรรทัดเดินทางยังไง

เมื่อโค้ดเรียก drone.takeOff() จะเกิดสิ่งนี้ตามลำดับ

  1. takeOff() เขียนเลขคำสั่งลงในอาร์เรย์ 6 ไบต์ในหน่วยความจำของ Arduino (m_i2cData) และบวกตัวนับ "คำสั่งใหม่" ขึ้นหนึ่ง
  2. FC ทักมาที่ Arduino ทาง I2C เป็นระยะ อ่านอาร์เรย์นั้นไป เห็นตัวนับเปลี่ยนจึงรู้ว่ามีคำสั่งใหม่
  3. FC สั่งมอเตอร์ให้ขึ้นบิน โดยทรงตัวเองตลอดทาง
  4. โค้ดบรรทัดถัดไปของเรารันต่อทันที โดยไม่รอให้ขึ้นบินเสร็จ

ข้อ 4 คือเหตุผลที่โค้ดของชมรมต้องใส่ delay() เพื่อรอ หรือคำสั่งสั้นๆ จะซ้อนกันจนโดรนทำไม่ทัน อ่านรายละเอียดไบต์ต่อไบต์ได้ที่ แพ็กเก็ต I2C (บทขั้นสูง)

3. ทำไมโดรนไม่รู้ว่าไปถึงหรือยัง

คำสั่งอย่าง fw(250) ไม่ได้บอกว่า "ไปให้ถึง 250 ซม." แต่ทำงานเป็น "บินไปข้างหน้า แล้วนับเวลา ครบเวลาแล้วหยุด" (ระยะ = ความเร็ว × เวลา) โดรนไม่มีเซ็นเซอร์วัดว่าไกลแค่ไหนแล้ว นี่เป็นเหตุผลที่ต้องวัดค่าเวลาต่อเซนติเมตรเอง และเหตุผลที่ระยะคลาดสะสม อ่านต่อใน Dead reckoning

4. เซ็นเซอร์ที่ FC ใช้

เซ็นเซอร์ใช้ทำอะไร
ไจโร / มาตรความเร่ง (IMU)รู้ว่าเอียงเท่าไร หมุนเร็วแค่ไหน
LiDAR ใต้ท้องวัดระยะจากพื้น (ใช้ได้ถึง 8 เมตร)
บารอมิเตอร์วัดความสูงจากความกดอากาศ (ถึง 50 เมตร)
กล้อง Optical flowดูลายพื้นเพื่อรู้ว่าโดรนไถลไปทางไหน

รายละเอียดอยู่ที่ เซ็นเซอร์

On this page