แล็บ: GPIO และอุปกรณ์ต่อพ่วงบนฮาร์ดแวร์จริง
Course 1 · Module 3
Type: Hands-on lab (block-by-block, then short integration)
Suggested time: 2.5–3 hours
Read first: Lesson · API map · ← Table of Contents · ← M02 · M04 →
หมายเหตุ: snippet ในแล็บนี้ใช้ API ของเฟิร์มแวร์ TESAIoT Bitstream ซึ่งยังไม่เปิดซอร์ส ดูรายละเอียดและตัวอย่างเทียบใน SDK สาธารณะได้ที่หมายเหตุต้นบทเรียน GPIO และอุปกรณ์ต่อพ่วงผ่าน Driver API
Useful references during the lab
หัวข้อที่มีชื่อว่า “Useful references during the lab”| เอกสาร | ใช้เมื่อ |
|---|---|
| TESAIoT Developer Hub | ตัวอย่าง GPIO / Sensors / Embedded |
| Snippet ใน Lesson | ชื่อฟังก์ชันจริงของ TESA Firmware SDK |
| TESAIoT_Hackathon | HEX / Flasher หากใช้แพ็กสำเร็จรูป |
| Bitstream Studio | ดู telemetry (เสริม) |
Lab Goals
หัวข้อที่มีชื่อว่า “Lab Goals”- ควบคุม LED ด้วย
led_controller_*(หรือCy_GPIO_*) - รับเหตุการณ์ปุ่มด้วย
cm55_button_* - ส่ง log ทาง UART (
printf/LOG_INFO/cm55_uart_send) - ทำอย่างน้อยหนึ่งอย่างจาก: PWM (
bitstream_led_pwm_*) · ADC (cm55_adc_*) · I²C (sensor_sht40_*หรือเซ็นเซอร์อื่นที่มีบนบอร์ดของคุณ) - กรอกชื่อ API จริงใน peripheral-api-map.md
Prerequisites
หัวข้อที่มีชื่อว่า “Prerequisites”- ผ่านเกณฑ์ M02
- โปรเจกต์ตัวอย่างที่ลิงก์ TESA Firmware SDK แล้ว
- สาย USB + serial terminal
- รู้คิตในมือ (AI vs Eval — มีผลต่อปุ่มที่สองและ POT)
Lab A — GPIO: LED + Button (required)
หัวข้อที่มีชื่อว่า “Lab A — GPIO: LED + Button (required)”- เรียก
led_controller_init(ถ้าโปรเจกต์ยังไม่ init) และทดลองled_controller_set/led_controller_toggle - เรียก
cm55_button_initแล้วผูกcm55_button_on_pressed(BUTTON_ID_0, …)ให้สลับ LED - Flash แล้วสาธิตบนบอร์ด
Pass when: กดปุ่มแล้ว LED เปลี่ยนสถานะอย่างเสถียร
/* แนวทางสั้น — ดูรายละเอียดใน Lesson §2 */(void)led_controller_init();(void)cm55_button_init();(void)cm55_button_on_pressed(BUTTON_ID_0, on_btn_pressed);Lab B — UART log (required)
หัวข้อที่มีชื่อว่า “Lab B — UART log (required)”- ใน callback ปุ่ม (หรือ loop) พิมพ์ข้อความ เช่น
btn toggled - เปิด terminal บนพอร์ต KitProg3 ตาม baud ของโปรเจกต์
- ยืนยันว่าข้อความตรงกับเหตุการณ์ปุ่ม
printf("btn toggled\r\n");/* หรือ */ LOG_INFO("LAB", "btn toggled");Pass when: เห็นข้อความตรงกับเหตุการณ์ปุ่ม
Lab C — Choose at least one (required)
หัวข้อที่มีชื่อว่า “Lab C — Choose at least one (required)”(void)bitstream_led_pwm_init();(void)bitstream_led_pwm_set_brightness(0, 20);(void)bitstream_led_pwm_set_brightness(0, 80);Pass when: เห็นความสว่างต่างกันชัดเจนอย่างน้อย 2 ระดับ
C2 ADC (Eval kit with POT)
หัวข้อที่มีชื่อว่า “C2 ADC (Eval kit with POT)”(void)cm55_adc_init();int16_t mv = cm55_adc_read_pot_mv();printf("POT mV=%d\r\n", (int)mv);Pass when: ค่าเปลี่ยนเมื่อหมุน POT และพิมพ์ทาง UART ได้
C3 I²C sensor
หัวข้อที่มีชื่อว่า “C3 I²C sensor”(void)sensor_sht40_startup();sht40_sample_t s;if (sensor_sht40_read(&s)) { printf("T=%.2f RH=%.2f\r\n", (double)s.temperature, (double)s.humidity);}(หรือเซ็นเซอร์อื่นที่มีบนบอร์ดของคุณ — sensor_bmi270_* ฯลฯ)
Pass when: อ่านค่าได้และพิมพ์ทาง UART
Lab D — Mini integration (recommended)
หัวข้อที่มีชื่อว่า “Lab D — Mini integration (recommended)”รวม A+B กับผลจาก C เช่น ADC → PWM duty หรือปุ่ม → สลับโหมด + UART log
หน่วงใน task:
vTaskDelay(pdMS_TO_TICKS(50));Optional: เปิด Bitstream Studio ถ้าเฟิร์มแวร์ส่ง telemetry
Short report (5–10 lines)
หัวข้อที่มีชื่อว่า “Short report (5–10 lines)”- ชื่อ BSP / บอร์ด
- ตารางงาน → ชื่อ API จริง (จาก API map)
- ผล Lab A/B/C
Troubleshooting
หัวข้อที่มีชื่อว่า “Troubleshooting”| อาการ | แนวทางแก้ |
|---|---|
| LED ไม่ติด | led_id_t ผิด · active level · ยังไม่ init BSP |
| ปุ่มไม่มี event | ยังไม่ cm55_button_init / ผูก callback · ใช้ผิด BUTTON_ID_* |
| UART เงียบ | พอร์ต COM / baud · retarget ยังไม่พร้อม · ล็อก cm55_uart_out_* ค้าง |
| I²C fail | เซ็นเซอร์ไม่พร้อม · ลืม lock บัสเมื่อเขียนไดรเวอร์ต่ำ · ที่อยู่ผิด |
| ADC = 0 ตลอด | คิตไม่มี POT · ยังไม่ cm55_adc_init |
| PWM ไม่เปลี่ยน | ยังไม่ bitstream_led_pwm_init · led_id ผิดช่วง |
Submit checklist
หัวข้อที่มีชื่อว่า “Submit checklist”- Lab A ผ่าน
- Lab B ผ่าน
- Lab C ≥ 1 ข้อผ่าน
- กรอก peripheral-api-map.md
- (แนะนำ) Lab D
Lesson · API map · Table of Contents · M04 →
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"แล็บ: GPIO และอุปกรณ์ต่อพ่วงบนฮาร์ดแวร์จริง" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "Lab: GPIO and Peripherals on Real Hardware" 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/m03-gpio-peripherals/l02-lab/
บทเรียนนี้ดัดแปลงจากต้นฉบับด้านล่าง เมื่ออ้างอิงให้คงเครดิตต้นฉบับไว้ด้วย
https://github.com/drsanti/TESAIoT-Courses/blob/287c21814ba8c75f693136616dcd270349a15966/C1/M03/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