مقياس التسارع في الأجهزة المحمولة هو مستشعر MEMS يقيس التسارع الخطي على ثلاثة محاور لتحديد اتجاه الجهاز وحركته. وفقًا لـ دليل مستشعرات Android من Google (2025)، يعتبر مقياس التسارع أكثر المستشعرات استخدامًا في التطبيقات المحمولة. تسمح تقنية MEMS بوضع المستشعر في شريحة بحجم 1 مم تستهلك أقل من 1 ميلي وات من الطاقة.
النقاط الرئيسية
مقياس التسارع هو مستشعر كهروميكانيكي دقيق (MEMS) يقيس إسقاط التسارع على ثلاثة محاور متعامدة: X (أفقي، متجه لليمين)، Y (رأسي، متجه للأعلى) و Z (عمودي على سطح الشاشة). في حالة السكون، يظهر مقياس التسارع قيمة 9.8 متر/ثانية² على المحور Z — هذه هي تسارع الجاذبية الموجهة نحو مركز الأرض. بناءً على هذه القيمة، يحدد النظام اتجاه الجهاز: إذا كانت قيمة Z قريبة من 0 وقيمة Y قريبة من -9.8 متر/ثانية²، فإن الجهاز مدور أفقيًا. يتراوح نطاق قياس مقياس التسارع عادةً بين ±2g، ±4g، ±8g أو ±16g حسب طراز الشريحة.
تتميز مقاييس التسارع الحديثة بعدة معامل رئيسية: الحساسية (من 0.001 متر/ثانية²)، معدل أخذ العينات (حتى 1000 هرتز)، نطاق القياس ومستوى الضوضاء. تستخدم الأجهزة المتميزة مستشعرات STMicroelectronics LSM6DSO أو Bosch BMI270 بتردد يصل إلى 1600 هرتز واستهلاك أقل من 0.5 ميلي وات في الوضع النشط. كلما زاد معدل أخذ العينات، كلما كانت الإشارة التي يتلقاها التطبيق أكثر تفصيلًا — تتطلب الألعاب 200–400 هرتز، بينما يحتاج عد الخطوات 10–50 هرتز فقط. يؤثر ضوضاء المستشعر على دقة القياسات ويتم تعويضه عادةً بمرشح تمرير المنخفض على مستوى نظام التشغيل.
يتكون مقياس التسارع MEMS داخليًا من هيكل سيليكوني مجهري: كتلة اختبار معلقة على كابوليات مرنة بين أقطاب ثابتة. عند حدوث تسارع، تنزحرح الكتلة مُغيرة السعة بين العناصر المتحركة والثابتة — يتم قياس هذا التغير وتحويله إلى إشارة كهربائية. يحافظ دارة تغذية مرتدة مغلقة على الكتلة في وضع المركز باستخدام القوة الكهروستاتيكية، مما يضمن الخطية عبر النطاق كاملًا. في الأنظمة مفتوحة الحلقة، تتحرك الكتلة بحرية، مما يجعل الحسابات أبسط ولكن الدقة أقل. وفقًا لشركة STMicroelectronics (2025)، تحقق مقاييس التسارع مغلقة الحلقة دقة تصل إلى 0.001g مع انحراف حراري أقل من 0.1 مليغرام/°م.
تتوافق المحاور الثلاثة لمقياس التسارع مع ثلاثة أبعاد مكانية: X (إمالة يمنة-يسرة)، Y (أعلى-أسفل) و Z (أمام-خلف بالنسبة للشاشة). عندما يكون الجهاز موضوعًا على طاولة والشاشة للأعلى، يتجه متجه تسارع الجاذبية على المحور Z بقيمة 9.8 متر/ثانية². عند إمالة الجهاز، تتوزع إسقاطات الجاذبية بين المحاور — من هذه الإسقاطات يمكن حساب زاوية الإمالة بدقة تصل إلى 0.1 درجة. لكشف الحركة بدون تأثير الجاذبية، يتم استخدام مرشح تمرير عالي لفصل المركب الديناميكي للتسارع (حركة الجهاز نفسه) من المركب الثابت (الجاذبية).
في 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 هرتز، وهو الأمثل للألعاب والتطبيقات التفاعلية. لعد الخطوات، استخدم SENSOR_DELAY_NORMAL (~5 هرتز)؛ للقياسات الدقيقة، استخدم SENSOR_DELAY_FASTEST (~200 هرتز). في onSensorChanged، يحتوي مصفوف event.values على قراءات المستشعر الحالية. بناءً على قيم X، Y، Z، يتم حساب زاوية الإمالة باستخدام 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 متر/ثانية²)
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 ثانية (~60 هرتز) — وهو الأمثل للرسوم المتحركة السلسة والألعاب. يتحقق الملفوظ isAccelerometerAvailable من توافر المستشعر على الجهاز. تعاد قيم التسارع بوحدات g (حيث 1 g = 9.8 متر/ثانية²). يتم حساب متجه magnitude كقاعدة إيقليدية للمركبات الثلاثة — إذا تجاوزت القيمة 2.5 g، يتم تفسيرها كهز للجهاز. لإيقاف التحديثات، استدع دائمًا stopAccelerometerUpdates عند مغادرة الشاشة.
يستخدم مقياس التسارع في مجموعة واسعة من التطبيقات المحمولة. أكثر السيناريوهات وضوحًا هو التدوير التلقائي للشاشة: يبدل النظام بين الوضع العمودي والأفقي استنادًا إلى بيانات مقياس التسارع. في الألعاب، يعمل مقياس التسارع كمدخل تحكم — إمالة الجهاز تدير عجلة القيادة أو تحرك الشخصية. تقوم تطبيقات اللياقة البدنية بعد الخطوات بناءً على قمم التسارع المميزة أثناء المشي. أدناه جدول بالسيناريوهات النموذجية ومتطلبات المستشعر.
| السيناريو | التردد (هرتز) | الدقة | التصفية |
|---|---|---|---|
| التدوير التلقائي للشاشة | 5–10 | منخفضة | LPF |
| عد الخطوات | 20–50 | متوسطة | HPF + كاشف القمم |
| الألعاب (سباق) | 50–200 | عالية | المعايرة + LPF |
| تثبيت الكاميرا | 200–1000 | قصوى | مرشح تكاملي |
| تعرف الإيماءات | 50–100 | متوسطة | HPF + كاشف العتبة |
عند تطبيق مقياس التسارع، ضع في اعتبارك أن تسخين الجهاز وتقدم المستشعر يمكن أن يؤثرا على دقة القراءات. بالنسبة للقياسات الحرجة (ثبات الفيديو، البوصلة)، يوصى باستخدام الجيروسكوب ومقياس المغناطيسية أيضًا كجزء من دمج المستشعرات.
تتعرض مقاييس التسارع لعدة أنواع من الأخطاء: انحراف الصفر — عندما يظهر المستشعر قيمة غير صفرية في حالة السكون؛ خطأ عامل القياس — عندما تختلف الحساسية بين المحاور؛ وضوضاء القياس، مما يقلل دقة القراءة الواحدة. تتم معايرة مستشعرات MEMS أثناء التصنيع، ولكن بمرور الوقت قد تنحرف المعامل بسبب الحرارة والإجهاد الميكانيكي. للتعويض في التطبيق، يمكن تنفيذ معايرة بسيطة: في حالة السكون، سجل متوسط القيمة (الانحراف) واطرحه من جميع القياسات اللاحقة. تتطلب المعايرة الأكثر دقة تدوير الجهاز على جميع المحاور — يطلق على هذه الطريقة اسم معايرة ست نقاط وتحقق خطأ أقل من 0.5%.
الأسئلة الشائعة
مقياس التسارع في الهاتف الذكي هو مستشعر MEMS بحجم حوالي 1 مم يقيس التسارع على ثلاثة محاور. يحدد اتجاه الجهاز (عمودي أو أفقي)، والهز، والخطوات والحركة دون استخدام مصادر خارجية.
يقيس مقياس التسارع التسارع الخطي (بما في ذلك الجاذبية)، بينما يقيس الجيروسكوب السرعة الزاوية (الدوران). يحدد مقياس التسارع الاتجاه، ويكتشف الجيروسكوب الدوران. معًا، يوفران تتبعًا دقيقًا للحركة في الفضاء (دمج المستشعرات).
استخدم SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) للحصول على المستشعر، ثم registerListener مع SensorEventListener. في onSensorChanged، يحتوي مصفوف event.values على القيم X، Y، Z بوحدات متر/ثانية². ألغ التسجيل دائمًا في onPause.
احسب magnitude = sqrt(x² + y² + z²). إذا تجاوزت القيمة 2–3 g (بعد تصفية الجاذبية)، فقد تم هز الجهاز. في iOS، استخدم CMMotionManager بعتبة 2.5 g؛ في Android، استخدم Sensor.TYPE_LINEAR_ACCELERATION بعتبة 15 متر/ثانية².
نعم، للحصول على معايرة بسيطة ضع الجهاز على سطح مستوٍ، سجل متوسط القراءات لكل محور لمدة 2–3 ثانية، واطرح هذه القيم من جميع القياسات اللاحقة. يعوض ذلك انحراف الصفر ولكن لا يعوض خطأ القياس.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا