แล็บ: สตรีมเซ็นเซอร์และหน้าต่างข้อมูลพร้อม AI
Course 1 · Module 5
Type: Hands-on lab (read sensors → filter/window → optional host view)
Suggested time: 2.5–3.5 hours
Read first: Lesson · Cheatsheet · ← Table of Contents · ← M04 · M06 →
หมายเหตุ: snippet ในแล็บนี้ใช้ API ของเฟิร์มแวร์ TESAIoT Bitstream ซึ่งยังไม่เปิดซอร์ส ดูรายละเอียดและตัวอย่างเทียบใน SDK สาธารณะได้ที่หมายเหตุต้นบทเรียน สตรีมเซ็นเซอร์ที่พร้อมสำหรับ Edge AI
Useful references during the lab
หัวข้อที่มีชื่อว่า “Useful references during the lab”| เอกสาร | ใช้เมื่อ |
|---|---|
| Lesson | sensor_*, fusion, SENSOR_CFG |
| TESAIoT Developer Hub | Domain Sensors |
| Hackathon web-app | ex01–ex06 ดูค่าบนโฮสต์ |
| Bitstream Studio | Sensor Telemetry deck |
Lab Goals
หัวข้อที่มีชื่อว่า “Lab Goals”- เรียก
sensor_*_startup/readอย่างน้อย สองชนิด (เช่น SHT40 + BMI270) - สร้าง task อ่านคาบคงที่ ด้วย FreeRTOS
- ทำ filter หรือ normalize อย่างน้อยหนึ่งแบบในโค้ดแล็บ
- สร้าง หน้าต่างข้อมูล (window) จาก IMU หรืออุณหภูมิ
- (แนะนำ) ดูสตรีมบน Bitstream Studio หรือ Hackathon web-app
- (แนะนำ) อ่านผล fusion หรือยิง event เมื่อเข้าเงื่อนไข
Prerequisites
หัวข้อที่มีชื่อว่า “Prerequisites”- ผ่าน M03 (UART) และ M04 (สร้าง task ได้)
- บอร์ดมีเซ็นเซอร์ตามคิตที่ใช้
- รู้ว่าเซ็นเซอร์ใดถูก enable ในเฟิร์มแวร์/โปรเจกต์ของคุณ
Lab A — Bring-up two sensors (required)
หัวข้อที่มีชื่อว่า “Lab A — Bring-up two sensors (required)”sensor_sht40_startupแล้วอ่านtemperature/humidityพิมพ์ UARTsensor_bmi270_startup(ถ้ายังไม่ถูก start จาก boot) แล้วอ่านacc_*- ตรวจ
sensor_*_is_readyก่อนอ่าน
Pass when: ได้ค่าที่สมเหตุสมผลทั้งสองชนิดบน terminal
Lab B — Fixed-rate sample task (required)
หัวข้อที่มีชื่อว่า “Lab B — Fixed-rate sample task (required)”- สร้าง task อ่านเซ็นเซอร์ด้วย
vTaskDelayUntil(เช่น SHT40 ทุก 500–1000 ms หรือ BMI270 ทุก 40 ms) - บันทึกว่าเลือกคาบเท่าไรและทำไม
TickType_t last = xTaskGetTickCount();const TickType_t period = pdMS_TO_TICKS(40);for (;;) { (void)sensor_bmi270_read(&imu); vTaskDelayUntil(&last, period);}Pass when: คาบอ่านสม่ำเสมอโดยไม่ busy-wait
Lab C — Filter + normalize (required)
หัวข้อที่มีชื่อว่า “Lab C — Filter + normalize (required)”- ทำ EMA (หรือ median หน้าต่างสั้น) บนอุณหภูมิหรือแกน accel
- Normalize ค่าอย่างน้อยหนึ่งช่องไปช่วงที่กำหนด (เช่นประมาณ [-1, 1] หรือ 0..1)
- พิมพ์ทั้งค่าดิบและค่าหลังประมวลผล
Pass when: อธิบายได้ว่า filter ลด noise อย่างไรจากการสังเกตบน terminal
Lab D — Feature window (required)
หัวข้อที่มีชื่อว่า “Lab D — Feature window (required)”- สร้าง ring buffer / window อย่างน้อย 16–32 ตัวอย่างจาก BMI270 หรือ อนุกรมอุณหภูมิ
- เมื่อหน้าต่างเต็ม ให้คำนวณอย่างน้อยหนึ่งฟีเจอร์ (เช่น mean, variance, max−min)
- พิมพ์ฟีเจอร์ทาง UART เป็นคาบ
Pass when: ได้เวกเตอร์สรุปจากหน้าต่างเต็มอย่างน้อยหนึ่งครั้งต่อวินาที (หรือตามคาบที่สมเหตุสมผล)
Lab E — Choose one (recommended)
หัวข้อที่มีชื่อว่า “Lab E — Choose one (recommended)”E1 Fusion orientation
หัวข้อที่มีชื่อว่า “E1 Fusion orientation”cm55_imu_fusion_bridge_push_raw_components+get_latest_result- พิมพ์ pitch/roll หรือ
orientation
E2 Host telemetry
หัวข้อที่มีชื่อว่า “E2 Host telemetry”- Flash/เชื่อมตามชุดที่ใช้ → เปิด Bitstream Studio หรือ Hackathon
web-app - ยืนยันว่าค่าเซ็นเซอร์บนโฮสต์ขยับตรงกับบอร์ด
E3 Condition event
หัวข้อที่มีชื่อว่า “E3 Condition event”- เมื่อฟีเจอร์หรือ EMA เกินเกณฑ์ → เปิด LED + ข้อความ
EVENT ...
Pass when: ทำครบหนึ่งตัวเลือกและมีหลักฐาน (terminal / UI / LED)
Short report (8–12 lines)
หัวข้อที่มีชื่อว่า “Short report (8–12 lines)”- เซ็นเซอร์ที่ใช้ + คาบ sampling
- วิธี filter / normalize
- ขนาดหน้าต่าง + ฟีเจอร์ที่คำนวณ
- (ถ้ามี) ผล fusion หรือภาพหน้าจอโฮสต์
- สิ่งที่จะส่งต่อไป cloud ใน M06 (payload แนวคิด)
Troubleshooting
หัวข้อที่มีชื่อว่า “Troubleshooting”| อาการ | แนวทาง |
|---|---|
is_ready เป็น false |
ยังไม่ startup · เซ็นเซอร์ไม่ถูก build เข้าโปรเจกต์ · บัสมีปัญหา |
| อ่านได้เป็นครั้งคราว | คาบถี่เกิน · บัสแย่งกับ task อื่น · ลอง try_read / ลดอัตรา |
| Mag อ่านไม่ได้ผ่าน I2C lock | BMM350 เป็น I3C — ใช้ sensor_bmm350_* ตาม SDK |
| Fusion ไม่อัปเดต | ยังไม่ push raw · CM33 fusion ยังไม่รันในคอนฟิกที่ใช้ |
| โฮสต์ไม่มีค่า | ยังไม่ Link Bitstream · HEX/VSIX คนละเวอร์ชัน · SENSOR_CFG disabled |
Submit checklist
หัวข้อที่มีชื่อว่า “Submit checklist”- Lab A–D ผ่าน
- Lab E อย่างน้อย 1 ข้อ
- กรอกตารางใน sensor-ai-prep.md
- รายงานสั้นครบ
Lesson · Cheatsheet · Table of Contents · M06 →
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"แล็บ: สตรีมเซ็นเซอร์และหน้าต่างข้อมูลพร้อม AI" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "Lab: Sensor Streams and AI-Ready Windows" 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/firmware-sdk-edge-ai/m05-sensor-data/l02-lab/
บทเรียนนี้ดัดแปลงจากต้นฉบับด้านล่าง เมื่ออ้างอิงให้คงเครดิตต้นฉบับไว้ด้วย
https://github.com/drsanti/TESAIoT-Courses/blob/287c21814ba8c75f693136616dcd270349a15966/C1/M05/lab.md · Original content by Asst. Prof. Dr. Santi Nuratch (ผศ.ดร.สันติ นุราช), KMUTT. Course 1 (C1/) of drsanti/TESAIoT-Courses. TESA funded the work and holds the rights; published here under CC BY-NC 4.0. The upstream repository carries no licence file. Text kept faithful; structure, front matter, quizzes and notes added by TESA Open Knowledge.
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0
เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA