ตัวอย่างการเขียนโปรแกรมโดรน Hula 5 ระดับ

5 โปรแกรมตัวอย่างสำหรับแอป Hula ตั้งแต่บินตรงแล้วลงจอด สี่เหลี่ยมด้วยลูป Repeat ดาว 5 แฉกพร้อมไฟ เลี่ยงสิ่งกีดขวางด้วยเซนเซอร์และตัวแปร ไปจนถึงภารกิจค้นหา QR Code แบบหลายเธรดขนาน พร้อมคำอธิบายทีละบรรทัด

หมวดทั้งหมด

5 ตัวอย่างตั้งแต่ระดับเริ่มต้นจนถึงซับซ้อนสูง พร้อมคำอธิบายละเอียด — แตะหัวข้อเพื่อดู/ซ่อนรายละเอียด แต่ละตัวอย่างต่อยอดจากตัวอย่างก่อนหน้า

ฝึกคำนวณมุม ระยะทาง และค่าคลาดเคลื่อนของโปรแกรม ↓

#1

บินตรงไปข้างหน้าแล้วลงจอด

ระดับ 1 · เริ่มต้น
โดรนฝึกบินตามเส้นตรงระหว่างจุดเริ่มและจุดลงจอดในสนามตาข่าย
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ
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 · เบื้องต้น
โดรนบินเหนือเส้นทางสี่เหลี่ยมสำหรับฝึกคำสั่ง Repeat สี่รอบ
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ
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 · ปานกลาง
โดรนติดไฟสีเขียวเหนือเส้นทางดาวห้าแฉกไขว้กลางในพื้นที่ฝึกบิน
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ
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 · ซับซ้อน
โดรนฝึกตรวจสิ่งกีดขวางใกล้เสาโฟมนุ่มในพื้นที่ทดลอง
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ
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 · สูงมาก
โดรนติดกล้องค้นหาป้าย QR ในสนามฝึก ข้างคอมพิวเตอร์แสดงโปรแกรมสองชุด
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ
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) ซึ่งเกินกว่าการต่อบล็อกบินทั่วไปมาก

สูตรและแบบฝึกเพิ่มเติม · ปรับปรุง 2026-09-26

F40: ต้องเลี้ยวกี่องศา และใกล้เป้าหมายพอหรือยัง

นี่คือการสาธิตคณิตศาสตร์แบบระนาบอุดมคติสำหรับอ่านลูป Hula ไม่ใช่การรับรองเส้นทางบินจริง กำหนดเดินเส้นตรงยาวเท่ากันแล้วเลี้ยวทิศเดียวกันทุกครั้ง

turnconvex = 360°/n; turnstar = 360°k/n

distance = Σ segmenti; position_pass = |x − target| ≤ ε

angle_error = ((actual − target + 180°) mod 360°) − 180°; angle_pass = |angle_error| ≤ εangle

ตัวแปร ความหมายและหน่วย ช่วงและแหล่งค่า
n จำนวนจุดยอด จุด; input จำนวนเต็ม ≥ 3 จากรูปที่ออกแบบ
k จำนวนจุดที่ก้าวข้ามในวงจุดยอด ไม่มีหน่วย; input รูปนูน k=1; ดาว 1<k<n/2 และ gcd(n,k)=1 สำหรับวงเดียว
turn มุมเลี้ยวภายนอก deg; output 360k/n; กำหนดเครื่องหมายซ้าย/ขวาตาม API จริง
segment_i, distance ระยะแต่ละช่วงและระยะรวม cm หรือ m; input/output ≥ 0 finite; แปลงเป็นหน่วยเดียวก่อนรวม
x, target ตำแหน่งหนึ่งแกน cm; input finite จากโจทย์หรือการวัดใน frame เดียวกัน
ε ระยะยอมรับ cm; input ≥ 0 จากข้อกำหนดโจทย์ ไม่ใช่ความแม่นยำที่รับรอง
actual, target_angle มุมที่วัดและมุมเป้าหมาย deg; input finite; target ในสมการ angle_error หมายถึง target_angle
angle_error, ε_angle ความคลาดเคลื่อนมีเครื่องหมายและเกณฑ์ deg; output/input error อยู่ [−180,180); 0 ≤ ε_angle ≤ 180

สี่เหลี่ยมเลี้ยว 90 องศาและดาวห้าแฉกเดินข้ามทีละสองจุดเลี้ยว 144 องศา

คำอธิบายภาพ: รูปซ้ายเดิน 4 ด้านเท่ากันแล้วเลี้ยว 90° ต่อครั้ง รูปขวาดาว {5/2} เชื่อมจุดลำดับ 0→2→4→1→3→0 และเลี้ยว 144° ต่อครั้ง

ตัวอย่างและข้อจำกัดของลูป

สี่เหลี่ยม n=4, k=1 ได้มุม 90° ด้านละ 100 cm รวม 400 cm ดาว {5/2} ได้ 360×2/5 = 144° รวมมุมเลี้ยว 5×144 = 720° ไม่ใช่ 360° หาก n และ k ไม่เป็นจำนวนเฉพาะสัมพัทธ์ เช่น {6/2} จะกลับจุดแรกหลัง 3 ช่วงและได้วงสามเหลี่ยมหนึ่งวง ไม่ใช่เดินครบทั้ง 6 จุดในวงเดียว สูตรนี้เป็นการอนุมานเรขาคณิตที่ผู้เขียนจัดทำ ไม่ใช่สเปก Hula

ตำแหน่ง x=99, target=100 cm, ε=2 cm ได้ |99−100|=1 cm จึงผ่าน ส่วน actual=359°, target=1° ได้ error = −2° หลัง wrap จึงผ่านเกณฑ์ 3° เครื่องหมายเก็บทิศความคลาดเคลื่อน; ใช้ค่าสัมบูรณ์เฉพาะทดสอบขนาด ไม่ใช้ abs แทนคำสั่งเลี้ยว signed angle

นิยาม mod ในบทนี้คืนค่า [0,360) เสมอ ใน JavaScript ต้องใช้ ((value % 360) + 360) % 360 เมื่อ value อาจติดลบ ที่ต่างกันพอดี 180° เลือก −180° ตามช่วงที่ประกาศ กรณีหลายแกนต้องกำหนด norm หรือเกณฑ์รายแกนเพิ่ม ไม่ตีความสูตรหนึ่งแกนเป็นรัศมี 3D

ค่า speed เป็น เปอร์เซ็นต์คำสั่ง ไม่ใช่ m/s จึงใช้คำนวณระยะจากเวลาไม่ได้จนกว่าจะมีข้อมูลรุ่นและการสอบเทียบ อ่านพฤติกรรมคำสั่งจาก คู่มือ Hula ควบคู่กับตัวอย่างในหน้านี้ ตรวจขอบเขตบท 26 กันยายน 2569; แบบฝึกนี้ไม่อ้างผลการบินหรือความคลาดเคลื่อนของอุปกรณ์จริง

แบบฝึกเปลี่ยนตัวแปร

เปลี่ยนจำนวนด้านจาก 4 เป็น 6 โดยคงด้านละ 100 cm จะเลี้ยวและเดินรวมเท่าใด? เปลี่ยน actual เป็น 355° โดยคง target=1° และเกณฑ์ 3° จะผ่านหรือไม่?

เฉลย F40

360/6 = 60° และ 6×100 = 600 cm; error = −6° จึงไม่ผ่านเกณฑ์ |−6|≤3 ยอมรับคำตอบเชิงเลข ±0.001° หรือ cm ส่วนผลตรรกะต้องตรง

ดาวน์โหลดชุดฝึกสูตรประยุกต์ (CSV/JSON พร้อมเฉลย)

อ้างอิง ถอดความและจัดหมวดจาก Hula User Manual (HighGreat) ให้เข้ากับธีมและชุดไอคอนของคลังความรู้นี้ — ข้อมูลพารามิเตอร์และข้อจำกัดอ้างอิงตามคู่มือฉบับผู้ใช้ โปรดตรวจสอบกับเวอร์ชันแอปที่ใช้งานจริง

ใช้ในรายวิชา

วิธีอ้างอิงหน้านี้

สถาบันโดรน มหาวิทยาลัยรังสิต. (2569). ตัวอย่างการเขียนโปรแกรมโดรน Hula 5 ระดับ. ใน คลังความรู้หลักสูตร ทล.บ. เทคโนโลยีระบบอากาศยานไร้คนขับ. https://rsu-drt.pk-research.work/th/kb/hula/examples/

ต้นฉบับจากคลังความรู้โดรน: https://drone.pk-research.work/hula/examples/ · © PK-Research