6. หมุนหัวโดรน (Yaw)
set_yaw, yaw_block, yaw_soft_stop แบบ 70/30 พร้อม trim และค่า YAW_* ใน config.hpp
Yaw คือการหมุนรอบแกนตั้ง หัวโดรนหันไปซ้ายหรือขวาโดยตัวไม่เลื่อนที่ ใช้เมื่อกลไกอยู่ที่หัวโดรน เช่นเข็มเจาะลูกโป่ง ต้องหันหัวเข้าหาเป้า (ดู เจาะลูกโป่ง)
1. set_yaw: สั่งหมุน
หลังสั่งแล้ว โดรนหมุนอยู่ที่เดิม ตำแหน่งไม่เปลี่ยน ดูลูกศรแดงบนพื้น (ทิศหัว) หมุนตาม
pArduino->set_yaw(1, 90);ลูกศรแดง = ทิศหัวโดรน · เส้นฟ้า = เส้นทาง · ภาพช่วยเข้าใจ ไม่ใช่สเกลจริง
1หมุนขวา 90°
1 = ขวา 90°
เวลาจริงบนโดรนประมาณ 3.90 วินาที (ในภาพเร่งให้ดูง่าย)
pArduino->set_yaw(1, 90); // 1 = หมุนขวา 90 องศา
pArduino->set_yaw(2, 90); // 2 = หมุนซ้าย 90 องศาเหมือน set_direction คำสั่งนี้ ส่งแล้วจบทันที ไม่รอให้หมุนเสร็จ ต้อง delay เองให้พอ โค้ดของชมรมคำนวณเวลาจากมุม:
// config.hpp
static const uint16_t YAW_MS_PER_DEG = 42;
static const uint16_t YAW_EXTRA_MS = 120;
static const uint16_t YAW_SETTLE_MS = 220;
static const uint8_t YAW_TRIM_DEG = 4;
static inline void yaw_block(uint8_t dir, uint16_t deg){
pArduino->set_yaw(dir, deg);
delay((uint32_t)deg * YAW_MS_PER_DEG + YAW_EXTRA_MS);
}yaw_block(dir, deg) = สั่งหมุน แล้วรอ deg × 42 + 120 ms หมุน 90° รอ 90 × 42 + 120 = 3900 ms
2. หมุนทีเดียวแล้ว "เลยเป้า"
คิดถึงจักรยานที่เบรกกะทันหันบนทางลื่น: ล้อหยุด ตัวยังไถลต่อ โดรนที่หมุนเร็วแล้วหยุดทันทีก็เลยมุมได้เล็กน้อย (overshoot) วิธีที่ชมรมใช้คือหมุน สองจังหวะ แล้วถอยกลับนิดหนึ่ง
3. yaw_soft_stop: 70 แล้ว 30 แล้ว trim
// config.hpp
static inline void yaw_soft_stop(bool to_right, uint16_t deg, uint8_t trim_deg = YAW_TRIM_DEG){
const uint8_t DIR = to_right ? 1 : 2;
const uint8_t ANTI = to_right ? 2 : 1;
const uint16_t a = (deg * 7) / 10;
const uint16_t b = deg - a;
yaw_block(DIR, a);
pArduino->set_direction(7, 3); delay(YAW_SETTLE_MS);
yaw_block(DIR, b);
pArduino->set_direction(7, 3); delay(YAW_SETTLE_MS / 2);
if (trim_deg){
yaw_block(ANTI, trim_deg);
pArduino->set_direction(7, 3); delay(YAW_SETTLE_MS);
}
}สามจังหวะ:
- หมุน 70% ของมุมที่ต้องการ แล้ว
posholdนิ่ง 220 ms - หมุนส่วนที่เหลือ 30% แล้วนิ่ง 110 ms (
YAW_SETTLE_MS / 2) - หมุนย้อนทิศ
trim_deg= 4° เพื่อดึงกลับจาก overshoot แล้วนิ่ง 220 ms
ตัวอย่าง yaw_soft_stop(true, 90):
| จังหวะ | หมุน | รอหมุน | นิ่ง |
|---|---|---|---|
| 1 | ขวา 63° | 63 × 42 + 120 = 2766 ms | 220 ms |
| 2 | ขวา 27° | 27 × 42 + 120 = 1254 ms | 110 ms |
| 3 (trim) | ซ้าย 4° | 4 × 42 + 120 = 288 ms | 220 ms |
รวม 2766 + 220 + 1254 + 110 + 288 + 220 = 4858 ms ช้ากว่า yaw_block(1, 90) ตัวเดียว (3900 ms) ราวหนึ่งวินาที แลกกับมุมที่นิ่งกว่า
4. smart_yaw: ใส่เลขบวก/ลบได้เลย
smart_yaw(90);ลูกศรแดง = ทิศหัวโดรน · เส้นฟ้า = เส้นทาง · ภาพช่วยเข้าใจ ไม่ใช่สเกลจริง
1หมุนขวา 90°
เลขบวก = ขวา
smart_yaw(90); // ขวา 90 องศา (yaw_soft_stop(true, 90))
smart_yaw(-45); // ซ้าย 45 องศา (yaw_soft_stop(false, 45))เลขบวกหมุนขวา เลขลบหมุนซ้าย smart_yaw ตัดสินทิศจากเครื่องหมายแล้วเรียก yaw_soft_stop ให้
ตอนนี้ยังไม่ถูกใช้ในภารกิจ
ฟังก์ชัน yaw_block, yaw_soft_stop และ smart_yaw ถูกเตรียมไว้ใน config.hpp แต่ไฟล์ .ino ปัจจุบันไม่ได้เรียก (ใน KEY1_mode1 มีบรรทัด drone.setYaw ที่ถูกคอมเมนต์ไว้) ค่า 42 ms ต่อองศาและ trim 4° จึงควรวัดเองก่อนใช้จริง เหมือน ms/cm
5. ปรับ YAW_* ให้พอดีโดรน
- หมุนไม่ถึงเป้า: ลองเพิ่ม
YAW_MS_PER_DEGทีละ 2–3 หรือดูว่าแบตอ่อน - เลยเป้ายังเหลือ: เพิ่ม
YAW_TRIM_DEGเป็น 5–6 ทีละ 1 องศา - หมุนเสร็จแล้วยังโยก: เพิ่ม
YAW_SETTLE_MS
เปลี่ยนทีละค่า ทดสอบ 3 ครั้ง ก่อนเปลี่ยนค่าถัดไป
ลองทำ
- คำนวณเวลาที่
yaw_soft_stop(false, 60)ใช้ทั้งหมด (ตอบ: a = 42, b = 18: (42×42+120) + 220 + (18×42+120) + 110 + 288 + 220 = 1884 + 220 + 876 + 110 + 288 + 220 = 3598 ms) - เขียน handler ที่บินหน้า 100 ซม. หมุนขวา 90° แล้วบินหน้า 100 ซม. (ใช้
smart_yaw(90)) - วัดว่าหมุนจริงกี่องศา ด้วยแผ่นกระดาษมีเส้นมุมวางใต้โดรน
พังตรงไหนบ่อย
- ลืมว่า
set_yawไม่รอ ถ้าไม่delayโดรนยังหมุนตอนคำสั่งบินเดินหน้าเริ่ม - ทิศหน้า-ซ้าย-ขวาเปลี่ยนหลังหมุน
fw,ml,mrนับตามหัวโดรนใหม่ เมื่อหมุนไปแล้วเส้นทางทั้งหมดเปลี่ยน - ใช้
degไม่เป็นบวกyaw_soft_stopรับuint16_tใส่ค่าลบจะกลายเป็นเลขใหญ่มาก ใช้smart_yawที่รับค่าลบได้ - เอามุมไปคูณ ms เอง ลืมบวก
YAW_EXTRA_MSทำให้ตัดช่วงท้ายสั้นไป