ข้ามไปยังเนื้อหา

ลงมือทำ: เกจฟิสิกส์สี่ตัวบนจอ

โมดูล 3 — ประมวลผลด้วยคณิตศาสตร์และฟิสิกส์ · สไลด์: slides.md · ภาพรวมโมดูล · หน้าหลักสูตร

เติมสี่สูตรแปลงใน s06_physics_viz.py (tilt, energy, altitude, dBFS) แล้วเลือกปริมาณใน dropdown ขยับ ยก หรือส่งเสียง จนเกจ Seg7 แถบ และกราฟขยับตามค่าที่เราคำนวณเอง

เมื่อจบบทเรียนนี้ คุณจะ:

  1. เติมสี่สูตรใน practice/s06_physics_viz.py จนอย่างน้อยสามปริมาณ (Tilt, Energy, Altitude) แสดงค่าที่เปลี่ยนตามการเคลื่อนไหวจริงบน Emulator หรือบอร์ด
  2. ทดสอบสูตร energy ให้ได้ราว 0 ตอนวางนิ่งและเกิน 1 ตอนเขย่าแรง แล้วอธิบายได้ว่าทำไมต้องหาร 9.81 และลบ 1g
  3. อธิบายหน้าที่ของ placeholder ในไฟล์ฝึก การจับ p0 ก่อนลูป และการคืนไมโครโฟนด้วย pdm.deinit() ใน finally

ผ่านบทเรียน 3.1 มาแล้ว เข้าใจสี่สูตรและเหตุผลของการหาร 9.81 เติมทีละสูตรแล้วทดสอบทีละปริมาณ จะจับบั๊กได้ง่ายกว่าเติมรวดเดียว

ทั้งไฟล์อ่านเป็นประโยคเดียว: เลือกปริมาณ → อ่านค่าดิบ → คำนวณเป็นปริมาณจริง → ส่งขึ้น Seg7, Bar และ Chart → วนทุก 120 ms ส่วนบนสร้าง widget ครั้งเดียว ลองเปิดไมค์ใน try เพื่อตั้ง has_mic และจับ p0 ก่อนลูป ทั้งหมดนี้ให้ไว้แล้ว งานของเราคือสูตรตรงกลาง (จังหวะ derived) สี่จุด ไฟล์ฝึกวาง placeholder อย่าง roll, pitch = 0.0, 0.0 หรือ db = -96.0 ไว้ให้รันได้ตั้งแต่ยังไม่เติม (โชว์ 0) พอเติมจริงค่าถึงจะขยับ เทคนิคเดียวกับ r = None ในบทเรียน 1.3

สี่สูตรคือ (1) roll, pitch = dsp.tilt(ax, ay, az) (2) mag = math.sqrt(ax*ax + ay*ay + az*az) / 9.81 แล้ว energy = abs(mag - 1.0) (3) alt = dsp.altitude(p, p0) และ (4) db = 20 * math.log10(rms / 32768.0) ภายใน if rms > 0: เพราะ log10(0) คำนวณไม่ได้ ระวังลำดับที่ dsp.tilt คืน (roll ก่อน pitch) และจำว่า motion() ให้หน่วย m/s² ถ้าลืมหาร 9.81 พลังงานจะค้างราว 8.8 แม้วางนิ่ง ความดันไวต่อลมและแอร์ ค่าความสูงจึงแกว่งเล็กน้อยเป็นปกติ ซึ่งเราจะกรองให้นิ่งในโมดูล 4

เมื่อเติมครบ กราฟ Chart เก็บประวัติย้อนหลังให้ ลองเขย่าเป็นจังหวะแล้วดูรูปคลื่น จะเห็น “รูปร่างของการเคลื่อนไหว” ชัดกว่าตัวเลขนิ่ง ๆ ความสำเร็จไม่ใช่แค่ตัวเลขขยับ แต่ต้องบอกได้ว่า energy 0.8 หมายความว่าอะไร และทำไม tilt ใช้ atan2 ได้โดยไม่ต้องรู้หน่วยของ accel

s06_physics_viz_full.py เพิ่มการจำค่าสูงสุดต่ำสุด (hi/lo hold) ป้าย STEADY/ACTIVE และปุ่ม Reset รันก่อนเริ่มบทเรียนเพื่อดูปลายทาง แล้วกลับมาอ่านอีกครั้งหลังเติมไฟล์ฝึกผ่าน

ไฟล์ ไฟล์นี้สอน
examples/s06_physics_viz_full.py Physics Lab: raw -> derived -> viz (ฉบับเต็ม)

คอมเมนต์ # เติม: สี่จุดอยู่ที่บรรทัด 94, 103, 112 และ 125 (Tilt, Energy, Altitude, dBFS) แทน placeholder ด้วยสูตรตามคำใบ้ แล้วกด Run (Emulator) หรือ Program to Device (บอร์ด) ถ้าเกจค้างที่ 0 ให้ตรวจว่าเติมบรรทัดสูตรแล้วและไม่ได้เขียนทับด้วย placeholder อีกครั้ง

ไฟล์ฝึก เรื่อง
practice/s06_physics_viz.py Physics Lab: raw -> derived -> viz (ฉบับฝึกเติมโค้ด)

เปิดเฉลยหลังจากลองเองแล้วอย่างน้อยหนึ่งรอบ และอ่าน วิธีใช้เฉลย ก่อน

เฉลย คู่กับ
solution/s06_physics_viz.py practice/s06_physics_viz.py

คำถามชุดเดียวกันอยู่ใน quiz.yaml สำหรับระบบที่ตรวจอัตโนมัติ

  1. เติมสูตร Tilt แล้วแต่เกจมุมยังค้างที่ 0 ทุกครั้ง สาเหตุที่น่าจะเป็นคืออะไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 1)

    • ก) ยังไม่ได้แทน pass หรือยังเหลือบรรทัด placeholder roll, pitch = 0.0, 0.0 อยู่หลังสูตร
    • ข) dsp.tilt ใช้ได้เฉพาะบนบอร์ด
    • ค) ต้องหาร 9.81 ก่อนเรียก dsp.tilt
    • ง) Chart รับค่าเกิน 100 ไม่ได้
    เฉลย

    ก — placeholder มีไว้ให้ไฟล์รันได้ตอนยังไม่เติม ถ้ามันยังทับค่าหลังสูตรอยู่ เกจจะโชว์ 0 ตลอด ส่วน dsp.tilt ไม่ต้องแปลงหน่วยก่อน

  2. วางบอร์ดนิ่งแล้ว Energy โชว์ 8.81 ตลอด ต้องแก้สูตรอย่างไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)

    • ก) เปลี่ยน abs เป็น max
    • ข) หารขนาดเวกเตอร์ด้วย 9.81 ให้เป็นหน่วย g ก่อนลบ 1.0
    • ค) ลบ 1.0 ออกจากสูตร
    • ง) ใช้ gx gy gz แทน ax ay az
    เฉลย

    ข — motion() ให้ m/s² ขนาดตอนนิ่งจึงราว 9.81 หาร 9.81 แล้วได้ราว 1g ลบ 1 จึงเหลือราว 0

  3. energy (หน่วย g) ถูกแปลงเป็นแถบด้วย clamp100(energy / 2.0 * 100) ถ้า energy = 0.5 แถบจะอยู่ที่เท่าไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)

    • ก) 5
    • ข) 25
    • ค) 50
    • ง) 100
    เฉลย

    ข — 0.5 / 2.0 × 100 = 25 ช่วง 0..2g ถูก map ลงแถบ 0..100 ส่วนค่าเกิน 2g จะถูก clamp ไว้ที่ 100

  4. ข้อใดถูกต้องเกี่ยวกับส่วนที่ให้ไว้แล้วในไฟล์ฝึก (เลือกทุกข้อที่ถูก) (เลือกได้หลายข้อ · เป้าหมายข้อ 3)

    • ก) p0 จับครั้งเดียวก่อนลูปเพราะเป็นจุดอ้างอิงที่ไม่เปลี่ยน
    • ข) pdm.deinit() อยู่ใน finally เพื่อคืนไมโครโฟนเสมอไม่ว่าจะออกด้วยวิธีใด
    • ค) placeholder ทำให้ไฟล์รันได้และโชว์ 0 ตั้งแต่ยังไม่เติม
    • ง) widget ถูกสร้างใหม่ในลูปทุก 120 ms
    เฉลย

    ก, ข, ค — widget สร้างครั้งเดียวก่อนลูปตามโครงร่วม ในลูปแค่เปลี่ยนค่า ส่วนอีกสามข้อคือการเตรียมของก่อนลูปและการเก็บกวาดที่ถูกต้อง

MVP ของชุดบทเรียน 3.1–3.2: สัญญาณดิบ → ปริมาณที่คำนวณได้ → แสดงเห็นบนจอ ครบวงอย่างน้อยหนึ่งปริมาณ

  • เติมไฟล์ฝึกครบสี่สูตร รันได้บน Emulator หรือบอร์ด
  • ทดสอบอย่างน้อยสามปริมาณ (Tilt → Energy → Altitude) จดลงบันทึกการเรียนว่าต้องทำอะไรถึงจะเห็นค่าเปลี่ยนชัด
  • หาค่าอ้างอิงตอนนิ่งของ Energy แล้วลองลบ - 1.0 ออกชั่วคราว ดูว่าค่าตอนนิ่งกลายเป็นเท่าไรและอธิบายว่าทำไม
  • อธิบายได้ว่าสูตรที่เติมแปลงตัวเลขดิบเป็นปริมาณอะไร หน่วยอะไร

ชุดบทเรียนถัดไป (บทเรียน 3.3–3.4) เราจะเอาปริมาณที่แปลงได้ไปตัดสินด้วยกฎ เช่น “สบาย” หรือ “ร้อน” จากอุณหภูมิกับความชื้น

