ชมรมโดรน

9. ภารกิจแรก บินไปปล่อยบอล

เขียนโค้ดสั่งโดรนทีละ 7 ขั้น ตั้งแต่ calibrate จนลงจอด ด้วยคำสั่งจริงของชมรม

คำสั่งของชมรมสั้นเหมือนพูด drone.fw(250) แปลว่า "ไปข้างหน้า 250 ซม." โดรนไม่ได้วัดระยะ มันนับ เวลา บินนานเท่าไรก็ไปไกลเท่านั้น เหมือนเดินนับก้าวโดยหลับตา หน้านี้พาเขียนภารกิจเต็มหนึ่งรอบ ทีละขั้น ถ้ายังไม่เคยอ่าน เชื่อมต่อ และ คำสั่งแรก ให้กลับไปอ่านสองหน้านั้นก่อน เพราะที่นี่จะไม่อธิบายเหตุผลของ delay ซ้ำ

เส้นทางบินมองจากด้านบนเริ่มที่แท่น บินหน้า 250 ซม. เลื่อนซ้าย 255 ซม. ปล่อยบอลแล้วลงจอดจุดเริ่มfw(250)ml(255)ปล่อยบอล แล้วลงจอดภาพไม่ตรงสเกลจริง
เส้นทางของภารกิจแรกมองจากด้านบน: เดินหน้า 250 ซม. แล้วเลื่อนซ้าย 255 ซม. ไปถึงจุดปล่อยบอล
กำลังโหลดโดรน 3 มิติ…
drone.calibration();

ลูกศรแดง = ทิศหัวโดรน · เส้นฟ้า = เส้นทาง · ภาพช่วยเข้าใจ ไม่ใช่สเกลจริง

1calibrate ตั้งศูนย์ไจโร

โดรนนอนนิ่งบนพื้น มอเตอร์ไม่หมุน ไจโรอ่านค่าตอนนิ่งเก็บไว้เป็น "ศูนย์" ห้ามจับหรือขยับจนกว่าจะรอครบ (ชมรมใช้ 3 วินาที)

เวลาจริงบนโดรนประมาณ 3.00 วินาที (ในภาพเร่งให้ดูง่าย)

กดข้อไหนก็ได้ ดูว่าโดรนทำอะไรหลังคำสั่งนั้น

1. เขียนทีละขั้น

โค้ดย่อมาจาก KEY1_mode1() ใน Drone_Mission.ino (ตัดส่วนที่ลองแล้วถูกคอมเมนต์ทิ้งออกให้อ่านง่าย)

1. Calibrate: วางโดรนนิ่งๆ แล้วรอ

drone.calibration();
delay(3000);

โดรนต้องตั้งศูนย์ไจโรบนพื้นที่นิ่ง ห้ามจับ ห้ามขยับ รอ 3 วินาทีให้เสร็จก่อนค่อยสั่งต่อ ถ้าอยากรวมสองบรรทัดเป็นบรรทัดเดียว ใช้ drone.calibrateAndDelay(3000);

2. Take off: ขึ้นบิน

drone.takeOff();
delay(4000);

คำสั่งนี้แค่ส่งสัญญาณ "ขึ้น" แล้วจบทันที โดรนยังไม่ทันลอยถึงที่ จึงต้อง delay รอ ถ้าไม่รอ คำสั่งถัดไปจะซ้อนทับตอนโดรนกำลังขึ้น

3. ตั้งความสูง

drone.sh(HEIGHT_TAKEOFF);   // 110 ซม. จาก config.hpp

sh ย่อมาจาก set height ส่งเป้าความสูงแล้วรอ 400 ms ให้โดรนไปถึง

4. เดินหน้า

drone.fw(250);

ใช้เวลา 250 × 15.46 = 3865 ms แล้วเบรกอีก 400 ms (อ่านรายละเอียดที่ distance-time)

5. เลื่อนซ้าย

drone.ml(255);

เลื่อนข้างโดยหัวโดรนยังหันไปทางเดิม ใช้เวลา 255 × 15.65 ≈ 3991 ms

6. ปล่อยบอล

mission_drop_ch1_ch4();

ฟังก์ชันนี้เขียนเองใน Drone_Mission.ino เปิดช่อง 1 กับ 4 รอ 300 ms (MISSION_DROP_WAIT_MS) แล้วปิดประตู กลไกเซอร์โวอยู่ใน ปล่อยสัมภาระ

7. ลงจอด

drone.autoLand();

โดรนลงเองจนถึงพื้น

2. ประกอบเป็นฟังก์ชันเดียว

void MyFirstMission() {
  drone.calibration();
  delay(3000);

  drone.takeOff();
  delay(4000);

  drone.sh(HEIGHT_TAKEOFF);
  drone.fw(250);
  drone.ml(255);

  mission_drop_ch1_ch4();
  drone.autoLand();
}

ผูกกับปุ่ม KEY11 ซึ่งโหมด Mission ยังไม่ได้ใช้ ใส่ในฟังก์ชัน loopDroneMissionMode():

drone.onKey11(MyFirstMission);

เวลารวมก่อนลงจอดประมาณ 3000 + 4000 + 400 + (3865 + 400) + (3991 + 400) + 400 ≈ 16.5 วินาที จับเวลาดูว่าตรงไหม

ความสูงตามเวลาในภารกิจแรกcalibration บนพื้น takeOff ขึ้น sh 110 บินหน้าและซ้ายที่ความสูงเท่าเดิม แล้ว autoLand ลง110 ซม.calibrationtakeOffshfw · ml · ปล่อยautoLand
ความสูงตามเวลา: พื้น → ขึ้นบิน → ตั้ง 110 ซม. → บินหน้าและซ้ายที่ความสูงเท่าเดิม → ลงจอด
ดูภารกิจคล้ายกันในตัวจำลอง

ตัวจำลองใช้ชุดคำสั่งย่อของมันเอง (takeOff(), fw(), drop()) ชื่อคล้ายแต่ไม่ใช่โค้ด Arduino จริง ใช้ดูภาพรวมของลำดับเท่านั้น

ก่อนบินจริง

ต้องมีที่โล่ง แบตเต็ม และคนยืนห่างพอ อ่านหน้า ความปลอดภัย ก่อนทุกครั้ง ถ้าโดรนไปผิดทาง กดลงจอดบนรีโมททันที

ลองทำ

  1. ลดระยะเป็น drone.fw(100) และ drone.ml(100) บินก่อนเพื่อดูว่าไปตรงไหม
  2. เพิ่ม drone.bw(250) ก่อน autoLand() ให้โดรนกลับมาลงที่เดิม
  3. ลองสลับ ขั้น 2 กับ ขั้น 3 แล้วคิดว่าจะเกิดอะไรขึ้น (ตอบ: สั่งความสูงตอนยังอยู่บนพื้นไม่ได้ผล)

พังตรงไหนบ่อย

  • โดรนไม่ขึ้น ลืม calibrate หรือขยับโดรนระหว่าง calibrate
  • ขึ้นแล้วกระตุกหรือเอียง delay หลัง takeOff() สั้นไป
  • ไปไม่ถึงจุดปล่อย ค่า ms/cm ไม่ตรงกับโดรนตัวนั้น ให้วัดใหม่
  • กดปุ่มแล้วไม่เกิดอะไร ลืมผูกด้วย onKey11(...) ใน loop หรือเลือกโหมดผิด ดู เลือกโหมดบิน

On this page