ชมรมโดรน

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();           // ลงบนแท่นเขียวอีกครั้ง = หยุดเวลา
รัน mission-t

เทียบกับโค้ดจริงของชมรม 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();           // ลงบนแท่นเขียว = หยุดเวลา
รัน aviation-all

จุดที่ต้องสังเกต: ต้องลงจอดและขึ้นบินใหม่ 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();
รัน innovation-four

ในโค้ดจริง Drone_Innovation_Challenge.ino KEY1 ยิงด้านหน้าหนึ่งครั้งแล้วถอยไปยิงด้านหลังหนึ่งครั้ง ก่อนกลับ โดยรอความสูงนิ่งด้วย holdHeight(132), wait(700), setHeight(135), wait(1500) ก่อนเรียก servoAngle ทุกครั้ง

5. เทียบสามประเภทกับงบ 150 วินาที

เวลาที่โปรแกรมตัวอย่างใช้เทียบกับงบ 150 วินาทีmission-t 83.5 วินาที aviation-all 89.8 วินาที innovation-four 59.1 วินาทีmission-t83.5 วิaviation-all89.8 วิinnovation-four59.1 วิหมดเวลา 150 วินาที075เวลาจากตัวจำลองของเว็บนี้ ไม่ใช่เวลาที่จับจากโดรนจริง
เวลาที่ตัวจำลองประเมินของแต่ละโปรแกรมเต็ม เส้นประแดงคือเส้นหมดเวลา

ส่วนต่างที่เหลือ: mission-t เหลือ 66.5 วินาที aviation-all เหลือ 60.2 วินาที innovation-four เหลือ 90.9 วินาที แต่ต้องหักส่วนต่างระหว่างตัวจำลองกับโดรนจริง (ดู วางเส้นทางและงบเวลา) ก่อนเชื่อว่าเหลือเท่านั้น

ลองทำ

  1. รันทั้งสามโปรแกรมในตัวจำลอง แล้วเปิดรายการคะแนนที่แสดงให้ตรงกับตัวเลขในหน้านี้
  2. ใน innovation-four เปลี่ยน sh(140) เป็น sh(150) ดูว่าคะแนนต่อเป้าลดจาก 20 เป็นเท่าไร
  3. ใน mission-t ลบ poshold() ก่อน drop() ครั้งเดียว ดูว่าตัวจำลองเตือนหรือคะแนนเปลี่ยนไหม
  4. เขียนแผนเทียบ: อันไหนของ aviation-all ตัดได้โดยเสียคะแนนน้อยที่สุด ถ้าเวลาเหลือไม่พอ

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

  • คัดลอกโค้ดตัวจำลองไปวางใน Arduino คอมไพล์ไม่ผ่านเพราะไม่มี reload(), drop(), pop() ใช้ตารางด้านบนแปลงก่อน
  • ลืมว่าคำสั่งในโค้ดจริงต่อเวลา fw() จริงรอเพิ่ม 400 ms ทุกครั้ง
  • ลืมหมุนโดรนด้วยมือ ใน mission-t ต้องหมุนตัว 180° ก่อนรอบสอง ถ้าไม่หมุน แท่นที่ไปจะเป็นแท่นเดิม
  • ลงจอดผิดแท่นระหว่างทาง autoLand() บนพื้นสนาม ไม่ใช่แท่น ไม่ได้ +5 คะแนน
  • ผูกปุ่มผิด กด KEY1 แล้วนึกว่าได้ท่าเต็ม แต่ตอนนี้ KEY1 รันเส้นทางทดสอบ (KEY1_MODE = 2)

On this page