ระบบอัตโนมัติกับโดรน
UAT 202 พื้นฐานเทคโนโลยีระบบอัตโนมัติ
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- ออกแบบลำดับงานของสถานีเปลี่ยนแบตเตอรี่เป็น state machine ที่มีการจัดการเหตุขัดข้อง
- อธิบายการสื่อสาร Modbus TCP และสร้างคำขออ่าน holding register
- อธิบายตัวควบคุมแบบ cascade ในตัวควบคุมการบินของ PX4 และ ArduPilot
- ใช้ relay และ gripper ของ ArduPilot เพื่อเชื่อมโดรนกับอุปกรณ์อัตโนมัติ
ทำไมต้องรู้
โดรนที่ต้องบินเฝ้าระวังพื้นที่ตลอดวันต้องเปลี่ยนแบตเตอรี่เป็นระยะ ถ้าให้คนเปลี่ยนก็ต้องมีคนประจำตลอดเวลา สถานีเปลี่ยนแบตเตอรี่อัตโนมัติจึงเป็นจุดที่ระบบอัตโนมัติอุตสาหกรรม (เซนเซอร์ PLC แอคชูเอเตอร์) พบกับระบบโดรน (ตัวควบคุมการบิน ภารกิจ และลิงก์สื่อสาร) โมดูลนี้รวมทุกอย่างในวิชาเข้าด้วยกัน
ลำดับงานเป็น state machine
State machine อธิบายระบบเป็นชุดสถานะ และเหตุการณ์ที่ทำให้เปลี่ยนจากสถานะหนึ่งไปอีกสถานะหนึ่ง ภาษา SFC ใน IEC 61131-3 ออกแบบมาสำหรับงานลักษณะนี้
- 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 แบบดั้งเดิม ไม่มีการยืนยันตัวตนหรือเข้ารหัส จึงต้องอยู่ในเครือข่ายที่แยกและควบคุมการเข้าถึง ห้ามเปิดออกอินเทอร์เน็ต
ระบบอัตโนมัติในตัวโดรน
ตัวควบคุมการบินใช้วงป้อนกลับหลายชั้นซ้อนกัน (cascade) ตามแผนผังของ PX4 วงตำแหน่งสั่งความเร็ว วงความเร็วสั่งท่าทาง วงท่าทางสั่งอัตราหมุน และวงอัตราหมุนสั่งมอเตอร์ วงในทำงานเร็วกว่าวงนอก ArduPilot ใช้หลักเดียวกัน คือตัวควบคุมมุมแบบ P สร้างอัตราหมุนที่ต้องการ แล้วตัวควบคุมอัตราหมุนแบบ PID สั่งมอเตอร์
โดรนยังสั่งอุปกรณ์ภายนอกได้ด้วย ArduPilot มี relay ที่สั่งจากสวิตช์บนรีโมตหรือคำสั่ง DO_SET_RELAY ในภารกิจ และมี servo gripper ที่สั่งด้วยคำสั่ง DO_GRIPPER เช่น ปล่อยของเมื่อถึงจุดหมาย นี่คือระบบอัตโนมัติแบบเดียวกับที่เรียนมาทั้งวิชา เพียงอยู่บนอากาศยาน
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: ออกแบบสถานีเปลี่ยนแบตเตอรี่
- เขียน state machine ของสถานีด้วย SFC หรือ ST ใน CODESYS ตามภาพที่ 1 กำหนดเวลาสูงสุดของทุกสถานะ
- ทดสอบกรณีปกติ กรณีหมดเวลาในทุกสถานะ และกรณีกดหยุดฉุกเฉิน เทียบกับโค้ดตัวอย่างที่ 1
- เปิด Modbus TCP server ใน CODESYS แล้วอ่าน register ด้วยโปรแกรมบนคอมพิวเตอร์ในเครือข่ายภายในห้องปฏิบัติการ
- ใน ArduPilot SITL ตั้ง relay และสั่ง
DO_SET_RELAYในภารกิจ ดูสถานะใน log - เขียนแผนผังรวมว่าโดรน สถานี และระบบจัดการภารกิจคุยกันอย่างไร และจุดใดต้องมีการหยุดฉุกเฉิน
ข้อผิดพลาดที่พบบ่อย
ระวัง
- ไม่กำหนดเวลาสูงสุดของสถานะ ระบบค้างรอเหตุการณ์ที่ไม่มาถึง
- ออกจาก FAULT เองโดยอัตโนมัติ โดยไม่มีคนตรวจ
- เปิด Modbus ออกเครือข่ายภายนอก ทั้งที่ไม่มีการยืนยันตัวตน
- ปรับวงนอกของ cascade ก่อนวงใน ทั้งที่วงในต้องเสถียรก่อน
- ทดสอบ relay หรือ gripper บนลำจริงโดยติดใบพัด
สรุป
- State machine อธิบายลำดับงานเป็นสถานะและเหตุการณ์ และต้องมีเวลาสูงสุดกับสถานะ FAULT
- Modbus TCP ใช้พอร์ต 502 ฟังก์ชัน 03 อ่าน holding register และต้องอยู่ในเครือข่ายที่ควบคุม
- ตัวควบคุมการบินเป็นวงป้อนกลับแบบ cascade จากตำแหน่งถึงอัตราหมุน
- ArduPilot สั่ง relay และ gripper จากภารกิจได้ เชื่อมโดรนกับอุปกรณ์อัตโนมัติ
แบบฝึกตรวจความเข้าใจ
- สถานะ SWAP กำหนดเวลาสูงสุด 20 วินาที เข้าสถานะที่วินาทีที่ 2 ถ้าวินาทีที่ 25 ยังไม่เสร็จ จะเกิดอะไรขึ้น
- ฟังก์ชัน Modbus ใดใช้อ่าน holding register
- Modbus TCP ใช้พอร์ตใด
- ในตัวควบคุมแบบ cascade วงใดทำงานเร็วที่สุด
- คำสั่งใดในภารกิจของ ArduPilot ใช้สั่ง gripper
เฉลย
- เกิน 20 วินาที (ผ่านไป 23 วินาที) จึงเข้า FAULT
- ฟังก์ชัน 03
- พอร์ต 502
- วงอัตราหมุน (rate) ซึ่งเป็นวงในสุด
DO_GRIPPER
สรุปสูตรสำคัญ
| การเปลี่ยนสถานะ |
แหล่งอ้างอิงหลัก
- Modbus Organization. (2012). MODBUS application protocol specification V1.1b3. link
- PX4 Autopilot. Controller diagrams. PX4 user guide (main). link
- ArduPilot Dev Team. Copter attitude control. ArduPilot developer documentation. link
- ArduPilot Dev Team. Relay switch. ArduPilot Copter documentation. link
- ArduPilot Dev Team. Servo gripper. ArduPilot Copter documentation. link
- International Electrotechnical Commission. (2025). OPC unified architecture – Part 1: Overview and concepts (IEC 62541-1:2025). link
- International Organization for Standardization. (2015). Safety of machinery — Emergency stop function — Principles for design (ISO 13850:2015). link
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
หัวข้อที่ 2: AI และการควบคุมระบบอัตโนมัติ
เนื้อหาเจาะลึก: จาก Embedded System สู่ AI Robot และ ROS
การควบคุมแบบ cascade และการปรับจูน flight controller
เนื้อหาเจาะลึก: MQTT และ Eclipse Mosquitto สำหรับระบบโดรนและ IoT
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz