หมวดทั้งหมด #1
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ #2
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ #3
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ #4
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ #5
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ
ตัวอย่างโปรแกรม
ตัวอย่างการเขียนโปรแกรมโดรน Hula 5 ระดับ
5 ตัวอย่างตั้งแต่ระดับเริ่มต้นจนถึงซับซ้อนสูง พร้อมคำอธิบายละเอียด — แตะหัวข้อเพื่อดู/ซ่อนรายละเอียด แต่ละตัวอย่างต่อยอดจากตัวอย่างก่อนหน้า
#1 บินตรงไปข้างหน้าแล้วลงจอด
ระดับ 1 · เริ่มต้น
Events Flight order
when [▶] clicked
Take off
Fly to Front with 100 cm Speed 50%
Landing
โครงสร้างพื้นฐานที่สุดของทุกโปรแกรมใน Hula ประกอบด้วยแค่ 2 หมวด: Events (จุดเริ่ม) และ Flight order (การบิน)
กฎเหล็ก 2 ข้อที่ต้องจำขึ้นใจ: (1) ต้องมี Take off ก่อนคำสั่งบินอื่นเสมอ และ (2) ต้องปิดท้ายด้วย Landing เสมอ — ถ้าลืม Landing โดรนจะค้างลอยอยู่กลางอากาศจนกว่าจะสั่งลงจอดเองผ่านแอป
ที่ความเร็ว 50% (คิดเป็น 0.5 m/s) กับระยะ 100 ซม. โดรนจะใช้เวลาบินประมาณ 2 วินาที เหมาะเป็นโปรแกรมทดสอบตัวแรกเพื่อเช็คว่าเชื่อมต่อโดรนและรันบล็อกได้ถูกต้อง ก่อนไปเขียนโปรแกรมที่ซับซ้อนขึ้น
#2 บินเป็นรูปสี่เหลี่ยมจัตุรัสด้วยลูป Repeat
ระดับ 2 · เบื้องต้น
Events Flight order Control
when [▶] clicked
Take off
Repeat [4] times
Fly to Front with 60 cm Speed 50%
Turn to Clockwise with 90 degree
Landing
ต่อยอดจากตัวอย่างที่ 1 ด้วยการแนะนำหมวด Control เป็นครั้งแรก — บล็อก Repeat [n] times
แทนที่จะต่อบล็อก Fly + Turn ด้วยมือ 4 ชุด (รวม 8 บล็อก) เราใช้ลูปแทน เหลือแค่ 2 บล็อกข้างในลูป ข้อดีคือถ้าจะเปลี่ยนขนาดสี่เหลี่ยม แก้แค่ตัวเลขในบล็อก Fly ตัวเดียว ไม่ต้องไล่แก้ทีละบล็อก
หลักคณิตศาสตร์ที่ใช้: มุมรวมที่ต้องเลี้ยวให้ครบวงคือ 360° เสมอ (สำหรับรูปหลายเหลี่ยมนูนทั่วไป) หารด้วยจำนวนด้าน n จึงได้มุมเลี้ยวต่อจุด — สี่เหลี่ยม 4 ด้าน → 360/4 = 90° นี่คือฐานความเข้าใจที่ใช้ต่อยอดไปคำนวณรูปดาวในตัวอย่างถัดไป
#3 บินเป็นรูปดาว 5 แฉกไขว้กลาง พร้อมไฟกระพริบ
ระดับ 3 · ปานกลาง
Events Flight order Control Multimedia (ไฟ)
when [▶] clicked
Take off (ไฟ steady on สีเขียว)
Repeat [5] times
Fly to Front with 50 cm Speed 50% (ไฟ flash)
Turn to Clockwise with 144 degree
Landing
ต่อยอดจากตัวอย่างที่ 2 ด้วยโจทย์ที่ซับซ้อนขึ้น: รูปดาว 5 แฉกไขว้กลาง (pentagram) มุมเลี้ยวไม่ใช่ 360/5 = 72° แบบห้าเหลี่ยมธรรมดา แต่ต้องเป็น 144° เพราะเส้นบินไขว้ตัวเอง (self-intersecting) ทำให้มุมเลี้ยวสะสมทั้งหมดต้องครบ 720° ไม่ใช่ 360°
จุดที่ต่างจากตัวอย่างก่อนหน้าคือการฝังบล็อกไฟไว้ในกล่องขาวท้ายบล็อก Take off และ Fly to Front — ไฟไม่ได้เป็นบล็อกแยกอิสระ แต่เป็นพารามิเตอร์เสริมที่ผูกกับช่วงเวลาของบล็อกบินนั้นโดยตรง ทำให้เห็นทิศทางการบินชัดเจนขึ้นเมื่อบินในที่แสงน้อย
นี่คือตัวอย่างที่แสดงว่าหมวด Flight order กับ Multimedia (แสง) ไม่ได้แยกจากกันเสมอไป บางบล็อกก็ผสานเข้าด้วยกันในตัวเดียว
#4 บินสำรวจ เลี่ยงสิ่งกีดขวางอัตโนมัติ นับจำนวนครั้งและยิงเตือน
ระดับ 4 · ซับซ้อน
Events Flight order Sensor Control Variables Laser
when [▶] clicked
Turn on obstacle avoidance
Set [จำนวนครั้งที่เจอสิ่งกีดขวาง] to 0
Take off
repeat until [จำนวนครั้งที่เจอสิ่งกีดขวาง = 3]
Fly to Front with 30 cm Speed 40%
if [Return "true" if obstacle Front] then
Turn to Clockwise with 90 degree
change [จำนวนครั้งที่เจอสิ่งกีดขวาง] by 1
if [จำนวนครั้งที่เจอสิ่งกีดขวาง = 3] then
Lasing 5 times at 2 Hz
Landing
ตัวอย่างแรกที่ผสาน 5 หมวดเข้าด้วยกันอย่างจริงจัง: Sensor (ตรวจจับสิ่งกีดขวาง), Variables (นับจำนวนครั้งสะสม), Control (if ซ้อน if และ repeat until), Laser (ยิงเตือนเมื่อครบเกณฑ์) และ Flight order (การเคลื่อนที่)
จุดสำคัญที่ต่างจาก Repeat n times: เราไม่รู้ล่วงหน้าว่าจะเจอสิ่งกีดขวางกี่ครั้งกว่าจะครบ 3 ครั้ง จึงต้องใช้ repeat until [เงื่อนไข] แทนการกำหนดจำนวนรอบตายตัว
สังเกตการซ้อน if ภายใน if: if แรกเช็คว่าเจอสิ่งกีดขวางหรือไม่ (ถ้าเจอ ให้เลี้ยวหลบและนับเพิ่ม) if ที่สองซ้อนอยู่ข้างในเช็คว่าค่าตัวแปรถึง 3 หรือยัง (ถ้าถึง ค่อยยิงเลเซอร์เตือน) — ถ้าไม่ซ้อนแบบนี้ เลเซอร์จะยิงทุกครั้งที่เจอสิ่งกีดขวางแทนที่จะยิงเฉพาะครั้งที่ครบเกณฑ์
ข้อควรระวัง: กฎ "ห้ามใช้ = เทียบค่าพิกัดขณะบินแบบเรียลไทม์" จากหมวด Sensor ใช้กับค่าจากเซนเซอร์โดยตรงเท่านั้น (เช่น current coordinate) ส่วนตัวแปรที่เราควบคุมค่าเองผ่าน Set/change แบบในตัวอย่างนี้ เทียบด้วย = ได้ตามปกติ เพราะค่าเปลี่ยนเฉพาะตอนที่โปรแกรมสั่งเปลี่ยนเท่านั้น ไม่ใช่ค่าที่ไหลมาจากฮาร์ดแวร์แบบต่อเนื่อง
#5 ภารกิจค้นหาและยิงเป้าหมาย QR Code แบบหลายเธรดขนาน
ระดับ 5 · สูงมาก
Events Flight order Sensor AI-Recognition Laser Control Variables
สคริปต์ที่ 1 — เธรดควบคุมการบิน
when [▶] clicked
Turn on obstacle avoidance
Set [เป้าหมายที่ยิงแล้ว] to 0
Take off
broadcast [เริ่มภารกิจ]
repeat until [เป้าหมายที่ยิงแล้ว = 3]
Fly to Front with 40 cm Speed 40%
if [Return "true" if obstacle Front] then
Turn to Clockwise with 90 degree
Landing
stop [all scripts]
สคริปต์ที่ 2 — เธรดค้นหาและยิงเป้าหมาย (ทำงานขนาน)
when I receive [เริ่มภารกิจ]
repeat until [เป้าหมายที่ยิงแล้ว = 3]
[Front camera] Recognize QR code [0]
if [Return the result of Recognize] then
Turn to Clockwise with 180 degree
Lasing 3 times at 2 Hz
change [เป้าหมายที่ยิงแล้ว] by 1
wait 1 seconds
นี่คือตัวอย่างระดับสูงสุดที่รวมเกือบทุกหมวดเข้าด้วยกัน และเป็นตัวอย่างเดียวที่ใช้ 2 สคริปต์ทำงาน "ขนานกัน" (parallel threads) แทนที่จะเป็นลำดับเดียวยาวๆ
ทำไมต้องแยก 2 สคริปต์: การบินสำรวจ (movement) กับการค้นหา QR code (recognition) เป็นงานที่ต้องเกิดขึ้นพร้อมกัน ไม่ใช่ทำสลับกันทีละขั้น ถ้าใส่ในสคริปต์เดียวเรียงลำดับ โดรนจะต้องหยุดนิ่งรอผลการจดจำทุกครั้งก่อนบินต่อ ทำให้ค้นหาช้ามากและไม่สมจริง
กลไกที่ทำให้ 2 สคริปต์เริ่มพร้อมกัน: broadcast [เริ่มภารกิจ] ในสคริปต์ที่ 1 จุดชนวนให้ when I receive [เริ่มภารกิจ] ในสคริปต์ที่ 2 เริ่มทำงานทันที เป็นกลไกเดียวใน Hula ที่ทำหน้าที่คล้าย multi-threading เบื้องต้น
ตัวแปรร่วม (shared variable): [เป้าหมายที่ยิงแล้ว] ถูกอ่าน/เขียนโดยทั้ง 2 สคริปต์พร้อมกัน สคริปต์ 2 เพิ่มค่าทุกครั้งที่ยิงโดนเป้าหมาย ส่วนสคริปต์ 1 คอยเช็คค่านี้เพื่อรู้ว่าเมื่อไหร่ภารกิจเสร็จแล้วค่อยลงจอด — เป็นวิธีเดียวที่ 2 เธรดสื่อสารสถานะระหว่างกันได้ในแอปนี้
ข้อจำกัดฮาร์ดแวร์ที่ต้องระวัง: กฎ mutual exclusion ของหมวด AI-Recognition ระบุว่าห้ามมีบล็อกจดจำมากกว่า 1 ตัวทำงานพร้อมกัน ดังนั้นสคริปต์ค้นหาจึงใช้บล็อกจดจำ QR code เพียงตัวเดียวต่อรอบลูป ไม่ใส่บล็อกจดจำซ้อนกันหลายตัว
stop [all scripts] ท้ายสคริปต์ที่ 1: เป็น safety pattern ป้องกันเธรดค้าง (dangling thread) เผื่อกรณีสคริปต์ 2 ยังทำงานช้ากว่าที่คาดไว้ตอนที่ภารกิจควรจบแล้ว — เป็นแนวคิดระดับวิศวกรรมซอฟต์แวร์ ไม่ใช่แค่การต่อบล็อกบินทั่วไป
เหตุผลที่จัดเป็นระดับสูงสุด: ต้องคิดพร้อมกันทั้งเรื่อง concurrency (การทำงานคู่ขนาน) การแชร์สถานะข้ามเธรด ข้อจำกัดของฮาร์ดแวร์กล้อง และการจัดการกรณีขอบ (edge case) ซึ่งเกินกว่าการต่อบล็อกบินทั่วไปมาก
อ้างอิง ถอดความและจัดหมวดจาก Hula User Manual (HighGreat) ให้เข้ากับธีมและชุดไอคอนของคลังความรู้นี้ — ข้อมูลพารามิเตอร์และข้อจำกัดอ้างอิงตามคู่มือฉบับผู้ใช้ โปรดตรวจสอบกับเวอร์ชันแอปที่ใช้งานจริง