Gia tốc kế trong thiết bị di động là cảm biến MEMS đo gia tốc tuyến tính theo ba trục để xác định hướng và chuyển động của thiết bị. Theo Google Android Sensors Guide (2025), gia tốc kế là cảm biến được sử dụng nhiều nhất trong các ứng dụng di động. Công nghệ MEMS cho phép đặt cảm biến trong chip 1 mm tiêu thụ dưới 1 mW điện năng.
Điểm chính
Gia tốc kế là cảm biến vi điện cơ (MEMS) đo hình chiếu của gia tốc lên ba trục vuông góc với nhau: X (nằm ngang, hướng sang phải), Y (thẳng đứng, hướng lên trên) và Z (vuông góc với mặt phẳng màn hình). Ở trạng thái tĩnh, gia tốc kế hiển thị 9,8 m/s² trên trục Z — đây là gia tốc trọng trường hướng về tâm Trái Đất. Dựa trên giá trị này, hệ thống xác định hướng của thiết bị: nếu giá trị Z gần 0 và giá trị Y gần -9,8 m/s², thiết bị đã xoay ngang. Dải đo của gia tốc kế thường là ±2g, ±4g, ±8g hoặc ±16g tùy thuộc vào mẫu chip.
Các gia tốc kế hiện đại được đặc trưng bởi một số thông số chính: độ nhạy (từ 0,001 m/s²), tần suất lấy mẫu (lên đến 1000 Hz), dải đo và mức nhiễu. Các thiết bị cao cấp sử dụng cảm biến STMicroelectronics LSM6DSO hoặc Bosch BMI270 với tần số lên đến 1600 Hz và mức tiêu thụ dưới 0,5 mW ở chế độ hoạt động. Tần suất lấy mẫu càng cao, tín hiệu ứng dụng nhận được càng chi tiết — trò chơi cần 200–400 Hz, trong khi đếm bước chỉ cần 10–50 Hz. Nhiễu cảm biến ảnh hưởng đến độ chính xác của phép đo và thường được bù bằng bộ lọc thông thấp ở cấp hệ điều hành.
Gia tốc kế MEMS bên trong bao gồm một cấu trúc silicon siêu nhỏ: một khối lượng kiểm tra được treo trên các dầm đàn hồi giữa các điện cực cố định. Khi có gia tốc, khối lượng dịch chuyển, làm thay đổi điện dung giữa các phần tử chuyển động và cố định — sự thay đổi này được đo và chuyển đổi thành tín hiệu điện. Mạch phản hồi vòng kín giữ khối lượng ở vị trí trung tâm bằng lực tĩnh điện, đảm bảo tuyến tính trên toàn dải. Trong hệ thống vòng hở, khối lượng di chuyển tự do, việc tính toán đơn giản hơn nhưng độ chính xác thấp hơn. Theo STMicroelectronics (2025), gia tốc kế vòng kín đạt độ chính xác lên đến 0,001g với độ trôi nhiệt dưới 0,1 mg/°C.
Ba trục của gia tốc kế tương ứng với ba chiều không gian: X (nghiêng trái-phải), Y (lên-xuống) và Z (trước-sau so với màn hình). Khi thiết bị đặt trên bàn với màn hình hướng lên trên, vectơ gia tốc trọng trường hướng dọc theo trục Z ở 9,8 m/s². Khi thiết bị nghiêng, các hình chiếu trọng lực phân bổ lại giữa các trục — từ các hình chiếu này, góc nghiêng có thể được tính với độ chính xác lên đến 0,1 độ. Để phát hiện chuyển động mà không chịu ảnh hưởng của trọng lực, bộ lọc thông cao được sử dụng để tách thành phần động của gia tốc (chuyển động riêng của thiết bị) khỏi thành phần tĩnh (trọng lực).
Trên Android, quyền truy cập vào gia tốc kế được cung cấp qua lớp SensorManager và giao diện SensorEventListener. Ứng dụng nhận dịch vụ hệ thống SENSOR_SERVICE, yêu cầu cảm biến TYPE_ACCELEROMETER và đăng ký một trình lắng nghe với tốc độ cập nhật được chỉ định. Hệ thống gọi onSensorChanged với mỗi phép đo mới kèm một mảng giá trị: values[0] = X, values[1] = Y, values[2] = Z. Dưới đây là ví dụ đầy đủ về đọc dữ liệu gia tốc kế trong 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]
// Tính góc nghiêng
val pitch = Math.atan2(
x.toDouble(),
Math.sqrt(y.toDouble() * y + z.toDouble() * z)
)
// Cập nhật giao diện với góc mới
textViewAngle.text = "Độ nghiêng: ${Math.toDegrees(pitch)}°"
}
override fun onAccuracyChanged(
sensor: Sensor, accuracy: Int
) { }
}
sensorManager.registerListener(
sensorEventListener,
accelerometer,
SensorManager.SENSOR_DELAY_GAME
)
Trong ví dụ, SensorManager.SENSOR_DELAY_GAME đặt tốc độ cập nhật ~50 Hz, tối ưu cho trò chơi và ứng dụng tương tác. Để đếm bước, sử dụng SENSOR_DELAY_NORMAL (~5 Hz); để đo chính xác, sử dụng SENSOR_DELAY_FASTEST (~200 Hz). Trong onSensorChanged, mảng event.values chứa các giá trị đọc hiện tại của cảm biến. Dựa trên các giá trị X, Y, Z, góc nghiêng được tính bằng atan2 — đây là công thức cơ bản để xác định hướng của thiết bị mà không cần cảm biến định hướng. Nhớ hủy đăng ký trình lắng nghe trong onPause để tiết kiệm pin.
private val alpha = 0.8f
private val gravity = FloatArray(3)
private val linearAcceleration = FloatArray(3)
override fun onSensorChanged(event: SensorEvent) {
// Bộ lọc thông thấp (LPF) để trích trọng lực
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]
// Trừ trọng lực — thu được gia tốc tuyến tính
linearAcceleration[0] = event.values[0] - gravity[0]
linearAcceleration[1] = event.values[1] - gravity[1]
linearAcceleration[2] = event.values[2] - gravity[2]
}
Bộ lọc thông thấp với hệ số alpha trích xuất thành phần trọng lực (vectơ tĩnh); trừ đi thành phần này sẽ thu được gia tốc thuần của thiết bị (gia tốc tuyến tính). Điều này cần thiết để phát hiện chuyển động mà không xét đến hướng — ví dụ, phát hiện bước đi, lắc hoặc va chạm. Giá trị alpha 0,8 có nghĩa là bộ lọc cho qua khoảng 20% tín hiệu mới và giữ lại 80% tín hiệu trước — đủ để loại bỏ nhiễu mà không có độ trễ đáng kể.
Trên iOS, quyền truy cập vào gia tốc kế được cung cấp bởi framework Core Motion qua lớp CMMotionManager. Ứng dụng tạo một thể hiện trình quản lý và gọi startAccelerometerUpdates với hàng đợi và trình xử lý. Dữ liệu được trả về dưới dạng CMAccelerometerData, chứa cấu trúc CMAcceleration với các trường x, y và z. Dưới đây là ví dụ lấy dữ liệu gia tốc kế trong Swift có lọc nhiễu.
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 }
// Giá trị bằng g (1 g = 9,8 m/s²)
let magnitude = sqrt(
acceleration.x * acceleration.x +
acceleration.y * acceleration.y +
acceleration.z * acceleration.z
)
// Nếu magnitude > 2,5 g — phát hiện lắc
if magnitude > 2.5 {
DispatchQueue.main.async {
self.handleShake()
}
}
}
Trong ví dụ, accelerometerUpdateInterval được đặt là 1/60 giây (~60 Hz) — tối ưu cho hoạt ảnh mượt và trò chơi. Phương thức isAccelerometerAvailable kiểm tra xem cảm biến có trên thiết bị không. Các giá trị gia tốc được trả về bằng đơn vị g (1 g = 9,8 m/s²). Vectơ magnitude được tính là chuẩn Euclid của ba thành phần — nếu giá trị vượt quá 2,5 g, được hiểu là thiết bị đang bị lắc. Để dừng cập nhật, luôn gọi stopAccelerometerUpdates khi rời khỏi màn hình.
Gia tốc kế được sử dụng trong nhiều ứng dụng di động. Kịch bản rõ ràng nhất là xoay màn hình tự động: hệ thống chuyển đổi giữa chế độ dọc và ngang dựa trên dữ liệu gia tốc kế. Trong trò chơi, gia tốc kế đóng vai trò như đầu vào điều khiển — nghiêng thiết bị để xoay vô lăng hoặc di chuyển nhân vật. Ứng dụng thể dục đếm bước dựa trên các đỉnh gia tốc đặc trưng khi đi bộ. Dưới đây là bảng các kịch bản điển hình và yêu cầu cảm biến.
| Kịch bản | Tần số (Hz) | Độ chính xác | Lọc |
|---|---|---|---|
| Xoay màn hình tự động | 5–10 | Thấp | LPF |
| Đếm bước | 20–50 | Trung bình | HPF + bộ phát hiện đỉnh |
| Trò chơi (đua xe) | 50–200 | Cao | Hiệu chuẩn + LPF |
| Ổn định máy ảnh | 200–1000 | Tối đa | Bộ lọc bổ sung |
| Nhận dạng cử chỉ | 50–100 | Trung bình | HPF + bộ phát hiện ngưỡng |
Khi triển khai gia tốc kế, hãy lưu ý rằng thiết bị nóng lên và lão hóa cảm biến có thể ảnh hưởng đến độ chính xác của phép đo. Đối với các phép đo quan trọng (ổn định video, la bàn), nên sử dụng thêm con quay hồi chuyển và từ kế như một phần của tích hợp cảm biến.
Gia tốc kế chịu một số loại sai số: độ lệch không (bias) — khi cảm biến hiển thị giá trị khác không ở trạng thái tĩnh; sai số hệ số tỷ lệ — khi độ nhạy khác nhau giữa các trục; và nhiễu đo, làm giảm độ chính xác của một lần đọc duy nhất. Cảm biến MEMS được hiệu chuẩn trong quá trình sản xuất, nhưng theo thời gian, các thông số có thể trôi do nhiệt độ và ứng suất cơ học. Để bù trong ứng dụng, có thể thực hiện hiệu chuẩn đơn giản: ở trạng thái tĩnh, ghi lại giá trị trung bình (độ lệch) và trừ nó khỏi tất cả các phép đo sau đó. Hiệu chuẩn chính xác hơn yêu cầu xoay thiết bị theo tất cả các trục — phương pháp này được gọi là hiệu chuẩn sáu điểm và đạt sai số dưới 0,5%.
Câu hỏi thường gặp
Gia tốc kế trong điện thoại thông minh là cảm biến MEMS kích thước khoảng 1 mm đo gia tốc trên ba trục. Nó xác định hướng của thiết bị (dọc hoặc ngang), lắc, bước đi và chuyển động mà không cần nguồn bên ngoài.
Gia tốc kế đo gia tốc tuyến tính (bao gồm trọng lực), trong khi con quay hồi chuyển đo tốc độ góc (xoay). Gia tốc kế xác định hướng, con quay hồi chuyển phát hiện xoay. Kết hợp lại, chúng cung cấp theo dõi chuyển động chính xác trong không gian (tích hợp cảm biến).
Sử dụng SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) để lấy cảm biến, sau đó registerListener với SensorEventListener. Trong onSensorChanged, mảng event.values chứa các giá trị X, Y, Z bằng m/s². Luôn hủy đăng ký trong onPause.
Tính magnitude = sqrt(x² + y² + z²). Nếu giá trị vượt quá 2–3 g (sau khi lọc trọng lực), thiết bị đã bị lắc. Trên iOS, sử dụng CMMotionManager với ngưỡng 2,5 g; trên Android, sử dụng Sensor.TYPE_LINEAR_ACCELERATION với ngưỡng 15 m/s².
Có, để hiệu chuẩn đơn giản, đặt thiết bị trên bề mặt phẳng, ghi lại giá trị trung bình của mỗi trục trong 2–3 giây và trừ các giá trị này khỏi tất cả các phép đo sau đó. Điều này bù được độ lệch không nhưng không bù được sai số tỷ lệ.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm