Το επιταχυνσιόμετρο στις κινητές συσκευές είναι ένας αισθητήρας MEMS που μετρά γραμμική επιτάχυνση σε τρεις άξονες για τον προσδιορισμό του προσανατολισμού και της κίνησης της συσκευής. Σύμφωνα με το Google Android Sensors Guide (2025), το επιταχυνσιόμετρο είναι ο πιο χρησιμοποιούμενος αισθητήρας σε κινητές εφαρμογές. Η τεχνολογία MEMS επιτρέπει την τοποθέτηση του αισθητήρα σε ένα τσιπ μεγέθους 1 mm, που καταναλώνει λιγότερο από 1 mW ενέργειας.
Κύρια σημεία
Επιταχυνσιόμετρο — είναι ένας μικροηλεκτρομηχανικός (MEMS) αισθητήρας που μετρά την προβολή της επιτάχυνσης σε τρεις αμοιβαία κάθετους άξονες: X (οριζόντιος, προς τα δεξιά), Y (κατακόρυφος, προς τα πάνω) και Z (κάθετος στο επίπεδο της οθόνης). Σε κατάσταση ηρεμίας, το επιταχυνσιόμετρο δείχνει τιμή 9.8 m/s² στον άξονα Z — αυτή είναι η επιτάχυνση της βαρύτητας προς το κέντρο της Γης. Με βάση αυτή την τιμή, το σύστημα καθορίζει τον προσανατολισμό της συσκευής: αν η τιμή στο Z είναι κοντά στο 0 και στο Y κοντά στο -9.8 m/s², η συσκευή είναι οριζόντια περιστραμμένη. Το εύρος μέτρησης του επιταχυνσιόμετρου είναι συνήθως ±2g, ±4g, ±8g ή ±16g ανάλογα με το μοντέλο του τσιπ.
Τα σύγχρονα επιταχυνσιόμετρα χαρακτηρίζονται από διάφορες βασικές παραμέτρους: ευαισθησία (από 0.001 m/s²), συχνότητα δειγματοληψίας (έως 1000 Hz), εύρος μέτρησης και επίπεδο θορύβου. Σε συσκευές ναυαρχίδες εγκαθίστανται αισθητήρες STMicroelectronics LSM6DSO ή Bosch BMI270 με συχνότητα έως 1600 Hz και κατανάλωση μικρότερη από 0.5 mW σε ενεργή λειτουργία. Όσο υψηλότερη είναι η συχνότητα δειγματοληψίας, τόσο πιο λεπτομερές σήμα λαμβάνει η εφαρμογή — για παιχνίδια απαιτείται 200-400 Hz, για μέτρηση βημάτων αρκεί 10-50 Hz. Ο θόρυβος του αισθητήρα επηρεάζει την ακρίβεια μέτρησης και συνήθως αντισταθμίζεται με χαμηλοπερατό φίλτρο σε επίπεδο λειτουργικού συστήματος.
Το επιταχυνσιόμετρο MEMS εσωτερικά αποτελεί μια μικροσκοπική δομή από πυρίτιο: μια κινητή μάζα (proof mass) αιωρείται σε ελαστικές δοκούς (cantilevers) μεταξύ σταθερών ηλεκτροδίων. Κατά την επιτάχυνση, η μάζα μετατοπίζεται, αλλάζοντας την χωρητικότητα μεταξύ κινητών και σταθερών στοιχείων — αυτή η αλλαγή μετράται και μετατρέπεται σε ηλεκτρικό σήμα. Το κύκλωμα κλειστού βρόχου ανάδρασης (closed-loop) διατηρεί τη μάζα στην κεντρική θέση με ηλεκτροστατική δύναμη, εξασφαλίζοντας γραμμικότητα μέτρησης σε ολόκληρο το εύρος. Σε ανοικτά συστήματα (open-loop) η μάζα κινείται ελεύθερα και οι υπολογισμοί είναι απλούστεροι, αλλά η ακρίβεια είναι χαμηλότερη. Σύμφωνα με στοιχεία της STMicroelectronics (2025), τα επιταχυνσιόμετρα closed-loop παρέχουν ακρίβεια έως 0.001g με θερμική μετατόπιση μικρότερη από 0.1 mg/°C.
Τρεις άξονες του επιταχυνσιόμετρου αντιστοιχούν στις τρεις διαστάσεις του χώρου: X (αριστερή-δεξιά κλίση), Y (πάνω-κάτω) και Z (μπροστά-πίσω σε σχέση με την οθόνη). Όταν η συσκευή βρίσκεται στο τραπέζι με την οθόνη προς τα πάνω, το διάνυσμα της βαρυτικής επιτάχυνσης κατευθύνεται κατά μήκος του άξονα Z προς τα κάτω με τιμή 9.8 m/s². Κατά την κλίση της συσκευής, οι προβολές της βαρύτητας ανακατανέμονται μεταξύ των αξόνων — βάσει αυτών των προβολών μπορεί να υπολογιστεί η γωνία κλίσης με ακρίβεια έως 0.1 μοίρας. Για τον προσδιορισμό κίνησης χωρίς την επίδραση της βαρύτητας χρησιμοποιείται υψιπερατό φίλτρο (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 ορίζει συχνότητα ενημέρωσης ~50 Hz, βέλτιστη για παιχνίδια και διαδραστικές εφαρμογές. Για μέτρηση βημάτων χρησιμοποιήστε SENSOR_DELAY_NORMAL (~5 Hz), για ακριβείς μετρήσεις — SENSOR_DELAY_FASTEST (~200 Hz). Στην 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 0.8 σημαίνει ότι το φίλτρο επιτρέπει τη διέλευση ~20% του νέου σήματος και διατηρεί το 80% του προηγούμενου — αρκετό για εξομάλυνση θορύβου χωρίς σημαντική καθυστέρηση.
Στο iOS, η πρόσβαση στο επιταχυνσιόμετρο παρέχεται από το πλαίσιο Core Motion μέσω της κλάσης CMMotionManager. Η εφαρμογή δημιουργεί ένα στιγμιότυπο του διαχειριστή και καλεί την startAccelerometerUpdates με καθορισμό ουράς και χειριστή. Τα δεδομένα επιστρέφονται ως 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 έχει οριστεί σε 1/60 s (~60 Hz) — βέλτιστο για ομαλή κίνηση και παιχνίδια. Η μέθοδος isAccelerometerAvailable ελέγχει την ύπαρξη αισθητήρα στη συσκευή. Οι τιμές επιτάχυνσης επιστρέφονται σε μονάδες g (όπου 1 g = 9.8 m/s²). Το διάνυσμα magnitude υπολογίζεται ως Ευκλείδεια νόρμα των τριών συνιστωσών — αν η τιμή υπερβαίνει τα 2.5 g, αυτό ερμηνεύεται ως κούνημα της συσκευής (shake). Για διακοπή ενημερώσεων καλέστε stopAccelerometerUpdates κατά την έξοδο από την οθόνη.
Το επιταχυνσιόμετρο χρησιμοποιείται σε ένα ευρύ φάσμα κινητών εφαρμογών. Το πιο προφανές σενάριο είναι η αυτόματη περιστροφή οθόνης: το σύστημα εναλλάσσει μεταξύ κατακόρυφου και οριζόντιου προσανατολισμού βάσει δεδομένων του επιταχυνσιόμετρου. Σε παιχνίδια, το επιταχυνσιόμετρο λειτουργεί ως χειριστήριο ελέγχου — η κλίση της συσκευής περιστρέφει το τιμόνι ή μετακινεί τον χαρακτήρα. Οι εφαρμογές γυμναστικής μετρούν βήματα βάσει χαρακτηριστικών κορυφών επιτάχυνσης κατά το περπάτημα. Παρακάτω δίνεται ένας πίνακας με τυπικά σενάρια και απαιτήσεις αισθητήρα.
| Σενάριο | Συχνότητα (Hz) | Ακρίβεια | Φιλτράρισμα |
|---|---|---|---|
| Αυτόματη περιστροφή οθόνης | 5-10 | Χαμηλή | LPF |
| Μέτρηση βημάτων | 20-50 | Μεσαία | HPF + ανιχνευτής κορυφών |
| Παιχνίδια (αγώνες) | 50-200 | Υψηλή | Βαθμονόμηση + LPF |
| Σταθεροποίηση κάμερας | 200-1000 | Μέγιστη | Συμπληρωματικό φίλτρο |
| Αναγνώριση χειρονομιών | 50-100 | Μεσαία | HPF + ανιχνευτής κατωφλίου |
Κατά την υλοποίηση του επιταχυνσιόμετρου πρέπει να λαμβάνεται υπόψη ότι η θέρμανση της συσκευής και η γήρανση του αισθητήρα μπορούν να επηρεάσουν την ακρίβεια των ενδείξεων. Για κρίσιμες μετρήσεις (σταθεροποίηση βίντεο, πυξίδα) συνιστάται η πρόσθετη χρήση γυροσκοπίου και μαγνητόμετρου στο πλαίσιο ολοκλήρωσης αισθητήρων (sensor fusion).
Τα επιταχυνσιόμετρα υπόκεινται σε διάφορους τύπους σφαλμάτων: μετατόπιση μηδενός (bias) — όταν ο αισθητήρας δείχνει μη μηδενική τιμή σε ηρεμία; σφάλμα συντελεστή κλίμακας (scale factor error) — όταν η ευαισθησία σε διαφορετικούς άξονες διαφέρει; και θόρυβος μέτρησης (noise), που μειώνει την ακρίβεια μιας μεμονωμένης ένδειξης. Κατά την παραγωγή, οι αισθητήρες MEMS βαθμονομούνται, αλλά με την πάροδο του χρόνου οι παράμετροι μπορεί να μετατοπιστούν λόγω θερμοκρασίας και μηχανικών καταπονήσεων. Για διόρθωση στην εφαρμογή μπορεί να υλοποιηθεί απλή βαθμονόμηση: σε κατάσταση ηρεμίας καταγράψτε τη μέση τιμή (μετατόπιση) και αφαιρέστε την από όλες τις επόμενες μετρήσεις. Ακριβέστερη βαθμονόμηση απαιτεί περιστροφή της συσκευής γύρω από όλους τους άξονες — αυτή η μέθοδος ονομάζεται βαθμονόμηση έξι σημείων (six-point calibration) και δίνει σφάλμα μικρότερο από 0.5%.
Συχνές ερωτήσεις
Επιταχυνσιόμετρο στο smartphone είναι ένας αισθητήρας MEMS μεγέθους περίπου 1 mm που μετρά επιτάχυνση σε τρεις άξονες. Καθορίζει τον προσανατολισμό της συσκευής (κατακόρυφο ή οριζόντιο), κούνημα, βήματα και κίνηση χωρίς χρήση εξωτερικών πηγών.
Το επιταχυνσιόμετρο μετρά γραμμική επιτάχυνση (συμπεριλαμβανομένης της βαρύτητας), ενώ το γυροσκόπιο μετρά γωνιακή ταχύτητα (περιστροφή). Το επιταχυνσιόμετρο καθορίζει τον προσανατολισμό, το γυροσκόπιο την περιστροφή. Μαζί παρέχουν ακριβή παρακολούθηση κίνησης στο χώρο (sensor fusion).
Χρησιμοποιήστε SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) για λήψη του αισθητήρα, στη συνέχεια registerListener με SensorEventListener. Στην onSensorChanged, ο πίνακας event.values περιέχει τιμές X, Y, Z σε m/s². Ακυρώστε την εγγραφή στο onPause.
Υπολογίστε το magnitude = sqrt(x² + y² + z²). Αν το magnitude υπερβαίνει τα 2-3 g (μετά από φιλτράρισμα βαρύτητας), η συσκευή κουνήθηκε. Για iOS χρησιμοποιήστε CMMotionManager με κατώφλι 2.5 g, για Android — Sensor.TYPE_LINEAR_ACCELERATION με κατώφλι 15 m/s².
Ναι, για απλή βαθμονόμηση τοποθετήστε τη συσκευή σε επίπεδη επιφάνεια, καταγράψτε τις μέσες ενδείξεις για κάθε άξονα για 2-3 δευτερόλεπτα και αφαιρέστε αυτές τις τιμές από όλες τις επόμενες μετρήσεις. Αυτό αντισταθμίζει τη μετατόπιση μηδενός (bias), αλλά όχι το σφάλμα κλίμακας.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης