ชมรมโดรน

2. คำสั่งแรก: calibrate ขึ้นบิน ตั้งความสูง ลงจอด

สอนทีละคำสั่งพร้อมเหตุผลว่าทำไมต้อง delay เท่านี้ จากแบบ pArduino-> ก่อน แล้วค่อยย่อเป็น drone.*

ไม่เคยเขียนโปรแกรมมาก่อน?

ถ้าเห็นคำอย่าง pArduino->, เมธอด หรือตัวแปร แล้วยังไม่คุ้น ให้อ่าน อ่านโค้ดให้ออก ก่อน ใช้เวลาประมาณ 15 นาที แล้วกลับมาหน้านี้

หน้านี้สอนลำดับเริ่มต้นของทุกการบิน ทีละคำสั่ง เรียงตามที่ต้องทำจริง

  1. calibrate (ตั้งศูนย์)
  2. take off (ขึ้นบิน)
  3. set height (ตั้งความสูง)
  4. auto land (ลงจอด)
  5. stop motor (ฉุกเฉิน)

เริ่มด้วยสิ่งที่ต้องรู้ก่อนข้อ 1 เพราะถ้าไม่รู้จะ delay แล้วงงทุกบรรทัด

0. สั่งแล้วจบทันที แต่โดรนยังไม่เสร็จ

pArduino->take_off() ใช้เวลาไม่ถึงหนึ่งในพันวินาที เพราะมันแค่เขียนเลข 2 ตัวลงตัวแปร (ไบต์ 0 บวกหนึ่ง ไบต์ 1 ใส่รหัส F_ARM) แล้วจบ ส่วนโดรนใช้เวลาเป็นวินาทีกว่าจะขึ้นถึง

สั่งแล้วจบทันที แต่โดรนยังทำงานอยู่บรรทัดโค้ดจบในไม่กี่ไมโครวินาที ส่วนโดรนใช้เวลาเป็นวินาทีกว่าจะทำเสร็จ delay คือเวลาที่เรารอเองโค้ด ArduinoโดรนเราเขียนtakeOff()ถ้าไม่มี delay โค้ดวิ่งต่อไปบรรทัดถัดไปทันทีใบพัดเร่งรอบ แล้วยกตัวขึ้นdelay(4000);= รอให้โดรนทำเสร็จถึงตรงนี้ค่อยสั่งต่อ
โค้ดไปต่อได้ทันที แต่โดรนยังทำงานอยู่ delay คือเวลาที่เรายืนรอให้มันเสร็จก่อนสั่งต่อ

ถ้าไม่ delay คำสั่งถัดไปจะทับคำสั่งเดิมก่อนโดรนทำเสร็จ ผลคือโดรนทำครึ่งๆ กลางๆ หรือมองข้ามคำสั่ง

ตัวเลข delay มาจากไหน

ผู้ผลิตไม่ได้ระบุเวลาของแต่ละคำสั่งไว้ ตัวเลขทั้งหมดในหน้านี้ (3000, 4000, 400) คือค่าที่ชมรมทดลองจนบินได้เสถียร ไม่ใช่ค่ามาตรฐาน โดรนอีกตัวหรือแบตเตอรี่ต่ำกว่านี้อาจต้องรอนานขึ้น แต่ละหัวข้อด้านล่างบอกวิธีวัดค่าของคุณเอง

1. Calibrate: ตั้งศูนย์ไจโร

pArduino->calibration();
delay(3000);

ทำอะไร ไจโรสโคปในโดรนวัดความเร็วในการหมุน ตอนนิ่งมันควรอ่านได้ศูนย์ แต่ความจริงอ่านได้เลขเล็กๆ เพี้ยนไม่เท่ากันทุกตัว (เรียกว่า offset) calibrate คือให้โดรนวัดตอนมันนิ่งสนิท จำเลขเพี้ยนนั้นไว้ แล้วหักออกทุกครั้งที่อ่านค่า

ทำไมต้องรอ 3 วินาที FC ต้องอ่านค่าหลายครั้งแล้วเฉลี่ยจึงได้เลขที่เชื่อถือได้ และตลอดเวลานั้นโดรนต้องไม่ขยับเลย ถ้าถูกจับหรือสั่น ค่าที่จำไว้จะเพี้ยน ทำให้โดรนเอียงหรือลอยไหลตอนบิน ชมรมเผื่อไว้ 3 วินาที (ไฟ LED เป็นฟ้านิ่งตลอดช่วงนี้)

เช็กยังไงว่าเสร็จ ดูไฟ ฟ้านิ่งหายไปแปลว่าเสร็จ ถ้าเป็นเหลืองนิ่งแปลว่าคาลิเบรตไม่สำเร็จ ให้วางใหม่บนพื้นเรียบแล้วทำซ้ำ

กำลังโหลดโดรน 3 มิติ…
pArduino->calibration();

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

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

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

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

วัดเวลาของคุณเอง กด calibrate แล้วจับเวลาจนไฟฟ้านิ่งดับ บวกเผื่อ 1 วินาที

คำสั่งย่อ: drone.calibrateAndDelay(3000); (รวมสองบรรทัดเป็นบรรทัดเดียว)

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

pArduino->take_off();
delay(4000);

ทำอะไร ส่งรหัส F_ARM ให้ FC สตาร์ตมอเตอร์ ใบพัดเร่งรอบ แล้วโดรนยกตัวขึ้นลอยนิ่ง คู่มือผู้ผลิตบอกว่าขึ้นไปลอยที่ประมาณ 120 ซม.

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

เช็กยังไงว่าเสร็จ ไฟเป็นเขียวนิ่ง (ลอยนิ่ง) แล้วค่อยสั่งต่อ

กำลังโหลดโดรน 3 มิติ…
pArduino->take_off();

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

take off ขึ้นบิน

ใบพัดหมุนเร็วขึ้นทั้ง 4 ตัว โดรนยกตัวจากพื้นขึ้นลอย สั่งแล้วจบทันที ต้องรอ ~4 วินาทีให้ขึ้นถึงก่อนสั่งต่อ

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

วัดเวลาของคุณเอง จับเวลาตั้งแต่สั่งจนไฟเขียวนิ่ง บวกเผื่อครึ่งวินาที ถ้าแบตเตอรี่เหลือน้อย มอเตอร์ต้องใช้เวลานานขึ้นเล็กน้อย

คำสั่งย่อ: drone.takeOff(); delay(4000); หรือ drone.wait(4000); ต่อท้าย

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

pArduino->set_height(110);
delay(400);

ทำอะไร บอกโดรนว่า "อยากให้ลอยสูง 110 ซม. จากพื้น" เลขส่งเป็น 2 ไบต์ (ไบต์ต่ำก่อน) FC วัดความสูงด้วยเซ็นเซอร์ ToF LiDAR ที่ท้องโดรน แล้วปรับแรงยกให้ถึงเป้า

ทำไม delay แค่ 400 ms เพราะในภารกิจชมรมโดรนลอยอยู่ใกล้ความสูงนี้อยู่แล้วหลัง take off (ราว 110–120 ซม.) แค่ปรับเล็กน้อย 400 ms พอให้ถึงก่อนสั่งบินไปข้างหน้า ถ้าสั่งเปลี่ยนความสูงเยอะ เช่นจาก 110 ลงเหลือ 45 ซม. ต้องรอนานกว่านั้น ประมาณเท่าที่โดรนใช้เคลื่อนที่ลงจริง เริ่มลอง 1500 ms แล้วดูว่าถึงไหม

ข้อควรระวัง ตอนที่ยังอยู่บนพื้นและยังไม่ได้ take off สั่ง set_height ไม่มีผล ต้องขึ้นบินก่อนเสมอ

กำลังโหลดโดรน 3 มิติ…
pArduino->take_off();

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

1take off ขึ้นบิน

ใบพัดหมุนเร็วขึ้นทั้ง 4 ตัว โดรนยกตัวจากพื้นขึ้นลอย สั่งแล้วจบทันที ต้องรอ ~4 วินาทีให้ขึ้นถึงก่อนสั่งต่อ

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

วัดเวลาของคุณเอง สั่ง set_height(45) จากที่ลอยอยู่ 110 แล้วจับเวลาจนไฟเขียวนิ่ง นั่นคือเวลาลง 65 ซม. ของโดรนคุณ นำไปใช้คำนวณ delay ของการเปลี่ยนความสูงขนาดอื่นได้คร่าวๆ ตามสัดส่วน

คำสั่งย่อ: drone.sh(110); คำสั่งนี้ใส่ delay(400) ให้ในตัว (ดู DroneEasy.cpp) ถ้าอยากได้ค่าความสูงที่ชมรมใช้ประจำ ดู ตารางค่าคงที่ HEIGHT_TAKEOFF = 110

ความสูงเปลี่ยนมากๆ แล้วโดรนกระชาก แนะนำให้ค่อยๆ ขยับทีละ 10 ซม. อ่านต่อที่ คุมความสูง

4. Auto land: ลงจอด

pArduino->auto_land();
delay(4000);

ทำอะไร ส่งรหัส F_AUTO_LAND โดรนลดความสูงเองอย่างช้าๆ จนแตะพื้นแล้วหยุดมอเตอร์ ไม่ต้องบอกว่าสูงเท่าไร มันรู้จาก LiDAR

ทำไมรอ ถ้าสั่งอย่างอื่นต่อระหว่างที่ยังลงไม่ถึงพื้น โดรนอาจเปลี่ยนไปทำคำสั่งใหม่กลางทาง (พฤติกรรมนี้ผู้ผลิตไม่ได้ระบุ ให้ทดสอบเอง) จึงรอจนมอเตอร์หยุดก่อนเสมอ

กำลังโหลดโดรน 3 มิติ…
pArduino->take_off();

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

1take off ขึ้นบิน

ใบพัดหมุนเร็วขึ้นทั้ง 4 ตัว โดรนยกตัวจากพื้นขึ้นลอย สั่งแล้วจบทันที ต้องรอ ~4 วินาทีให้ขึ้นถึงก่อนสั่งต่อ

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

วัดเวลาของคุณเอง ลงจากความสูงที่ใช้บ่อยที่สุด จับเวลาจนมอเตอร์หยุด

คำสั่งย่อ: drone.autoLand();

5. Stop motor: ตัดมอเตอร์ฉุกเฉิน

pArduino->stop_motor();

ตัดไฟมอเตอร์ทันที ไม่ลงอย่างนุ่มนวล โดรนตกลงพื้น ใช้เมื่อกำลังจะชนคนหรือของเท่านั้น ไม่ต้อง delay

กำลังโหลดโดรน 3 มิติ…
pArduino->stop_motor();

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

stop motor ตัดมอเตอร์

ตัดไฟมอเตอร์ทั้ง 4 ตัวทันที โดรนตกลงพื้นเลย ใช้เฉพาะฉุกเฉิน

คำสั่งย่อ: drone.stopMotor();

6. รวมเป็นโปรแกรมแรก

ลำดับเต็มจากบนลงล่าง ใส่ในปุ่ม KEY ใดก็ได้ที่ยังไม่ใช้ (เรื่องปุ่มอยู่ใน ปุ่มรีโมท)

void FirstProgram() {
  pArduino->calibration();   // 1. ตั้งศูนย์
  delay(3000);

  pArduino->take_off();      // 2. ขึ้นบิน
  delay(4000);

  pArduino->set_height(110); // 3. ตั้งความสูง
  delay(400);

  delay(3000);               // ลอยให้ดูเฉยๆ 3 วินาที

  pArduino->auto_land();     // 4. ลงจอด
  delay(4000);
}
กำลังโหลดโดรน 3 มิติ…
pArduino->calibration();

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

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

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

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

ดูตั้งแต่ต้นจนจบ แล้วเทียบกับไฟสถานะบนโดรนจริง
เวลาตั้งแต่ calibrate ถึงพร้อมบินcalibration 3000 มิลลิวินาที takeOff 4000 มิลลิวินาที setHeight 400 มิลลิวินาที รวม 7.4 วินาทีcalibration() รอ 3000takeOff() รอ 4000sh(110) รอ 4000 วินาที3 วินาที7 วินาที7.4 วินาที
เวลาสะสมก่อนโดรนพร้อมสั่งบินไปข้างหน้า 7.4 วินาที ตัวเลขทั้งหมดมาจากการทดลองของชมรม

ย่อด้วยคำสั่ง drone.* ได้เหลือแค่นี้ (ทำงานเหมือนกันทุกประการ)

void FirstProgram() {
  drone.calibrateAndDelay(3000);
  drone.takeOff();
  drone.wait(4000);
  drone.sh(110);
  drone.wait(3000);
  drone.autoLand();
  drone.wait(4000);
}

บทถัดไปจะสอนคำสั่งเดินหน้า ถอยหลัง หมุนหัว แล้วจึงเอามาประกอบเป็นภารกิจ

ลองทำ

  1. เขียน FirstProgram ผูกกับปุ่ม แล้วบินจริงครั้งแรกโดยถอดคนออกจากรัศมี 2 เมตร
  2. จับเวลาแต่ละขั้นเทียบกับไฟสถานะ ตารางที่คุณได้อาจต่างจากของชมรม จดไว้
  3. ลองลด delay(4000) หลัง take off เหลือ 1000 แล้วดูว่าเกิดอะไรขึ้น (ทำที่พื้นนุ่มๆ และพร้อมกดลงจอดบนรีโมท)

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

  • โดรนเอียงหรือไหลตอนลอย ไม่ได้ calibrate หรือขยับโดรนระหว่างคาลิเบรต
  • ไม่ขึ้นบิน แบตเตอรี่ต่ำ ยังไม่ได้จับคู่รีโมท หรือไฟสถานะเป็นแดง/เหลือง (ลองคาลิเบรตใหม่)
  • ขึ้นแล้วกระตุก delay หลัง take off สั้นไป หรือแบตเตอรี่ใกล้หมด
  • สั่ง set_height แล้วไม่เปลี่ยน สั่งก่อนขึ้นบิน
  • ลงจอดแล้วมอเตอร์ยังหมุน สั่งอย่างอื่นต่อก่อนลงถึง เพิ่ม delay

On this page