شتابسنج در دستگاههای موبایل — یک سنسور MEMS است که شتاب خطی را در سه محور برای تعیین جهت و حرکت دستگاه اندازهگیری میکند. بر اساس Google Android Sensors Guide (2025)، شتابسنج پرکاربردترین سنسور در برنامههای موبایل است. فناوری MEMS امکان قرار دادن سنسور در تراشهای به اندازه ۱ میلیمتر با مصرف انرژی کمتر از ۱ میلیوات را فراهم میکند.
نکات اصلی
شتابسنج — یک سنسور میکروالکترومکانیکی (MEMS) است که برآیند شتاب را روی سه محور متقابل عمود اندازهگیری میکند: X (افقی، به سمت راست)، Y (عمودی، به سمت بالا) و Z (عمود بر صفحه نمایش). در حالت سکون، شتابسنج مقدار ۹.۸ m/s² را روی محور Z نشان میدهد — این شتاب گرانشی است که به سمت مرکز زمین جهت دارد. سیستم بر اساس این مقدار جهت دستگاه را تعیین میکند: اگر مقدار Z نزدیک به ۰ و Y نزدیک به ۹.۸- m/s² باشد، دستگاه به صورت افقی چرخیده است. محدوده اندازهگیری شتابسنج معمولاً بسته به مدل تراشه ±۲g، ±۴g، ±۸g یا ±۱۶g است.
شتابسنجهای مدرن با چند پارامتر کلیدی مشخص میشوند: حساسیت (از ۰.۰۰۱ m/s²)، نرخ نمونهبرداری (تا ۱۰۰۰ هرتز)، محدوده اندازهگیری و سطح نویز. در دستگاههای پرچمدار از سنسورهای STMicroelectronics LSM6DSO یا Bosch BMI270 با فرکانس تا ۱۶۰۰ هرتز و مصرف کمتر از ۰.۵ میلیوات در حالت فعال استفاده میشود. هرچه نرخ نمونهبرداری بالاتر باشد، سیگنال دقیقتری به برنامه میرسد — برای بازیها ۲۰۰-۴۰۰ هرتز و برای شمارش قدمها ۱۰-۵۰ هرتز کافی است. نویز سنسور بر دقت اندازهگیری تأثیر میگذارد و معمولاً با فیلتر پایینگذر در سطح سیستم عامل جبران میشود.
شتابسنج MEMS در داخل یک ساختار میکروسکوپی از سیلیکون است: جرم متحرک (proof mass) روی تیرهای الاستیک (cantilevers) بین الکترودهای ثابت معلق است. در هنگام شتاب، جرم جابجا شده و ظرفیت خازنی بین عناصر متحرک و ثابت تغییر میکند — این تغییر اندازهگیری شده و به سیگنال الکتریکی تبدیل میشود. مدار با حلقه بازخورد بسته (closed-loop) جرم را با نیروی الکترواستاتیک در موقعیت مرکزی نگه میدارد که خطی بودن اندازهگیری را در کل محدوده تضمین میکند. در سیستمهای باز (open-loop) جرم آزادانه حرکت میکند و محاسبات سادهتر است، اما دقت کمتر است. بر اساس دادههای STMicroelectronics (2025)، شتابسنجهای closed-loop دقت تا ۰.۰۰۱g را با رانش دمایی کمتر از ۰.۱ میلیگرم بر درجه سانتیگراد تضمین میکنند.
سه محور شتابسنج با سه بعد فضا مطابقت دارد: X (شیب چپ-راست)، Y (بالا-پایین) و Z (جلو-عقب نسبت به صفحه نمایش). وقتی دستگاه روی میز با صفحه نمایش رو به بالا قرار دارد، بردار شتاب گرانشی در امتداد محور Z به سمت پایین با مقدار ۹.۸ m/s² جهت میگیرد. هنگام کج شدن دستگاه، برآیندهای گرانش بین محورها توزیع میشوند — با استفاده از این برآیندها میتوان زاویه شیب را با دقت تا ۰.۱ درجه محاسبه کرد. برای تعیین حرکت بدون تأثیر گرانش از فیلتر بالاگذر (high-pass filter) استفاده میشود که مؤلفه دینامیکی شتاب (حرکت خود دستگاه) را از مؤلفه ایستا (نیروی گرانش) جدا میکند.
در 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 نرخ بهروزرسانی ~۵۰ هرتز را تعیین میکند که برای بازیها و برنامههای تعاملی بهینه است. برای شمارش قدمها از SENSOR_DELAY_NORMAL (~۵ هرتز) و برای اندازهگیریهای دقیق از SENSOR_DELAY_FASTEST (~۲۰۰ هرتز) استفاده کنید. در onSensorChanged آرایه event.values شامل مقادیر فعلی سنسور است. بر اساس مقادیر X، Y، Z زاویه شیب (pitch) با استفاده از 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 برابر ۰.۸ به این معنی است که فیلتر حدود ۲۰٪ سیگنال جدید را عبور میدهد و ۸۰٪ سیگنال قبلی را حفظ میکند — این برای هموارسازی نویز بدون تأخیر قابل توجه کافی است.
در iOS دسترسی به شتابسنج توسط فریمورک Core Motion از طریق کلاس CMMotionManager فراهم میشود. برنامه نمونهای از مدیر را ایجاد کرده و startAccelerometerUpdates را با تعیین صف و handler فراخوانی میکند. دادهها به صورت 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 روی ۱/۶۰ ثانیه (~۶۰ هرتز) تنظیم شده است — برای انیمیشن روان و بازیها بهینه است. متد isAccelerometerAvailable وجود سنسور در دستگاه را بررسی میکند. مقادیر شتاب بر حسب g بازگردانده میشوند (۱ g = ۹.۸ m/s²). بردار magnitude به عنوان نرم اقلیدسی سه مؤلفه محاسبه میشود — اگر مقدار از ۲.۵ g بیشتر شود، به عنوان لرزش دستگاه (shake) تفسیر میشود. برای توقف بهروزرسانیها هنگام خروج از صفحه حتماً stopAccelerometerUpdates فراخوانی شود.
شتابسنج در طیف گستردهای از برنامههای موبایل استفاده میشود. واضحترین سناریو — چرخش خودکار صفحه: سیستم بر اساس دادههای شتابسنج جهت عمودی و افقی را تغییر میدهد. در بازیها، شتابسنج به عنوان کنترلکننده عمل میکند — کج کردن دستگاه فرمان را میچرخاند یا شخصیت را حرکت میدهد. برنامههای تناسب اندام قدمها را بر اساس پیکهای مشخص شتاب در هنگام راه رفتن شمارش میکنند. در زیر جدولی با سناریوهای معمول و الزامات سنسور آورده شده است.
| سناریو | فرکانس (هرتز) | دقت | فیلتراسیون |
|---|---|---|---|
| چرخش خودکار صفحه | ۵-۱۰ | کم | LPF |
| شمارش قدمها | ۲۰-۵۰ | متوسط | HPF + تشخیص پیک |
| بازیها (مسابقه) | ۵۰-۲۰۰ | زیاد | کالیبراسیون + LPF |
| تثبیت دوربین | ۲۰۰-۱۰۰۰ | حداکثر | فیلتر مکمل |
| تشخیص حرکات | ۵۰-۱۰۰ | متوسط | HPF + تشخیص آستانه |
هنگام پیادهسازی شتابسنج باید در نظر گرفت که گرم شدن دستگاه و پیری سنسور میتوانند بر دقت خوانشها تأثیر بگذارند. برای اندازهگیریهای حیاتی (تثبیت ویدئو، قطبنما) توصیه میشود از ژیروسکوپ و مغناطیسسنج نیز در چارچوب ادغام سنسورها (sensor fusion) استفاده شود.
شتابسنجها در معرض چند نوع خطا هستند: بایاس (bias) — زمانی که سنسور در حالت سکون مقدار غیرصفر نشان میدهد؛ خطای ضریب مقیاس (scale factor error) — زمانی که حساسیت در محورهای مختلف متفاوت است؛ و نویز اندازهگیری (noise) که دقت یک خوانش را کاهش میدهد. سنسورهای MEMS در کارخانه کالیبره میشوند، اما با گذشت زمان پارامترها ممکن است به دلیل دما و بارهای مکانیکی دچار رانش شوند. برای تصحیح در برنامه میتوان کالیبراسیون سادهای پیادهسازی کرد: در حالت سکون مقدار میانگین (بایاس) را ثبت کرده و آن را از تمام اندازهگیریهای بعدی کم کنید. کالیبراسیون دقیقتر نیاز به چرخش دستگاه حول تمام محورها دارد — این روش کالیبراسیون شش نقطهای (six-point calibration) نام دارد و خطای کمتر از ۰.۵٪ میدهد.
سوالات متداول
شتابسنج در گوشی هوشمند — یک سنسور MEMS به اندازه حدود ۱ میلیمتر است که شتاب را در سه محور اندازهگیری میکند. جهت دستگاه (عمودی یا افقی)، لرزش، قدمها و حرکت را بدون استفاده از منابع خارجی تعیین میکند.
شتابسنج شتاب خطی (شامل گرانش) را اندازهگیری میکند، در حالی که ژیروسکوپ سرعت زاویهای (چرخش) را. شتابسنج جهت را تعیین میکند، ژیروسکوپ — چرخش را. با هم، آنها ردیابی دقیق حرکت در فضا را فراهم میکنند (sensor fusion).
از SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) برای دریافت سنسور استفاده کنید، سپس registerListener را با SensorEventListener ثبت کنید. در onSensorChanged آرایه event.values شامل مقادیر X، Y، Z بر حسب m/s² است. حتماً ثبت را در onPause لغو کنید.
Magnitude = sqrt(x² + y² + z²) را محاسبه کنید. اگر magnitude بیش از ۲-۳ g (پس از فیلتر گرانش) باشد، دستگاه تکان داده شده است. برای iOS از CMMotionManager با آستانه ۲.۵ g، برای Android از Sensor.TYPE_LINEAR_ACCELERATION با آستانه ۱۵ m/s² استفاده کنید.
بله، برای کالیبراسیون ساده دستگاه را روی سطح صاف قرار دهید، میانگین خوانشها را برای هر محور به مدت ۲-۳ ثانیه ثبت کرده و این مقادیر را از تمام اندازهگیریهای بعدی کم کنید. این کار بایاس (bias) را جبران میکند، اما خطای مقیاس را نه.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید