3. ภารกิจเต็ม 3 ประเภท
ตัวอย่างโปรแกรมครบทุกขั้นของ mission-t, aviation-all และ innovation-four พร้อมเวลาและคะแนนจากตัวจำลอง
หน้านี้รวมโปรแกรมเต็มที่ได้ 100 คะแนนในตัวจำลอง ทั้งสามประเภท เปิดรันได้เลยด้วยปุ่มใต้แต่ละโปรแกรม
นี่คือภาษาของตัวจำลอง ไม่ใช่โค้ด Arduino
ในตัวอย่างมีคำสั่งอย่าง reload(), drop(), pop(), shoot(), turnByHand() ที่ ไม่มีอยู่ใน DroneEasy ของชมรม ตัวจำลองแปลงภารกิจให้เป็นคำสั่งสั้นๆ ที่อ่านง่าย ตารางด้านล่างบอกว่าแต่ละคำสั่งตรงกับอะไรในโค้ดจริง
1. แปลงเป็นโค้ดจริง
| ตัวจำลอง | โค้ด Arduino ของชมรม | หมายเหตุ |
|---|---|---|
calibration() | drone.calibration() + drone.wait(3000) | ตัวจำลองรอ 3 วินาทีให้เอง |
takeOff() | drone.takeOff() + drone.wait(3000) | ใช้รอบละ 3–3.5 วินาทีในไฟล์ภารกิจ |
sh(n) | drone.setHeight(n) หรือ drone.sh(n) | sh ในไลบรารีรออีก 400 ms |
fw / bw / ml / mr(cm) | drone.fw / bw / ml / mr(cm) | แต่ละคำสั่งต่อด้วย settle(400) |
poshold() | drone.posHold() | ตัวจำลองหยุด 1.2 วินาที |
autoLand() | drone.autoLand() | |
drop() | mission_drop_ch1_ch4() / mission_drop_ch2_ch3() | ใน Drone_Mission.ino |
yaw(deg) | drone.setYaw(dir, angle) หรือ smart_yaw(angle) | smart_yaw อยู่ใน config.hpp |
shoot() | drone.servoAngle(SHOOT1_PIN, S_LEFT_ANGLE) | ตาม Drone_Innovation_Challenge.ino |
pop() | advance_and_poke_straight(...) | ไลบรารีใน poke_controls.ino |
reload(), turnByHand() | ไม่มี | คนแข่งทำด้วยมือบนแท่น |
2. 1) ทิ้งสัมภาระ: mission-t (100 คะแนน)
ตัว T สองรอบ รอบแรกแท่นบน รอบสองคนแข่งบรรจุบอลใหม่ หมุนโดรนด้วยมือ 180° แล้วบินท่าเดิมไปแท่นล่าง ไม่ต้องสั่ง yaw ผลจากตัวจำลอง: 83.5 วินาที · 100 คะแนน (บอล 80 ลูก + ลอดห่วงลงจอด 20)
// Drone Mission : ตัว T ด้านบน → คนแข่งบรรจุบอลและหมุนโดรนด้วยมือ → ตัว T ด้านล่าง
calibration();
// ---------- ด้านบน ----------
reload(); // คนแข่งใส่บอลชุดซ้าย 20 + ชุดขวา 20 ลูกที่ตัวโดรน
takeOff();
sh(100); // ความสูง 100 ซม. ลอดห่วงได้
fw(250);
ml(250); // ถึงแท่นซ้ายบน
poshold();
drop(); // ปล่อยชุดซ้าย 20 ลูก
mr(500); // ข้ามไปแท่นขวาบน
poshold();
drop(); // ปล่อยชุดขวา 20 ลูก
ml(250);
bw(250);
autoLand(); // กลับมาลงบนแท่นเขียว
// ---------- ด้านล่าง ----------
reload();
turnByHand(180); // คนแข่งหมุนตัวโดรนด้วยมือ (ไม่ใช้ yaw)
takeOff();
sh(100);
fw(250);
ml(250); // ซ้ายของโดรน = ฝั่งขวาของสนาม
poshold();
drop();
mr(500);
poshold();
drop();
ml(250);
bw(250);
autoLand(); // ลงบนแท่นเขียวอีกครั้ง = หยุดเวลาเทียบกับโค้ดจริงของชมรม KEY1_mode1 ใน Drone_Mission.ino ซึ่งบินท่าตัว T ที่ต่อเนื่องกว่า (ไปแท่นซ้ายปล่อยช่อง 1&4 แล้วข้ามไปแท่นขวาปล่อยช่อง 2&3 แล้วกลับ) ตัวเลขจริงคือ
drone.fw(256);
drone.moveFastLeft(257);
drone.setHeight(HEIGHT_DROP);
delay(250);
drone.down(3, 300);
mission_drop_ch1_ch4();
drone.setHeight(110);
delay(250);
drone.mr(480);
drone.bw(8);
// ... ลงมาที่ 40 ซม. แล้ว mission_drop_ch2_ch3() ...
drone.ml(260);
drone.moveBackward(262);
drone.autoLand();ตอนนี้ปุ่มที่ผูกกับท่านี้คือ KEY10 (drone.onKey10(KEY1_mode1) ใน loopDroneMissionMode) ส่วน KEY1 เรียก DroneMission_KEY_1_handle ซึ่งเลือกตามตัวแปร KEY1_MODE ที่ตั้งเป็น 2 ไว้ เป็นเส้นทางทดสอบบินไปแท่นเดียวแล้วลงจอด
3. 2) ยุทธวิธี: aviation-all (100 คะแนน)
แตะลูกโป่งทีละกลุ่ม แวะลงแท่นวงกลมทีละแท่น (+5) แล้วกลับฐาน ผลจากตัวจำลอง: 89.8 วินาที · 100 คะแนน (ลูกโป่ง 60 + แท่น 20 + ห่วงลงจอด 20)
// Aviation Mastery : บน → ขวาบน → ขวา → ขวาล่าง → ล่าง → ซ้ายล่าง → ซ้าย → ซ้ายบน → กลับฐาน
calibration();
takeOff();
sh(100);
fw(100); // ลอดห่วง
sh(145); // สูงเท่ากลางลูกโป่ง
fw(138);
poshold(); pop(); // ลูกกลางด้านบน
ml(60); pop();
mr(120); pop();
mr(190); // ไปแท่นขวาบน
autoLand(); // +5
takeOff();
sh(145);
yaw(180); // หันหน้าลง
fw(166); pop(); // กลุ่มด้านขวา
fw(60); pop();
fw(60); pop();
fw(202); // ไปแท่นขวาล่าง
autoLand(); // +5
takeOff();
sh(145);
yaw(90); // หันหน้าไปทางซ้าย
fw(178); pop(); // กลุ่มด้านล่าง
fw(60); pop();
fw(60); pop();
fw(202); // ไปแท่นซ้ายล่าง
autoLand(); // +5
takeOff();
sh(145);
yaw(90); // หันหน้าขึ้นบน
fw(178); pop(); // กลุ่มด้านซ้าย
fw(60); pop();
fw(60); pop();
fw(202); // ไปแท่นซ้ายบน
autoLand(); // +5
takeOff();
sh(100);
yaw(135); // หันหน้ากลับฐาน
fw(354);
autoLand(); // ลงบนแท่นเขียว = หยุดเวลาจุดที่ต้องสังเกต: ต้องลงจอดและขึ้นบินใหม่ 4 รอบ (autoLand แล้ว takeOff) เพื่อเก็บ +5 ต่อแท่น แต่ละรอบเสียเวลาและแบตเตอรี่ ตัวอย่างจริง Aviation_Mastery.ino ของชมรมตอนนี้เป็นเส้นทางสั้นกว่านี้ (fw/bw/ml/mr ล้วน ไม่มีการเจาะ)
4. 3) ยิงเป้า: innovation-four (100 คะแนน)
บินไปยืนห่างเป้า แล้วยิงตรงกลาง ผลจากตัวจำลอง: 59.1 วินาที · 100 คะแนน (ยิงเข้าวง 20 ทั้ง 4 เป้า = 80 บวกห่วงลงจอด 20)
// Drone Innovation Challenge : ซ้ายบน → ขวาบน → (กลับหัว) ขวาล่าง → ซ้ายล่าง
calibration();
takeOff();
sh(100);
fw(100); // ลอดห่วง
sh(140); // ความสูงเท่ากึ่งกลางเป้า
ml(250);
poshold(); shoot(); // เป้าซ้ายบน
mr(500);
poshold(); shoot(); // เป้าขวาบน
yaw(180); // กลับหัว หันหน้าลงใต้
fw(200);
poshold(); shoot(); // เป้าขวาล่าง
mr(500);
poshold(); shoot(); // เป้าซ้ายล่าง
yaw(180);
fw(100);
mr(250);
autoLand();ในโค้ดจริง Drone_Innovation_Challenge.ino KEY1 ยิงด้านหน้าหนึ่งครั้งแล้วถอยไปยิงด้านหลังหนึ่งครั้ง ก่อนกลับ โดยรอความสูงนิ่งด้วย holdHeight(132), wait(700), setHeight(135), wait(1500) ก่อนเรียก servoAngle ทุกครั้ง
5. เทียบสามประเภทกับงบ 150 วินาที
ส่วนต่างที่เหลือ: mission-t เหลือ 66.5 วินาที aviation-all เหลือ 60.2 วินาที innovation-four เหลือ 90.9 วินาที แต่ต้องหักส่วนต่างระหว่างตัวจำลองกับโดรนจริง (ดู วางเส้นทางและงบเวลา) ก่อนเชื่อว่าเหลือเท่านั้น
ลองทำ
- รันทั้งสามโปรแกรมในตัวจำลอง แล้วเปิดรายการคะแนนที่แสดงให้ตรงกับตัวเลขในหน้านี้
- ใน
innovation-fourเปลี่ยนsh(140)เป็นsh(150)ดูว่าคะแนนต่อเป้าลดจาก 20 เป็นเท่าไร - ใน
mission-tลบposhold()ก่อนdrop()ครั้งเดียว ดูว่าตัวจำลองเตือนหรือคะแนนเปลี่ยนไหม - เขียนแผนเทียบ: อันไหนของ
aviation-allตัดได้โดยเสียคะแนนน้อยที่สุด ถ้าเวลาเหลือไม่พอ
พังตรงไหนบ่อย
- คัดลอกโค้ดตัวจำลองไปวางใน Arduino คอมไพล์ไม่ผ่านเพราะไม่มี
reload(),drop(),pop()ใช้ตารางด้านบนแปลงก่อน - ลืมว่าคำสั่งในโค้ดจริงต่อเวลา
fw()จริงรอเพิ่ม 400 ms ทุกครั้ง - ลืมหมุนโดรนด้วยมือ ใน
mission-tต้องหมุนตัว 180° ก่อนรอบสอง ถ้าไม่หมุน แท่นที่ไปจะเป็นแท่นเดิม - ลงจอดผิดแท่นระหว่างทาง
autoLand()บนพื้นสนาม ไม่ใช่แท่น ไม่ได้ +5 คะแนน - ผูกปุ่มผิด กด KEY1 แล้วนึกว่าได้ท่าเต็ม แต่ตอนนี้ KEY1 รันเส้นทางทดสอบ (
KEY1_MODE = 2)