เครื่องวัดความเร่งในอุปกรณ์มือถือคือเซ็นเซอร์ MEMS ที่วัดความเร่งเชิงเส้นตามสามแกนเพื่อกำหนดทิศทางและการเคลื่อนที่ของอุปกรณ์ ตาม Google Android Sensors Guide (2025) เครื่องวัดความเร่งเป็นเซ็นเซอร์ที่ใช้มากที่สุดในแอปพลิเคชันมือถือ เทคโนโลยี MEMS ช่วยให้วางเซ็นเซอร์ในชิปขนาด 1 มม. ที่กินไฟน้อยกว่า 1 มิลลิวัตต์
ประเด็นสำคัญ
เครื่องวัดความเร่ง คือเซ็นเซอร์ไมโครอิเล็กโทรเมคานิกส์ (MEMS) ที่วัดการฉายของความเร่งบนสามแกนที่ตั้งฉากกัน: X (แนวนอน, ไปทางขวา), Y (แนวตั้ง, ขึ้นด้านบน) และ Z (ตั้งฉากกับระนาบหน้าจอ) ในสภาวะนิ่ง เครื่องวัดความเร่งจะแสดงค่า 9.8 m/s² บนแกน Z — นี่คือความเร่งเนื่องจากแรงโน้มถ่วงที่มุ่งสู่ศูนย์กลางโลก จากค่านี้ ระบบจะกำหนดทิศทางของอุปกรณ์: ถ้าค่า Z ใกล้ 0 และค่า Y ใกล้ -9.8 m/s² แสดงว่าอุปกรณ์ถูกหมุนในแนวนอน ช่วงการวัดของเครื่องวัดความเร่งโดยทั่วไปคือ ±2g, ±4g, ±8g หรือ ±16g ขึ้นอยู่กับรุ่นของชิป
เครื่องวัดความเร่ง สมัยใหม่มีลักษณะเฉพาะด้วยพารามิเตอร์สำคัญหลายประการ: ความไว (ตั้งแต่ 0.001 m/s²), อัตราการสุ่มตัวอย่าง (สูงถึง 1000 Hz), ช่วงการวัด และระดับสัญญาณรบกวน อุปกรณ์เรือธงใช้เซ็นเซอร์ STMicroelectronics LSM6DSO หรือ Bosch BMI270 ที่มีความถี่สูงถึง 1600 Hz และกินไฟน้อยกว่า 0.5 mW ในโหมดทำงาน ยิ่งอัตราการสุ่มตัวอย่างสูง สัญญาณที่แอปได้รับก็ยิ่งละเอียด — เกมต้องการ 200–400 Hz ในขณะที่นับก้าวต้องการเพียง 10–50 Hz สัญญาณรบกวนของเซ็นเซอร์ส่งผลต่อความแม่นยำของการวัดและมักได้รับการชดเชยด้วยตัวกรองความถี่ต่ำที่ระดับ OS
เครื่องวัดความเร่ง MEMS ภายในประกอบด้วยโครงสร้างซิลิคอนขนาดเล็ก: มวลทดสอบที่แขวนอยู่บนคานยืดหยุ่นระหว่างอิเล็กโทรดคงที่ เมื่อมีความเร่ง มวลจะเคลื่อนที่ เปลี่ยนความจุระหว่างองค์ประกอบที่เคลื่อนที่และคงที่ — การเปลี่ยนแปลงนี้จะถูกวัดและแปลงเป็นสัญญาณไฟฟ้า วงจรป้อนกลับแบบวงปิดจะรักษามวลให้อยู่ในตำแหน่งกึ่งกลางด้วยแรงไฟฟ้าสถิต เพื่อให้มั่นใจถึงความเป็นเชิงเส้นตลอดช่วง ในระบบวงเปิด มวลจะเคลื่อนที่อย่างอิสระ การคำนวณง่ายกว่าแต่ความแม่นยำต่ำกว่า ตามข้อมูลของ STMicroelectronics (2025) เครื่องวัดความเร่งแบบวงปิดให้ความแม่นยำสูงถึง 0.001g โดยมีการเลื่อนอุณหภูมิน้อยกว่า 0.1 มก./°C
สามแกน ของเครื่องวัดความเร่งสอดคล้องกับสามมิติของพื้นที่: X (เอียงซ้าย-ขวา), Y (ขึ้น-ลง) และ Z (หน้า-หลังสัมพันธ์กับหน้าจอ) เมื่ออุปกรณ์วางบนโต๊ะโดยหงายหน้าจอขึ้น เวกเตอร์ความเร่งโน้มถ่วงจะชี้ไปตามแกน Z ที่ 9.8 m/s² เมื่อเอียงอุปกรณ์ การฉายของแรงโน้มถ่วงจะกระจายใหม่ระหว่างแกน — จากการฉายเหล่านี้ สามารถคำนวณมุมเอียงได้ด้วยความแม่นยำสูงถึง 0.1 องศา ในการตรวจจับการเคลื่อนที่โดยไม่มีอิทธิพลของแรงโน้มถ่วง จะใช้ตัวกรองความถี่สูงเพื่อแยกองค์ประกอบไดนามิกของความเร่ง (การเคลื่อนที่ของอุปกรณ์เอง) ออกจากองค์ประกอบคงที่ (แรงโน้มถ่วง)
บน Android การเข้าถึงเครื่องวัดความเร่ง ทำได้ผ่านคลาส SensorManager และอินเทอร์เฟซ SensorEventListener แอปจะรับบริการระบบ SENSOR_SERVICE ขอเซ็นเซอร์ TYPE_ACCELEROMETER และลงทะเบียนตัวฟังด้วยอัตราการอัปเดตที่ระบุ ระบบจะเรียก onSensorChanged ทุกครั้งที่มีการวัดใหม่พร้อมอาร์เรย์ของค่า: values[0] = X, values[1] = Y, values[2] = Z ด้านล่างเป็นตัวอย่างสมบูรณ์ของการอ่านข้อมูลเครื่องวัดความเร่งใน Kotlin
val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
val sensorEventListener = object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
val x = event.values[0]
val y = event.values[1]
val z = event.values[2]
// คำนวณมุมเอียง
val pitch = Math.atan2(
x.toDouble(),
Math.sqrt(y.toDouble() * y + z.toDouble() * z)
)
// อัปเดต UI ด้วยมุมใหม่
textViewAngle.text = "ความเอียง: ${Math.toDegrees(pitch)}°"
}
override fun onAccuracyChanged(
sensor: Sensor, accuracy: Int
) { }
}
sensorManager.registerListener(
sensorEventListener,
accelerometer,
SensorManager.SENSOR_DELAY_GAME
)
ในตัวอย่าง SensorManager.SENSOR_DELAY_GAME กำหนดอัตราการอัปเดตที่ ~50 Hz ซึ่งเหมาะสมที่สุดสำหรับเกมและแอปแบบโต้ตอบ สำหรับการนับก้าว ให้ใช้ SENSOR_DELAY_NORMAL (~5 Hz); สำหรับการวัดที่แม่นยำ ให้ใช้ SENSOR_DELAY_FASTEST (~200 Hz) ใน onSensorChanged อาร์เรย์ event.values จะมีค่าที่อ่านได้ปัจจุบันของเซ็นเซอร์ จากค่า X, Y, Z มุมเอียงจะคำนวณโดยใช้ atan2 — นี่คือสูตรพื้นฐานสำหรับกำหนดทิศทางของอุปกรณ์โดยไม่ต้องใช้เซ็นเซอร์ทิศทาง อย่าลืมยกเลิกการลงทะเบียนตัวฟังใน onPause เพื่อประหยัดแบตเตอรี่
private val alpha = 0.8f
private val gravity = FloatArray(3)
private val linearAcceleration = FloatArray(3)
override fun onSensorChanged(event: SensorEvent) {
// ตัวกรองความถี่ต่ำ (LPF) สำหรับแยกแรงโน้มถ่วง
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]
// ลบแรงโน้มถ่วง — ได้ความเร่งเส้นตรง
linearAcceleration[0] = event.values[0] - gravity[0]
linearAcceleration[1] = event.values[1] - gravity[1]
linearAcceleration[2] = event.values[2] - gravity[2]
}
ตัวกรองความถี่ต่ำที่มีค่าสัมประสิทธิ์ alpha จะแยกองค์ประกอบแรงโน้มถ่วง (เวกเตอร์คงที่); การลบออกจะได้ความเร่งบริสุทธิ์ของอุปกรณ์ (ความเร่งเชิงเส้น) ซึ่งจำเป็นสำหรับการตรวจจับการเคลื่อนที่โดยไม่คำนึงถึงทิศทาง — เช่น การตรวจจับก้าว การเขย่า หรือการกระแทก ค่า alpha 0.8 หมายความว่าตัวกรองยอมให้สัญญาณใหม่ผ่านประมาณ 20% และคงไว้ 80% ของสัญญาณก่อนหน้า — เพียงพอที่จะกำจัดสัญญาณรบกวนโดยไม่มีความล่าช้าที่มีนัยสำคัญ
บน iOS การเข้าถึงเครื่องวัดความเร่ง จัดเตรียมโดยเฟรมเวิร์ก Core Motion ผ่านคลาส CMMotionManager แอปสร้างอินสแตนซ์ของผู้จัดการและเรียก startAccelerometerUpdates พร้อมคิวและตัวจัดการ ข้อมูลจะถูกส่งกลับเป็น CMAccelerometerData ซึ่งมีโครงสร้าง CMAcceleration พร้อมฟิลด์ x, y และ z ด้านล่างเป็นตัวอย่างการรับข้อมูลเครื่องวัดความเร่งใน Swift พร้อมการกรองสัญญาณรบกวน
import CoreMotion
let motionManager = CMMotionManager()
motionManager.accelerometerUpdateInterval = 1.0 / 60.0
guard motionManager.isAccelerometerAvailable else { return }
motionManager.startAccelerometerUpdates(to: OperationQueue.current!) {
data, error in
guard let acceleration = data?.acceleration,
error == nil else { return }
// ค่าในหน่วย g (1 g = 9.8 m/s²)
let magnitude = sqrt(
acceleration.x * acceleration.x +
acceleration.y * acceleration.y +
acceleration.z * acceleration.z
)
// ถ้า magnitude > 2.5 g — ตรวจจับการเขย่า
if magnitude > 2.5 {
DispatchQueue.main.async {
self.handleShake()
}
}
}
ในตัวอย่าง accelerometerUpdateInterval ถูกตั้งค่าเป็น 1/60 วินาที (~60 Hz) — เหมาะสมที่สุดสำหรับแอนิเมชันที่ลื่นไหลและเกม เมธอด isAccelerometerAvailable ตรวจสอบว่าเซ็นเซอร์พร้อมใช้งานบนอุปกรณ์หรือไม่ ค่าความเร่งจะถูกส่งกลับในหน่วย g (โดย 1 g = 9.8 m/s²) เวกเตอร์ magnitude คำนวณเป็นบรรทัดฐานแบบยุคลิดของสามองค์ประกอบ — ถ้าค่าเกิน 2.5 g จะถูกตีความว่าเป็นการเขย่าอุปกรณ์ หากต้องการหยุดการอัปเดต ให้เรียก stopAccelerometerUpdates เสมอเมื่อออกจากหน้าจอ
เครื่องวัดความเร่ง ถูกใช้ในแอปพลิเคชันมือถือที่หลากหลาย สถานการณ์ที่ชัดเจนที่สุดคือการหมุนหน้าจออัตโนมัติ: ระบบจะสลับระหว่างแนวนอนและแนวตั้งตามข้อมูลจากเครื่องวัดความเร่ง ในเกม เครื่องวัดความเร่งทำหน้าที่เป็นอินพุตควบคุม — การเอียงอุปกรณ์จะหมุนพวงมาลัยหรือเคลื่อนที่ตัวละคร แอปฟิตเนสนับก้าวตามจุดสูงสุดของความเร่งที่มีลักษณะเฉพาะขณะเดิน ด้านล่างเป็นตารางสถานการณ์ทั่วไปและข้อกำหนดของเซ็นเซอร์
| สถานการณ์ | ความถี่ (Hz) | ความแม่นยำ | การกรอง |
|---|---|---|---|
| หมุนหน้าจออัตโนมัติ | 5–10 | ต่ำ | LPF |
| นับก้าว | 20–50 | ปานกลาง | HPF + ตัวตรวจจับจุดสูงสุด |
| เกม (แข่งรถ) | 50–200 | สูง | การสอบเทียบ + LPF |
| คงภาพกล้อง | 200–1000 | สูงสุด | ตัวกรองเสริม |
| จดจำท่าทาง | 50–100 | ปานกลาง | HPF + ตัวตรวจจับเกณฑ์ |
เมื่อใช้งานเครื่องวัดความเร่ง โปรดทราบว่าความร้อนของอุปกรณ์และอายุของเซ็นเซอร์อาจส่งผลต่อความแม่นยำในการอ่านค่า สำหรับการวัดที่สำคัญ (คงภาพวิดีโอ, เข็มทิศ) แนะนำให้ใช้ไจโรสโคปและแมกนีโตมิเตอร์เพิ่มเติมเป็นส่วนหนึ่งของการรวมเซ็นเซอร์
เครื่องวัดความเร่ง มีแนวโน้มที่จะเกิดข้อผิดพลาดหลายประเภท: การเลื่อนศูนย์ (bias) — เมื่อเซ็นเซอร์แสดงค่าที่ไม่ใช่ศูนย์ในสภาวะนิ่ง; ข้อผิดพลาดของปัจจัยมาตราส่วน — เมื่อความไวแตกต่างกันระหว่างแกน; และสัญญาณรบกวนการวัด ซึ่งลดความแม่นยำของการอ่านครั้งเดียว เซ็นเซอร์ MEMS ได้รับการสอบเทียบระหว่างการผลิต แต่เมื่อเวลาผ่านไป พารามิเตอร์อาจเลื่อนเนื่องจากอุณหภูมิและความเค้นเชิงกล สำหรับการชดเชยในแอป สามารถดำเนินการสอบเทียบอย่างง่าย: ในสภาวะนิ่ง ให้บันทึกค่าเฉลี่ย (การเลื่อน) และลบค่านั้นออกจากการวัดที่ตามมาทั้งหมด การสอบเทียบที่แม่นยำยิ่งขึ้นต้องหมุนอุปกรณ์ตามทุกแกน — วิธีการนี้เรียกว่าการสอบเทียบหกจุดและให้ข้อผิดพลาดน้อยกว่า 0.5%
คำถามที่พบบ่อย
เครื่องวัดความเร่ง ในสมาร์ทโฟนคือเซ็นเซอร์ MEMS ขนาดประมาณ 1 มม. ที่วัดความเร่งบนสามแกน โดยกำหนดทิศทางของอุปกรณ์ (แนวตั้งหรือแนวนอน), การเขย่า, ก้าว และการเคลื่อนที่โดยไม่ต้องใช้แหล่งภายนอก
เครื่องวัดความเร่งวัดความเร่งเชิงเส้น (รวมถึงแรงโน้มถ่วง) ในขณะที่ไจโรสโคปวัดความเร็วเชิงมุม (การหมุน) เครื่องวัดความเร่งกำหนดทิศทาง; ไจโรสโคปตรวจจับการหมุน เมื่อรวมกันแล้วจะให้การติดตามการเคลื่อนที่ที่แม่นยำในพื้นที่ (การรวมเซ็นเซอร์)
ใช้ SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) เพื่อรับเซ็นเซอร์ จากนั้น registerListener กับ SensorEventListener ใน onSensorChanged อาร์เรย์ event.values จะมีค่า X, Y, Z ในหน่วย m/s² ยกเลิกการลงทะเบียนใน onPause เสมอ
คำนวณ magnitude = sqrt(x² + y² + z²) ถ้าค่าเกิน 2–3 g (หลังจากกรองแรงโน้มถ่วง) แสดงว่าอุปกรณ์ถูกเขย่า บน iOS ให้ใช้ CMMotionManager ที่เกณฑ์ 2.5 g; บน Android ให้ใช้ Sensor.TYPE_LINEAR_ACCELERATION ที่เกณฑ์ 15 m/s²
ได้ สำหรับการสอบเทียบอย่างง่าย วางอุปกรณ์บนพื้นผิวเรียบ บันทึกค่าเฉลี่ยของแต่ละแกนเป็นเวลา 2–3 วินาที และลบค่าเหล่านั้นออกจากการวัดที่ตามมาทั้งหมด ซึ่งชดเชยการเลื่อนศูนย์ แต่ไม่ชดเชยข้อผิดพลาดของมาตราส่วน
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม