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

วางแผนการบูรณาการ

UAT 302 การติดตั้งและประกอบรวมระบบอากาศยานไร้คนขับ

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

บทเรียน

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

  1. เขียนบัญชีส่วนต่อประสาน (interface register) ของระบบที่จะประกอบ
  2. จัดลำดับการติดตั้งจากกราฟความขึ้นต่อกัน และหาเส้นทางวิกฤต
  3. จัดสรรพอร์ตอนุกรมและที่อยู่ I2C ของตัวควบคุมการบิน และตรวจหาความขัดแย้งด้วยโปรแกรม
  4. วางเกณฑ์ทดสอบของแต่ละขั้นก่อนต่อขั้นถัดไป

ความรู้พื้นฐานที่ควรมี: UAT 204 (อินเทอร์เฟซอนุกรม) · UAT 321 (ปฏิบัติการติดตั้งและบูรณาการ)

ทำไมต้องรู้

วิชานี้เป็นวิชาปฏิบัติการ ตลอดวิชาใช้กรณีเดียว: ทีมนักศึกษาประกอบ โดรนสำรวจสี่ใบพัดแบตเตอรี่ 6S จากชิ้นส่วน ใช้ตัวควบคุมการบินตระกูล Pixhawk กับ ArduPilot มี GNSS พร้อมเข็มทิศ วิทยุ telemetry เครื่องรับวิทยุบังคับ คอมพิวเตอร์บนลำ และกล้องสั่งถ่ายภาพ ปัญหาที่พบบ่อยที่สุดของการประกอบไม่ใช่ชิ้นส่วนเสีย แต่เป็นการต่อผิดพอร์ต ตั้งค่าไม่ตรงกัน และติดตั้งผิดลำดับจนต้องรื้อ หน่วยความรู้เรื่องออกแบบและประกอบรวมระบบของคลังความรู้โดรนแนะนำให้เขียนข้อกำหนดการเชื่อมต่อที่ตรวจสอบได้ก่อนลงมือ ตัวเลขในโมดูลเป็นข้อมูลสมมติ ยกเว้นค่าที่อ้างจากเอกสาร

บัญชีส่วนต่อประสาน

คู่มือวิศวกรรมระบบของ NASA และ INCOSE ให้บันทึกทุกส่วนต่อประสานก่อนบูรณาการ สำหรับโดรนหนึ่งลำ แต่ละแถวของ บัญชีส่วนต่อประสาน ควรมีอย่างน้อย: อุปกรณ์สองฝั่ง พอร์ตหรือขั้วต่อ ชนิดสัญญาณและโพรโทคอล ระดับแรงดัน อัตราข้อมูล กระแสที่ใช้ และพารามิเตอร์ที่ต้องตั้ง บัญชีนี้คือสิ่งที่ UAT 321 เรียกว่าบัญชีการเชื่อมต่อ ในวิชานี้จะใช้โปรแกรมตรวจมันด้วย

ลำดับการติดตั้ง

การติดตั้งบางอย่างต้องทำก่อนอย่างอื่น เช่น ต้องมีระบบจ่ายไฟและตัวควบคุมการบินก่อนจึงทดสอบ GNSS ได้ ลำดับเหล่านี้เขียนเป็น กราฟความขึ้นต่อกัน แล้วเรียงงานด้วย topological sort ซึ่งรับประกันว่าทุกงานมาหลังงานที่ต้องเสร็จก่อน ถ้ามีคนทำงานขนานกันได้ เส้นทางที่ยาวที่สุดในกราฟคือ เส้นทางวิกฤต ซึ่งกำหนดเวลาเสร็จเร็วที่สุด

กราฟความขึ้นต่อกันของงานติดตั้ง ระบบจ่ายไฟไปตัวควบคุมการบิน จากตัวควบคุมการบินแยกไปเครื่องรับวิทยุ GNSS เข็มทิศ วิทยุ telemetry ESC และมอเตอร์ และคอมพิวเตอร์บนลำ คอมพิวเตอร์บนลำไปกล้อง เส้นทางวิกฤตระบบจ่ายไฟ ตัวควบคุมการบิน คอมพิวเตอร์บนลำ และกล้องเป็นสีชมพู
ภาพที่ 1 กราฟความขึ้นต่อกันของงานติดตั้ง

ตัวอย่างที่ 1 เรียงลำดับงานและหาเส้นทางวิกฤต

tasks = {   # งาน: (ชั่วโมง, งานที่ต้องเสร็จก่อน)
    "power distribution": (3, []),
    "flight controller": (2, ["power distribution"]),
    "RC receiver": (1, ["flight controller"]),
    "GNSS + compass": (2, ["flight controller"]),
    "telemetry radio": (1, ["flight controller"]),
    "ESCs + motors": (3, ["power distribution", "flight controller"]),
    "companion computer": (3, ["power distribution", "flight controller"]),
    "camera trigger": (2, ["companion computer", "flight controller"]),
}

indeg = {t: len(p) for t, (_, p) in tasks.items()}
order, ready = [], [t for t, d in indeg.items() if d == 0]
while ready:
    t = ready.pop(0)
    order.append(t)
    for u, (_, pred) in tasks.items():
        if t in pred:
            indeg[u] -= 1
            if indeg[u] == 0:
                ready.append(u)
assert len(order) == len(tasks), "dependency cycle"

finish, prev = {}, {}
for t in order:
    d, pred = tasks[t]
    start = max((finish[p] for p in pred), default=0)
    prev[t] = max(pred, key=lambda p: finish[p]) if pred else None
    finish[t] = start + d
end = max(finish, key=finish.get)
path, t = [], end
while t:
    path.append(t)
    t = prev[t]
print("order:", " -> ".join(order))
print(f"total effort {sum(d for d, _ in tasks.values())} h, earliest finish with parallel work {finish[end]} h")
print("critical path:", " -> ".join(reversed(path)))
order: power distribution -> flight controller -> RC receiver -> GNSS + compass -> telemetry radio -> ESCs + motors -> companion computer -> camera trigger
total effort 17 h, earliest finish with parallel work 10 h
critical path: power distribution -> flight controller -> companion computer -> camera trigger

ถ้ามีคนเดียวต้องใช้เวลารวมทั้งหมด แต่ถ้ามีสองถึงสามคน งานบนเส้นทางวิกฤตคือสิ่งที่ต้องเฝ้าดู งานอื่นเลื่อนได้โดยไม่ทำให้ทั้งโครงงานช้า และโปรแกรมจะแจ้งทันทีถ้ากราฟวนกลับ ซึ่งแปลว่าลำดับที่เขียนไว้ขัดแย้งกันเอง

จัดสรรพอร์ตและที่อยู่

ตามเอกสาร ArduPilot สำหรับ Pixhawk 6X พอร์ต SERIAL1 คือ TELEM1 และ SERIAL2 คือ TELEM2 ซึ่งมีสาย RTS/CTS สำหรับ flow control ส่วน SERIAL3 คือ GPS1 และ SERIAL5 คือ TELEM3 แต่ละพอร์ตตั้งชนิดโพรโทคอลด้วย SERIALn_PROTOCOL (เช่น 2 = MAVLink2, 5 = GPS) และความเร็วด้วย SERIALn_BAUD (เช่น 57 = 57,600 และ 921 = 921,600 bps) สัญญาณ TELEM ของบอร์ดนี้เป็นระดับ 3.3 V ส่วนบัส I2C อุปกรณ์แต่ละตัวต้องมี ที่อยู่ 7 บิต ไม่ซ้ำกันบนบัสเดียวกัน เช่น บารอมิเตอร์ MS5611 ใช้ 0x76 หรือ 0x77 ตามขา CSB

ตัวอย่างที่ 2 ตรวจการจัดสรรพอร์ตและ I2C

PORTS = {"SERIAL1": {"name": "TELEM1", "flow": True}, "SERIAL2": {"name": "TELEM2", "flow": True},
         "SERIAL3": {"name": "GPS1", "flow": False}, "SERIAL5": {"name": "TELEM3", "flow": True}}
PROTO = {2: "MAVLink2", 5: "GPS"}
plan = [   # อุปกรณ์, พอร์ต, SERIALn_PROTOCOL, SERIALn_BAUD, ต้องการ flow control
    ("telemetry radio", "SERIAL1", 2, 57, False),
    ("companion computer", "SERIAL3", 2, 921, True),
    ("GNSS", "SERIAL3", 5, 115, False),
    ("ground display radio", "SERIAL5", 2, 57, False),
]
i2c = {"external bus": [("GNSS module compass", 0x0E), ("add-on compass", 0x0E), ("barometer", 0x77)]}

used, issues = {}, []
for dev, port, proto, baud, need_flow in plan:
    if port in used:
        issues.append(f"{port} used by both {used[port]} and {dev}")
    used[port] = dev
    if need_flow and not PORTS[port]["flow"]:
        issues.append(f"{dev} needs flow control but {port} ({PORTS[port]['name']}) has none")
    print(f"{port:<8}{PORTS[port]['name']:<7} {dev:<21} {PROTO[proto]:<9} baud code {baud}")
for bus, devs in i2c.items():
    seen = {}
    for dev, addr in devs:
        if addr in seen:
            issues.append(f"I2C {bus}: {dev} and {seen[addr]} both at 0x{addr:02X}")
        seen[addr] = dev
print("issues:", *issues, sep="\n  ")
free = [p for p in PORTS if p not in used]
print("free ports:", free)
SERIAL1 TELEM1  telemetry radio       MAVLink2  baud code 57
SERIAL3 GPS1    companion computer    MAVLink2  baud code 921
SERIAL3 GPS1    GNSS                  GPS       baud code 115
SERIAL5 TELEM3  ground display radio  MAVLink2  baud code 57
issues:
  companion computer needs flow control but SERIAL3 (GPS1) has none
  SERIAL3 used by both companion computer and GNSS
  I2C external bus: add-on compass and GNSS module compass both at 0x0E
free ports: ['SERIAL2']

แผนนี้มีสามปัญหาที่พบได้บ่อยจริง: ต่อคอมพิวเตอร์บนลำไว้ที่พอร์ต GPS ซึ่งชนกับ GNSS และไม่มี flow control และใส่เข็มทิศรุ่นเดียวกันสองตัวบนบัสเดียวกัน วิธีแก้คือย้ายคอมพิวเตอร์บนลำไป SERIAL2 ซึ่งยังว่างและมี flow control และเลือกเข็มทิศเสริมที่ตั้งที่อยู่ต่างกันได้ หรือต่อไว้บนบัสอื่น

ตัวควบคุมการบินตรงกลางมีพอร์ต TELEM1 TELEM2 GPS1 TELEM3 และ I2C เส้นเชื่อมจาก TELEM1 ไปวิทยุ telemetry จาก TELEM2 ไปคอมพิวเตอร์บนลำ จาก GPS1 ไป GNSS จาก TELEM3 ไปวิทยุจอภาคพื้น และจาก I2C ไปเข็มทิศและบารอมิเตอร์
ภาพที่ 2 แผนผังพอร์ตหลังแก้ความขัดแย้ง

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

ปฏิบัติการ: แผนบูรณาการของโดรนฝึก

  1. เขียนบัญชีส่วนต่อประสานของโดรนฝึกครบทุกเส้น ตามหัวข้อในบทนี้
  2. เขียนกราฟความขึ้นต่อกันและใช้ตัวอย่างที่ 1 หาลำดับงานกับเส้นทางวิกฤต
  3. อ่านหน้าอุปกรณ์ของตัวควบคุมการบินที่ใช้ในเอกสาร ArduPilot หรือ PX4 แล้วจัดพอร์ตด้วยตัวอย่างที่ 2
  4. กำหนดเกณฑ์ผ่านของแต่ละขั้น เช่น GNSS ได้ 3D fix และ HDOP ต่ำกว่าค่าที่ตกลง ก่อนต่อขั้นถัดไป
  5. ให้เพื่อนอีกทีมตรวจบัญชีและแผนก่อนลงมือ

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

ระวัง

  • ลงมือประกอบโดยไม่มีบัญชีส่วนต่อประสาน
  • ต่ออุปกรณ์ที่ต้องการ flow control กับพอร์ตที่ไม่มี
  • ใส่อุปกรณ์ I2C ที่อยู่ซ้ำบนบัสเดียว
  • ติดตั้งทุกอย่างก่อนแล้วทดสอบทีเดียว
  • อ่านชื่อพอร์ตบนบอร์ดแล้วเดาหมายเลข SERIAL โดยไม่ดูเอกสารของบอร์ดรุ่นนั้น

สรุป

  • บัญชีส่วนต่อประสานบันทึกทุกเส้นที่เชื่อมต่อ พร้อมโพรโทคอล แรงดัน อัตรา กระแส และพารามิเตอร์
  • กราฟความขึ้นต่อกันให้ลำดับงาน และเส้นทางวิกฤตบอกเวลาเสร็จเร็วสุด
  • พอร์ตอนุกรมตั้งด้วย SERIALn_PROTOCOL และ SERIALn_BAUD และต้องจับคู่ความต้องการ flow control
  • อุปกรณ์บนบัส I2C เดียวกันต้องมีที่อยู่ไม่ซ้ำ

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

  1. งาน A ใช้ 2 ชั่วโมง งาน B ใช้ 3 ชั่วโมงและต้องรอ A งาน C ใช้ 1 ชั่วโมงและต้องรอ A เวลาเสร็จเร็วสุดเท่าใด
  2. SERIAL2_PROTOCOL = 2 หมายถึงอะไร
  3. ถ้าคอมพิวเตอร์บนลำส่งข้อมูลที่ 921,600 bps ควรต่อพอร์ตแบบใด
  4. บารอมิเตอร์ MS5611 ที่ขา CSB ต่อระดับสูงใช้ที่อยู่ใด
  5. ถ้าโปรแกรม topological sort วางงานได้ไม่ครบ แปลว่าอะไร
เฉลย
  1. ชั่วโมง
  2. ตั้ง TELEM2 ให้ใช้ MAVLink2
  3. พอร์ตที่มี flow control เช่น TELEM1 หรือ TELEM2
  4. 0x76
  5. กราฟความขึ้นต่อกันวนกลับ ลำดับที่เขียนไว้ขัดแย้งกันเอง

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

เวลาเสร็จเร็วสุดของงาน

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

  1. National Aeronautics and Space Administration. (2016). NASA systems engineering handbook (NASA/SP-2016-6105 Rev 2). link
  2. INCOSE. (2023). INCOSE systems engineering handbook: A guide for system life cycle processes and activities (5th ed.). Wiley. link
  3. ArduPilot Dev Team. Serial port configuration. ArduPilot Copter documentation. link
  4. ArduPilot Dev Team. Holybro Pixhawk 6X. ArduPilot Copter documentation. link
  5. ArduPilot Dev Team. Parameter list (Copter stable V4.6.3). ArduPilot Copter documentation. link
  6. Holybro. Pixhawk baseboard pinout (Pixhawk 6X). link
  7. TE Connectivity. (2017). MS5611-01BA03 barometric pressure sensor datasheet. link

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

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

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

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

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

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

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

โดเมนความรู้: อากาศยาน โครงสร้าง และการออกแบบ · การติดตั้ง บำรุงรักษา และการทดสอบ · ไฟฟ้า อิเล็กทรอนิกส์ และระบบกำลัง · การจัดการ นวัตกรรม และวิชาชีพ