บทเรียนถัดไป: บทเรียน 3.3 — ค่าอนุพัทธ์และการจำแนกด้วยกฎ: dew point, heat index และบันไดกฎ

  • ปริมาณไหนที่ Chart เล่าเรื่องได้ดีกว่าตัวเลข Seg7 และเพราะอะไร
  • ถ้าต้องใช้ค่า energy ไปตัดสินว่า “มีคนหยิบบอร์ด” คุณจะตั้งเกณฑ์ที่เท่าไร และจะทดสอบเกณฑ์นั้นอย่างไร

คำถามทบทวน

ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย

  1. เติมสูตร Tilt แล้วแต่เกจมุมยังค้างที่ 0 ทุกครั้ง สาเหตุที่น่าจะเป็นคืออะไร (เป้าหมายข้อ 1)

    1. ยังไม่ได้แทน pass หรือยังเหลือบรรทัด placeholder roll, pitch = 0.0, 0.0 อยู่หลังสูตร
    2. dsp.tilt ใช้ได้เฉพาะบนบอร์ด
    3. ต้องหาร 9.81 ก่อนเรียก dsp.tilt
    4. Chart รับค่าเกิน 100 ไม่ได้
    ดูเฉลย

    คำตอบ: A. ยังไม่ได้แทน pass หรือยังเหลือบรรทัด placeholder roll, pitch = 0.0, 0.0 อยู่หลังสูตร

    placeholder มีไว้ให้ไฟล์รันได้ตอนยังไม่เติม ถ้ามันยังทับค่าหลังสูตรอยู่ เกจจะโชว์ 0 ตลอด ส่วน dsp.tilt ไม่ต้องแปลงหน่วยก่อน

  2. วางบอร์ดนิ่งแล้ว Energy โชว์ 8.81 ตลอด ต้องแก้สูตรอย่างไร (เป้าหมายข้อ 2)

    1. เปลี่ยน abs เป็น max
    2. หารขนาดเวกเตอร์ด้วย 9.81 ให้เป็นหน่วย g ก่อนลบ 1.0
    3. ลบ 1.0 ออกจากสูตร
    4. ใช้ gx gy gz แทน ax ay az
    ดูเฉลย

    คำตอบ: B. หารขนาดเวกเตอร์ด้วย 9.81 ให้เป็นหน่วย g ก่อนลบ 1.0

    motion() ให้ m/s² ขนาดตอนนิ่งจึงราว 9.81 หาร 9.81 แล้วได้ราว 1g ลบ 1 จึงเหลือราว 0

  3. energy (หน่วย g) ถูกแปลงเป็นแถบด้วย clamp100(energy / 2.0 * 100) ถ้า energy = 0.5 แถบจะอยู่ที่เท่าไร (เป้าหมายข้อ 2)

    1. 5
    2. 25
    3. 50
    4. 100
    ดูเฉลย

    คำตอบ: B. 25

    0.5 / 2.0 × 100 = 25 ช่วง 0..2g ถูก map ลงแถบ 0..100 ส่วนค่าเกิน 2g จะถูก clamp ไว้ที่ 100

  4. ข้อใดถูกต้องเกี่ยวกับส่วนที่ให้ไว้แล้วในไฟล์ฝึก (เลือกทุกข้อที่ถูก) (เป้าหมายข้อ 3)

    1. p0 จับครั้งเดียวก่อนลูปเพราะเป็นจุดอ้างอิงที่ไม่เปลี่ยน
    2. pdm.deinit() อยู่ใน finally เพื่อคืนไมโครโฟนเสมอไม่ว่าจะออกด้วยวิธีใด
    3. placeholder ทำให้ไฟล์รันได้และโชว์ 0 ตั้งแต่ยังไม่เติม
    4. widget ถูกสร้างใหม่ในลูปทุก 120 ms
    ดูเฉลย

    คำตอบ: A. p0 จับครั้งเดียวก่อนลูปเพราะเป็นจุดอ้างอิงที่ไม่เปลี่ยน · B. pdm.deinit() อยู่ใน finally เพื่อคืนไมโครโฟนเสมอไม่ว่าจะออกด้วยวิธีใด · C. placeholder ทำให้ไฟล์รันได้และโชว์ 0 ตั้งแต่ยังไม่เติม

    widget สร้างครั้งเดียวก่อนลูปตามโครงร่วม ในลูปแค่เปลี่ยนค่า ส่วนอีกสามข้อคือการเตรียมของก่อนลูปและการเก็บกวาดที่ถูกต้อง

อ้างอิงบทเรียนนี้

ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน

"ลงมือทำ: เกจฟิสิกส์สี่ตัวบนจอ" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0

ข้อความอ้างอิงภาษาอังกฤษ: "Hands-on: four physics gauges on screen" from TESA Open Knowledge by the Thai Embedded Systems Association (TESA), https://github.com/tesaiot/tesa-qualification-program, licensed under CC BY-NC 4.0

ลิงก์บทเรียน: https://tesaiot.github.io/tesa-qualification-program/courses/edge-ai-developer/m03-processing/l02-physics-gauges-lab/

วิธีอ้างอิง TESA ฉบับเต็ม

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA