บทเรียน 1.3 — ลงมือทำ: เมนูโมเดลตัวแรกของเรา

Edge AI และวงจรชีวิตของข้อมูล · รันโมเดลตัวแรกของเรา

โมดูล 1 — เริ่มต้น: รันของจริงแล้วแกะดูข้างใน

ต่อจากบทเรียน 1.2 — โมดูล edge_ai: ถามทะเบียนโมเดล เลือก แล้วอ่านคำตอบ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

โครงร่วมของทุกโปรแกรม MicroPython

ก่อนดูโค้ดจริง จับ "โครง" ให้ได้ก่อน โปรแกรม MicroPython บน BENTO เกือบทุกตัวเดินตามสี่จังหวะนี้ (เราจะเจอซ้ำทั้งคอร์ส):

1 · import edge_ai · ui · lcd · time 2 · สร้างครั้งเดียว อ่าน models() + widget 3 · ลูป อ่านผล + อัปเดตจอ 4 · ui.poll รับปุ่ม/แตะจอ วนกลับ

"สร้างครั้งเดียว" สำคัญมาก: สร้าง widget นอกลูป ในลูปแค่เปลี่ยนค่า/ข้อความ ถ้าสร้างซ้ำทุกรอบ จอจะกระพริบและกินหน่วยความจำ บทเรียน 1.4–1.5 เราจะแกะโครงนี้ให้ละเอียด

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

โครงของไฟล์ s01_first_inference.py

ทั้งไฟล์อ่านเป็นประโยคเดียว: "ถามว่ามีโมเดลอะไร → เลือกหนึ่งตัว → วนอ่านผล → เอาคลาสที่ชนะขึ้นจอ → หยุดตอนออก"

อ่านทะเบียน models() :33 สร้าง widget dropdown+การ์ด :39 กด Load select(sel) :103 running? ออก→stop อ่านผล result() :124 คลาสที่ชนะ verdict.text :128 + แถบ scores no yes → วนอ่านผลทุก 180 ms แถวล่าง = สิ่งที่เกิดในลูปเมื่อโมเดลกำลังรัน

ตัวเลขบรรทัด (:103, :124, :128) ชี้ไปที่จุดที่คุณต้องเติมโค้ดในไฟล์ฝึก จำโครงนี้ไว้ เดี๋ยวไล่ดูทีละส่วน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ไล่โค้ด (1) — อ่านทะเบียนโมเดล

ส่วนแรกของไฟล์ ถามเฟิร์มแวร์ว่ามีโมเดลอะไร แล้วเอาชื่อไปทำ dropdown:

import edge_ai
import ui
ui.screen()
import lcd, time

models = edge_ai.models()               # ถามเฟิร์มแวร์ (ให้ไว้แล้ว)
names = [m['name'] for m in models]     # ดึงเฉพาะชื่อไปทำ dropdown
lcd.console(' พบ %d โมเดล: %s' % (len(models), ", ".join(names)))

dd = ui.Dropdown(text="\n".join(names), x=20, y=42, w=250)
btn_load = ui.Button("Load", x=285, y=42, w=88, h=36)
  • models() ให้ list ของ dict — เราวนดึง m['name'] มาต่อเป็นบรรทัดใน dropdown
  • บรรทัดนี้ให้ไว้แล้วในไฟล์ฝึก เพราะทั้งไฟล์ต้องพึ่ง models แต่คุณควรอ่านให้เข้าใจว่ามันได้อะไรมา

ลองใน REPL ก่อนก็ได้: import edge_ai; edge_ai.models() แล้วดูว่าตอบอะไรกลับมา — นี่คือวิธี "ถามฮาร์ดแวร์" ที่เร็วที่สุด

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ไล่โค้ด (2) — กด Load แล้ว select()

ช่องเติมที่ 1: เมื่อผู้ใช้กดปุ่ม Load เราต้องสั่งให้โมเดลที่เลือกเริ่มรัน:

elif h == load_id:
    try:
        # เติม: สั่งให้ CM55 รันโมเดลที่เลือก ด้วย edge_ai.select(sel)
        pass
        running = True
        status.text("RUNNING")
        status.color(GREEN)
    except OSError as e:
        status.text("ERROR")            # ข้ามคอร์พลาดได้ ต้องเผื่อไว้
        status.color(RED)
  • แทน pass ด้วย edge_ai.select(sel) — sel คือ index ที่เลือกใน dropdown
  • ต้องอยู่ใน try เพราะ select() โยน OSError ได้ถ้า M55 ไม่ยืนยันการสลับ
  • ถ้าลืมเติม: กด Load แล้วสถานะขึ้น RUNNING แต่ไม่มีผลอนุมานจริง (เพราะไม่ได้สั่งโมเดลเลย)

นี่คือเหตุผลที่เราขึ้น "RUNNING" หลัง select() สำเร็จเท่านั้น — ถ้า error จะกระโดดไป except ไม่โกหกผู้ใช้ว่ากำลังรัน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ไล่โค้ด (3) — อ่านผล + แถบความมั่นใจ

ช่องเติมที่ 2 และ 3: หัวใจของ MVP วันนี้ อ่านผลแล้วเอาคลาสที่ชนะขึ้นจอ:

if running:
    # เติม: อ่านผลอนุมานล่าสุดมาเก็บใน r  ->  r = edge_ai.result()
    r = None
    pass
    if r and r['seq'] != last_seq:      # มีผลใหม่จริงไหม (seq เปลี่ยน)
        last_seq = r['seq']
        # เติม: แสดงคลาสที่ชนะ ด้วย verdict.text(r['label'] or '-')
        pass
        conf.text("conf: %.0f %%" % (r['conf'] * 100))
        top = r['top']
        for i, (lb, br) in enumerate(rows):
            if i < len(r['scores']):
                br.value(int(r['scores'][i] * 100))     # แถบต่อคลาส
                br.color(GREEN if i == top else DIM)     # คลาสที่ชนะสีเขียว
  • ช่องที่ 2: แทน pass ด้วย r = edge_ai.result() (ลบ r = None ทิ้ง หรือปล่อยไว้ก็ได้ เพราะจะถูกทับ)
  • ช่องที่ 3: แทน pass ด้วย verdict.text(r['label'] or '-')
  • เช็ก seq ก่อนเสมอ จะได้วาดจอเฉพาะตอนมีผลใหม่ ไม่รัดจอทุกรอบ

r['scores'] คือคะแนน ทุกคลาส เราวนเอาไปทำแถบ ส่วนคลาสที่ i == top (ชนะ) ระบายเขียว — ผู้ใช้เห็นทั้งคำตอบและ "ความสูสี" ของคลาสอื่น

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ไล่โค้ด (4) — หยุดให้เรียบร้อย

ช่องเติมที่ 4: ปุ่ม Stop และการเก็บกวาดตอนออก:

elif h == stop_id:
    # เติม: สั่งหยุดโมเดลด้วย edge_ai.stop()
    pass
    running = False
    status.text("STOPPED")
    status.color(RED)
...
finally:
    edge_ai.stop()      # ให้ไว้แล้ว: ออกยังไงก็หยุดเครื่องยนต์เสมอ
  • แทน pass ด้วย edge_ai.stop() — คู่กับ select() เมื่อ Load
  • บล็อก finally ให้ไว้แล้ว: ไม่ว่าจะออกด้วยปุ่ม back หรือ error โมเดลจะถูกหยุดเสมอ

นิสัย embedded: ออกจากงานยังไง ทิ้งเครื่องไว้ให้เรียบร้อยแบบนั้น อย่าปล่อยเครื่องยนต์รันค้างหลังโปรแกรมจบ นี่คือหลักเดียวกับที่คอร์สเกมสอน "คืนฮาร์ดแวร์สู่สถานะที่รู้แน่"

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ลงมือทำ — เติมช่องว่างทั้ง 4 จุด

เปิด s01_first_inference.py ในไฟล์มี pass วางไว้ 4 จุด ตรงที่ต้องเติมคำสั่งจริงของ edge_ai:

# จุด เติมด้วย ถ้าลืม
1 ปุ่ม Load edge_ai.select(sel) RUNNING แต่ไม่มีผล
2 ในลูป r = edge_ai.result() จอไม่ขึ้นคลาสเลย
3 มีผลใหม่ verdict.text(r['label'] or '-') แถบขยับ แต่ตัวเลขใหญ่ไม่เปลี่ยน
4 ปุ่ม Stop edge_ai.stop() กด Stop แล้วโมเดลยังรันอยู่

ขั้นตอน:

  1. ไล่หา # เติม: ทีละจุด แล้วแทน pass ด้วยคำสั่งตามคำใบ้
  2. กด Run (Emulator) หรือ Program to Device (บอร์ด)
  3. เลือกโมเดล กด Load ทำท่า/ส่งเสียง ดูคลาสที่ชนะ ถ้ายังไม่ขึ้น กลับมาเช็ก indent กับชื่อคำสั่ง

สี่ช่องนี้คือสี่คำสั่งหลักของ edge_ai เป๊ะ — เติมครบเมื่อไร คุณรันเมนู 6 โมเดลได้ครบวงจร

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

แหล่งเรียนรู้เพิ่มเติม

อยากต่อยอดที่บ้าน ลองตามลิงก์เหล่านี้ คัดมาจากช่อง/แหล่งที่เชื่อถือได้

วิดีโอ (เปิดในเบราว์เซอร์ ไม่ได้ฝังในสไลด์):

ภาพ / เอกสารอ้างอิง:

วิดีโอ/ภาพภายนอกเป็นของเจ้าของต้นฉบับ ใช้เพื่อการศึกษา อ้างอิงลิงก์ต้นทาง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ชัยชนะที่เห็นได้ + MVP ของชุดบทเรียนนี้

ชัยชนะที่เห็นได้ของชุดบทเรียนนี้ · เมนู 6 โมเดลรู้จำท่าทาง/เสียงของคุณบนจอ พร้อมคลาสที่ชนะและความมั่นใจ

MVP ของบทเรียน 1.1–1.3 (เกณฑ์ผ่านของชุดบทเรียน): คุณรันเมนู edge_ai ได้ แล้ว อ่านผลสด ออก — คลาสที่ชนะ (label) + ความมั่นใจ (conf) เปลี่ยนตามท่าทาง/เสียงจริง

  • ทำบน Emulator หรือ บอร์ดจริง ก็ได้ (โค้ดชุดเดียวกัน)
  • อธิบายได้ว่าโค้ดเรียก models / select / result / stop ตรงไหน ทำอะไร

"อ่านผลออก" ไม่ใช่แค่ "เห็นตัวหนังสือขยับ" — คุณต้องบอกได้ว่า conf 92% หมายความว่าอะไร และทำไมบางท่าโมเดลถึง "ยังไม่ชัวร์"

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

บันไดช่วยเหลือ — ใบ้ → เริ่มจากโครง → เฉลย → ฉบับเต็ม

ถ้าติด ให้ไต่บันไดนี้ทีละขั้น อย่าเพิ่งกระโดดไปดูเฉลย เพราะของจะเข้าหัวตอนที่คุณพยายามเองก่อน:

  • ใบ้ — คำใบ้อยู่ในคอมเมนต์ # เติม: ทั้ง 4 จุดในไฟล์ฝึก + ตารางหน้าที่แล้ว บอกว่าแต่ละช่องเติมอะไร
  • เริ่มจากโครง — s01_first_inference.py มีโครงครบทั้งไฟล์แล้ว เหลือแค่ 4 บรรทัดให้เติม
  • เฉลย — s01_first_inference.py เติมครบพร้อมคอมเมนต์อธิบายทุกช่อง (อ่านให้เข้าใจ ปิดไฟล์ แล้วพิมพ์เอง)
  • ฉบับเต็ม — s01_first_inference_full.py ฉบับขัดเรียบร้อย เพิ่ม latency + เกณฑ์ CONF_FLOOR แยก "มั่นใจ/ยังไม่ชัวร์" ด้วยสี

ลองเขียนเองให้สุดก่อนนะ ถ้าติดจริงๆ ค่อยเปิดเฉลยดูทีละช่อง แล้วกลับมาพิมพ์เอง — เดี๋ยวเราค่อย ๆ แกะไปด้วยกัน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

เชื่อมโยงรากฐาน — วันนี้เราแตะอะไรไปบ้าง

การรันโมเดลตัวแรกซ่อนแนวคิด Edge AI หลายชั้นที่จะใช้ไปตลอดคอร์ส:

ฝั่ง Edge AI / ระบบ

  • Inference on device — โมเดลอนุมานบน NPU ตรงหน้า ไม่ผ่านคลาวด์
  • Model registry — เฟิร์มแวร์เก็บทะเบียนโมเดลไว้ เราถามด้วย models() ไม่ hard-code
  • Verdict = ความน่าจะเป็น — conf + scores + CONF_FLOOR บอกว่าโมเดล "มั่นใจแค่ไหน" ไม่ใช่คำตอบเด็ดขาด
  • Cross-core pull — โค้ด Python (M33) ดึงผลจากคอร์ AI (M55) แบบปลอดภัย

ฝั่ง MicroPython / โครงโปรแกรม

  • โครงร่วม — import → สร้างครั้งเดียว → ลูป → ui.poll (จะแกะละเอียดใน บทเรียน 1.4–1.5)
  • สร้าง widget ครั้งเดียว — ประหยัดหน่วยความจำ จอไม่กระพริบ
  • เก็บกวาดตอนจบ — finally: edge_ai.stop() คืนเครื่องสู่สถานะที่รู้แน่

ทั้งหมดนี้ยืนบนคำสั่งแค่ 4 ตัว — พลังของ MicroPython-first คือคุณได้ผลจริงตั้งแต่ชุดบทเรียนแรก โดยยังไม่ต้องแตะ C หรือ toolchain

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ใช้จริงที่ไหน — Edge AI inference ในโลกจริง

สี่โมเดลที่เราลองวันนี้ ไม่มีตัวไหนเป็นของสมมติ ทุกตัวมีสินค้าจริงในโลกที่ทำงานด้วยหลักการเดียวกัน:

Motion (IMU) — นาฬิกา/แท็ก ตรวจการล้ม · นับก้าว · รู้ท่าทางการออกกำลัง ต้องตอบทันที + ทำงานตลอด → รันบนอุปกรณ์ โมเดลเดียวกับ "shaking/circle/idle" วันนี้ เสียง (MIC) — บ้าน/โรงงาน ตรวจเสียงเด็กร้อง · เสียงไอ · เสียงเตือน/ไซเรน เสียงไม่ต้องออกจากเครื่อง → ความเป็นส่วนตัว โมเดล Baby Cry/Cough/Alarm/Siren วันนี้ เรดาร์ (RADAR) — สวิตช์/ป้าย ตรวจการมี-ไม่มีคน · ท่าทางกวักมือ (ไม่ใช้กล้อง) ทำงานในที่มืด/ผ่านวัสดุได้ → เปิดไฟอัตโนมัติ โมเดล Push Detection วันนี้ ร่วมกัน — ความมั่นใจ + action ทุกงานใช้ conf/scores ตัดสินว่าจะเชื่อไหม แล้วสั่งการต่อ (แจ้งเตือน · เปิดไฟ · บันทึก) คือ โมดูล 6 (Apps, โมดูล 6) ของเรา

เห็นไหมว่า 6 โมเดลที่เล่นวันนี้ ไม่ได้เล่นเปล่า — มันคือแก่นของสินค้า Edge AI จริงที่ขายอยู่ในตลาด เราแค่กำลังเริ่มจากปลายทางเพื่อจะย้อนไปสร้างเองได้

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

งานทำเอง + สรุปบทเรียน

งานทำเอง (ท้ายบทเรียน):

  1. เติม s01_first_inference.py ให้ครบทั้ง 4 ช่อง รันได้จริง (Emulator หรือบอร์ด)
  2. ลองสลับอย่างน้อย 3 โมเดล (เช่น Motion → Baby Cry → Push) แล้วจดว่าแต่ละตัวต้องทำอะไรถึงจะได้คลาสที่ชนะ
  3. หาท่า/เสียงที่ทำให้โมเดล "ยังไม่ชัวร์" (conf ต่ำกว่า 50%) แล้วอธิบายว่าทำไม

ใบ้ข้อ 3 — ท่าที่ก้ำกึ่งระหว่างสองคลาส หรือเสียงที่คล้ายหลายคลาส จะทำให้คะแนนกระจาย ไม่มีคลาสไหนชนะขาด

วันนี้เราได้: เข้าใจว่า Edge AI คืออะไร · เห็นวงจร 5 ขั้นและสเปกตรัมหลายเป้าหมาย · รันเมนู 6 โมเดลด้วย models/select/result/stop · อ่านคลาสที่ชนะ + ความมั่นใจสดๆ

ชุดบทเรียนถัดไป (บทเรียน 1.4–1.5) เราจะ แกะแอปเซนเซอร์ ทีละส่วน — จับโครงร่วม "import → สร้างครั้งเดียว → ลูป → ui.poll" ให้ขาด แล้วลอง remix เอง เจอกันครับ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0