จับสัญญาณดิจิทัลครั้งแรก
เป้าหมาย
หัวข้อที่มีชื่อว่า “เป้าหมาย”เมื่อจบบทเรียนนี้ คุณจะ
- ต่อสายกราวด์และสายสัญญาณของ logic analyzer กับบอร์ดได้ถูกต้อง
- เลือกอัตราสุ่มตัวอย่างที่เร็วพอสำหรับสัญญาณที่ต้องการวัด และอธิบายผลเมื่อช้าเกินไป
- วัดความกว้างพัลส์และความถี่ของสัญญาณกะพริบจากภาพที่จับได้
ก่อนเริ่ม
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม”- logic analyzer ราคาประหยัดที่ใช้กับ sigrok ได้ (หลายรุ่นใช้ไดรเวอร์ fx2lafw) พร้อมสายและปากคีบ
- ติดตั้ง PulseView บนคอมพิวเตอร์ของคุณ แล้วลองเสียบเครื่องดูว่าโปรแกรมเห็นอุปกรณ์
- TESAIoT Dev Kit ที่ flash ตัวอย่าง QWA309 Header I/O Test ไว้ ตัวอย่างนี้สร้างสัญญาณให้เราวัดบนขา header
- ถ้าใช้ Eva Kit ให้เขียนโปรแกรมกะพริบขาว่างหนึ่งขาด้วยจังหวะที่คุณรู้ค่า เช่น ติด 250 ms ดับ 250 ms แล้ววัดขานั้นแทน
ความปลอดภัยของเครื่องมือ logic analyzer ราคาประหยัดส่วนใหญ่ไม่มีการแยกกราวด์ (isolation) กราวด์ของมันคือกราวด์ของคอมพิวเตอร์ ห้ามต่อกับวงจรที่กราวด์ไม่ใช่กราวด์เดียวกับคอมพิวเตอร์ หรือวงจรที่มีไฟบ้าน และตรวจสเปกแรงดันขาเข้าสูงสุดของเครื่องก่อนใช้เสมอ
ดูของจริงก่อน
หัวข้อที่มีชื่อว่า “ดูของจริงก่อน”รันโปรแกรมทดสอบ header แล้วกดปุ่ม PWM Out จอจะเขียนว่ากำลังขับ P13.3 และ P13.4 เป็นคู่สัญญาณกลับเฟส 50 รอบ ครึ่งคาบเวลา 20 ms “ความถี่ประมาณ 25 Hz” ถ้าต่อ LED กับตัวต้านทาน 1 kΩ ไว้ที่ขา P13.3 (แบบในบทเรียน ชิ้นส่วนพื้นฐาน) คุณจะเห็นไฟกะพริบถี่จนเกือบดูเหมือนติดค้าง ประมาณสองวินาที
ตาบอกได้แค่ว่า “กะพริบเร็ว” แต่ตอบไม่ได้ว่า 25 Hz จริงไหม แต่ละพัลส์กว้างเท่ากันหรือเปล่า และครบ 50 รอบไหม มัลติมิเตอร์ก็ตอบไม่ได้ เพราะมันเฉลี่ยค่า เครื่องมือที่ตอบได้คือ logic analyzer
1. logic analyzer ทำงานอย่างไร และต่ออย่างไร
หัวข้อที่มีชื่อว่า “1. logic analyzer ทำงานอย่างไร และต่ออย่างไร”logic analyzer อ่านแรงดันของแต่ละช่องเป็นจังหวะคงที่ เทียบกับเกณฑ์ (threshold) แล้วเก็บเป็น 0 หรือ 1 เรียงตามเวลา โปรแกรมบนคอมพิวเตอร์วาดผลออกมาเป็นรูปคลื่นสี่เหลี่ยม มันไม่รู้ว่าแรงดันจริงเป็นเท่าไร รู้แค่ว่าสูงกว่าหรือต่ำกว่าเกณฑ์ (ถ้าอยากเห็นแรงดันจริงต้องใช้ออสซิลโลสโคปในโมดูล 5)
กราวด์ก่อนเสมอ แรงดันคือความต่างระหว่างสองจุด ช่องสัญญาณของ logic analyzer วัดเทียบกับสาย GND ของมัน ถ้าไม่ได้ต่อ GND เข้ากับ GND ของบอร์ด เครื่องจะไม่มีจุดอ้างอิง ภาพที่ได้จะเป็นสัญญาณมั่วหรือเส้นตรง แม้สายสัญญาณจะต่อถูกก็ตาม ลำดับที่ดีคือ ต่อ GND → ต่อสายสัญญาณ → เปิดโปรแกรม และถอดกลับด้าน
ระดับแรงดันต้องเข้ากัน ตรวจสเปกว่าเกณฑ์ขาเข้าของเครื่องอ่านสัญญาณ 3.3 V ได้ (เกือบทุกรุ่นได้) ส่วนสัญญาณ 1.8 V บางรุ่นอ่านได้ บางรุ่นอยู่ใกล้เกณฑ์จนไม่น่าเชื่อถือ
เลือกขาที่จะวัด จิ้มหรือหนีบเฉพาะขา header หรือจุดทดสอบ ใช้ปากคีบที่ออกแบบมาสำหรับหนีบขา อย่าให้ปลายสายโลหะแตะขาข้าง ๆ
2. อัตราสุ่มตัวอย่าง และเมื่อมันช้าเกินไป
หัวข้อที่มีชื่อว่า “2. อัตราสุ่มตัวอย่าง และเมื่อมันช้าเกินไป”อัตราสุ่มตัวอย่าง (sample rate, f_s) คือจำนวนครั้งที่เครื่องอ่านต่อวินาที ช่วงห่างระหว่างสองตัวอย่างคือ T_s = 1 / f_s ซึ่งเป็น ความละเอียดของเวลา ที่วัดได้ ขอบสัญญาณที่เกิดระหว่างสองตัวอย่าง เครื่องจะเห็นที่ตัวอย่างถัดไป ความกว้างพัลส์ที่วัดได้จึงคลาดได้ราวหนึ่ง T_s
ต้องเร็วแค่ไหน ทฤษฎีบทการสุ่มตัวอย่าง (Nyquist–Shannon) บอกว่าสัญญาณที่มีความถี่สูงสุด f ต้องสุ่มเร็วกว่า 2f จึงสร้างกลับได้ แต่งานวัดเวลาของสัญญาณดิจิทัลต้องการมากกว่านั้น กฎหยาบที่ใช้กันคือ อย่างน้อย 4 ตัวอย่างต่อพัลส์ที่แคบที่สุด และถ้าอยากวัดเวลาให้แม่น ใช้ 10 ตัวอย่างขึ้นไป
| สัญญาณ | ช่วงที่แคบที่สุด | อัตราสุ่มที่เหมาะ |
|---|---|---|
| PWM 25 Hz ของโปรแกรมทดสอบ | 20 ms | 10 kHz ก็เพียงพอ (ความละเอียด 0.1 ms หรือ 0.25% ของคาบเวลา 40 ms) |
| UART 115200 baud | 1 บิต = 1 / 115200 = 8.68 µs | 1 MHz ได้ 8.7 ตัวอย่างต่อบิต 4 MHz สบายกว่า |
| I2C 400 kHz | ช่วงสูงหรือต่ำของ SCL ราว 1.25 µs | 4 ถึง 10 MHz |
ถ้าช้าเกินไป มีสองอาการ
- พัลส์หาย พัลส์ที่แคบกว่า T_s อาจตกระหว่างสองตัวอย่างพอดี เครื่องไม่เห็นเลย
- aliasing สัญญาณเร็วที่ถูกสุ่มช้าเกินไปกลายเป็นภาพของสัญญาณที่ช้ากว่าและไม่มีอยู่จริง
ตัวอย่าง คลื่นสี่เหลี่ยม 1 kHz ถูกสุ่มที่ 1.1 kHz แต่ละตัวอย่างเลื่อนไปบนคลื่นทีละ 1000 / 1100 = 0.909 รอบ เท่ากับถอยหลังทีละ 0.091 รอบ ภาพที่ได้จึงเป็นคลื่นที่ครบรอบทุก 11 ตัวอย่าง คือ 1100 / 11 = 100 Hz ความถี่ปลอมนี้คือ |1100 − 1000| Hz ภาพดูสะอาดและน่าเชื่อ นั่นคือเหตุผลที่ aliasing อันตราย มันไม่ได้ดูเหมือนความผิดพลาด
หน่วยความจำ จำนวนตัวอย่าง = f_s × เวลาที่จับ สุ่ม 1 MHz นาน 5 s ได้ 5 ล้านตัวอย่างต่อช่อง ตั้งเร็วเกินจำเป็นกินหน่วยความจำและทำให้จับได้สั้นลง เครื่องที่ส่งข้อมูลผ่าน USB ตลอดเวลาอาจทำอัตราสูงสุดไม่ได้เมื่อเปิดหลายช่องพร้อมกัน
3. Trigger และการวัดเวลา
หัวข้อที่มีชื่อว่า “3. Trigger และการวัดเวลา”trigger คือเงื่อนไขที่บอกเครื่องว่า “เริ่มเก็บตรงนี้” เช่น ขอบขาขึ้นของช่อง 0 เครื่องจะรอจนเงื่อนไขเป็นจริง แล้วเก็บตัวอย่างรอบ ๆ จุดนั้น ทำให้เราไม่ต้องกดเริ่มให้ทันเหตุการณ์ และเหตุการณ์อยู่ตำแหน่งเดิมทุกครั้งที่จับ
วัดเวลาจากภาพ ใช้เครื่องมือวัดเวลา (cursor หรือ marker) ของโปรแกรมวางที่ขอบสัญญาณ
ความกว้างพัลส์ (t_high) = เวลาขอบขาลง − เวลาขอบขาขึ้นก่อนหน้าคาบเวลา (T) = เวลาขอบขาขึ้นถัดไป − เวลาขอบขาขึ้นแรกความถี่ (f) = 1 / Tduty cycle = t_high / Tวัดหลายคาบเวลาแล้วหารด้วยจำนวนคาบเวลาจะแม่นกว่าวัดคาบเวลาเดียว เพราะความคลาดราวหนึ่ง T_s ที่ขอบถูกหารด้วยจำนวนคาบเวลาด้วย
ตัวอย่างสมบูรณ์
หัวข้อที่มีชื่อว่า “ตัวอย่างสมบูรณ์”โจทย์ จับสัญญาณจากปุ่ม PWM Out ของโปรแกรมทดสอบ header แล้ววัดความถี่ ความกว้างพัลส์ และนับจำนวนรอบ
- รู้ก่อนว่าคาดอะไร จากคำอธิบายบนจอ ครึ่งคาบเวลา 20 ms คาบเวลาจึงประมาณ 40 ms ความถี่ประมาณ 25 Hz duty ราว 50% นาน 50 รอบ รวมราว 2 s P13.4 ควรกลับเฟสกับ P13.3 ตลอดเวลา
- ต่อสาย GND ของเครื่องเข้า GND ของ header ช่อง 0 เข้า P13.3 ช่อง 1 เข้า P13.4
- เลือกอัตราสุ่ม ช่วงที่แคบที่สุดคือ 20 ms ที่ 10 kHz ได้ 200 ตัวอย่างต่อช่วง ความละเอียด 0.1 ms เกินพอ
- เลือกเวลาจับ อย่างน้อย 3 s เพื่อให้ครบ 2 s ของสัญญาณ ได้ 10 kHz × 3 s = 30,000 ตัวอย่างต่อช่อง
- ตั้ง trigger ขอบขาขึ้นของช่อง 0 กด Run ในโปรแกรม แล้วกดปุ่ม PWM Out บนจอ
- วัด (ตัวเลขต่อไปนี้เป็นข้อมูลตัวอย่าง) ขอบขาขึ้นแรกที่ 0 ms ขอบขาขึ้นลูกที่ 11 อยู่ที่ 401.0 ms คาบเวลาเฉลี่ย = 401.0 / 10 = 40.10 ms ความถี่ = 1 / 40.10 ms = 24.94 Hz ความกว้างพัลส์ลูกแรก 20.05 ms duty = 20.05 / 40.10 = 50.0%
- ตีความ คาบเวลายาวกว่า 40 ms อยู่ 0.1 ms (0.25%) เพราะโปรแกรมสร้างสัญญาณด้วยการเขียนขาแล้วหน่วงเวลาด้วยซอฟต์แวร์ แต่ละรอบจึงมีเวลาของคำสั่งอื่นปนเพิ่มเล็กน้อย ถ้าความละเอียด 0.1 ms ของเครื่องหยาบเกินกว่าจะแยกความต่างนี้ได้ ให้เพิ่มอัตราสุ่มเป็น 100 kHz แล้ววัดใหม่
- นับรอบ ใช้ decoder หรือนับขอบขาขึ้น ต้องได้ 50 ขอบพอดี และช่อง 0 กับ 1 ต้องไม่เป็น 1 พร้อมกันตรงไหนเลย
ฝึกเติม
หัวข้อที่มีชื่อว่า “ฝึกเติม”- จะจับ UART 115200 baud ให้ได้อย่างน้อย 8 ตัวอย่างต่อบิต ต้องใช้อัตราสุ่มอย่างน้อยเท่าไร
- สุ่ม 1 MHz นาน 5 s ใช้ 8 ช่อง เครื่องต้องเก็บกี่ตัวอย่างต่อช่อง และรวมกี่ตัวอย่าง
- คลื่นสี่เหลี่ยม 900 Hz ถูกสุ่มที่ 1 kHz ภาพที่เห็นจะมีความถี่เท่าไร
- ในภาพที่จับได้ ขอบขาขึ้นอยู่ที่ 12.0 ms และ 52.1 ms ขอบขาลงระหว่างนั้นอยู่ที่ 32.0 ms หาคาบเวลา ความถี่ ความกว้างพัลส์ และ duty cycle
- สัญญาณมีพัลส์กว้าง 3 µs สุ่มที่ 200 kHz จะเกิดอะไรขึ้น ควรเปลี่ยนเป็นเท่าไร
- ถ้าลืมต่อสาย GND ของ logic analyzer ภาพที่ได้น่าจะเป็นอย่างไร เพราะอะไร
- 115200 × 8 = 921,600 ตัวอย่างต่อวินาที ใช้ 1 MHz (ได้ 8.7 ตัวอย่างต่อบิต)
- 1 MHz × 5 s = 5 ล้านตัวอย่างต่อช่อง รวม 8 ช่องเป็น 40 ล้านตัวอย่าง
- |1000 − 900| = 100 Hz
- คาบเวลา = 52.1 − 12.0 = 40.1 ms ความถี่ = 1 / 40.1 ms = 24.9 Hz ความกว้างพัลส์ = 32.0 − 12.0 = 20.0 ms duty = 20.0 / 40.1 = 49.9%
- ช่วงห่างระหว่างตัวอย่าง 5 µs กว้างกว่าพัลส์ พัลส์อาจหายไปทั้งพัลส์หรือเห็นเป็นตัวอย่างเดียว ใช้อย่างน้อย 4 ตัวอย่างต่อพัลส์คือ 4 / 3 µs ≈ 1.33 MHz เลือก 2 MHz ขึ้นไป (10 ตัวอย่างต่อพัลส์ใช้ราว 4 MHz)
- ภาพจะมั่วหรือเป็นเส้นคงที่ หรือเปลี่ยนเมื่อขยับสาย เพราะช่องสัญญาณไม่มีจุดอ้างอิงร่วมกับบอร์ด แรงดันที่เครื่องเห็นจึงไม่ใช่แรงดันของสัญญาณเทียบ GND ของบอร์ด
เช็กความเข้าใจ
หัวข้อที่มีชื่อว่า “เช็กความเข้าใจ”ตอบคำถามใน quiz.yaml ให้ถูกอย่างน้อย 4 ใน 5 ข้อ
ส่วน A: สัญญาณกะพริบช้า (GPIO Out)
- ต่อ GND ของเครื่องเข้า GND ของ header แล้วต่อช่อง 0 ถึง 5 เข้า P13.0, P13.3, P13.4, P13.5, P13.6, P13.7 ตามลำดับ (ถ้าเครื่องมีช่องไม่พอ ใช้แค่สองขาแรก)
- ตั้งอัตราสุ่ม 10 kHz เวลาจับ 20 s ตั้ง trigger ขอบขาขึ้นของช่อง 0
- กด Run แล้วกดปุ่ม GPIO Out บนจอ โปรแกรมจะขับทีละขาเป็น 1 ขาละราว 0.7 s เรียงกัน แล้วปิดทั้งหมด ทำสามรอบ
- ทาย ก่อนดูผล ความกว้างพัลส์ของแต่ละขาน่าจะยาวกว่า 700 ms หรือสั้นกว่า เพราะอะไร (ใบ้: ดูโค้ดของตัวอย่างว่ามีอะไรทำงานระหว่างสองจังหวะหน่วงเวลา)
- วัดความกว้างพัลส์ของช่อง 0 ทั้งสามรอบ และเวลาจากขอบขาขึ้นของช่อง 0 ถึงขอบขาขึ้นของช่อง 1 จดลงตาราง
ส่วน B: สัญญาณเร็วขึ้น (PWM Out)
- ต่อช่อง 0 เข้า P13.3 และช่อง 1 เข้า P13.4 ทำตามตัวอย่างสมบูรณ์ วัดคาบเวลาเฉลี่ย 10 คาบเวลา ความถี่ ความกว้างพัลส์ และนับจำนวนรอบ
- ทดลองให้ช้าเกินไป ลดอัตราสุ่มลงเป็นค่าต่ำสุดที่เครื่องยอมให้ตั้ง แล้วจับใหม่ ถ้าเครื่องยังเร็วเกินกว่าจะเห็นผลกับสัญญาณ 25 Hz ให้คำนวณแทนว่าที่อัตราสุ่มเท่าไรจะเริ่มเห็นความผิดปกติ และจะเห็นอะไร
- ลองดู decoder ชื่อ Timing ใน PulseView (ถ้ามีในเวอร์ชันของคุณ) ที่แสดงเวลาระหว่างขอบให้อัตโนมัติ เทียบกับที่วัดด้วยมือ
| การวัด | คาด | วัดได้ |
|---|---|---|
| ความกว้างพัลส์ P13.0 (GPIO Out) | ราว 0.7 s | |
| ขอบขึ้น P13.0 ถึงขอบขึ้น P13.3 | ราว 0.7 s | |
| คาบเวลาเฉลี่ย 10 คาบเวลา (PWM Out) | ราว 40 ms | |
| ความถี่ | ราว 25 Hz | |
| duty cycle ของ P13.3 | ราว 50% | |
| จำนวนรอบ | 50 | |
| มีช่วงที่ P13.3 และ P13.4 เป็น 1 พร้อมกันไหม | ไม่มี |
บทเรียนถัดไป ถอดรหัส I2C และ UART เราจะให้โปรแกรมอ่านความหมายของสัญญาณแทนเรา ตั้งแต่ address ของอุปกรณ์บนบัส I2C ไปจนถึงไบต์ที่วิ่งบนสาย UART
สะท้อนคิด
หัวข้อที่มีชื่อว่า “สะท้อนคิด”ในส่วน A คุณทายถูกไหมว่าพัลส์ยาวกว่าหรือสั้นกว่า 700 ms เรื่องนี้บอกอะไรเกี่ยวกับการสร้างจังหวะเวลาด้วยการหน่วงในซอฟต์แวร์
แหล่งอ้างอิง
หัวข้อที่มีชื่อว่า “แหล่งอ้างอิง”- sigrok PulseView
- Logic analyzer (Wikipedia)
- AIoT in Action: examples/s03/02_led_blink.py
- Nyquist–Shannon sampling theorem (Wikipedia)
- โค้ดของ QWA309 Header I/O Test (Developer Hub, commit 372d0d8)
คำถามทบทวน
ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย
-
ต่อสายสัญญาณของ logic analyzer เข้าขาของบอร์ดแล้ว แต่ลืมต่อสาย GND ผลที่น่าจะเกิดคืออะไร (เป้าหมายข้อ 1)
- ภาพถูกต้องตามปกติ เพราะ USB ต่อกราวด์ให้เองเสมอ
- ภาพมั่ว เป็นเส้นคงที่ หรือเปลี่ยนเมื่อขยับสาย เพราะเครื่องไม่มีจุดอ้างอิงร่วมกับบอร์ด
- บอร์ดจะรีเซ็ต
- เครื่องจะวัดแรงดันจริงได้แทนค่า 0 และ 1
ดูเฉลย
คำตอบ: B. ภาพมั่ว เป็นเส้นคงที่ หรือเปลี่ยนเมื่อขยับสาย เพราะเครื่องไม่มีจุดอ้างอิงร่วมกับบอร์ด
ช่องสัญญาณวัดแรงดันเทียบกับ GND ของเครื่อง ถ้าไม่มีสาย GND ร่วมกับบอร์ด ไม่มีอะไรรับประกันว่าจุดอ้างอิงสองฝั่งเท่ากัน ต่อ GND ก่อนสายสัญญาณทุกครั้ง
-
ลำดับการต่อ logic analyzer เข้ากับบอร์ดข้อใดดีที่สุด (เป้าหมายข้อ 1)
- ต่อสายสัญญาณก่อน แล้วต่อ GND ทีหลังถ้าภาพไม่นิ่ง
- ต่อ GND ก่อน แล้วต่อสายสัญญาณ แล้วจึงเริ่มจับ
- ไม่ต้องต่อ GND ถ้าบอร์ดใช้ไฟจาก USB
- ต่อสายสัญญาณเข้าขาชิปโดยตรงให้ใกล้ที่สุด
ดูเฉลย
คำตอบ: B. ต่อ GND ก่อน แล้วต่อสายสัญญาณ แล้วจึงเริ่มจับ
ต่อจุดอ้างอิงก่อนเสมอ แล้วหนีบสายสัญญาณที่ขา header หรือจุดทดสอบ การจิ้มขาชิปที่ถี่เสี่ยงลัดวงจรขาข้าง ๆ
-
ต้องการจับสัญญาณ UART 115200 baud ให้ได้อย่างน้อย 8 ตัวอย่างต่อบิต อัตราสุ่มข้อใดต่ำที่สุดที่ใช้ได้ (เป้าหมายข้อ 2)
- 115.2 kHz
- 230.4 kHz
- 500 kHz
- 1 MHz
ดูเฉลย
คำตอบ: D. 1 MHz
115200 × 8 = 921.6 kHz ในตัวเลือกมีเพียง 1 MHz ที่เกินค่านี้ (ได้ราว 8.7 ตัวอย่างต่อบิต)
-
คลื่นสี่เหลี่ยม 1 kHz ถูกสุ่มที่ 1.1 kHz ภาพที่ได้จะแสดงความถี่เท่าไร (เป้าหมายข้อ 2)
- 1 kHz
- 1.1 kHz
- 100 Hz
- 2.1 kHz
ดูเฉลย
คำตอบ: C. 100 Hz
สุ่มช้ากว่า 2 เท่าของความถี่สัญญาณมาก เกิด aliasing ความถี่ปลอมคือ |1100 − 1000| = 100 Hz และภาพดูสะอาดน่าเชื่อ จึงอันตราย
-
ภาพที่จับได้มีขอบขาขึ้นที่ 5.0 ms และ 25.0 ms และขอบขาลงระหว่างนั้นที่ 10.0 ms ความถี่และ duty cycle เป็นเท่าไร (เป้าหมายข้อ 3)
- 50 Hz และ 25%
- 40 Hz และ 25%
- 50 Hz และ 75%
- 200 Hz และ 50%
ดูเฉลย
คำตอบ: A. 50 Hz และ 25%
คาบเวลา 25.0 − 5.0 = 20 ms จึงได้ 50 Hz ความกว้างพัลส์ 10.0 − 5.0 = 5 ms duty = 5 / 20 = 25%
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"จับสัญญาณดิจิทัลครั้งแรก" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "Capturing a first digital signal" 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
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0
เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA