Mobil uygulamalarda ivmeölçer: nedir, nasıl çalışır ve nerede kullanılır

Yazar: IT Sectr Yayınlanma: 2026-03-22 Okuma süresi: 9 dk

Mobil cihazlardaki ivmeölçer, cihazın yönelimini ve hareketini belirlemek için üç eksen boyunca doğrusal ivmeyi ölçen bir MEMS sensörüdür. Google Android Sensör Kılavuzu’na (2025) göre, ivmeölçer mobil uygulamalarda en yaygın kullanılan sensördür. MEMS teknolojisi, sensörün 1 mm’lik bir çipe yerleştirilmesine ve 1 mW’tan az güç tüketmesine olanak tanır.

Önemli noktalar

  • İvmeölçer — X, Y ve Z eksenlerinde ivmeyi m/s² veya g cinsinden ölçen MEMS sensörü.
  • Çalışma prensibi, kapasitif sensörler tarafından algılanan ivme altında mikroskobik bir kütlenin yer değiştirmesine dayanır.
  • Android, SensorManager ve SensorEventListener aracılığıyla erişim sağlar.
  • iOS, ivmeölçer verilerini almak için CMMotionManager ile CoreMotion’u kullanır.
  • Uygulamalar — ekran yönlendirmesi algılama, adım sayma, oyunlar, görüntü sabitleme.

İvmeölçer nedir

İvmeölçer, ivmenin birbirine dik üç eksen üzerindeki izdüşümünü ölçen bir mikroelektromekanik (MEMS) sensördür: X (yatay, sağa doğru), Y (dikey, yukarı doğru) ve Z (ekran düzlemine dik). Hareketsiz durumda, ivmeölçer Z ekseninde 9,8 m/s² gösterir — bu, Dünya’nın merkezine doğru yönelen yerçekimi ivmesidir. Sistem, bu değere göre cihazın yönelimini belirler: Z değeri 0’a yakın ve Y değeri -9,8 m/s²’ye yakınsa, cihaz yatay olarak döndürülmüştür. İvmeölçerin ölçüm aralığı, çip modeline bağlı olarak tipik olarak ±2g, ±4g, ±8g veya ±16g’dir.

İvmeölçerin fiziksel parametreleri

Modern ivmeölçerler birkaç temel parametreyle karakterize edilir: hassasiyet (0,001 m/s²’den itibaren), örnekleme hızı (1000 Hz’e kadar), ölçüm aralığı ve gürültü seviyesi. Amiral gemisi cihazlar, 1600 Hz’e kadar frekansa ve aktif modda 0,5 mW’tan az güç tüketimine sahip STMicroelectronics LSM6DSO veya Bosch BMI270 sensörlerini kullanır. Örnekleme hızı ne kadar yüksekse, uygulamanın aldığı sinyal o kadar ayrıntılı olur — oyunlar 200–400 Hz gerektirirken, adım sayma için 10–50 Hz yeterlidir. Sensör gürültüsü ölçüm doğruluğunu etkiler ve genellikle işletim sistemi düzeyinde bir düşük geçiş filtresiyle telafi edilir.

İvmeölçerin çalışma prensibi

Bir MEMS ivmeölçer, içten içe silikondan oluşan mikroskobik bir yapıdan oluşur: sabit elektrotlar arasında elastik kirişler üzerinde asılı duran bir test kütlesi. İvme oluştuğunda, kütle yer değiştirir ve hareketli ile sabit elemanlar arasındaki kapasitansı değiştirir — bu değişim ölçülür ve bir elektrik sinyaline dönüştürülür. Kapalı döngü geri bildirim devresi, elektrostatik kuvvet kullanarak kütleyi merkez konumunda tutar ve tüm aralıkta doğrusallığı sağlar. Açık döngü sistemlerde kütle serbestçe hareket eder, hesaplamalar daha basittir ancak doğruluk daha düşüktür. STMicroelectronics’e (2025) göre, kapalı döngü ivmeölçerler, 0,1 mg/°C’nin altında sıcaklık kaymasıyla 0,001g’ye kadar doğruluğa ulaşır.

Ölçüm eksenleri

İvmeölçerin üç ekseni, üç uzamsal boyuta karşılık gelir: X (sol-sağ eğim), Y (yukarı-aşağı) ve Z (ekrana göre ileri-geri). Cihaz ekranı yukarı bakacak şekilde bir masaya konulduğunda, yerçekimi ivme vektörü Z ekseni boyunca 9,8 m/s²’de yönelir. Cihaz eğildiğinde, yerçekimi izdüşümleri eksenler arasında yeniden dağılır — bu izdüşümlerden eğim açısı 0,1 dereceye kadar doğrulukla hesaplanabilir. Yerçekiminin etkisi olmadan hareketi algılamak için, ivmenin dinamik bileşenini (cihazın kendi hareketi) statik bileşenden (yerçekimi) ayırmak üzere bir yüksek geçiş filtresi kullanılır.

Android’de ivmeölçer verilerini alma

Android’de ivmeölçere erişim, SensorManager sınıfı ve SensorEventListener arayüzü aracılığıyla sağlanır. Uygulama, SENSOR_SERVICE sistem hizmetini alır, TYPE_ACCELEROMETER sensörünü talep eder ve belirtilen bir güncelleme hızında bir dinleyici kaydeder. Sistem, her yeni ölçümde bir değer dizisiyle onSensorChanged’ı çağırır: values[0] = X, values[1] = Y, values[2] = Z. Aşağıda, Kotlin’de ivmeölçer verilerini okumaya yönelik tam bir örnek verilmiştir.

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]

        // Eğim açısını hesaplama
        val pitch = Math.atan2(
            x.toDouble(),
            Math.sqrt(y.toDouble() * y + z.toDouble() * z)
        )
        // Kullanıcı arayüzünü yeni açıyla güncelleme
        textViewAngle.text = "Eğim: ${Math.toDegrees(pitch)}°"
    }

    override fun onAccuracyChanged(
        sensor: Sensor, accuracy: Int
    ) { }
}

sensorManager.registerListener(
    sensorEventListener,
    accelerometer,
    SensorManager.SENSOR_DELAY_GAME
)

Örnekte, SensorManager.SENSOR_DELAY_GAME güncelleme hızını ~50 Hz’e ayarlar; bu, oyunlar ve etkileşimli uygulamalar için idealdir. Adım sayma için SENSOR_DELAY_NORMAL (~5 Hz); hassas ölçümler için SENSOR_DELAY_FASTEST (~200 Hz) kullanın. onSensorChanged’da event.values dizisi geçerli sensör okumalarını içerir. X, Y, Z değerlerine göre eğim açısı atan2 kullanılarak hesaplanır — bu, yön sensörünü kullanmadan cihaz yönelimini belirlemek için temel formültür. Pil tasarrufu için onPause’da dinleyici kaydını iptal etmeyi unutmayın.

Gürültü filtreleme

kotlin
private val alpha = 0.8f
private val gravity = FloatArray(3)
private val linearAcceleration = FloatArray(3)

override fun onSensorChanged(event: SensorEvent) {
    // Yerçekimini çıkarmak için düşük geçiş filtresi (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]

    // Yerçekimini çıkarma — doğrusal ivmeyi elde etme
    linearAcceleration[0] = event.values[0] - gravity[0]
    linearAcceleration[1] = event.values[1] - gravity[1]
    linearAcceleration[2] = event.values[2] - gravity[2]
}

Alpha katsayılı bir düşük geçiş filtresi, yerçekimi bileşenini (statik vektör) çıkarır; bunu çıkarmak, cihazın saf ivmesini (doğrusal ivme) verir. Bu, yönelimi dikkate almadan hareketi algılamak için gereklidir — örneğin, bir adım, sallanma veya darbe algılama. Alpha değeri 0,8, filtrenin yeni sinyalin yaklaşık %20’sini geçirdiği ve öncekinin %80’ini koruduğu anlamına gelir — önemli bir gecikme olmadan gürültüyü gidermek için yeterlidir.

iOS’ta ivmeölçer verilerini alma

iOS’ta ivmeölçere erişim, Core Motion framework’ü aracılığıyla CMMotionManager sınıfıyla sağlananır. Uygulama bir yönetici örneği oluşturur ve bir kuyruk ve işleyiciyle startAccelerometerUpdates’i çağırır. Veriler, x, y ve z alanlarına sahip bir CMAcceleration yapısını içeren CMAccelerometerData olarak döndürülür. Aşağıda, gürültü filtrelemeli Swift’te ivmeölçer verilerinin alınmasına ilişkin bir örnek verilmiştir.

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 cinsinden değerler (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 ise — sallanma algılandı
    if magnitude > 2.5 {
        DispatchQueue.main.async {
            self.handleShake()
        }
    }
}

Örnekte, accelerometerUpdateInterval 1/60 saniye (~60 Hz) olarak ayarlanır — akıcı animasyonlar ve oyunlar için idealdir. isAccelerometerAvailable metodu, sensörün cihazda mevcut olup olmadığını kontrol eder. İvme değerleri g birimleriyle döndürülür (1 g = 9,8 m/s²). magnitude vektörü, üç bileşenin Öklid normu olarak hesaplanır — değer 2,5 g’yi aşarsa, cihaz sallanması olarak yorumlanır. Güncellemeleri durdurmak için, ekrandan çıkarken her zaman stopAccelerometerUpdates’i çağırın.

Kullanım senaryoları

İvmeölçer, çok çeşitli mobil uygulamalarda kullanılır. En belirgin senaryo, otomatik ekran döndürmedir: sistem, ivmeölçer verilerine göre dikey ve yatay yönlendirme arasında geçiş yapar. Oyunlarda, ivmeölçer bir kontrol girişi görevi görür — cihazı eğmek direksiyonu döndürür veya karakteri hareket ettirir. Fitness uygulamaları, yürürken karakteristik ivme zirvelerine dayanarak adımları sayar. Aşağıda tipik senaryolar ve sensör gereksinimlerinin bir tablosu bulunmaktadır.

SenaryoFrekans (Hz)DoğrulukFiltreleme
Otomatik ekran döndürme5–10DüşükLPF
Adım sayma20–50OrtaHPF + tepe dedektörü
Oyunlar (yarış)50–200YüksekKalibrasyon + LPF
Kamera sabitleme200–1000MaksimumTamamlayıcı filtre
Jest tanıma50–100OrtaHPF + eşik dedektörü

Bir ivmeölçer uygularken, cihazın ısınmasının ve sensör yaşlanmasının okuma doğruluğunu etkileyebileceğini unutmayın. Kritik ölçümler (video sabitleme, pusula) için, sensör birleştirmenin bir parçası olarak jiroskop ve manyetometrenin de kullanılması önerilir.

Kalibrasyon ve hatalar

İvmeölçerler birkaç tür hataya maruz kalır: sıfır sapması (bias) — sensörün hareketsiz durumda sıfır olmayan bir değer göstermesi; ölçek faktörü hatası — hassasiyetin eksenler arasında farklılık göstermesi; ve tek bir okumanın doğruluğunu azaltan ölçüm gürültüsü. MEMS sensörler üretim sırasında kalibre edilir, ancak zamanla parametreler sıcaklık ve mekanik stres nedeniyle kayabilir. Uygulamada telafi için basit bir kalibrasyon uygulanabilir: hareketsiz durumda, ortalama değeri (sapma) kaydedin ve sonraki tüm ölçümlerden çıkarın. Daha hassas kalibrasyon, cihazın tüm eksenlerde döndürülmesini gerektirir — bu yönteme altı nokta kalibrasyonu denir ve %0,5’in altında hata elde eder.

Sıkça sorulan sorular

Telefondaki ivmeölçer nedir?

Akıllı telefondaki ivmeölçer, yaklaşık 1 mm boyutunda, üç eksende ivmeyi ölçen bir MEMS sensörüdür. Harici kaynaklar kullanmadan cihazın yönelimini (dikey veya yatay), sallanmayı, adımları ve hareketi belirler.

İvmeölçer ile jiroskop arasındaki fark nedir?

İvmeölçer doğrusal ivmeyi (yerçekimi dahil) ölçerken, jiroskop açısal hızı (dönüş) ölçer. İvmeölçer yönelimi belirler; jiroskop dönüşü algılar. Birlikte, uzayda hassas hareket takibi (sensör birleştirme) sağlarlar.

Android’de ivmeölçer verileri nasıl alınır?

Sensörü almak için SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) kullanın, ardından bir SensorEventListener ile registerListener yapın. onSensorChanged’da event.values dizisi X, Y, Z değerlerini m/s² cinsinden içerir. onPause’da kaydı her zaman iptal edin.

Cihaz sallanması nasıl algılanır?

magnitude = sqrt(x² + y² + z²) hesaplayın. Değer 2–3 g’yi (yerçekimi filtrelemesinden sonra) aşarsa, cihaz sallanmıştır. iOS’ta 2,5 g eşiğiyle CMMotionManager kullanın; Android’te 15 m/s² eşiğiyle Sensor.TYPE_LINEAR_ACCELERATION kullanın.

İvmeölçer yazılımsal olarak kalibre edilebilir mi?

Evet, basit bir kalibrasyon için cihazı düz bir yüzeye koyun, 2–3 saniye boyunca her eksenin ortalama okumalarını kaydedin ve bu değerleri sonraki tüm ölçümlerden çıkarın. Bu, sıfır sapmasını telafi eder ancak ölçek hatasını telafi etmez.

Özet

  • İvmeölçer — X, Y, Z eksenlerinde ivmeyi ölçen MEMS sensörü, mikroskobik kütle yer değiştirmesine dayanır.
  • Çalışma prensibi — kapalı döngü geri bildirimli kapasitif MEMS, 0,001g’ye kadar doğruluk.
  • Android, veri erişimi için TYPE_ACCELEROMETER ve SensorEventListener ile SensorManager sağlar.
  • iOS, veri almak için CMMotionManager ve startAccelerometerUpdates ile Core Motion kullanır.
  • Filtreleme — yerçekimi için düşük geçiş, doğrusal ivme için yüksek geçiş.
  • Uygulamalar — otomatik ekran döndürme, adım sayma, oyunlar, sabitleme ve jest tanıma.
  • Öneri — senaryoya göre güncelleme hızını seçin: adımlar için 20–50 Hz, oyunlar için 50–200 Hz, sabitleme için 200–1000 Hz.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun