โมดูล 5/5 · สัปดาห์ 13–15 · 27 ชม.

ระบบอัตโนมัติกับโดรน

UAT 202 พื้นฐานเทคโนโลยีระบบอัตโนมัติ

เวลาเรียนประมาณ 80 นาทีร่าง รอตรวจปรับปรุงล่าสุด 27 กันยายน 2569

บทเรียน

เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ

  1. ออกแบบลำดับงานของสถานีเปลี่ยนแบตเตอรี่เป็น state machine ที่มีการจัดการเหตุขัดข้อง
  2. อธิบายการสื่อสาร Modbus TCP และสร้างคำขออ่าน holding register
  3. อธิบายตัวควบคุมแบบ cascade ในตัวควบคุมการบินของ PX4 และ ArduPilot
  4. ใช้ relay และ gripper ของ ArduPilot เพื่อเชื่อมโดรนกับอุปกรณ์อัตโนมัติ

ความรู้พื้นฐานที่ควรมี: UAT 202 โมดูล 1–4

ทำไมต้องรู้

โดรนที่ต้องบินเฝ้าระวังพื้นที่ตลอดวันต้องเปลี่ยนแบตเตอรี่เป็นระยะ ถ้าให้คนเปลี่ยนก็ต้องมีคนประจำตลอดเวลา สถานีเปลี่ยนแบตเตอรี่อัตโนมัติจึงเป็นจุดที่ระบบอัตโนมัติอุตสาหกรรม (เซนเซอร์ PLC แอคชูเอเตอร์) พบกับระบบโดรน (ตัวควบคุมการบิน ภารกิจ และลิงก์สื่อสาร) โมดูลนี้รวมทุกอย่างในวิชาเข้าด้วยกัน

ลำดับงานเป็น state machine

State machine อธิบายระบบเป็นชุดสถานะ และเหตุการณ์ที่ทำให้เปลี่ยนจากสถานะหนึ่งไปอีกสถานะหนึ่ง ภาษา SFC ใน IEC 61131-3 ออกแบบมาสำหรับงานลักษณะนี้

สถานะเรียงจาก IDLE ไป LOCK ไป SWAP ไป CHECK แล้วไป RELEASE และกลับไป IDLE เส้นประสีชมพูจาก LOCK และ SWAP ไปที่ FAULT ข้อความด้านล่างเขียนว่า หมดเวลาหรือกดหยุดฉุกเฉินจะไปที่ FAULT
ภาพที่ 1 state machine ของสถานีเปลี่ยนแบตเตอรี่
  • IDLE รอโดรนลงจอด
  • LOCK ยึดโดรนเข้าตำแหน่งเมื่อเซนเซอร์เห็นโดรนบนลานจอด
  • SWAP แขนกลถอดแบตเตอรี่เก่าและใส่ก้อนใหม่
  • CHECK ตรวจว่าแบตเตอรี่ใหม่เข้าที่และแรงดันถูกต้อง
  • RELEASE ปลดล็อก ให้โดรนพร้อมขึ้นบิน
  • FAULT เมื่อขั้นใดหมดเวลาหรือมีการกดหยุดฉุกเฉิน หยุดทุกการเคลื่อนที่และรอคนตรวจ

ตัวอย่างที่ 1 จำลอง state machine ของสถานี

TIMEOUT = {"LOCK": 5, "SWAP": 20, "CHECK": 5, "RELEASE": 5}   # วินาทีสูงสุดของแต่ละสถานะ
NEXT = {("IDLE", "landed"): "LOCK", ("LOCK", "locked"): "SWAP", ("SWAP", "swapped"): "CHECK",
        ("CHECK", "voltage_ok"): "RELEASE", ("RELEASE", "released"): "IDLE"}


def run(events):
    state, entered = "IDLE", 0
    for t, event in events:
        if event == "estop" or (state in TIMEOUT and t - entered > TIMEOUT[state]):
            reason = "E-stop" if event == "estop" else f"timeout in {state}"
            print(f"t={t:>3} s  {state:<8} -> FAULT ({reason})")
            return "FAULT"
        new = NEXT.get((state, event))
        if new:
            print(f"t={t:>3} s  {state:<8} -> {new:<8} on '{event}'")
            state, entered = new, t
    return state


print("final:", run([(0, "landed"), (2, "locked"), (15, "swapped"), (17, "voltage_ok"), (19, "released")]))
print("final:", run([(0, "landed"), (2, "locked"), (30, "swapped")]))
t=  0 s  IDLE     -> LOCK     on 'landed'
t=  2 s  LOCK     -> SWAP     on 'locked'
t= 15 s  SWAP     -> CHECK    on 'swapped'
t= 17 s  CHECK    -> RELEASE  on 'voltage_ok'
t= 19 s  RELEASE  -> IDLE     on 'released'
final: IDLE
t=  0 s  IDLE     -> LOCK     on 'landed'
t=  2 s  LOCK     -> SWAP     on 'locked'
t= 30 s  SWAP     -> FAULT (timeout in SWAP)
final: FAULT

รอบแรกเปลี่ยนแบตเตอรี่สำเร็จใน 19 วินาที รอบที่สองแขนกลใช้เวลาเกิน 20 วินาทีที่กำหนด สถานีจึงเข้า FAULT แทนที่จะปล่อยโดรนพร้อมแบตเตอรี่ที่อาจยังไม่เข้าที่ การกำหนดเวลาสูงสุดของทุกสถานะทำให้ระบบไม่ค้างโดยไม่มีใครรู้

Modbus: ภาษากลางของอุปกรณ์

ระบบจัดการภารกิจของโดรนต้องถาม PLC ของสถานีว่าพร้อมหรือไม่ Modbus เป็นโพรโทคอลอุตสาหกรรมที่ใช้แพร่หลาย ข้อมูลเก็บเป็น coil (บิต) และ register (ค่า 16 บิต) ตามข้อกำหนด Modbus V1.1b3 แบบ TCP ใช้พอร์ต 502 ฟังก์ชัน 01 อ่าน coil และฟังก์ชัน 03 อ่าน holding register ส่วน OPC UA (IEC 62541) เป็นมาตรฐานรุ่นใหม่ที่มีโครงสร้างข้อมูลและความปลอดภัยครบกว่า

ตัวอย่างที่ 2 สร้างคำขอ Modbus TCP

อ่าน holding register สองตัวเริ่มที่ตำแหน่ง 0 (เช่น สถานะสถานีและจำนวนแบตเตอรี่ที่พร้อม) จากอุปกรณ์หมายเลข 1

import struct

transaction_id, protocol_id, unit_id = 1, 0, 1
function_code, start_address, quantity = 3, 0, 2
pdu = struct.pack(">BHH", function_code, start_address, quantity)   # function + ข้อมูล
mbap = struct.pack(">HHHB", transaction_id, protocol_id, len(pdu) + 1, unit_id)
frame = mbap + pdu
print("request bytes:", frame.hex(" "))
print("length:", len(frame), "bytes; send to TCP port 502")
request bytes: 00 01 00 00 00 06 01 03 00 00 00 02
length: 12 bytes; send to TCP port 502

หกไบต์แรกคือส่วนหัว MBAP (หมายเลขรายการ โพรโทคอล และความยาว) ตามด้วยหมายเลขอุปกรณ์ แล้วจึงเป็นฟังก์ชัน 03 ตำแหน่งเริ่ม และจำนวน Modbus แบบดั้งเดิม ไม่มีการยืนยันตัวตนหรือเข้ารหัส จึงต้องอยู่ในเครือข่ายที่แยกและควบคุมการเข้าถึง ห้ามเปิดออกอินเทอร์เน็ต

ระบบอัตโนมัติในตัวโดรน

ห้ากล่องเรียงจากซ้ายไปขวา ตำแหน่งแบบ P ความเร็วแบบ PID ท่าทางแบบ P อัตราหมุนแบบ PID แล้วไปมอเตอร์ ด้านบนเขียนว่า วงนอกช้าไปวงในเร็ว
ภาพที่ 2 ตัวควบคุมแบบ cascade ของโดรนหลายใบพัด

ตัวควบคุมการบินใช้วงป้อนกลับหลายชั้นซ้อนกัน (cascade) ตามแผนผังของ PX4 วงตำแหน่งสั่งความเร็ว วงความเร็วสั่งท่าทาง วงท่าทางสั่งอัตราหมุน และวงอัตราหมุนสั่งมอเตอร์ วงในทำงานเร็วกว่าวงนอก ArduPilot ใช้หลักเดียวกัน คือตัวควบคุมมุมแบบ P สร้างอัตราหมุนที่ต้องการ แล้วตัวควบคุมอัตราหมุนแบบ PID สั่งมอเตอร์

โดรนยังสั่งอุปกรณ์ภายนอกได้ด้วย ArduPilot มี relay ที่สั่งจากสวิตช์บนรีโมตหรือคำสั่ง DO_SET_RELAY ในภารกิจ และมี servo gripper ที่สั่งด้วยคำสั่ง DO_GRIPPER เช่น ปล่อยของเมื่อถึงจุดหมาย นี่คือระบบอัตโนมัติแบบเดียวกับที่เรียนมาทั้งวิชา เพียงอยู่บนอากาศยาน

ปฏิบัติการประจำโมดูล

ปฏิบัติการ: ออกแบบสถานีเปลี่ยนแบตเตอรี่

  1. เขียน state machine ของสถานีด้วย SFC หรือ ST ใน CODESYS ตามภาพที่ 1 กำหนดเวลาสูงสุดของทุกสถานะ
  2. ทดสอบกรณีปกติ กรณีหมดเวลาในทุกสถานะ และกรณีกดหยุดฉุกเฉิน เทียบกับโค้ดตัวอย่างที่ 1
  3. เปิด Modbus TCP server ใน CODESYS แล้วอ่าน register ด้วยโปรแกรมบนคอมพิวเตอร์ในเครือข่ายภายในห้องปฏิบัติการ
  4. ใน ArduPilot SITL ตั้ง relay และสั่ง DO_SET_RELAY ในภารกิจ ดูสถานะใน log
  5. เขียนแผนผังรวมว่าโดรน สถานี และระบบจัดการภารกิจคุยกันอย่างไร และจุดใดต้องมีการหยุดฉุกเฉิน

ข้อผิดพลาดที่พบบ่อย

ระวัง

  • ไม่กำหนดเวลาสูงสุดของสถานะ ระบบค้างรอเหตุการณ์ที่ไม่มาถึง
  • ออกจาก FAULT เองโดยอัตโนมัติ โดยไม่มีคนตรวจ
  • เปิด Modbus ออกเครือข่ายภายนอก ทั้งที่ไม่มีการยืนยันตัวตน
  • ปรับวงนอกของ cascade ก่อนวงใน ทั้งที่วงในต้องเสถียรก่อน
  • ทดสอบ relay หรือ gripper บนลำจริงโดยติดใบพัด

สรุป

  • State machine อธิบายลำดับงานเป็นสถานะและเหตุการณ์ และต้องมีเวลาสูงสุดกับสถานะ FAULT
  • Modbus TCP ใช้พอร์ต 502 ฟังก์ชัน 03 อ่าน holding register และต้องอยู่ในเครือข่ายที่ควบคุม
  • ตัวควบคุมการบินเป็นวงป้อนกลับแบบ cascade จากตำแหน่งถึงอัตราหมุน
  • ArduPilot สั่ง relay และ gripper จากภารกิจได้ เชื่อมโดรนกับอุปกรณ์อัตโนมัติ

แบบฝึกตรวจความเข้าใจ

  1. สถานะ SWAP กำหนดเวลาสูงสุด 20 วินาที เข้าสถานะที่วินาทีที่ 2 ถ้าวินาทีที่ 25 ยังไม่เสร็จ จะเกิดอะไรขึ้น
  2. ฟังก์ชัน Modbus ใดใช้อ่าน holding register
  3. Modbus TCP ใช้พอร์ตใด
  4. ในตัวควบคุมแบบ cascade วงใดทำงานเร็วที่สุด
  5. คำสั่งใดในภารกิจของ ArduPilot ใช้สั่ง gripper
เฉลย
  1. เกิน 20 วินาที (ผ่านไป 23 วินาที) จึงเข้า FAULT
  2. ฟังก์ชัน 03
  3. พอร์ต 502
  4. วงอัตราหมุน (rate) ซึ่งเป็นวงในสุด
  5. DO_GRIPPER

สรุปสูตรสำคัญ

การเปลี่ยนสถานะ

แหล่งอ้างอิงหลัก

  1. Modbus Organization. (2012). MODBUS application protocol specification V1.1b3. link
  2. PX4 Autopilot. Controller diagrams. PX4 user guide (main). link
  3. ArduPilot Dev Team. Copter attitude control. ArduPilot developer documentation. link
  4. ArduPilot Dev Team. Relay switch. ArduPilot Copter documentation. link
  5. ArduPilot Dev Team. Servo gripper. ArduPilot Copter documentation. link
  6. International Electrotechnical Commission. (2025). OPC unified architecture – Part 1: Overview and concepts (IEC 62541-1:2025). link
  7. International Organization for Standardization. (2015). Safety of machinery — Emergency stop function — Principles for design (ISO 13850:2015). link

อ่านเพิ่มเติม

ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล

พร้อมใช้D11D02

หัวข้อที่ 2: AI และการควบคุมระบบอัตโนมัติ

สรุปเนื้อหาหัวข้อที่ 2: การเขียนโปรแกรมโดรนแบบบล็อก (BlockCode) ภารกิจ Waypoint อัตโนมัติ AI และ Computer Vision การเทรน Object Detection ด้วย YOLO/Ultralytics และการประยุกต์ Aerial Mapping & GIS
พร้อมใช้D04D12

เนื้อหาเจาะลึก: จาก Embedded System สู่ AI Robot และ ROS

จาก Embedded System สู่ AI Robot: เหตุผลที่ระบบฝังตัวต้องมี AI ฮาร์ดแวร์ Edge AI (Jetson, Kria, Raspberry Pi) กล้องและ Sensor Fusion แนวคิด ROS Node/Topic และสถาปัตยกรรมครบวงจรที่เชื่อมกลับสู่ MQTT
อยู่ระหว่างพัฒนาD06

การควบคุมแบบ cascade และการปรับจูน flight controller

rate/attitude/position loop, filter, และการอ่าน log เพื่อจูน
พร้อมใช้D07D02

เนื้อหาเจาะลึก: MQTT และ Eclipse Mosquitto สำหรับระบบโดรนและ IoT

เจาะลึก MQTT Publish-Subscribe และ Eclipse Mosquitto สำหรับโดรนและ IoT: การปิดช่องโหว่ด้วย TLS และ Dynamic Security Plugin การใช้กับ ROS 2 จุดเชื่อมกับ ChirpStack และเครื่องมือทดสอบ MQTT.fx

ในชั้นเรียน / ภาคสนาม

ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย

หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz

แบบทดสอบประจำโมดูล

แบบทดสอบนี้ใช้ตรวจความเข้าใจ (formative) ไม่ใช่การสอบเก็บคะแนน

โดเมนความรู้: ปัญญาประดิษฐ์และคอมพิวเตอร์วิทัศน์ · การเขียนโปรแกรมและเทคโนโลยีดิจิทัล · การสำรวจ ทำแผนที่ และภูมิสารสนเทศ · เซนเซอร์และระบบสมองกลฝังตัว · ระบบอัตโนมัติ หุ่นยนต์ และฝูงโดรน · การควบคุม ออโตไพลอต และการนำทาง · การสื่อสาร เครือข่าย และ IoT