Акселерометр у мобільних додатках: що це, як працює та де використовується

Автор: IT Sectr Опубліковано: 2026-03-22 Час читання: 9 хв

Акселерометр у мобільних пристроях — це MEMS-датчик, що вимірює лінійне прискорення по трьох осях для визначення орієнтації та руху пристрою. Згідно з Google Android Sensors Guide (2025), акселерометр є найбільш використовуваним датчиком у мобільних додатках. MEMS-технологія дозволяє розмістити датчик у чипі розміром 1 мм, що споживає менше ніж 1 мВт енергії.

Головне

  • Акселерометр — MEMS-датчик, що вимірює прискорення по осях X, Y і Z в м/с² або g.
  • Принцип роботи базується на зміщенні мікроскопічної маси під дією прискорення, що фіксується ємнісними датчиками.
  • Android надає доступ через SensorManager та SensorEventListener.
  • iOS використовує CoreMotion з CMMotionManager для отримання даних акселерометра.
  • Застосування — визначення орієнтації екрана, підрахунок кроків, ігри, стабілізація зображення.

Що таке акселерометр

Акселерометр — це мікроелектромеханічний (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

На Android доступ до акселерометра здійснюється через клас SensorManager та інтерфейс SensorEventListener. Додаток отримує системну службу SENSOR_SERVICE, запитує датчик TYPE_ACCELEROMETER та реєструє слухача із зазначеною частотою оновлень. Система викликає onSensorChanged при кожному новому вимірюванні з масивом значень: values[0] = X, values[1] = Y, values[2] = Z. Нижче наведено повний приклад читання даних з акселерометра на Kotlin.

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 для економії заряду батареї.

Фільтрація шуму

kotlin
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

На iOS доступ до акселерометра надає фреймворк Core Motion через клас CMMotionManager. Додаток створює екземпляр менеджера та викликає startAccelerometerUpdates із чергою та обробником. Дані повертаються як CMAccelerometerData, що містить структуру CMAcceleration з полями x, y та z. Нижче наведено приклад отримання даних з акселерометра на Swift з фільтрацією шуму.

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).

Як отримати дані з акселерометра на Android?

Використовуйте 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 секунди та віднімайте ці значення від усіх наступних вимірювань. Це компенсує зміщення нуля, але не масштабну похибку.

Підсумок

  • Акселерометр — MEMS-датчик для вимірювання прискорення по осях X, Y, Z, заснований на зміщенні мікроскопічної маси.
  • Принцип роботи — ємнісний MEMS з замкненим контуром зворотного зв’язку, точність до 0,001g.
  • Android надає SensorManager з TYPE_ACCELEROMETER та SensorEventListener для доступу до даних.
  • iOS використовує Core Motion з CMMotionManager та startAccelerometerUpdates для отримання даних.
  • Фільтрація — фільтр низьких частот для гравітації та високих для лінійного прискорення.
  • Застосування — автоповорот екрана, підрахунок кроків, ігри, стабілізація та розпізнавання жестів.
  • Рекомендація — обирайте частоту оновлень залежно від сценарію: 20–50 Гц для кроків, 50–200 Гц для ігор, 200–1000 Гц для стабілізації.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також