ทั้งไฟล์อ่านเป็นประโยคเดียว: "ถามว่ามีโมเดลอะไร → เลือกหนึ่งตัว → วนอ่านผล → เอาคลาสที่ชนะขึ้นจอ → หยุดตอนออก"
ตัวเลขบรรทัด (
:103,:124,:128) ชี้ไปที่จุดที่คุณต้องเติมโค้ดในไฟล์ฝึก จำโครงนี้ไว้ เดี๋ยวไล่ดูทีละส่วน
ส่วนแรกของไฟล์ ถามเฟิร์มแวร์ว่ามีโมเดลอะไร แล้วเอาชื่อไปทำ 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'] มาต่อเป็นบรรทัดใน dropdownmodels แต่คุณควรอ่านให้เข้าใจว่ามันได้อะไรมาลองใน REPL ก่อนก็ได้:
import edge_ai; edge_ai.models()แล้วดูว่าตอบอะไรกลับมา — นี่คือวิธี "ถามฮาร์ดแวร์" ที่เร็วที่สุด
ช่องเติมที่ 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 ที่เลือกใน dropdowntry เพราะ select() โยน OSError ได้ถ้า M55 ไม่ยืนยันการสลับนี่คือเหตุผลที่เราขึ้น "RUNNING" หลัง
select()สำเร็จเท่านั้น — ถ้า error จะกระโดดไป except ไม่โกหกผู้ใช้ว่ากำลังรัน
ช่องเติมที่ 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) # คลาสที่ชนะสีเขียว
pass ด้วย r = edge_ai.result() (ลบ r = None ทิ้ง หรือปล่อยไว้ก็ได้ เพราะจะถูกทับ)pass ด้วย verdict.text(r['label'] or '-')seq ก่อนเสมอ จะได้วาดจอเฉพาะตอนมีผลใหม่ ไม่รัดจอทุกรอบ
r['scores']คือคะแนน ทุกคลาส เราวนเอาไปทำแถบ ส่วนคลาสที่i == top(ชนะ) ระบายเขียว — ผู้ใช้เห็นทั้งคำตอบและ "ความสูสี" ของคลาสอื่น
ช่องเติมที่ 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() เมื่อ Loadfinally ให้ไว้แล้ว: ไม่ว่าจะออกด้วยปุ่ม back หรือ error โมเดลจะถูกหยุดเสมอนิสัย embedded: ออกจากงานยังไง ทิ้งเครื่องไว้ให้เรียบร้อยแบบนั้น อย่าปล่อยเครื่องยนต์รันค้างหลังโปรแกรมจบ นี่คือหลักเดียวกับที่คอร์สเกมสอน "คืนฮาร์ดแวร์สู่สถานะที่รู้แน่"
เปิด 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 แล้วโมเดลยังรันอยู่ |
ขั้นตอน:
# เติม: ทีละจุด แล้วแทน pass ด้วยคำสั่งตามคำใบ้สี่ช่องนี้คือสี่คำสั่งหลักของ
edge_aiเป๊ะ — เติมครบเมื่อไร คุณรันเมนู 6 โมเดลได้ครบวงจร
อยากต่อยอดที่บ้าน ลองตามลิงก์เหล่านี้ คัดมาจากช่อง/แหล่งที่เชื่อถือได้
วิดีโอ (เปิดในเบราว์เซอร์ ไม่ได้ฝังในสไลด์):
ภาพ / เอกสารอ้างอิง:
วิดีโอ/ภาพภายนอกเป็นของเจ้าของต้นฉบับ ใช้เพื่อการศึกษา อ้างอิงลิงก์ต้นทาง
MVP ของบทเรียน 1.1–1.3 (เกณฑ์ผ่านของชุดบทเรียน): คุณรันเมนู edge_ai ได้ แล้ว อ่านผลสด ออก — คลาสที่ชนะ (label) + ความมั่นใจ (conf) เปลี่ยนตามท่าทาง/เสียงจริง
models / select / result / stop ตรงไหน ทำอะไร"อ่านผลออก" ไม่ใช่แค่ "เห็นตัวหนังสือขยับ" — คุณต้องบอกได้ว่า
conf92% หมายความว่าอะไร และทำไมบางท่าโมเดลถึง "ยังไม่ชัวร์"
ถ้าติด ให้ไต่บันไดนี้ทีละขั้น อย่าเพิ่งกระโดดไปดูเฉลย เพราะของจะเข้าหัวตอนที่คุณพยายามเองก่อน:
# เติม: ทั้ง 4 จุดในไฟล์ฝึก + ตารางหน้าที่แล้ว บอกว่าแต่ละช่องเติมอะไรs01_first_inference.py มีโครงครบทั้งไฟล์แล้ว เหลือแค่ 4 บรรทัดให้เติมs01_first_inference.py เติมครบพร้อมคอมเมนต์อธิบายทุกช่อง (อ่านให้เข้าใจ ปิดไฟล์ แล้วพิมพ์เอง)s01_first_inference_full.py ฉบับขัดเรียบร้อย เพิ่ม latency + เกณฑ์ CONF_FLOOR แยก "มั่นใจ/ยังไม่ชัวร์" ด้วยสีลองเขียนเองให้สุดก่อนนะ ถ้าติดจริงๆ ค่อยเปิดเฉลยดูทีละช่อง แล้วกลับมาพิมพ์เอง — เดี๋ยวเราค่อย ๆ แกะไปด้วยกัน
การรันโมเดลตัวแรกซ่อนแนวคิด Edge AI หลายชั้นที่จะใช้ไปตลอดคอร์ส:
ฝั่ง Edge AI / ระบบ
models() ไม่ hard-codeconf + scores + CONF_FLOOR บอกว่าโมเดล "มั่นใจแค่ไหน" ไม่ใช่คำตอบเด็ดขาดฝั่ง MicroPython / โครงโปรแกรม
ui.poll (จะแกะละเอียดใน บทเรียน 1.4–1.5)finally: edge_ai.stop() คืนเครื่องสู่สถานะที่รู้แน่ทั้งหมดนี้ยืนบนคำสั่งแค่ 4 ตัว — พลังของ MicroPython-first คือคุณได้ผลจริงตั้งแต่ชุดบทเรียนแรก โดยยังไม่ต้องแตะ C หรือ toolchain
สี่โมเดลที่เราลองวันนี้ ไม่มีตัวไหนเป็นของสมมติ ทุกตัวมีสินค้าจริงในโลกที่ทำงานด้วยหลักการเดียวกัน:
เห็นไหมว่า 6 โมเดลที่เล่นวันนี้ ไม่ได้เล่นเปล่า — มันคือแก่นของสินค้า Edge AI จริงที่ขายอยู่ในตลาด เราแค่กำลังเริ่มจากปลายทางเพื่อจะย้อนไปสร้างเองได้
งานทำเอง (ท้ายบทเรียน):
s01_first_inference.py ให้ครบทั้ง 4 ช่อง รันได้จริง (Emulator หรือบอร์ด)ใบ้ข้อ 3 — ท่าที่ก้ำกึ่งระหว่างสองคลาส หรือเสียงที่คล้ายหลายคลาส จะทำให้คะแนนกระจาย ไม่มีคลาสไหนชนะขาด
วันนี้เราได้: เข้าใจว่า Edge AI คืออะไร · เห็นวงจร 5 ขั้นและสเปกตรัมหลายเป้าหมาย · รันเมนู 6 โมเดลด้วย models/select/result/stop · อ่านคลาสที่ชนะ + ความมั่นใจสดๆ
ชุดบทเรียนถัดไป (บทเรียน 1.4–1.5) เราจะ แกะแอปเซนเซอร์ ทีละส่วน — จับโครงร่วม "import → สร้างครั้งเดียว → ลูป → ui.poll" ให้ขาด แล้วลอง remix เอง เจอกันครับ