Accelerometern i mobila enheter är en MEMS-sensor som mäter linjär acceleration längs tre axlar för att bestämma enhetens orientering och rörelse. Enligt Google Android Sensors Guide (2025) är accelerometern den mest använda sensorn i mobila applikationer. MEMS-teknik gör det möjligt att placera sensorn i ett chip som är 1 mm stort och förbrukar mindre än 1 mW energi.
Huvudpunkter
Accelerometer är en mikroelektromekanisk (MEMS) sensor som mäter accelerationens projektion på tre inbördes vinkelräta axlar: X (horisontell, riktad åt höger), Y (vertikal, riktad uppåt) och Z (vinkelrät mot skärmens plan). I vila visar accelerometern värdet 9.8 m/s² på Z-axeln — detta är gravitationsaccelerationen riktad mot jordens centrum. Baserat på detta värde bestämmer systemet enhetens orientering: om värdet på Z är nära 0 och på Y är nära -9.8 m/s², är enheten roterad horisontellt. Accelerometerns mätområde är vanligtvis ±2g, ±4g, ±8g eller ±16g beroende på chipmodell.
Moderna accelerometrar kännetecknas av flera nyckelparametrar: känslighet (från 0.001 m/s²), samplingsfrekvens (upp till 1000 Hz), mätområde och brusnivå. I flaggskeppsenheter installeras sensorer från STMicroelectronics LSM6DSO eller Bosch BMI270 med frekvens upp till 1600 Hz och strömförbrukning under 0.5 mW i aktivt läge. Ju högre samplingsfrekvens, desto mer detaljerad signal får applikationen — för spel krävs 200-400 Hz, för stegräkning räcker 10-50 Hz. Sensorbrus påverkar mätnoggrannheten och kompenseras vanligtvis med ett lågpassfilter på operativsystemsnivå.
MEMS-accelerometern består invändigt av en mikroskopisk struktur av kisel: en rörlig massa (proof mass) är upphängd på elastiska balkar (cantilevers) mellan fasta elektroder. Vid acceleration förskjuts massan och ändrar kapacitansen mellan rörliga och fasta element — denna förändring mäts och omvandlas till en elektrisk signal. Kretsen med sluten återkoppling (closed-loop) håller massan i mittläget med hjälp av elektrostatisk kraft, vilket garanterar linjäritet över hela mätområdet. I öppna system (open-loop) rör sig massan fritt och beräkningarna är enklare, men noggrannheten är lägre. Enligt STMicroelectronics (2025) ger closed-loop-accelerometrar en noggrannhet på upp till 0.001g med termisk drift under 0.1 mg/°C.
Tre axlar hos accelerometern motsvarar rymdens tre dimensioner: X (vänster-höger lutning), Y (upp-ner) och Z (framåt-bakåt i förhållande till skärmen). När enheten ligger på bordet med skärmen uppåt, är gravitationsaccelerationsvektorn riktad längs Z-axeln nedåt med värdet 9.8 m/s². När enheten lutas omfördelas gravitationsprojektionerna mellan axlarna — baserat på dessa projektioner kan lutningsvinkeln beräknas med en noggrannhet på upp till 0.1 grad. För att bestämma rörelse utan påverkan av gravitation används ett högpassfilter (high-pass filter) som separerar accelerationens dynamiska komponent (enhetens egen rörelse) från den statiska komponenten (gravitationskraft).
På Android nås accelerometern via klassen SensorManager och gränssnittet SensorEventListener. Applikationen hämtar systemtjänsten SENSOR_SERVICE, begär sensorn TYPE_ACCELEROMETER och registrerar en lyssnare med angiven uppdateringsfrekvens. Systemet anropar onSensorChanged vid varje ny mätning med en värdeuppsättning: values[0] = X, values[1] = Y, values[2] = Z. Nedan finns ett fullständigt exempel på avläsning av data från accelerometern i 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]
// Beräkning av lutningsvinkel
val pitch = Math.atan2(
x.toDouble(),
Math.sqrt(y.toDouble() * y + z.toDouble() * z)
)
// Uppdatering av gränssnitt med ny vinkel
textViewAngle.text = "Lutning: ${Math.toDegrees(pitch)}°"
}
override fun onAccuracyChanged(
sensor: Sensor, accuracy: Int
) { }
}
sensorManager.registerListener(
sensorEventListener,
accelerometer,
SensorManager.SENSOR_DELAY_GAME
)
I exemplet ställer SensorManager.SENSOR_DELAY_GAME in uppdateringsfrekvensen till ~50 Hz, optimal för spel och interaktiva applikationer. För stegräkning använd SENSOR_DELAY_NORMAL (~5 Hz), för precis mätning — SENSOR_DELAY_FASTEST (~200 Hz). I onSensorChanged innehåller arrayen event.values sensorns aktuella avläsningar. Baserat på X-, Y-, Z-värdena beräknas lutningsvinkeln (pitch) med atan2 — detta är den grundläggande formeln för att bestämma enhetens orientering utan att använda en orienteringssensor. Glöm inte att avregistrera lyssnaren i onPause för att spara batteri.
private val alpha = 0.8f
private val gravity = FloatArray(3)
private val linearAcceleration = FloatArray(3)
override fun onSensorChanged(event: SensorEvent) {
// Lågpassfilter (LPF) för att separera gravitation
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]
// Subtraktion av gravitation — vi får linjär acceleration
linearAcceleration[0] = event.values[0] - gravity[0]
linearAcceleration[1] = event.values[1] - gravity[1]
linearAcceleration[2] = event.values[2] - gravity[2]
}
Lågpassfiltret med koefficienten alpha separerar gravitationskomponenten (statisk vektor), vars subtraktion ger enhetens rena acceleration (linjär acceleration). Detta är nödvändigt för att bestämma rörelse utan hänsyn till orientering — till exempel för detektering av steg, skakning eller stöt. Ett alpha-värde på 0.8 innebär att filtret släpper igenom ~20% av den nya signalen och behåller 80% av den föregående — tillräckligt för att jämna ut brus utan betydande fördröjning.
På iOS tillhandahålls åtkomst till accelerometern av ramverket Core Motion via klassen CMMotionManager. Applikationen skapar en instans av hanteraren och anropar startAccelerometerUpdates med angiven kö och hanterare. Data returneras som CMAccelerometerData som innehåller strukturen CMAcceleration med fälten x, y och z. Nedan finns ett exempel på att hämta data från accelerometern i Swift med brusfiltrering.
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 }
// Värden i g (1 g = 9.8 m/s²)
let magnitude = sqrt(
acceleration.x * acceleration.x +
acceleration.y * acceleration.y +
acceleration.z * acceleration.z
)
// Om magnitude > 2.5 g — skakning upptäckt
if magnitude > 2.5 {
DispatchQueue.main.async {
self.handleShake()
}
}
}
I exemplet är accelerometerUpdateInterval inställt på 1/60 s (~60 Hz) — optimalt för mjuk animering och spel. Metoden isAccelerometerAvailable kontrollerar om sensorn finns på enheten. Accelerationsvärden returneras i enheter av g (där 1 g = 9.8 m/s²). Vektorn magnitude beräknas som euklidisk norm av de tre komponenterna — om värdet överstiger 2.5 g tolkas detta som en skakning av enheten (shake). För att stoppa uppdateringar, anropa stopAccelerometerUpdates när du lämnar skärmen.
Accelerometern används inom ett brett spektrum av mobila applikationer. Det mest uppenbara scenariot är automatisk skärmrotation: systemet växlar mellan porträtt- och landskapsorientering baserat på accelerometerdata. I spel fungerar accelerometern som kontroll — lutning av enheten vrider ratten eller flyttar karaktären. Fitnessapplikationer räknar steg baserat på karakteristiska accelerationspikar vid gång. Nedan finns en tabell med typiska scenarier och sensorkrav.
| Scenario | Frekvens (Hz) | Noggrannhet | Filtrering |
|---|---|---|---|
| Automatisk skärmrotation | 5-10 | Låg | LPF |
| Stegräkning | 20-50 | Medel | HPF + toppdetektor |
| Spel (racing) | 50-200 | Hög | Kalibrering + LPF |
| Kamerastabilisering | 200-1000 | Maximal | Komplementärt filter |
| Gestigenkänning | 50-100 | Medel | HPF + tröskeldetektor |
Vid implementering av accelerometern måste man ta hänsyn till att uppvärmning av enheten och åldrande av sensorn kan påverka avläsningarnas noggrannhet. För kritiska mätningar (videostabilisering, kompass) rekommenderas ytterligare användning av gyroskop och magnetometer inom ramen för sensorintegration (sensor fusion).
Accelerometrar är utsatta för flera typer av fel: nollpunktsförskjutning (bias) — när sensorn visar ett värde som inte är noll i vila; skalfaktor fel (scale factor error) — när känsligheten på olika axlar skiljer sig; och mätbrus (noise), som minskar noggrannheten hos en enskild avläsning. Vid tillverkning kalibreras MEMS-sensorer, men med tiden kan parametrar driva på grund av temperatur och mekanisk belastning. För korrigering i applikationen kan en enkel kalibrering implementeras: i vila, registrera medelvärdet (förskjutningen) och subtrahera det från alla efterföljande mätningar. En mer noggrann kalibrering kräver rotation av enheten runt alla axlar — denna metod kallas sexpunktskalibrering (six-point calibration) och ger ett fel på mindre än 0.5%.
Vanliga frågor
Accelerometer i en smartphone är en MEMS-sensor på cirka 1 mm som mäter acceleration längs tre axlar. Den bestämmer enhetens orientering (porträtt eller landskap), skakning, steg och rörelse utan externa källor.
Accelerometern mäter linjär acceleration (inklusive gravitation), medan gyroskopet mäter vinkelhastighet (rotation). Accelerometern bestämmer orientering, gyroskopet bestämmer rotation. Tillsammans ger de exakt rörelsespårning i rymden (sensor fusion).
Använd SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) för att få sensorn, sedan registerListener med SensorEventListener. I onSensorChanged innehåller arrayen event.values X-, Y-, Z-värdena i m/s². Avregistrera i onPause.
Beräkna magnitude = sqrt(x² + y² + z²). Om magnitude överstiger 2-3 g (efter gravitationsfiltrering) har enheten skakats. För iOS använd CMMotionManager med tröskel 2.5 g, för Android — Sensor.TYPE_LINEAR_ACCELERATION med tröskel 15 m/s².
Ja, för en enkel kalibrering placera enheten på en plan yta, registrera genomsnittsavläsningarna för varje axel under 2-3 sekunder och subtrahera dessa värden från alla efterföljande mätningar. Detta kompenserar nollpunktsförskjutning (bias), men inte skalningsfelet.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också