Mobil qurilmalardagi akselerometr — bu uch o'q bo'ylab chiziqli tezlanishni o'lchaydigan, qurilmaning orientatsiyasi va harakatini aniqlash uchun mo'ljallangan MEMS sensoridir. Google Android Sensors Guide (2025) ma'lumotlariga ko'ra, akselerometr mobil ilovalarda eng ko'p ishlatiladigan sensordir. MEMS texnologiyasi sensorini 1 mm o'lchamdagi, 1 mVt dan kam energiya sarflaydigan chipga joylashtirish imkonini beradi.
Asosiy fikrlar
Akselerometr — bu uchta o'zaro perpendikulyar o'q: X (o'ngga yo'naltirilgan gorizontal), Y (yuqoriga yo'naltirilgan vertikal) va Z (ekran tekisligiga perpendikulyar) bo'ylab tezlanish proyeksiyasini o'lchaydigan mikroelektromexanik (MEMS) sensoridir. Tinch holatda akselerometr Z o'qi bo'ylab 9.8 m/s² qiymatini ko'rsatadi — bu Yer markaziga yo'naltirilgan tortishish tezlanishidir. Tizim ushbu qiymat asosida qurilmaning orientatsiyasini aniqlaydi: agar Z bo'ylab qiymat 0 ga, Y bo'ylab -9.8 m/s² ga yaqin bo'lsa, qurilma gorizontal aylantirilgan. Akselerometrning o'lchash diapazoni chip modeliga qarab odatda ±2g, ±4g, ±8g yoki ±16g ni tashkil qiladi.
Zamonaviy akselerometrlar bir nechta asosiy parametrlar bilan tavsiflanadi: sezgirlik (0.001 m/s² dan), tanlab olish chastotasi (1000 Hz gacha), o'lchash diapazoni va shovqin darajasi. Flagman qurilmalarda chastotasi 1600 Hz gacha va faol rejimda quvvat sarfi 0.5 mVt dan kam bo'lgan STMicroelectronics LSM6DSO yoki Bosch BMI270 sensorlari o'rnatiladi. Tanlab olish chastotasi qanchalik yuqori bo'lsa, ilova shunchalik batafsil signal oladi — o'yinlar uchun 200-400 Hz talab qilinadi, qadam sanash uchun 10-50 Hz yetarli. Sensor shovqini o'lchash aniqligiga ta'sir qiladi va odatda operatsion tizim darajasida past chastotali filtr bilan kompensatsiya qilinadi.
MEMS akselerometr ichki qismi kremniydan tayyorlangan mikroskopik strukturadan iborat: harakatlanuvchi massa (proof mass) qo'zg'almas elektrodlar orasidagi elastik to'sinlar (cantilevers) ga osilgan. Tezlanish paytida massa siljib, harakatlanuvchi va qo'zg'almas elementlar orasidagi sig'imni o'zgartiradi — bu o'zgarish o'lchanadi va elektr signaliga aylantiriladi. Yopiq qayta aloqa zanjiri (closed-loop) elektrostatik kuch yordamida massani markaziy holatda ushlab turadi, bu butun diapazonda o'lchashning chiziqliligini ta'minlaydi. Ochiq tizimlarda (open-loop) massa erkin harakatlanadi va hisob-kitoblar soddaroq, ammo aniqlik pastroq. STMicroelectronics (2025) ma'lumotlariga ko'ra, closed-loop akselerometrlar 0.1 mg/°C dan kam harorat drifti bilan 0.001g gacha aniqlikni ta'minlaydi.
Uch o'q akselerometrning fazodagi uch o'lchamga mos keladi: X (chap-o'ng egilish), Y (yuqori-past) va Z (ekranga nisbatan oldinga-orqaga). Qurilma ekrani yuqoriga qaragan holda stol ustida yotganda, tortishish tezlanish vektori Z o'qi bo'ylab pastga 9.8 m/s² qiymati bilan yo'naladi. Qurilma egilganda tortishish proyeksiyalari o'qlar o'rtasida taqsimlanadi — bu proyeksiyalar asosida egilish burchagini 0.1 daraja aniqlik bilan hisoblash mumkin. Tortishish ta'sirisiz harakatni aniqlash uchun yuqori chastotali filtr (high-pass filter) ishlatiladi, u tezlanishning dinamik komponentini (qurilmaning o'z harakati) statik komponentdan (tortishish kuchi) ajratadi.
Android da akselerometrga kirish SensorManager sinfi va SensorEventListener interfeysi orqali amalga oshiriladi. Ilova SENSOR_SERVICE tizim xizmatini oladi, TYPE_ACCELEROMETER sensorini so'raydi va yangilanish chastotasini ko'rsatgan holda tinglovchini ro'yxatdan o'tkazadi. Tizim har bir yangi o'lchashda qiymatlar massivi bilan onSensorChanged ni chaqiradi: values[0] = X, values[1] = Y, values[2] = Z. Quyida Kotlin tilida akselerometrdan ma'lumot o'qishning to'liq namunasi keltirilgan.
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]
// Egilish burchagini hisoblash
val pitch = Math.atan2(
x.toDouble(),
Math.sqrt(y.toDouble() * y + z.toDouble() * z)
)
// Interfeysni yangi burchak bilan yangilash
textViewAngle.text = "Nishablik: ${Math.toDegrees(pitch)}°"
}
override fun onAccuracyChanged(
sensor: Sensor, accuracy: Int
) { }
}
sensorManager.registerListener(
sensorEventListener,
accelerometer,
SensorManager.SENSOR_DELAY_GAME
)
Misolda SensorManager.SENSOR_DELAY_GAME o'yinlar va interaktiv ilovalar uchun optimal bo'lgan ~50 Hz yangilanish chastotasini o'rnatadi. Qadam sanash uchun SENSOR_DELAY_NORMAL (~5 Hz), aniq o'lchashlar uchun SENSOR_DELAY_FASTEST (~200 Hz) dan foydalaning. onSensorChanged da event.values massivi sensorning joriy ko'rsatkichlarini o'z ichiga oladi. X, Y, Z qiymatlari asosida atan2 yordamida egilish burchagi (pitch) hisoblanadi — bu orientatsiya sensoridan foydalanmasdan qurilma orientatsiyasini aniqlashning asosiy formulasidir. Batareyani tejash uchun onPause da tinglovchi ro'yxatdan o'tkazilishini bekor qilishni unutmang.
private val alpha = 0.8f
private val gravity = FloatArray(3)
private val linearAcceleration = FloatArray(3)
override fun onSensorChanged(event: SensorEvent) {
// Past chastotali filtr (LPF) tortishishni ajratish uchun
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]
// Tortishishni ayirish — chiziqli tezlanishni olamiz
linearAcceleration[0] = event.values[0] - gravity[0]
linearAcceleration[1] = event.values[1] - gravity[1]
linearAcceleration[2] = event.values[2] - gravity[2]
}
Alpha koeffitsienti bilan past chastotali filtr tortishish komponentini (statik vektor) ajratadi, uni ayirish qurilmaning sof tezlanishini (chiziqli tezlanish) beradi. Bu orientatsiyani hisobga olmagan holda harakatni aniqlash uchun zarur — masalan, qadam, silkinish yoki zarbani aniqlash uchun. Alpha qiymati 0.8 filtr yangi signalning ~20% ini o'tkazib, oldingisining 80% ini saqlashini anglatadi — bu sezilarli kechikishsiz shovqinni tekislash uchun yetarli.
iOS da akselerometrga kirish Core Motion frameworki orqali CMMotionManager sinfi tomonidan ta'minlanadi. Ilova menejerning nusxasini yaratadi va startAccelerometerUpdates ni navbat va handlerni ko'rsatgan holda chaqiradi. Ma'lumotlar x, y va z maydonlariga ega CMAcceleration strukturasini o'z ichiga olgan CMAccelerometerData shaklida qaytariladi. Quyida Swift tilida shovqin filtrlash bilan akselerometrdan ma'lumot olish namunasi keltirilgan.
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 dagi qiymatlar (1 g = 9.8 m/s²)
let magnitude = sqrt(
acceleration.x * acceleration.x +
acceleration.y * acceleration.y +
acceleration.z * acceleration.z
)
// Agar magnitude > 2.5 g bo'lsa — silkinish aniqlandi
if magnitude > 2.5 {
DispatchQueue.main.async {
self.handleShake()
}
}
}
Misolda accelerometerUpdateInterval 1/60 s (~60 Hz) ga o'rnatilgan — silliq animatsiya va o'yinlar uchun optimal. isAccelerometerAvailable metodi qurilmada sensor mavjudligini tekshiradi. Tezlanish qiymatlari g birliklarida qaytariladi (1 g = 9.8 m/s²). Magnitude vektori uch komponentning Evklid normasi sifatida hisoblanadi — agar qiymat 2.5 g dan oshsa, bu qurilmaning silkinishi (shake) sifatida talqin qilinadi. Yangilanishlarni to'xtatish uchun ekrandan chiqishda albatta stopAccelerometerUpdates chaqirilishi kerak.
Akselerometr mobil ilovalarning keng spektrida qo'llaniladi. Eng aniq stsenariy — ekranning avtomatik aylanishi: tizim akselerometr ma'lumotlari asosida portret va landshaft orientatsiyasini almashtiradi. O'yinlarda akselerometr boshqaruv vositasi sifatida xizmat qiladi — qurilmani egish rulni aylantiradi yoki personajni harakatlantiradi. Fitness ilovalari yurish paytida tezlanishning xarakterli cho'qqilari asosida qadamlarni hisoblaydi. Quyida odatiy stsenariylar va sensor talablari bilan jadval keltirilgan.
| Stsenariy | Chastota (Hz) | Aniqlik | Filtrlash |
|---|---|---|---|
| Ekranning avtomatik aylanishi | 5-10 | Past | LPF |
| Qadam sanash | 20-50 | O'rta | HPF + cho'qqi detektori |
| O'yinlar (poyga) | 50-200 | Yuqori | Kalibrlash + LPF |
| Kamera barqarorlashtirish | 200-1000 | Maksimal | Komplementar filtr |
| Ishora aniqlash | 50-100 | O'rta | HPF + chegara detektori |
Akselerometr ni tatbiq qilishda qurilmaning qizishi va sensorning eskirishi ko'rsatkichlarning aniqligiga ta'sir qilishi mumkinligini hisobga olish kerak. Kritik o'lchashlar uchun (video barqarorlashtirish, kompas) sensor integratsiyasi (sensor fusion) doirasida qo'shimcha ravishda giroskop va magnitometrdan foydalanish tavsiya etiladi.
Akselerometrlar bir necha turdagi xatolarga duchor bo'ladi: nol siljishi (bias) — sensor tinch holatda noldan farqli qiymat ko'rsatganda; masshtab koeffitsienti xatosi (scale factor error) — turli o'qlar bo'ylab sezgirlik farq qilganda; va o'lchash shovqini (noise) — bitta o'lchash aniqligini pasaytiradi. Ishlab chiqarishda MEMS sensorlari kalibrlanadi, ammo vaqt o'tishi bilan parametrlar harorat va mexanik yuklanishlar tufayli o'zgarishi mumkin. Ilovada tuzatish uchun oddiy kalibrlash amalga oshirilishi mumkin: tinch holatda o'rtacha qiymatni (siljish) yozib oling va uni barcha keyingi o'lchashlardan ayiring. Aniqroq kalibrlash qurilmani barcha o'qlar atrofida aylantirishni talab qiladi — bu usul olti nuqtali kalibrlash (six-point calibration) deb ataladi va 0.5% dan kam xato beradi.
Tez-tez so'raladigan savollar
Akselerometr smartfonda — uch o'q bo'ylab tezlanishni o'lchaydigan, taxminan 1 mm o'lchamdagi MEMS sensoridir. Qurilmaning orientatsiyasini (portret yoki landshaft), silkinishni, qadamlarni va harakatni tashqi manbalarsiz aniqlaydi.
Akselerometr chiziqli tezlanishni (tortishishni o'z ichiga olgan holda), giroskop esa burchak tezligini (aylanishni) o'lchaydi. Akselerometr orientatsiyani, giroskop aylanishni aniqlaydi. Birgalikda ular fazoda harakatning aniq kuzatilishini ta'minlaydi (sensor fusion).
SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) yordamida sensor oling, so'ngra registerListener ni SensorEventListener bilan ro'yxatdan o'tkazing. onSensorChanged da event.values massivi X, Y, Z qiymatlarini m/s² da o'z ichiga oladi. onPause da ro'yxatdan o'tkazishni bekor qilishni unutmang.
Magnitude = sqrt(x² + y² + z²) hisoblang. Agar magnitude 2-3 g dan oshsa (tortishish filtrlashidan keyin), qurilma silkitilgan. iOS uchun CMMotionManager dan 2.5 g chegarasi bilan, Android uchun Sensor.TYPE_LINEAR_ACCELERATION dan 15 m/s² chegarasi bilan foydalaning.
Ha, oddiy kalibrlash uchun qurilmani tekis yuzaga qo'ying, har bir o'q bo'ylab 2-3 soniya davomida o'rtacha ko'rsatkichlarni yozib oling va bu qiymatlarni barcha keyingi o'lchashlardan ayiring. Bu nol siljishini (bias) kompensatsiya qiladi, ammo masshtab xatosini emas.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.