2. คำสั่งแรก: calibrate ขึ้นบิน ตั้งความสูง ลงจอด
สอนทีละคำสั่งพร้อมเหตุผลว่าทำไมต้อง delay เท่านี้ จากแบบ pArduino-> ก่อน แล้วค่อยย่อเป็น drone.*
ไม่เคยเขียนโปรแกรมมาก่อน?
ถ้าเห็นคำอย่าง pArduino->, เมธอด หรือตัวแปร แล้วยังไม่คุ้น ให้อ่าน อ่านโค้ดให้ออก ก่อน ใช้เวลาประมาณ 15 นาที แล้วกลับมาหน้านี้
หน้านี้สอนลำดับเริ่มต้นของทุกการบิน ทีละคำสั่ง เรียงตามที่ต้องทำจริง
- calibrate (ตั้งศูนย์)
- take off (ขึ้นบิน)
- set height (ตั้งความสูง)
- auto land (ลงจอด)
- stop motor (ฉุกเฉิน)
เริ่มด้วยสิ่งที่ต้องรู้ก่อนข้อ 1 เพราะถ้าไม่รู้จะ delay แล้วงงทุกบรรทัด
0. สั่งแล้วจบทันที แต่โดรนยังไม่เสร็จ
pArduino->take_off() ใช้เวลาไม่ถึงหนึ่งในพันวินาที เพราะมันแค่เขียนเลข 2 ตัวลงตัวแปร (ไบต์ 0 บวกหนึ่ง ไบต์ 1 ใส่รหัส F_ARM) แล้วจบ ส่วนโดรนใช้เวลาเป็นวินาทีกว่าจะขึ้นถึง
ถ้าไม่ delay คำสั่งถัดไปจะทับคำสั่งเดิมก่อนโดรนทำเสร็จ ผลคือโดรนทำครึ่งๆ กลางๆ หรือมองข้ามคำสั่ง
ตัวเลข delay มาจากไหน
ผู้ผลิตไม่ได้ระบุเวลาของแต่ละคำสั่งไว้ ตัวเลขทั้งหมดในหน้านี้ (3000, 4000, 400) คือค่าที่ชมรมทดลองจนบินได้เสถียร ไม่ใช่ค่ามาตรฐาน โดรนอีกตัวหรือแบตเตอรี่ต่ำกว่านี้อาจต้องรอนานขึ้น แต่ละหัวข้อด้านล่างบอกวิธีวัดค่าของคุณเอง
1. Calibrate: ตั้งศูนย์ไจโร
pArduino->calibration();
delay(3000);ทำอะไร ไจโรสโคปในโดรนวัดความเร็วในการหมุน ตอนนิ่งมันควรอ่านได้ศูนย์ แต่ความจริงอ่านได้เลขเล็กๆ เพี้ยนไม่เท่ากันทุกตัว (เรียกว่า offset) calibrate คือให้โดรนวัดตอนมันนิ่งสนิท จำเลขเพี้ยนนั้นไว้ แล้วหักออกทุกครั้งที่อ่านค่า
ทำไมต้องรอ 3 วินาที FC ต้องอ่านค่าหลายครั้งแล้วเฉลี่ยจึงได้เลขที่เชื่อถือได้ และตลอดเวลานั้นโดรนต้องไม่ขยับเลย ถ้าถูกจับหรือสั่น ค่าที่จำไว้จะเพี้ยน ทำให้โดรนเอียงหรือลอยไหลตอนบิน ชมรมเผื่อไว้ 3 วินาที (ไฟ LED เป็นฟ้านิ่งตลอดช่วงนี้)
เช็กยังไงว่าเสร็จ ดูไฟ ฟ้านิ่งหายไปแปลว่าเสร็จ ถ้าเป็นเหลืองนิ่งแปลว่าคาลิเบรตไม่สำเร็จ ให้วางใหม่บนพื้นเรียบแล้วทำซ้ำ
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 ปรับตัวให้ลอยนิ่ง ถ้าสั่งต่อก่อนครบ เช่นสั่งเดินหน้าตอนยังไต่ขึ้น โดรนจะเอียงไปทั้งที่ยังไม่นิ่ง และอาจชนพื้นหรือไถลเสียหลัก
เช็กยังไงว่าเสร็จ ไฟเป็นเขียวนิ่ง (ลอยนิ่ง) แล้วค่อยสั่งต่อ
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 ไม่มีผล ต้องขึ้นบินก่อนเสมอ
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
ทำไมรอ ถ้าสั่งอย่างอื่นต่อระหว่างที่ยังลงไม่ถึงพื้น โดรนอาจเปลี่ยนไปทำคำสั่งใหม่กลางทาง (พฤติกรรมนี้ผู้ผลิตไม่ได้ระบุ ให้ทดสอบเอง) จึงรอจนมอเตอร์หยุดก่อนเสมอ
pArduino->take_off();ลูกศรแดง = ทิศหัวโดรน · เส้นฟ้า = เส้นทาง · ภาพช่วยเข้าใจ ไม่ใช่สเกลจริง
1take off ขึ้นบิน
ใบพัดหมุนเร็วขึ้นทั้ง 4 ตัว โดรนยกตัวจากพื้นขึ้นลอย สั่งแล้วจบทันที ต้องรอ ~4 วินาทีให้ขึ้นถึงก่อนสั่งต่อ
เวลาจริงบนโดรนประมาณ 4.00 วินาที (ในภาพเร่งให้ดูง่าย)
วัดเวลาของคุณเอง ลงจากความสูงที่ใช้บ่อยที่สุด จับเวลาจนมอเตอร์หยุด
คำสั่งย่อ: drone.autoLand();
5. Stop motor: ตัดมอเตอร์ฉุกเฉิน
pArduino->stop_motor();ตัดไฟมอเตอร์ทันที ไม่ลงอย่างนุ่มนวล โดรนตกลงพื้น ใช้เมื่อกำลังจะชนคนหรือของเท่านั้น ไม่ต้อง delay
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);
}pArduino->calibration();ลูกศรแดง = ทิศหัวโดรน · เส้นฟ้า = เส้นทาง · ภาพช่วยเข้าใจ ไม่ใช่สเกลจริง
1calibrate ตั้งศูนย์ไจโร
โดรนนอนนิ่งบนพื้น มอเตอร์ไม่หมุน ไจโรอ่านค่าตอนนิ่งเก็บไว้เป็น "ศูนย์" ห้ามจับหรือขยับจนกว่าจะรอครบ (ชมรมใช้ 3 วินาที)
เวลาจริงบนโดรนประมาณ 3.00 วินาที (ในภาพเร่งให้ดูง่าย)
ย่อด้วยคำสั่ง drone.* ได้เหลือแค่นี้ (ทำงานเหมือนกันทุกประการ)
void FirstProgram() {
drone.calibrateAndDelay(3000);
drone.takeOff();
drone.wait(4000);
drone.sh(110);
drone.wait(3000);
drone.autoLand();
drone.wait(4000);
}บทถัดไปจะสอนคำสั่งเดินหน้า ถอยหลัง หมุนหัว แล้วจึงเอามาประกอบเป็นภารกิจ
ลองทำ
- เขียน
FirstProgramผูกกับปุ่ม แล้วบินจริงครั้งแรกโดยถอดคนออกจากรัศมี 2 เมตร - จับเวลาแต่ละขั้นเทียบกับไฟสถานะ ตารางที่คุณได้อาจต่างจากของชมรม จดไว้
- ลองลด
delay(4000)หลัง take off เหลือ 1000 แล้วดูว่าเกิดอะไรขึ้น (ทำที่พื้นนุ่มๆ และพร้อมกดลงจอดบนรีโมท)
พังตรงไหนบ่อย
- โดรนเอียงหรือไหลตอนลอย ไม่ได้ calibrate หรือขยับโดรนระหว่างคาลิเบรต
- ไม่ขึ้นบิน แบตเตอรี่ต่ำ ยังไม่ได้จับคู่รีโมท หรือไฟสถานะเป็นแดง/เหลือง (ลองคาลิเบรตใหม่)
- ขึ้นแล้วกระตุก delay หลัง take off สั้นไป หรือแบตเตอรี่ใกล้หมด
- สั่ง set_height แล้วไม่เปลี่ยน สั่งก่อนขึ้นบิน
- ลงจอดแล้วมอเตอร์ยังหมุน สั่งอย่างอื่นต่อก่อนลงถึง เพิ่ม delay