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, 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.
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.
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.
İ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ç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.
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.
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ç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.
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.
İ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.
| Senaryo | Frekans (Hz) | Doğruluk | Filtreleme |
|---|---|---|---|
| Otomatik ekran döndürme | 5–10 | Düşük | LPF |
| Adım sayma | 20–50 | Orta | HPF + tepe dedektörü |
| Oyunlar (yarış) | 50–200 | Yüksek | Kalibrasyon + LPF |
| Kamera sabitleme | 200–1000 | Maksimum | Tamamlayıcı filtre |
| Jest tanıma | 50–100 | Orta | HPF + 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.
İ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
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 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.
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.
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.
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
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.
Ayrıca okuyun