Consulting Services
تدوينات مصغرةحساسات

معايرة الحساس المعناطيسي لاسلكياً باستخدام البلوتوث

تعد معايرة الحساس المعناطيسي خطوة أساسية لأي تطبيق يستخدم القراءات من الحساس المغناطيسي. إن الأداة المسماة MotionCal المطورة من قبل Paul Stoffregen تُعد أفضل المتاح لأدوات المعايرة الحاسوبية. يمكّن MotionCal من استعراض البيانات المستقبلة في البرنامج ويعرض معلومات إحصائية مثل: gap وfit error و variance .

لمزيد عن معايرة الحساس المغناطيسي، طالع المقالة: معايرة الحساس المغناطيسي من مسببات تشوه الحقل: لماذا وكيف

إن وصل الدارة سلكياً عبر اليو إس بي في كل معايرة غير عملي، وقد يكون مستحيلاً في بعض الحالات عند وضع الدارة بعلبة مغلقة أو عند التصنيع بكميات mass production، فلذلك قررت أن أعدل هذه الإجرائية في برنامج MotionCal  وأتيحها لاسلكياً عن طريق البلوتوث BLE.

خطوات استخدام هذا التعديل: 

المتطلبات المسبقة: 

1- جهز فيرموير جهازك بثلاث characteristic في service واحدة. Characteristic واحدة لمعطيات حساسي التسارع و الجايروسكوب و Characteristic لمعطيات الحساس المغناطيسي و Characteristic لاستقبال نتيجة المعايرة من الحاسب. وفرت في مستودع هذا التعديل فيرومور مثال يحوي ما تم ذكره. 

2- دارة NRF52 USB dongle مع مكتبة بايثون pc-ble-driver-py. يلزم تهيئة الدونغل للعمل بفيرموير connectivity firmware. أستخدم النسخة التالية: connectivity_4.1.4_usb_with_s132_5.1.0

3- نظام تشغيل لينكس/أوبونتو. من الممكن دعم نظام تشغيل ويندور مستقبلاً. 

الخطوات: 

1- تحميل مستودع التعديل

2- استخدام التعليمة التالية في التيرمينال لإنشاء المنافذ الافتراضية virtual ports.

sudo socat -d -d pty,link=/dev/ttyACM11,echo=0,perm=0777 pty,link=/dev/ttyACM10,echo=0,perm=0777

3- تحديد البورت ttyACM11 ضمن برنامج MotionCal.

4- تشغيل سكربت البايثون بعد وصل دونغل اليو إس بي NRF52 USB dongle. قم بتغيير ttyACM0 حسب اسم البورت المحدد للدونغل عندك. 

python3 nRF_dongle_imu_cal.py NRF52 /dev/ttyACM0

5- تشغيل نسخة البرنامج المعدلة المتوفرة في المستودع المعدَّل.

توضيح للاختلاف في برنامج MotionCal قبل وبعد التعديل. سكربت بايثون يستقبل البيانات من الحساسات لاسلكياً عبر البلوتوث ويعيد ارسالها عبر المنفذ الافتراضي داخلياً إلى البرنامج

كيف تم التعديل على البرنامج؟ 

يتوقع برنامج MotionCal رسائل على المنفذ التسلسلي بالصيغة التالية:

Raw:272,-304,16422,0,19,-3,-100,200,170

تتضمن الصيغة على ثلاث خانات الأولى لحساس التسارع والثلاثة التالية لحساس الجايروسكوب والأخيرة لحساس المغناطيسي. لا يقبل البرنامج وجود فاصلة منقوطة ولذلك يجب إرسالة قيم حساسي التسارع والجايرو من غير تحويل لقيمة فيزيائية وإنما باستخدام قيمة المسجلات الرقمية الداخلية مباشرة.

خطر لي وباستخدام المنفذ التسلسلي الافتراضي (تسمى أيضاً Psudo-tty) أن أحاكي ارسال هذه المعلومات للبرنامج ولكن بمساعدة سكربت بايثون يستقبل البيانات من الحساسات لاسلكياً عبر البلوتوث ويعيد ارسالها عبر المنفذ الافتراضي داخلياً إلى البرنامج وكأن دارة موصولة عبر المنفذ. 

أول مرحلة تجريبية كانت إنشاء المنافذ الافتراضية باستخدام التعليمة socat كما يلي:

sudo socat -d -d pty,link=/dev/ttyACM11,echo=0,perm=0777 pty,link=/dev/ttyACM10,echo=0,perm=0777

تُنشئ التعليمة منفذين افتراضيين، منفذ لإرسال ما يتم استقباله عبر البلوتوث باستخدام سكربت البايثون ومنفذ آخر سيستخدم في البرنامج لاستقبال قيم الحساسات. قبل كتابة السكربت أردت تجريب هذه الفكرة سريعاً ولذلك استخدمت minicom لفتح المنفذ الافتراضي لإرسال رسالة تجريبية للبرنامج والتأكد من استقبالها. 

minicom -b 115200 -o -D /dev/ttyACM10 

لم يعرض البرنامج ضمن المنافذ المتاحة المنفذين المنشأين. بفضل الكود مفتوح المصدر لـ MotionCal استقصيت عن السبب ووجدت أن البرنامج يفلتر المنافذ الافتراضية ولهذا قمت بتعديل صغير على مصدر البرنامج.

بسبب التعديل لابد من إعادة بناء البرنامج، ولبناء البرنامج نصبت wxwidgets وهي المكتبة المستخدمة لبناء الواجهة، ويمكن تنصيبها باستخدام الدليل الرسمي. استخدامت النسخة  wxwidget 3.0.2 وهي مطابقة للنسخة التي استخدمها المطور. ولبناء البرنامج قم بتنفيذ التعليمات التالية: 

mkdir gtk-build 
../configure --with-gtk=3 --with-opengl 
make -j3 sudo 
make install 
make clean 
sudo ldconfig

عُدِّل ملف Makefile (كما هو موجود في المستودع) تعديل بسيط لاستخدام نسخة الـ wxwidget المثبتة في النظام. 

كتبت سكربت البايثون باستخدام مكتبة pc-ble-driver-py المخصصة للتعامل مع الدونغل nRF USB dongle. اسم السكربت nRF_dongle_imu_cal.py وهو متاح في المستودع. اختيار دونغل خارجي للبلوتوث خيار يعطي أداء أفضل وقابلية للنقل portability.

إن الفيرموير اللازم في الدارة يحوي ثلاث مميزات characteristic ضمن نفس الخدمة BLE service. إن سكربت البايثون يتوقع الحصول على المعلومات على شكل مصفوفة من البايتات array of bytes.

 إن characteristic يحوي على معلومات حساسي التسارع والجايروسكوب بترتيب little-endian كما يلي: 

<B0..B1>Acc_x<B2..B3>acc_y<B4..B5>acc_z<B6..B7>gyro_x<B8..B9>gyro_y<B10..B11>gyro_z

 إن characteristic آخر يحوي على معلومات الحساس المغناطيسي بترتيب little-endian كما يلي: 

<B0..B1>mag_x<B2..B3>mag_y<B4..B5>mag_z

ويحوي الفيرموير characteristic أخير مخصص لاستقبال نتيجة المعاير، والتي تٌرسل من السكربت الذي يستقبلها من برنامج MotionCal بعد الضغط على زر Send Cal. يرسل السكربت النتائج بالشكل التالي: 

SoftI:S11,S12,S13,S21,S22,S23,S31,S32,S33
HardI:H1,H2,H3
شكل المميزات characteristic في الفيرموير المرجعي 

يتوفر في المستودع فيرموير مرجعي مكتوب لدارة أردوينو. 

Yahya Tawil

مؤسس عتاديات وأسعى لدعم المحتوى العربي عن النظم المضمنة في الويب العربي. خبرتي في مجال النظم المضمّنة تتركز في كتابة البرامج المضمنة وتصميم الدارات المطبوعة والمخططات وإنشاء المحتوى.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.

زر الذهاب إلى الأعلى