ภาพพื้นหลังปกบทเรียน

บทเรียน 3.1 — accelerometer กับมุมเอียง: roll และ pitch

เครื่องวัดระดับดิจิทัล: จากความเร่งดิบ สู่องศาที่คนอ่านรู้เรื่อง

โมดูล 3 — แสดงผลเซนเซอร์บน HMI

คาถาประจำบทเรียน: เซนเซอร์ไม่ได้บอกมุมมาให้ เราต่างหากที่เป็นคนคิดมันขึ้นมาจากตัวเลขดิบ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

ดูของจริงก่อน — เมนู Sensor Dashboard

Sensor Dashboard — กราฟ accel AZ ค้างสูง = แรงโน้มถ่วง AY ไต่ขึ้นมาแทนตอนเอียง สามอย่างที่ต้องลองก่อนเข้าเนื้อหา วางนิ่ง — มีเส้นหนึ่งค้างสูง ไม่ลงศูนย์ ยกขอบด้านหนึ่ง — เส้นนั้นลด อีกเส้นไต่ขึ้น เขย่าแล้ววาง — gyro พุ่งแล้วนิ่งทันที

เส้นที่ค้างอยู่คือ แรงโน้มถ่วง และมันคือกุญแจของเครื่องวัดระดับ สามข้อนี้คือทั้งบทเรียนวันนี้ ย่อไว้ในหนึ่งนาที

เข็มทิศทางขวาของหน้านั้นก็มาจากเซนเซอร์อีกตัว บทเรียน 3.7–3.9 เราจะไปหยิบมันมาใช้

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

ทำไม · คืออะไร · ทำยังไง — แผนที่ของชุดบทเรียนนี้

คำถาม คำตอบของชุดบทเรียนนี้ อยู่ช่วงไหน
Why ในเมื่อบอร์ดมี IMU อยู่แล้ว ทำไมยังต้องมานั่งคำนวณมุมเอง เพราะ ไม่มีชิปตัวไหนวัด "องศา" มาให้ มันวัดความเร่งกับความเร็วเชิงมุม ส่วนมุมเป็นปริมาณที่เราคิดขึ้นมาจากตัวเลขดิบ · และคำนวณผิดลำดับหรือผิดหน่วย โปรแกรมไม่พัง มันแค่ ตอบผิดอย่างเงียบ ๆ ซึ่งเป็นบั๊กที่แพงที่สุด ครึ่งแรก · จากความเร่งสู่องศา · สไลด์ลำดับค่าที่คืนกลับมา
What มีอะไรให้ใช้บ้าง ตระกูล IMU ทั้งสิบสี่ชื่อ — sensors.bmi270 5 · sensors.bmm350 5 · ฝั่ง IMU ของ dsp อีก 4 คือ tilt() compass() Madgwick Pedometer สไลด์บัญชี 14 ชื่อ
How ประกอบยังไงให้ใช้งานได้จริง อ่านหกแกนจากการอ่านครั้งเดียวด้วย motion() → dsp.tilt() → กรองด้วย dsp.EMA → หักค่าอ้างอิงที่ปุ่ม "ตั้งศูนย์" เก็บไว้ → ขึ้นแถบสองแกนบนไม้บรรทัด + Seg7 ห้าไฟล์ตัวอย่าง + ไฟล์ฝึก

ปลายทางที่จับต้องได้ — เครื่องวัดระดับสองแกน วางราบอ่านได้ราว 0° เอียงแล้วแถบทั้งสองแกนวิ่งถูกทิศ ไฟบอกได้ว่าเกินเกณฑ์ที่ตั้งไว้หรือยัง และกดปุ่มตั้งศูนย์เมื่อไรก็ประกาศจุดอ้างอิงใหม่ได้ทันที

บทเรียน 2.7–2.9 คือค่าดิบหนึ่งตัว แปลงเป็นหน่วยที่คนอ่านออก · ชุดบทเรียนนี้คือค่าดิบสามตัว แปลงเป็นปริมาณที่ไม่มีเซนเซอร์ตัวไหนวัดตรง ๆ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

เป้าหมายของชุดบทเรียนนี้ · และสิ่งที่ยกมาจากบทเรียน 2.7–2.9

  1. อธิบายได้ว่า accelerometer วัดอะไรกันแน่ และทำไมวางนิ่ง ๆ ค่ายังไม่เป็นศูนย์
  2. อ่านหกแกนพร้อมกันด้วย sensors.bmi270.motion() และบอกได้ว่าทำไมต้องอ่านทีเดียว
  3. แปลงความเร่งเป็นองศาด้วย dsp.tilt() โดยจำลำดับค่าที่มันคืนได้ถูก
  4. รู้ว่า gyro กับ accel เสียคนละแบบ และฟิลเตอร์เข้ามาช่วยตรงไหน
  5. สร้าง เครื่องวัดระดับ สองแกนที่มีปุ่ม "ตั้งศูนย์" ใช้งานได้จริง — วางราบอ่าน ~0° เอียงแล้วแถบทั้งสองแกนวิ่งถูกทิศ และมีเกณฑ์ยอมรับที่ผู้ใช้ตั้งเองได้

เกินเกณฑ์ผ่าน แต่อยู่ในชุดบทเรียนนี้ เพราะเป็นของกลุ่มเดียวกันและถ้าไม่พูดที่นี่ก็ไม่มีที่ไหนพูด: sensors.bmm350 (เข็มทิศ ห้าคำสั่ง) · dsp.compass() · dsp.Madgwick · dsp.Pedometer — สี่หัวข้อนี้มีสไลด์ของตัวเองและมีไฟล์ตัวอย่างให้ลอง ไม่ได้อยู่ในเกณฑ์ผ่านของชุดบทเรียนนี้

บทเรียน 2.7–2.9 — ค่าดิบหนึ่งตัว แปลงเป็นหน่วยที่คนอ่านออก pot.read() 0-65535 เปอร์เซ็นต์ · โวลต์ Bar + Scale + Seg7 บทเรียน 3.1–3.3 — ค่าดิบสามตัว แปลงเป็นปริมาณที่ไม่มีเซนเซอร์ตัวไหนวัดตรง ๆ ax, ay, az (m/s²) roll · pitch (องศา) Bar + Scale + Seg7 โครง UI เหมือนเดิม เปลี่ยนแค่แหล่งข้อมูล และสูตรที่อยู่ตรงกลาง dsp.EMA กลับมาอีกครั้ง

กฎเหล็ก 5 ข้อของ ui ยังบังคับใช้เหมือนเดิม — ui.poll() ทุกลูป, time.sleep_ms(200) สำหรับงานหนัก, งบ 32 widget ต่อหน้า (เพดานเฟิร์มแวร์ 64), ใช้ ui.* ครั้งแรกแล้ว sensor auto-task หยุด จึงต้องอ่านเซนเซอร์เองในลูป, ลูปเร็วเกินเฟรมจะหายเงียบ ๆ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

ปลายทางของชุดบทเรียนนี้ — เครื่องวัดระดับสองแกน

หน้าจอจาก BENTO Emulator ของเฉลยเครื่องวัดระดับดิจิทัลสองแกน

หน้าจอจริงจากการรันโค้ดเฉลยบน BENTO Emulator ที่ 800x480 เท่าจอของ Eva Kit และ Dev Kit — ไม่ใช่ภาพวาด ไม่ใช่ mock-up และไม่ใช่ภาพถ่ายจากบอร์ด

หน้าจอของเฉลยปัจจุบัน (s06_digital_level.py ของบทเรียน 3.3) แบ่งเป็นสามการ์ด

  • การ์ดบนซ้าย คือสองแกนวางเคียงกัน ROLL ซ้าย-ขวา และ PITCH หน้า-หลัง เรียงตามลำดับที่ dsp.tilt() คืนค่ามาพอดี แต่ละแกนเป็น ui.Bar วางทับ ui.Scale ที่มีขีดและตัวเลข -90 ถึง 90 พร้อม ui.Seg7 อ่านค่าละเอียดอยู่ข้าง ๆ
  • การ์ดบนขวา ui.Led สองดวง บอกว่าตอนนี้อยู่ในเกณฑ์หรือเกิน
  • การ์ดล่าง ซ้ายคือเกณฑ์ยอมรับหน่วยองศา เป็น ui.Spinbox ที่ตั้งเองได้ด้วยปุ่มเพิ่ม/ลด เพราะงานวางกล้องกับงานวางตู้เย็นยอมได้ไม่เท่ากัน · ขวาคือปุ่ม "ตั้งศูนย์" กับ "จบการวัด" · ใต้สุดคือบรรทัดอ้างอิง R +0.0 P +0.0 ที่เก็บค่าศูนย์ล่าสุดไว้
  • ข้างหัวเรื่องบนสุด คุณภาพของค่าเขียนเป็นคำ ขึ้น "ค่าค้าง" สีส้มเมื่อรอบนั้นอ่านเซนเซอร์ไม่ได้

ค่าที่อ่านได้ต้องเทียบกับอะไรสักอย่างเสมอ ปุ่มตั้งศูนย์คือการประกาศว่า "ตรงนี้คือศูนย์" และไม้บรรทัดใต้แถบคือการประกาศว่า "เต็มสเกลคือเท่านี้"

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

accelerometer วัดอะไร — คำตอบที่คนส่วนใหญ่ตอบผิด

คำตอบยอดนิยมคือ "วัดความเร่ง" ซึ่งถูกครึ่งเดียว วางบอร์ดนิ่งสนิทบนโต๊ะ มันไม่ได้เร่งไปไหนเลย แต่ค่าที่อ่านได้คือ

ax≈0ay≈0az≈+9.81 m/s2a_x \approx 0 \qquad a_y \approx 0 \qquad a_z \approx +9.81\ \mathrm{m/s^2}

อ่านเป็นภาษาคน: เซนเซอร์ไม่ได้วัดว่าเราเคลื่อนที่เร็วขึ้นแค่ไหน มันวัด แรงที่ตัวเรือนดันมวลเล็ก ๆ ข้างในไว้ไม่ให้ตกอิสระ — โต๊ะดันบอร์ดขึ้น บอร์ดดันมวลขึ้น จึงอ่านได้ +1 g ในทิศขึ้น ปริมาณนี้มีชื่อว่า proper acceleration

ตัวเลขจากบอร์ดจริง: ปล่อยบอร์ดตกอิสระ (อย่าทำ) ทั้งสามแกนจะอ่านได้ ~0 เพราะไม่มีใครดันมวลนั้นแล้ว

แกนพิกัดแบบมือขวา x y z ที่ใช้อ่านค่าจาก IMU

ภาพ: Gregors, Wikimedia Commons, CC BY-SA 3.0 — ข้อตกลงแกนขวามือที่ใช้ทั้งบทเรียน: x ไปทางขวาของบอร์ด, y ออกไปด้านบน, z ตั้งฉากออกจากหน้าบอร์ด · ทิศ x/y เทียบขอบบอร์ดจริง ต้องยืนยันบนโต๊ะก่อนขึ้นสอน ทั้ง Eva Kit และ Dev Kit — ยังไม่มีบันทึกการวัดของบอร์ดไหน (กล่องเตือนในสไลด์สูตร)
Veritasium · 17:33 · EN — ดูเพื่อเข้าใจว่า "ตัวที่วางนิ่งต่างหากที่กำลังถูกเร่ง" · แนะนำเริ่มที่ 2:30 หรือให้เป็นการบ้าน

แรงโน้มถ่วงอยู่ในค่าที่อ่านได้ ตลอดเวลา — คนอื่นเรียกมันว่าสัญญาณรบกวน วันนี้เราจะเรียกมันว่าสัญญาณ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

ข้างในชิปมีของที่ขยับได้จริง — มวลพิสูจน์บนสปริง

แผนภาพระบบมวล สปริง และตัวหน่วง ซึ่งเป็นแบบจำลองของมวลพิสูจน์ใน accelerometer

ภาพ: pbroks13, Wikimedia Commons, สาธารณสมบัติ

แผนภาพหลักการ accelerometer แบบวัดค่าความจุ: มวลที่ขยับได้อยู่ระหว่างแผ่นตัวเก็บประจุสองแผ่น

ภาพ: Tosaka, Wikimedia Commons, CC BY 3.0

ภาพเคลื่อนไหวมวลติดสปริงแกว่งขึ้นลงแบบฮาร์มอนิกอย่างง่าย

ภาพ: Guillermo Bossio, Wikimedia Commons, CC BY-SA 4.0

ภาพถ่ายกล้องจุลทรรศน์อิเล็กตรอนของโครงสร้าง MEMS accelerometer จริง

ภาพถ่าย SEM ของโครงสร้างจริง — Zhang H. et al., Micromachines 10(6):380 (2019), CC BY 4.0

โครงสร้างข้างใน BMI270 คือ มวลพิสูจน์ (proof mass) เล็กกว่าเม็ดฝุ่น แขวนบนสปริงซิลิคอนคดเคี้ยว พอบอร์ดถูกเร่ง มวลตามไม่ทันเพราะความเฉื่อย มันจึงเลื่อนไปในทางตรงข้าม

แล้ววงจรอ่าน "ระยะที่มวลเลื่อน" ได้ยังไง — มวลมีซี่หวียื่นออกมา สอดสลับกับซี่หวีที่ยึดกับตัวเรือน แต่ละคู่ซี่คือ ตัวเก็บประจุ หนึ่งตัว

  • มวลอยู่ตรงกลาง → d1=d2d_1 = d_2 → C1=C2C_1 = C_2
  • มวลเลื่อนไปซ้าย → d1<d2d_1 < d_2 → C1>C2C_1 > C_2

วงจรวัด ผลต่างของความจุ ส่งเข้า ADC ในชิป ออกมาเป็นตัวเลขบน I2C

Bosch Sensortec · 1:01 · แทบไม่มีคำพูด — ดูเพื่อเชื่อว่า "ในชิปมีของที่ขยับได้จริง" · Bosch คือผู้ผลิต BMI270 บนบอร์ดเรา

ภาพเคลื่อนไหวโครงสร้างซี่หวีของ MEMS ที่สั่นจริง วัดด้วยกล้องโฮโลกราฟิก

ภาพ: Jejmule, Wikimedia Commons, CC BY-SA 4.0 — ซี่หวีที่ย่อหน้าบนพูดถึง ตอนมันขยับจริง ซี่ชุดหนึ่งยึดกับตัวเรือน อีกชุดยื่นออกมาจากมวลที่เลื่อนได้ ระยะระหว่างซี่ที่เปลี่ยนไปคือความจุที่วงจรอ่าน

การวัดความเร่งจริง ๆ แล้วคือ การวัดอัตราส่วนความจุ — นี่คือเหตุผลที่มันเล็กและกินไฟน้อยได้ขนาดนี้

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

เข้าใจฮาร์ดแวร์ · แรงโน้มถ่วงทอดเงาลงบนแกนที่เอียง

บอร์ดเอียงไปเรื่อย ๆ · เวกเตอร์ g ชี้ลงเสมอ g = 9.81 ชี้ลงเสมอ เงาที่ตกบนแกนของบอร์ด az ay 0° → az 9.81 · ay 0.00 30° → az 8.50 · ay 4.91 60° → az 4.91 · ay 8.50 90° → az 0.00 · ay 9.81 √(ay² + az²) = 9.81 ทุกมุม รู้เงาสองอัน จึงเดามุมกลับได้
แผนภาพวาดเอง (บันทึกการค้น: ค้น Commons หมวด Accelerometers / Inclined planes ด้วยคำ "accelerometer gravity projection axes animation", "tilt sensing gravity vector components" — พบแต่ภาพนิ่งของระนาบเอียงเชิงกลศาสตร์ ไม่มีภาพที่ผูกกับแกนของเซนเซอร์ จึงวาดเอง · ภาพนิ่งที่ใกล้ที่สุดอยู่สไลด์ถัดไป)

เพราะขนาดรวมคงที่ เรารู้ค่าสองแกนก็เดามุมได้ นี่คือเหตุผลที่ สามตัวเลขกลายเป็นสององศา ได้

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

เรียกมุมพวกนี้ว่าอะไร — roll กับ pitch มาจากวงการการบิน

ภาพเคลื่อนไหวเครื่องบินหมุนรอบแกนลำตัว แสดงมุม roll

ภาพ: NASA Glenn Research Center, สาธารณสมบัติ — **roll** หมุนรอบแกนยาวของลำตัว

ภาพเคลื่อนไหวเครื่องบินก้มเงย แสดงมุม pitch

ภาพ: NASA Glenn Research Center, สาธารณสมบัติ — **pitch** ก้ม-เงย
ชื่อ คือการเอียงแบบไหน ทดสอบด้วยการ มาจากแกน
roll ซ้าย-ขวา ยกขอบด้านที่ทำให้ roll เพิ่ม — ดูว่าขอบไหนของบอร์ดทีม (Eva Kit: ขอบซ้าย · Dev Kit: ยังไม่ได้วัด จดลงบันทึกการเรียน) ay กับ az
pitch หน้า-หลัง ยกขอบด้านที่ทำให้ pitch เพิ่ม — ขอบที่ตั้งฉากกับขอบของ roll (Eva Kit: ขอบบน) ax เทียบ y-z
yaw หันซ้าย-ขวา หมุนบอร์ดบนโต๊ะ หาจาก accel ไม่ได้

ทำไม yaw หาไม่ได้จาก accel — การหันบอร์ดบนโต๊ะไม่ทำให้เงาของแรงโน้มถ่วงบนแกนใดเปลี่ยนเลย accel จึงมองไม่เห็นมัน ต้องใช้ magnetometer (บทเรียน 3.7–3.9) หรือ gyro

dsp.tilt() ให้เราสองแกน ไม่ใช่สาม — และนั่นเป็นข้อจำกัดทางฟิสิกส์ ไม่ใช่ข้อจำกัดของเฟิร์มแวร์

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

จากความเร่ง สู่องศา — สูตรจริงที่อยู่ข้างใน dsp.tilt()

ตรวจสุขภาพเซนเซอร์ก่อนเชื่อค่าอะไรทั้งนั้น

∥a⃗∥=ax2+ay2+az2\lVert \vec{a} \rVert = \sqrt{a_x^{2} + a_y^{2} + a_z^{2}}

ไทย: ไม่ว่าเอียงบอร์ดยังไง ถ้าวางนิ่งค่านี้ต้องได้ราว 9.81 m/s² เสมอ · ตัวเลขจาก Eva Kit (บอร์ดที่ใช้เขียนสไลด์): ax 0.02, ay −0.05, az 9.79 → ∥a⃗∥=9.79\lVert \vec{a} \rVert = 9.79 ผ่าน

สูตรที่แปลงเงาเป็นองศา

ϕroll=atan2⁡(ay,  az)θpitch=atan2⁡(−ax,  ay2+az2)ϕdeg⁡=ϕ⋅180π\phi_{\text{roll}} = \operatorname{atan2}\bigl(a_y,\; a_z\bigr) \qquad \theta_{\text{pitch}} = \operatorname{atan2}\Bigl(-a_x,\; \sqrt{a_y^{2} + a_z^{2}}\Bigr) \qquad \phi_{\deg} = \phi \cdot \frac{180}{\pi}

ไทย: เวกเตอร์แรงโน้มถ่วงชี้ลงคงที่เสมอ พอบอร์ดเอียง เงาของมันบนแกนก็เปลี่ยน · ตัวเลขจาก Eva Kit ตอนยกขอบซ้าย: ay 4.90, az 8.49 → atan2⁡(4.90,8.49)=0.524 rad=30.0∘\operatorname{atan2}(4.90, 8.49) = 0.524\ \mathrm{rad} = 30.0^\circ

ทำไมต้อง atan2 ไม่ใช่ atan — atan2 รับตัวตั้งกับตัวหารแยกกัน จึงแยกควอดรันต์ได้ครบสี่ และไม่ระเบิดเมื่อตัวหารเป็นศูนย์ตอนบอร์ดตั้งฉาก 90°

ต้องยืนยันข้อตกลงแกนกับบอร์ดจริงก่อนขึ้นสอน — แยกบอร์ด — Eva Kit: เอียงบอร์ดไปทางขวาแล้วดูว่าแกนไหนเปลี่ยนเครื่องหมาย ถ้าไม่ตรง ให้สลับเครื่องหมายในสไลด์ ไม่ใช่ไปแก้ที่ผู้เรียน · TESAIoT Dev Kit: ยังไม่มีใครวัดว่าขอบไหนของฐาน QWA309 ทำให้ roll เพิ่ม IMU ตัวเดียวกันแต่ประกอบบนบอร์ดคนละแบบ ห้ามยกคำว่า "ขอบซ้าย" ของ Eva ไปบอกทีม Dev Kit — ให้ทีมยกทีละขอบแล้วจดลงบันทึกการเรียน ว่าขอบไหนขยับ roll

แผนภาพแยกเวกเตอร์แรงโน้มถ่วงเป็นองค์ประกอบตามพื้นเอียงและตั้งฉากกับพื้น

ภาพ: Klaus-Dieter Keller, Wikimedia Commons, CC0 — แยกเวกเตอร์ g เป็นองค์ประกอบตามมุมของระนาบเอียง

วัตถุบนพื้นเอียงกับทิศแรงโน้มถ่วง มุม และด้านตรงข้าม ด้านประชิด ด้านตรงข้ามมุมฉาก

ภาพ: VT DLA, Wikimedia Commons, CC BY-SA 3.0 — ตรีโกณของมุมเดียวกันที่ `atan2` ใช้

รู้สูตรไว้ไม่ใช่เพื่อพิมพ์เอง แต่เพื่อ เดาถูกว่าจะพังตรงไหน เมื่อค่าออกมาแปลก

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

กับดักที่ตั้งใจดักทั้งบทเรียน — ลำดับค่าที่คืนกลับมา

ถูก · roll, pitch = dsp.tilt(...) เอียงซ้าย-ขวา ROLL วิ่ง PITCH นิ่ง ผิด · pitch, roll = dsp.tilt(...) เอียงซ้าย-ขวา ROLL นิ่ง PITCH วิ่ง

dsp.tilt() คืน (roll, pitch) — roll มาก่อน pitch เสมอ ตำราและไลบรารีจำนวนมากเขียนเรียงว่า "pitch, roll" จนติดปาก

ถ้าเผลอเขียนสลับ โปรแกรมจะ ไม่ error เลย จอขึ้นตัวเลขสวยงามครบทั้งสองแกน แต่เอียงซ้าย-ขวาแล้วแถบ PITCH ดันวิ่ง ส่วนแถบ ROLL นิ่ง — เหมือนภาพขวา

บั๊กที่ไม่ทำให้โปรแกรมพัง คือบั๊กที่แพงที่สุด เพราะไม่มีใครรู้ว่ามันอยู่ตรงนั้น

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

motion() — หกแกนจากการอ่านครั้งเดียว และหน่วยที่ต้องอ่านให้ถูก

ax, ay, az, gx, gy, gz = sensors.bmi270.motion()

หกค่านี้มาจาก การอ่านครั้งเดียวกัน — กลไกต่างกันตามบอร์ด: บน Eva Kit motion() หยิบจาก snapshot ชุดเดียวที่คอร์จออ่านค้างไว้ (ไม่มีการจองบัสฝั่ง Python) · บน Dev Kit CM33 จองบัส I2C ของตัวเอง (lock) อ่านหกแกนแล้วปล่อย · ถ้าเรียก acceleration() แล้ว gyroscope() แยกสองครั้ง ระหว่างสองครั้งนั้น snapshot อาจถูกเปลี่ยนชุด (Eva) หรือบัสถูกปล่อยว่าง (Dev Kit) และถ้าตอนนั้นบอร์ดกำลังขยับ ค่า accel กับ gyro ที่ได้จะมาจาก คนละท่าของบอร์ด

ค่า หน่วย จุดอ้างอิงที่ควรจำ
ax, ay, az m/s² 1 g = 9.81 · วางราบ az ≈ +9.81 · ตกอิสระ = 0
gx, gy, gz deg/s วางนิ่ง ≈ 0 · หมุนด้วยมือ 30-90 · สะบัดข้อมือ > 500

อย่าสับสน — accel บอก ตำแหน่งเชิงมุมเทียบกับแนวดิ่ง ส่วน gyro บอก อัตราการเปลี่ยนมุม ไม่ใช่ตัวมุมเอง

อ่านแยกสองครั้ง accel gyro ช่องว่าง — ค่าเปลี่ยนชุดได้ บอร์ดขยับไปแล้ว motion() — อ่านครั้งเดียว accel + gyro พร้อมกัน ได้ภาพนิ่งของบอร์ด ณ เวลาเดียวกัน

ข้อมูลที่จะเอาไปรวมกัน (fuse) ต้องมาจากเวลาเดียวกัน ไม่งั้นเราไม่ได้รวมข้อมูล เรากำลังรวมความมั่ว

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

จากชุดบทเรียนนี้ไป เราไม่ได้แค่ "แสดงค่าที่เซนเซอร์ให้มา" แต่เริ่มคำนวณปริมาณใหม่ขึ้นมาเอง