شتاب‌سنج در برنامه‌های موبایل: چیست، چگونه کار می‌کند و در کجا استفاده می‌شود

نویسنده: IT Sectr منتشر شده: 2026-03-22 زمان مطالعه: 9 دقیقه

شتاب‌سنج در دستگاه‌های موبایل — یک سنسور MEMS است که شتاب خطی را در سه محور برای تعیین جهت و حرکت دستگاه اندازه‌گیری می‌کند. بر اساس Google Android Sensors Guide (2025)، شتاب‌سنج پرکاربردترین سنسور در برنامه‌های موبایل است. فناوری MEMS امکان قرار دادن سنسور در تراشه‌ای به اندازه ۱ میلی‌متر با مصرف انرژی کمتر از ۱ میلی‌وات را فراهم می‌کند.

نکات اصلی

  • شتاب‌سنج — سنسور MEMS که شتاب را در محورهای X، Y و Z بر حسب m/s² یا g اندازه‌گیری می‌کند.
  • اصل کار بر اساس جابجایی جرم میکروسکوپی تحت تأثیر شتاب است که توسط سنسورهای خازنی ثبت می‌شود.
  • Android دسترسی را از طریق SensorManager و SensorEventListener فراهم می‌کند.
  • iOS از CoreMotion با CMMotionManager برای دریافت داده‌های شتاب‌سنج استفاده می‌کند.
  • کاربرد — تعیین جهت صفحه، شمارش قدم‌ها، بازی‌ها، تثبیت تصویر.

شتاب‌سنج چیست

شتاب‌سنج — یک سنسور میکروالکترومکانیکی (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

در 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 نرخ به‌روزرسانی ~۵۰ هرتز را تعیین می‌کند که برای بازی‌ها و برنامه‌های تعاملی بهینه است. برای شمارش قدم‌ها از SENSOR_DELAY_NORMAL (~۵ هرتز) و برای اندازه‌گیری‌های دقیق از SENSOR_DELAY_FASTEST (~۲۰۰ هرتز) استفاده کنید. در onSensorChanged آرایه event.values شامل مقادیر فعلی سنسور است. بر اساس مقادیر X، Y، Z زاویه شیب (pitch) با استفاده از 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 برابر ۰.۸ به این معنی است که فیلتر حدود ۲۰٪ سیگنال جدید را عبور می‌دهد و ۸۰٪ سیگنال قبلی را حفظ می‌کند — این برای هموارسازی نویز بدون تأخیر قابل توجه کافی است.

دریافت داده از شتاب‌سنج در iOS

در iOS دسترسی به شتاب‌سنج توسط فریمورک Core Motion از طریق کلاس CMMotionManager فراهم می‌شود. برنامه نمونه‌ای از مدیر را ایجاد کرده و startAccelerometerUpdates را با تعیین صف و handler فراخوانی می‌کند. داده‌ها به صورت 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 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).

چگونه داده‌های شتاب‌سنج را در Android دریافت کنیم؟

از 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) را جبران می‌کند، اما خطای مقیاس را نه.

خلاصه

  • شتاب‌سنج — سنسور MEMS اندازه‌گیری شتاب در محورهای X، Y، Z بر اساس جابجایی جرم میکروسکوپی.
  • اصل کار — MEMS خازنی با بازخورد closed-loop، دقت تا ۰.۰۰۱g.
  • Android SensorManager با TYPE_ACCELEROMETER و SensorEventListener را برای دسترسی به داده‌ها فراهم می‌کند.
  • iOS از Core Motion با CMMotionManager و startAccelerometerUpdates برای دریافت داده استفاده می‌کند.
  • فیلتراسیون — فیلتر پایین‌گذر برای گرانش و بالاگذر برای شتاب خطی.
  • کاربرد — چرخش خودکار صفحه، شمارش قدم‌ها، بازی‌ها، تثبیت و تشخیص حرکات.
  • توصیه — نرخ به‌روزرسانی را متناسب با سناریو انتخاب کنید: برای قدم‌ها ۲۰-۵۰ هرتز، برای بازی‌ها ۵۰-۲۰۰ هرتز، برای تثبیت ۲۰۰-۱۰۰۰ هرتز.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید