1. เชื่อมต่อ Arduino กับโดรน
บอร์ด Arduino คุยกับ Flight Controller ยังไง ต้องเขียนอะไรใน setup และ loop และเช็กว่าต่อติดแล้วจากไหน
ไม่เคยเขียนโปรแกรมมาก่อน?
ถ้าเห็นคำอย่าง pArduino->, เมธอด หรือตัวแปร แล้วยังไม่คุ้น ให้อ่าน อ่านโค้ดให้ออก ก่อน ใช้เวลาประมาณ 15 นาที แล้วกลับมาหน้านี้
ก่อนสั่งโดรนบินได้ ต้องรู้ก่อนว่า Arduino กับโดรนต่อกันยังไง หน้านี้มี 4 ขั้น ทำตามตามลำดับ จบแล้วคุณจะมีโปรแกรมเปล่าที่อัปโหลดได้ และรู้ว่าสายทุกเส้นทำอะไร
1. รู้ก่อนว่าใครคุยกับใคร
บนโดรนมีสมองสองก้อน
- Flight Controller (FC) ควบคุมมอเตอร์ อ่านเซ็นเซอร์ ทรงตัว มาจากโรงงาน เราแก้โค้ดข้างในไม่ได้
- บอร์ด Arduino Nano (ที่เราเขียนโค้ดลง) มีหน้าที่เดียวคือ "บอกให้ FC ทำอะไร"
สองก้อนคุยกันผ่านสาย I2C (สายข้อมูล 2 เส้น SDA และ SCL) FC มีที่อยู่ 0x34 Arduino ตั้งตัวเองเป็น 0x33 ฟังดูซับซ้อน แต่โค้ดฝั่งเรามีแค่บรรทัดเดียวที่ทำเรื่องนี้ และมันอยู่ใน protocol.cpp ให้แล้ว ไม่ต้องเขียนเอง
รายละเอียดสายและขา อ่านที่ Arduino Nano และพอร์ตบนโดรน และ I2C ตอนนี้ยังไม่ต้องอ่านก็เขียนต่อได้
2. โครงโปรแกรมที่ต้องมี
ทุกโปรแกรม Arduino มี setup() (รันครั้งเดียวตอนเปิดเครื่อง) กับ loop() (รันวนไม่รู้จบ) โค้ดของชมรมเป็นแบบนี้ ใน drone_sanam5.ino
void setup() {
drone.beginDefault(); // เริ่มระบบ + I2C กับ Flight Controller
MODE_SETUP(); // setup เฉพาะของโหมดที่เลือก
}
void loop() {
MODE_LOOP(); // คอยอ่านปุ่มจากรีโมท
}drone.beginDefault() ทำ 2 อย่าง เปิด Serial ที่ 9600 (ไว้ดูข้อความบนคอมพิวเตอร์) และตั้งขาของพอร์ต 1, 3, 4, 5, 6 เป็นขาออก (ไว้ต่อเซอร์โว)
ส่วนการต่อ I2C ไม่ต้องสั่ง เพราะ pArduino ถูกสร้างอัตโนมัติตั้งแต่โปรแกรมเริ่ม ตัวสร้างของมันเรียก Wire.begin(0x33) ให้เรียบร้อย ดูที่ protocol.cpp
Arduino *pArduino = new Arduino(); // สร้างตอนเริ่มโปรแกรม
Arduino::Arduino() {
Wire.begin(0x33); // ตั้ง Arduino เป็นอุปกรณ์ที่อยู่ 0x33
Wire.onRequest(requestEvent); // FC ขอข้อมูล → ส่งคำสั่งที่เขียนไว้
Wire.onReceive(receiveEvent); // FC ส่งเลขปุ่มรีโมทมา → เก็บไว้
}สังเกตว่า Arduino ไม่ได้ส่งคำสั่งเอง FC เป็นฝ่ายมาถามเป็นรอบๆ ว่า "มีคำสั่งอะไรไหม" แล้ว Arduino ตอบด้วยข้อมูล 6 ไบต์ที่เขียนค้างไว้ นี่คือเหตุผลที่คำสั่ง pArduino->take_off() จบทันที มันแค่เขียนไบต์ลงช่อง ยังไม่ได้ส่งอะไรเลย (ดูต่อในขั้นถัดไปของบทหน้า)
3. อัปโหลดโปรแกรมเปล่าก่อน
ยังไม่ต้องสั่งบิน อัปโหลดโปรแกรมของชมรมทั้งโฟลเดอร์ขึ้นไปก่อน เพื่อเช็กว่าทุกอย่างต่อติด ถ้ายังไม่เคยลง Arduino IDE ให้ทำ ติดตั้ง Arduino IDE ก่อน
- ถอดแบตเตอรี่โดรนออก (ให้ไฟมาจาก USB อย่างเดียว กันมอเตอร์หมุนโดยไม่ตั้งใจ)
- ต่อสาย USB จากคอมพิวเตอร์เข้าบอร์ด Arduino
- เลือกบอร์ดและพอร์ตใน Arduino IDE
- กดอัปโหลด (ลูกศรขวา)
- เปิด Serial Monitor ที่ 9600 ต้องไม่มีข้อความ error
4. เช็กว่าโดรนพร้อมจากไฟสถานะ
ใส่แบตเตอรี่ เปิดโดรน แล้วดูไฟ LED ใต้ท้องโดรน ตามคู่มือผู้ผลิต
| ไฟ | ความหมาย |
|---|---|
| เขียวนิ่ง | ลอยนิ่ง (hover) |
| เขียวกะพริบช้า | กำลังขึ้น-ลง หรือกำลังเคลื่อนที่ |
| ฟ้านิ่ง | กำลังคาลิเบรตไจโร (ขั้นต่อไป) |
| แดงกะพริบช้า | ยังไม่จับคู่กับรีโมท หรือสัญญาณหาย |
| แดงนิ่ง | ระบบผิดพลาด |
| เหลืองนิ่ง | เซ็นเซอร์ผิดพลาด หรือคาลิเบรตไม่สำเร็จ |
ถ้าเห็นแดงกะพริบ ให้จับคู่รีโมทก่อนที่ ประกอบและจับคู่
ก่อนทำขั้นต่อไป
วางโดรนบนพื้นเรียบโล่ง ถอดใบพัดไว้ก่อนถ้าเป็นการทดลองครั้งแรก คนยืนห่างอย่างน้อย 2 เมตร อ่าน ความปลอดภัย
ลองทำ
- อัปโหลดโปรแกรมชมรมแล้วเปิด Serial Monitor ดูว่าไม่มี error
- ถอด USB ใส่แบต เปิดโดรน ดูไฟ LED ว่าเป็นสีอะไร
- จดไว้ว่าไฟเป็นสีอะไรในแต่ละช่วง จะใช้ในบทถัดไป
พังตรงไหนบ่อย
- อัปโหลดไม่ได้ เลือกพอร์ตผิด หรือสาย USB เป็นแบบชาร์จอย่างเดียว ลองสายอื่น
- อัปโหลดได้แต่สั่งโดรนไม่ขยับ สาย SDA/SCL ต่อสลับหรือหลวม ดู I2C
- ไฟแดงกะพริบตลอด ยังไม่ได้จับคู่รีโมท