معايرة الحساس المعناطيسي لاسلكياً باستخدام البلوتوث
تعد معايرة الحساس المعناطيسي خطوة أساسية لأي تطبيق يستخدم القراءات من الحساس المغناطيسي. إن الأداة المسماة 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 رسائل على المنفذ التسلسلي بالصيغة التالية:
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
يتوفر في المستودع فيرموير مرجعي مكتوب لدارة أردوينو.