อนาล็อกและสัมผัส: ADC ลูกบิด และ CapSense
โมดูล 2 — จากจอสู่ฮาร์ดแวร์ · สไลด์: slides.md · ภาพรวมโมดูล · หน้าหลักสูตร
อ่านลูกบิดผ่าน ADC และอ่านปุ่มกับแถบสัมผัสผ่าน CapSense ให้เป็น แยกให้ออกว่าตัวเลขไหนเชื่อได้และตัวเลขไหนยังต้องวัดเอง แล้วเข้าใจว่าทำไมค่าที่ได้ยังสั่นแม้มือจะหยุดนิ่ง
เป้าหมาย
หัวข้อที่มีชื่อว่า “เป้าหมาย”เมื่อจบบทเรียนนี้ คุณจะ:
- เลือกใช้ sensors.pot.read() / .percent() / .voltage() ให้ตรงกับคนอ่าน และแปลงค่าดิบเป็นเปอร์เซ็นต์ด้วยตัวส่วน 2^n − 1 ได้ถูกต้อง (เช่น 40915 เป็น 62.43%) พร้อมบอกได้ว่าทำไมตัวเลขโวลต์ยังเชื่อไม่ได้จนกว่าจะวัด V_ref ของบอร์ดจริง
- อธิบายได้ว่า 0-65535 เป็นสเกลของ API ไม่ใช่ความละเอียดของ ADC และหาความละเอียดจริงจากขนาดก้าวของ read() บนบอร์ดจริงได้ (ก้าวละ k เท่ากับ 65536/k ขั้น) แล้วจดลงบันทึกการเรียน
- อธิบายหลักการของ CapSense (นิ้วเพิ่มความจุให้แผ่นทองแดง ชิป PSoC 4000T ตัดสินจากส่วนต่างเทียบกับ baseline) และแก้อาการปุ่มรายงานกลับด้านได้ถูกวิธีโดยไม่แก้โค้ด
- เลือก sensors.snapshot() แทนการถามทีละค่า ใช้ช่อง sequence ตรวจว่าลูปกำลังอ่านค่าเดิมซ้ำหรือไม่ และบอกได้ว่าห้าฟังก์ชันไหนที่ Eva Kit ปฏิเสธด้วย OSError และเพราะอะไร
ก่อนเริ่ม
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม”ต่อจากบทเรียน 2.4–2.6 ของที่ใช้ซ้ำวันนี้คือ ui.Label ui.Bar ui.Panel, การเรียก ui.poll() ทุกรอบลูป และ time.sleep_ms()
คุมจังหวะ ทิศทางของข้อมูลกลับด้านจากเดิม ชุดบทเรียน 2.7–2.9 ให้ฮาร์ดแวร์เป็นฝ่ายสั่งจอ
เปิดบันทึกการเรียนไว้ เพราะบทเรียนนี้มีตัวเลขหลายตัวที่เอกสารยังไม่ได้วัด และต้องจดจากบอร์ดของทีมเอง
ถ้ามีมัลติมิเตอร์ให้เตรียมไว้ด้วย และตอนเสียบสายบอร์ดอย่าวางนิ้วบนแผ่นสัมผัส (เหตุผลอยู่ในแนวคิดข้อ baseline)
- อุปกรณ์: บอร์ด Eva Kit หรือ TESAIoT Dev Kit ที่ลงเฟิร์มแวร์ MicroPython ของ BENTO แล้ว หรือ BENTO Emulator ใน BENTO IDE
- เรียนมาก่อน: บทเรียน 2.6 — ลงมือทำ: แผงควบคุมสัมผัสของเรา และ widget ขั้นต่อไป
ดูของจริงก่อน
หัวข้อที่มีชื่อว่า “ดูของจริงก่อน”บน Eva Kit เปิดเมนู Controls แล้วหมุนลูกบิดช้า ๆ เข็มโค้งบนจอกวาดตามมือทันที Dev Kit ไม่มีเมนูนี้
ให้เปิดหน้า GPIO & RGB Matrix แล้วหมุน VR1 บนฐานดูแถบ VR1-4 แทน ส่วนแถบสัมผัสให้รัน 01_capsense_dimmer.py
แล้วลากนิ้ว จากนั้นหยุดมือนิ่งสนิทแล้วจ้องตัวเลขเปอร์เซ็นต์ต่ออีกสิบวินาที มันยังขยับอยู่ทั้งที่ไม่มีใครแตะ
นั่นไม่ใช่บอร์ดเสียและไม่ใช่โปรแกรมผิด มันคือธรรมชาติของการอ่านค่าอนาล็อก และเป็นคำถามที่ชุดบทเรียนนี้จะตอบ
ลูกบิดไม่ได้ส่งตัวเลข มันคือ ตัวแบ่งแรงดันที่ปรับด้วยมือ wiper แบ่งแทร็กตัวต้านทานเป็นสองท่อน หมุนไปครึ่งทางจึงได้แรงดันครึ่งหนึ่ง (บน Eva Kit คือ R34 ขนาด 10 kΩ แบบ linear ซึ่งใช้เส้นทางเดียวกับ thermistor TH1 จึงใช้พร้อมกันไม่ได้ ค่าเริ่มต้นคือ pot) วงจร SAR ADC ในชิปตรึงแรงดันไว้ แล้วทายทีละบิตแบบไบนารีเสิร์ช ปัดลงขั้นบันไดที่ใกล้ที่สุด การแปลงหนึ่งครั้งจึงกินเวลา ไม่ใช่ทันที และค่าที่ Python อ่านได้คือผลของการทายที่จบไปแล้ว ไม่ใช่แรงดัน ณ วินาทีที่อ่านตัวแปร
ลูกบิดตัวเดียวมีสามหน้าตาจากการวัดครั้งเดียวกัน read() คืน 0-65535 ไว้ดูความละเอียดดิบและความสั่น percent() คืน 0-100
เข้ากับ ui.Arc / ui.Bar และ voltage() ไว้เทียบกับมัลติมิเตอร์ ไม่ต้องเรียก sensors.init() (บน Eva Kit เรียกแล้วได้ OSError)
บน Eva Kit คอร์จอ (CM55) อ่านลูกบิดแล้ว Python หยิบค่าจาก snapshot ส่วน Dev Kit ให้ CM33 อ่าน VR1 บนฐาน QWA309 ตรง ๆ
สูตรแปลงคือ p = raw / (2^n − 1) × 100% ส่วนขนาดหนึ่งขั้นใช้ 2^n อย่าสลับตัวส่วน และ 65535 เป็นแค่ สเกลของ API
เฟิร์มแวร์อ่าน ADC ได้ 12 บิต (0-4095) แล้วขยายเป็น 0-65535 เลขใหญ่กับเลขละเอียดจึงเป็นคนละเรื่อง
ส่วนโวลต์ต้องระวัง: ผังของทั้งสองบอร์ดระบุแรงดันอ้างอิง 1.8 V แต่ voltage() คูณด้วย 3.3 V ที่สมมติไว้ และยังไม่มีใครเอามิเตอร์ไปยืนยัน
จึงยังพูดตัวเลขโวลต์เป็นความจริงไม่ได้
CapSense ไม่มีสวิตช์ มีแต่แผ่นทองแดงใต้พลาสติก นิ้วคือตัวนำที่ต่อลงกราวด์ผ่านร่างกาย พอเข้าใกล้ ความจุของแผ่นเพิ่มขึ้น
ชิปอัดประจุแล้วจับเวลาได้นานขึ้นเล็กน้อยจึงสรุปว่ามีนิ้ว มันวัดความใกล้ของตัวนำ ไม่ใช่แรงกด ใส่ถุงมือยางหนาจึงไม่ติด
บน Eva Kit ปุ่ม CSB1 / CSB2 เป็นแบบ CSX (mutual-capacitance) มีขา Tx กับ Rx แยกกัน แถบเลื่อนคืออิเล็กโทรดห้าแผ่นที่ถัวเฉลี่ยเป็นตำแหน่ง 0-100
งานนี้ทำโดยชิป PSoC 4000T อีกตัว คอร์จออ่านจากมันทาง I2C (แอดเดรส 0x08) ครั้งละสามไบต์ คือปุ่ม 0 ปุ่ม 1 และตำแหน่งแถบเลื่อน
แล้ว Python ขอต่อจากคอร์จอ ในโค้ดเราเห็นแค่ btn0 btn1 slider เหมือนกันทั้งสองบอร์ด
ชิปไม่ได้ตัดสินจากค่าดิบ แต่จาก ส่วนต่างเทียบกับ baseline คือค่าตอนไม่มีนิ้ว baseline ไล่ตามการเปลี่ยนช้า ๆ อย่างความชื้นและอุณหภูมิ แต่ไล่ไม่ทันการแตะ และบนบอร์ดของเรามันถูกเก็บครั้งแรก ตอนบอร์ดบูต ไม่ใช่ตอนกด Program to Device ถ้าวางนิ้วค้างตอนบูต ปุ่มจะรายงานกลับด้านทั้งบทเรียน วิธีแก้คือยกนิ้วออกให้หมดแล้วถอดสาย USB เสียบกลับ การรันสคริปต์ใหม่ไม่ได้เก็บ baseline ใหม่ และบน Dev Kit ห้ามโยกสวิตช์บนฐาน เพราะสวิตช์พวกนั้นคือสวิตช์ไฟ
โมดูล sensors บน Eva Kit มีสิบห้าชื่อ คือเก้าฟังก์ชันกับหกเซนเซอร์ย่อยและตัววินิจฉัย ห้าฟังก์ชัน init() scan() push()
live_push() auto() ถูก Eva ปฏิเสธด้วย OSError เพราะทั้งห้าต้องขับบัส SCB0 ที่คอร์จอถือไว้ บน Dev Kit ห้าตัวนี้ทำงานจริง
แต่ไม่ได้แปลว่าควรเรียก (live_push() วนจนกด Ctrl+C และ auto() เปิดงานค้างไว้หลังสคริปต์จบ) ในคอร์สนี้ใช้ sensors.snapshot()
ซึ่งคืน dict สามกลุ่ม pot capsense bmi270 จากการอ่านจังหวะเดียวกัน และหน้าตาเดียวกันทั้งสองบอร์ด ต่างจาก read_all()
ที่บน Dev Kit คืน pot เป็น float ทุกกลุ่มมีช่อง sequence ถ้าเลขนี้ไม่ขยับระหว่างสองรอบ แปลว่าเราอ่านค่าเดิมซ้ำ
คอร์จออ่าน pot กับ capsense ทุก 200 ms ลูปที่เร็วกว่านั้นจึงเจอค่าเดิมแน่นอน
ตัวอย่างสมบูรณ์
หัวข้อที่มีชื่อว่า “ตัวอย่างสมบูรณ์”01_capsense_dimmer.pyก่อนรัน ทายก่อนว่าตอนปล่อยนิ้ว ค่าดิบจากslider()จะทำอะไร และไฟจะดับหรือไม่ ไฟล์เล่นรูปสาธิตก่อน (ตัวเลขที่พิมพ์เอง ยังไม่ใช่ค่าจริง) แล้วค่อยให้ลากจริง ดูสองเส้นบนกราฟที่แยกกันด้วยรูปทรง แล้วแกะว่าโค้ดตัดสิน “ปล่อยนิ้ว” จากค่าที่ไม่ขยับครบIDLE_ROUNDSรอบ ไม่ใช่จากslider() == 0ซึ่งอาจแปลว่าแตะที่ปลายซ้าย ลองเปลี่ยนIDLE_ROUNDSแล้วดูว่าป้าย “ปล่อยนิ้ว” ขึ้นเร็วหรือช้าลงอย่างไร และสังเกตว่าไฟค้างระดับได้เพราะhold()ถูกเรียกซ้ำทุกรอบ09_sensors_api_tour.pyก่อนรัน ทายว่าบนบอร์ดของทีมแถวไหนจะเขียว (เรียกได้) แถวไหนจะส้ม (ถูกปฏิเสธหรือถูกข้าม) แล้วรันเทียบ ทุกแถวคือผลจากการเรียกจริงในรอบนั้น ข้อความเต็มที่บอร์ดตอบอยู่ในคอนโซล บน Dev Kit ไฟล์นี้ตั้งใจข้ามpush()live_push()auto()เพราะมันทำงานจริง ปิดท้ายด้วยprint(dir(sensors))รายชื่อบนบอร์ดคือความจริง ตารางในสไลด์คือแผนที่
| ไฟล์ | ไฟล์นี้สอน |
|---|---|
| examples/01_capsense_dimmer.py | สไลเดอร์สัมผัสเป็นสวิตช์หรี่ไฟ |
| examples/09_sensors_api_tour.py | เรียกทุกชื่อในโมดูล sensors แล้วดูว่าใครตอบ ใครปฏิเสธ |
สไลด์ของบทเรียนนี้อ้างถึงไฟล์ที่อยู่ในบทเรียนอื่นด้วย:
- m02-ui-to-hardware/l06-touch-panel-lab/examples/09_scale_led_spinbox.py — สาม widget ที่แยกหน้าจอ HMI ออกจากหน้าจอเล่น ๆ
ภาพจอจาก BENTO Emulator ของตัวอย่างในบทนี้ (คลิกชื่อไฟล์เพื่อเปิดโค้ด)

01_capsense_dimmer.py สไลเดอร์สัมผัสเป็นสวิตช์หรี่ไฟ
09_sensors_api_tour.py เรียกทุกชื่อในโมดูล sensors แล้วดูว่าใครตอบ ใครปฏิเสธเช็กความเข้าใจ
หัวข้อที่มีชื่อว่า “เช็กความเข้าใจ”คำถามชุดเดียวกันอยู่ใน quiz.yaml สำหรับระบบที่ตรวจอัตโนมัติ
-
sensors.pot.read() คืน 40915 ข้อใดถูกต้องที่สุด (เลือกหนึ่งข้อ · เป้าหมายข้อ 1)
- ก) คิดเป็น 62.43% ของช่วงเต็มสเกล แต่ยังบอกเป็นโวลต์ไม่ได้จนกว่าจะรู้ V_ref ของบอร์ดจริง
- ข) คิดเป็น 2.06 V แน่นอน เพราะ voltage() คูณด้วย 3.3 V ซึ่งเป็นแรงดันจริงของลูกบิด
- ค) แปลว่า ADC ของบอร์ดละเอียด 65536 ขั้นจริง
- ง) ค่านี้ได้มาเพราะเรียก sensors.init() ไว้ก่อนแล้ว
เฉลย
ก — 40915 / 65535 × 100 ได้ 62.43% แต่ voltage() คูณด้วย 3.3 V ที่สมมติไว้ ขณะที่ผังบอร์ดระบุ 1.8 V และยังไม่มีใครวัดยืนยัน ส่วน 65535 เป็นสเกลของ API และไม่ต้องเรียก init() เลย
-
คุณเลื่อนลูกบิดช้า ๆ แล้วเห็นค่าจาก read() เดินทีละ 16 เท่ากันทุกก้อน ความละเอียดจริงของการวัดคือเท่าไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)
- ก) 4096 ขั้น
- ข) 65536 ขั้น ตามสเกลที่ read() คืน
- ค) 16 ขั้น
- ง) บอกไม่ได้จนกว่าจะรู้ V_ref
เฉลย
ก — ก้าวละ k หมายถึง 65536/k ขั้น คือ 65536/16 = 4096 ตรงกับที่เฟิร์มแวร์อ่าน ADC 12 บิตแล้วขยายเป็น 0-65535 จำนวนขั้นนับจากก้าวของค่าดิบได้โดยไม่ต้องรู้แรงดันอ้างอิง
-
ปุ่มสัมผัสรายงาน True ตอนไม่มีใครแตะ และ False ตอนแตะ ตั้งแต่เริ่มบทเรียน วิธีแก้ที่ถูกคืออะไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 3)
- ก) ยกนิ้วออกจากแผ่นสัมผัสให้หมด แล้วถอดสาย USB เสียบกลับ
- ข) กด Program to Device เพื่อรันสคริปต์ใหม่
- ค) กลับค่า True/False ในโค้ดของเรา
- ง) บน Dev Kit โยกสวิตช์บนฐานเพื่อรีเซ็ต
เฉลย
ก — baseline ถูกเก็บตอนบอร์ดบูตโดยไดรเวอร์บนคอร์จอ ถ้ามีนิ้วค้างตอนนั้น ชิปจะจำสภาพมีนิ้วเป็นสภาพปกติ การรันสคริปต์ใหม่ไม่ได้เก็บ baseline ใหม่ และสวิตช์บนฐาน Dev Kit คือสวิตช์ไฟ ไม่ใช่ปุ่มรีเซ็ต
-
ลูปของคุณพัก 50 ms แล้วอ่าน sensors.snapshot() ทุกรอบ และพบว่า d[‘pot’][‘sequence’] ไม่ขยับหลายรอบติดกัน แปลว่าอะไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 4)
- ก) เราอ่านค่าเดิมซ้ำ เพราะคอร์จออ่านลูกบิดทุก 200 ms และลูปของเราเร็วกว่านั้น
- ข) ลูกบิดเสีย ต้องเปลี่ยนบอร์ด
- ค) ADC ค้าง ต้องเรียก sensors.init() ใหม่
- ง) ค่าถูกกรองจนนิ่งแล้ว เป็นสัญญาณที่ดี
เฉลย
ก — sequence คือเลขนับตัวอย่างของกลุ่มนั้น ถ้าไม่ขยับแปลว่ายังเป็นตัวอย่างเดิม ไม่ใช่ว่าโลกหยุดนิ่ง มันจึงเป็นเครื่องมือบอกว่าจังหวะลูปเร็วเกินความจริงของข้อมูลหรือยัง
-
ข้อใดถูกเกี่ยวกับโมดูล sensors บน Eva Kit เลือกทุกข้อที่ถูก (เลือกได้หลายข้อ · เป้าหมายข้อ 4)
- ก) init() scan() push() live_push() auto() ถูกปฏิเสธด้วย OSError เพราะบัส SCB0 เป็นของคอร์จอ
- ข) auto() อันตรายที่สุด เพราะมันเปิดงานเบื้องหลังที่ขับบัสแทน อาการค้างจึงอยู่ต่อหลังบรรทัดนั้นจบ และ try/except ช่วยไม่ได้
- ค) read_all() อ่านได้มากกว่า snapshot() จึงควรใช้แทน
- ง) sensors.sht40 ใช้ได้เหมือนบน Dev Kit
- จ) คอร์สนี้ใช้ snapshot() เพราะได้ dict หน้าตาเดียวกันทั้งสองบอร์ด
เฉลย
ก, ข, จ — ห้าฟังก์ชันจบที่การขับบัสที่คอร์จอถือไว้ Eva จึงปฏิเสธ read_all() บน Eva คือบรรทัดเดียวที่เรียก snapshot() ต่อ และ sht40 ไม่มีในโมดูลของ Eva เลย (พิมพ์แล้วได้ AttributeError)
วัดของจริงของบอร์ดทีม จดทุกข้อลงบันทึกการเรียน
- หยุดมือบนลูกบิดสิบวินาที แล้วจดว่าเปอร์เซ็นต์สั่นขึ้นลงในช่วงเท่าไร
- พิมพ์
sensors.pot.read()ออกคอนโซลในลูปสั้น ๆ เลื่อนลูกบิดช้า ๆ แล้วดูว่าค่าเดินทีละเท่าไร ถ้าเดินก้อนละ k เท่ากันทุกก้อน ความละเอียดจริงคือ 65536/k ขั้น - หมุนลูกบิดสุดแล้วอ่าน
pot.read()กับpot.voltage()ถ้ามีมัลติมิเตอร์ วัดเทียบที่ขาลูกบิด (Eva Kit ขา P15[1] · Dev Kit ขากลางของ VR1) แล้วจดว่าตัวเลขตรงกันหรือไม่ - ทีม Dev Kit: จดทิศหมุนของ VR1 ว่าหมุนทางไหนค่าเพิ่ม เพราะเอกสารยังไม่ได้วัด อย่าเอาตัวเลขของ R34 ไปใช้
- รัน
09_sensors_api_tour.pyแล้วจดว่าเก้าแถวบนบอร์ดของทีม แถวไหนตอบ แถวไหนปฏิเสธ เทียบกับตารางในสไลด์
บทเรียน 2.8 ทำให้ตัวเลขที่สั่นนิ่งลงโดยไม่โกงค่า ด้วย dsp.EMA และ dsp.Median แล้วแกะโค้ดเกจที่วางค่าดิบกับค่ากรองแล้วไว้ข้างกัน
บทเรียนถัดไป: บทเรียน 2.8 — กรองสัญญาณ: EMA กับ Median แล้วแกะโค้ดเกจ
สะท้อนคิด
หัวข้อที่มีชื่อว่า “สะท้อนคิด”- ในงานของทีม มีค่าอะไรที่วัดเป็นอนาล็อก และตัวเลขนั้นควรแสดงเป็นหน่วยอะไรให้คนที่อ่านจอ
- ถ้าอุปกรณ์ของทีมอยู่ในที่ชื้น หรือคนใช้ใส่ถุงมือ ปุ่มสัมผัสยังเป็นตัวเลือกที่ดีหรือไม่ และเพราะอะไร
คำถามทบทวน
ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย
-
sensors.pot.read() คืน 40915 ข้อใดถูกต้องที่สุด (เป้าหมายข้อ 1)
- คิดเป็น 62.43% ของช่วงเต็มสเกล แต่ยังบอกเป็นโวลต์ไม่ได้จนกว่าจะรู้ V_ref ของบอร์ดจริง
- คิดเป็น 2.06 V แน่นอน เพราะ voltage() คูณด้วย 3.3 V ซึ่งเป็นแรงดันจริงของลูกบิด
- แปลว่า ADC ของบอร์ดละเอียด 65536 ขั้นจริง
- ค่านี้ได้มาเพราะเรียก sensors.init() ไว้ก่อนแล้ว
ดูเฉลย
คำตอบ: A. คิดเป็น 62.43% ของช่วงเต็มสเกล แต่ยังบอกเป็นโวลต์ไม่ได้จนกว่าจะรู้ V_ref ของบอร์ดจริง
40915 / 65535 × 100 ได้ 62.43% แต่ voltage() คูณด้วย 3.3 V ที่สมมติไว้ ขณะที่ผังบอร์ดระบุ 1.8 V และยังไม่มีใครวัดยืนยัน ส่วน 65535 เป็นสเกลของ API และไม่ต้องเรียก init() เลย
-
คุณเลื่อนลูกบิดช้า ๆ แล้วเห็นค่าจาก read() เดินทีละ 16 เท่ากันทุกก้อน ความละเอียดจริงของการวัดคือเท่าไร (เป้าหมายข้อ 2)
- 4096 ขั้น
- 65536 ขั้น ตามสเกลที่ read() คืน
- 16 ขั้น
- บอกไม่ได้จนกว่าจะรู้ V_ref
ดูเฉลย
คำตอบ: A. 4096 ขั้น
ก้าวละ k หมายถึง 65536/k ขั้น คือ 65536/16 = 4096 ตรงกับที่เฟิร์มแวร์อ่าน ADC 12 บิตแล้วขยายเป็น 0-65535 จำนวนขั้นนับจากก้าวของค่าดิบได้โดยไม่ต้องรู้แรงดันอ้างอิง
-
ปุ่มสัมผัสรายงาน True ตอนไม่มีใครแตะ และ False ตอนแตะ ตั้งแต่เริ่มบทเรียน วิธีแก้ที่ถูกคืออะไร (เป้าหมายข้อ 3)
- ยกนิ้วออกจากแผ่นสัมผัสให้หมด แล้วถอดสาย USB เสียบกลับ
- กด Program to Device เพื่อรันสคริปต์ใหม่
- กลับค่า True/False ในโค้ดของเรา
- บน Dev Kit โยกสวิตช์บนฐานเพื่อรีเซ็ต
ดูเฉลย
คำตอบ: A. ยกนิ้วออกจากแผ่นสัมผัสให้หมด แล้วถอดสาย USB เสียบกลับ
baseline ถูกเก็บตอนบอร์ดบูตโดยไดรเวอร์บนคอร์จอ ถ้ามีนิ้วค้างตอนนั้น ชิปจะจำสภาพมีนิ้วเป็นสภาพปกติ การรันสคริปต์ใหม่ไม่ได้เก็บ baseline ใหม่ และสวิตช์บนฐาน Dev Kit คือสวิตช์ไฟ ไม่ใช่ปุ่มรีเซ็ต
-
ลูปของคุณพัก 50 ms แล้วอ่าน sensors.snapshot() ทุกรอบ และพบว่า d['pot']['sequence'] ไม่ขยับหลายรอบติดกัน แปลว่าอะไร (เป้าหมายข้อ 4)
- เราอ่านค่าเดิมซ้ำ เพราะคอร์จออ่านลูกบิดทุก 200 ms และลูปของเราเร็วกว่านั้น
- ลูกบิดเสีย ต้องเปลี่ยนบอร์ด
- ADC ค้าง ต้องเรียก sensors.init() ใหม่
- ค่าถูกกรองจนนิ่งแล้ว เป็นสัญญาณที่ดี
ดูเฉลย
คำตอบ: A. เราอ่านค่าเดิมซ้ำ เพราะคอร์จออ่านลูกบิดทุก 200 ms และลูปของเราเร็วกว่านั้น
sequence คือเลขนับตัวอย่างของกลุ่มนั้น ถ้าไม่ขยับแปลว่ายังเป็นตัวอย่างเดิม ไม่ใช่ว่าโลกหยุดนิ่ง มันจึงเป็นเครื่องมือบอกว่าจังหวะลูปเร็วเกินความจริงของข้อมูลหรือยัง
-
ข้อใดถูกเกี่ยวกับโมดูล sensors บน Eva Kit เลือกทุกข้อที่ถูก (เป้าหมายข้อ 4)
- init() scan() push() live_push() auto() ถูกปฏิเสธด้วย OSError เพราะบัส SCB0 เป็นของคอร์จอ
- auto() อันตรายที่สุด เพราะมันเปิดงานเบื้องหลังที่ขับบัสแทน อาการค้างจึงอยู่ต่อหลังบรรทัดนั้นจบ และ try/except ช่วยไม่ได้
- read_all() อ่านได้มากกว่า snapshot() จึงควรใช้แทน
- sensors.sht40 ใช้ได้เหมือนบน Dev Kit
- คอร์สนี้ใช้ snapshot() เพราะได้ dict หน้าตาเดียวกันทั้งสองบอร์ด
ดูเฉลย
คำตอบ: A. init() scan() push() live_push() auto() ถูกปฏิเสธด้วย OSError เพราะบัส SCB0 เป็นของคอร์จอ · B. auto() อันตรายที่สุด เพราะมันเปิดงานเบื้องหลังที่ขับบัสแทน อาการค้างจึงอยู่ต่อหลังบรรทัดนั้นจบ และ try/except ช่วยไม่ได้ · E. คอร์สนี้ใช้ snapshot() เพราะได้ dict หน้าตาเดียวกันทั้งสองบอร์ด
ห้าฟังก์ชันจบที่การขับบัสที่คอร์จอถือไว้ Eva จึงปฏิเสธ read_all() บน Eva คือบรรทัดเดียวที่เรียก snapshot() ต่อ และ sht40 ไม่มีในโมดูลของ Eva เลย (พิมพ์แล้วได้ AttributeError)
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"อนาล็อกและสัมผัส: ADC ลูกบิด และ CapSense" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "Analog and touch: the ADC, the potentiometer and CapSense" 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/aiot-micropython/m02-ui-to-hardware/l07-adc-capsense/
บทเรียนนี้ดัดแปลงจากต้นฉบับด้านล่าง เมื่ออ้างอิงให้คงเครดิตต้นฉบับไว้ด้วย
https://github.com/Advance-Innovation-Centre-AIC/embedded-systems-for-aiot-developer/blob/a80bbe88a34bcb9bb8d991f42f9252b77cdab079/session-05.html (slides 1–20)
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0
เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA