Акселерометр у мобільних пристроях — це MEMS-датчик, що вимірює лінійне прискорення по трьох осях для визначення орієнтації та руху пристрою. Згідно з Google Android Sensors Guide (2025), акселерометр є найбільш використовуваним датчиком у мобільних додатках. MEMS-технологія дозволяє розмістити датчик у чипі розміром 1 мм, що споживає менше ніж 1 мВт енергії.
Головне
Акселерометр — це мікроелектромеханічний (MEMS) датчик, що вимірює проекцію прискорення на три взаємно перпендикулярні осі: X (горизонтальна, направлена вправо), Y (вертикальна, направлена вгору) та Z (перпендикулярна площині екрана). У стані спокою акселерометр показує значення 9,8 м/с² по осі Z — це прискорення вільного падіння, спрямоване до центру Землі. На основі цього значення система визначає орієнтацію пристрою: якщо значення Z близьке до 0, а Y до -9,8 м/с², пристрій повернутий горизонтально. Діапазон вимірювань акселерометра звичайно становить ±2g, ±4g, ±8g або ±16g залежно від моделі чипа.
Сучасні акселерометри характеризуються кількома ключовими параметрами: чутливість (від 0,001 м/с²), частота дискретизації (до 1000 Гц), діапазон вимірювань та рівень шуму. На флагманських пристроях встановлені датчики STMicroelectronics LSM6DSO або Bosch BMI270 з частотою до 1600 Гц та споживанням менше ніж 0,5 мВт у активному режимі. Чим вища частота дискретизації, тим детальніший сигнал отримує додаток — для ігор потрібно 200–400 Гц, для підрахунку кроків достатньо 10–50 Гц. Шум датчика впливає на точність вимірювань і звичайно компенсується фільтром низьких частот на рівні ОС.
MEMS-акселерометр всередині являє собою мікроскопічну структуру з кремнію: рухома маса, підвішена на пружних балках між нерухомими електродами. При прискоренні маса зміщується, змінюючи ємність між рухомими та нерухомими елементами — ця зміна вимірюється і перетворюється на електричний сигнал. Схема з замкненим контуром зворотного зв’язку утримує масу в центральному положенні за допомогою електростатичної сили, що забезпечує лінійність вимірювань в усьому діапазоні. У відкритих системах маса рухається вільно, обчислення простіші, але точність нижча. За даними STMicroelectronics (2025), акселерометри замкненого контуру забезпечують точність до 0,001g при температурному дрейфі менше ніж 0,1 мг/°C.
Три осі акселерометра відповідають трьом вимірам простору: X (нахил ліворуч-праворуч), Y (вгору-вниз) та Z (вперед-назад відносно екрана). Коли пристрій лежить на столі екраном догори, вектор прискорення вільного падіння направлений вдовж осі Z із значенням 9,8 м/с². При нахилі пристрою проекції гравітації перерозподіляються між осями — за цими проекціями можна обчислити кут нахилу з точністю до 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)
)
// Оновлення інтерфейсу з новим кутом
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 Гц, оптимальну для ігор та інтерактивних додатків. Для підрахунку кроків використовуйте SENSOR_DELAY_NORMAL (~5 Гц), для точних вимірювань — SENSOR_DELAY_FASTEST (~200 Гц). У 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 м/с²)
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 Гц) — оптимально для плавної анімації та ігор. Метод isAccelerometerAvailable перевіряє наявність датчика на пристрої. Значення прискорення повертаються в одиницях g (1 g = 9,8 м/с²). Вектор magnitude обчислюється як евклідова норма трьох компонентів — якщо значення перевищує 2,5 g, це інтерпретується як струшування пристрою. Для зупинки оновлень обов’язково викликайте stopAccelerometerUpdates при виході з екрана.
Акселерометр використовується в широкому спектрі мобільних додатків. Найочевидніший сценарій — автоматичний поворот екрана: система перемикає між книжковою та альбомною орієнтацією на основі даних акселерометра. У іграх акселерометр служить контролером керування — нахил пристрою повертає кермо або переміщує персонажа. Фітнес-додатки підраховують кроки на основі характерних піків прискорення при ходьбі. Нижче наведена таблиця з типовими сценаріями та вимогами до датчика.
| Сценарій | Частота (Гц) | Точність | Фільтрація |
|---|---|---|---|
| Автоповорот екрана | 5–10 | Низька | LPF |
| Підрахунок кроків | 20–50 | Середня | HPF + піковий детектор |
| Ігри (гонки) | 50–200 | Висока | Калібрування + LPF |
| Стабілізація камери | 200–1000 | Максимальна | Комплементарний фільтр |
| Розпізнавання жестів | 50–100 | Середня | HPF + пороговий детектор |
При реалізації акселерометра важливо враховувати, що нагрівання пристрою та старіння датчика можуть впливати на точність показів. Для критичних вимірювань (стабілізація відео, компас) рекомендується додатково використовувати гіроскоп та магнітометр в рамках сенсорної інтеграції (sensor fusion).
Акселерометри схильні до кількох типів похибок: зміщення нуля (bias) — коли датчик показує ненульове значення в спокої; похибка масштабного коефіцієнта — коли чутливість відрізняється по різних осях; та шум вимірювань, що знижує точність окремого відліку. MEMS-датчики калібруються на виробництві, але з часом параметри можуть дрейфувати через температуру та механічні навантаження. Для компенсації в додатку можна реалізувати просте калібрування: в стані спокою записати середнє значення (зміщення) та віднімати його від усіх наступних вимірювань. Більш точне калібрування потребує обертання пристрою по всіх осях — цей метод називається шеститочковим калібруванням та дає похибку менше ніж 0,5%.
Часто задавані питання
Акселерометр у смартфоні — це MEMS-датчик розміром близько 1 мм, що вимірює прискорення по трьох осях. Він визначає орієнтацію пристрою (книжкову або альбомну), струшування, кроки та рух без використання зовнішніх джерел.
Акселерометр вимірює лінійне прискорення (включаючи гравітацію), а гіроскоп — кутову швидкість (обертання). Акселерометр визначає орієнтацію, гіроскоп виявляє обертання. Разом вони забезпечують точне відстежування руху в просторі (sensor fusion).
Використовуйте SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) для отримання датчика, потім registerListener з SensorEventListener. У onSensorChanged масив event.values містить значення X, Y, Z в м/с². Обов’язково відміняйте реєстрацію в onPause.
Обчисліть magnitude = sqrt(x² + y² + z²). Якщо значення перевищує 2–3 g (після фільтрації гравітації), пристрій було струшено. На iOS використовуйте CMMotionManager з порогом 2,5 g, на Android — Sensor.TYPE_LINEAR_ACCELERATION з порогом 15 м/с².
Так, для простого калібрування помістіть пристрій на рівну поверхню, запишіть середні покази по кожній осі протягом 2–3 секунди та віднімайте ці значення від усіх наступних вимірювань. Це компенсує зміщення нуля, але не масштабну похибку.
Підсумок
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також