يُعتبَر بناء روبوت التوازن التلقائيّ تحدّياً كبيراً، حيث يتطلَّب التعاملَ مع العديد من الخيارات قبل البدء بعملية البناء بدءاً من اختيار المحرِّكات وحتى ضبط قِيم الـ PID Controller، مع وجود أمور أخرى يجب أن تُؤخَذَ بعين الاعتبار كنوع البطارية وموضِعِها والعجلات ونوع دارة قيادة المحرّك والحفاظ على مركز الثّقل (GoG Centre of gravity) وغير ذلك من الأمور المُهمّة، ولكن عند الانتهاء من بناء الروبوت ستكتشف أنّ الأمر لم يكن صعباً كما هو متوقَّع على الرغم ممّا سبق ذكره.
روبوت التوازن التلقائي
روبوت التوازن التلقائيّ

اختيار التجهيزات اللازمة لبناء الروبوت

1. أردوينو أونو.
2. محرِّكات تيار مستمر مع علبة تروس (Geared DC motors (Yellow colored) – 2Nos).
3. دارة قيادة محرّك (L298N).
4. حسّاس حركة (MPU6050).
5. زوج إطارات
6. بطارية ليثيوم 7.4 V.
7. أسلاك توصيل.
8. هيكل تمت طباعته بتقنية الطباعة الثلاثيّة الأبعاد.

المتحكِّم

سنستخدم هنا لوحة أردوينو أونو (Arduino UNO) وذلك لسهولة استخدامها، كما يمكنك استخدام أيّ لوحة أخرى أردوينو نانو (Arduino Nano) أو أردوينو ميني (Arduino mini)، ولكنّني أنصح باستخدام أردوينو أونو نظراً لإمكانيّة البرمجة بشكل مباشر دون استخدام تجهيزات خارجية.

المحرِّكات

يُعتبَر المحرِّك الخطويّ (Stepper motor) هو الخيار الأمثل للاستخدام، ولكن لجعل الأمر أبسط سنستخدم محرِّكاً مستمرّاً ذا علبة سرعة (DC gear motor)، وليس من الضروري استخدام المحرِّكات الخطويّة حيث يمكن استخدام المحرِّكات ذات اللون الأصفر المذكورة أعلاه.

دارات القيادة

عند اختيارك للمحرِّكات المستمرَّة ذات علبة السرعة (DC gear motors) يمكنك استخدام دارة القيادة (L298N driver) أو يمكنك استخدام (L293D Driver).

الإطارات

للوهلة الأولى قد يظنّ البعض أنّ الإطاراتِ ليست بالأمر المهمّ وأيّ نوعٍ سيَفي بالغرض، ولكن التجربة أثبتت عكس ذلك، لذا تأكَّد من استخدامِك لعجلات تتميّز بتماسكٍ جيّدٍ على الأرضيّة.

التّسارع والدّوران (Accelerometer and Gyroscope)

يُعتبَر حسّاس الحركة (MPU6050) الاختبار الأمثل لتحسّس التّسارع والدّوران، وتجدر الإشارة هنا إلى أنّ حسّاس التّسارع (ADXL345) أو أيّ حسّاسٍ مشابه له لن يعملَ بشكل جيّد، وسنتعرف على السبب في نهاية المقال.

البطاريّة

نحتاج إلى بطارية خفيفة الوزن قدر الإمكان وبجهد تشغيل يزيد عن 5V لنتمكّنَ من تغذية الأردوينو بشكل مباشر دون استخدام دارة رفع جهد، وبذلك يكون الخيار الأمثل هو بطارية (7.4V Li-polymer battery)، يمكنك استخدام بطارية (7.4V Li-ion battery) ولكن تذكّر أنّ بطارياتِ (Li-po) أفضلُ من بطارياتِ (Li-ion).

الهيكل

يُعتبَر الهيكل أمرا مهماً لا يجب التساهل فيه، يمكنك استخدام هيكلٍ من الورق المقوّى أو الخشب أو البلاستيك، فقط تأكّد من متانة الهيكل وأنّه لا ينحني عند عمل الروبوت لتحقيق التّوازن، في هذه التجربة قمْت برسم الهيكل باستخدام برنامج Solidworks ومن ثم قمْت بطباعته باستخدام طابعة ثلاثية الأبعاد.

طباعة الهيكل وتجميع الروبوت

إذا قرّرْت استخدام الطباعة الثلاثيّة الأبعاد للهيكل، فإنّه يمكنك تحميل ملفّ الـ STL من خلال الرابط التالي: اضغط هنا

ويمكنك التعديل على التصميم وفقاً لتصميمِك الشخصيّ.
يجب عليك طباعة الهيكل الأساسيّ فقط إضافةً لأربعة أجزاء أخرى يتمّ تجميعُها باستخدام صواميل (nuts) وبراغي بقطر 3mm، وبعد التّجميع سيظهر الروبوت كما في الشكل

روبوت التوازن التلقائيّ بعد عملية التجميع
روبوت التوازن التلقائيّ بعد عملية التجميع

تمّ وَضع التصميم الفعليّ للروبوت بوجود دارة القيادة (L298N drive) في الأسفل ولوحة الأردوينو والبطارية في الأعلى
كما يُظهِر الشكل السابق.

مخطّط الدارة

إنّ توصيلات هذا الروبوت تُعتبَر بسيطة، حيث سنقوم بتوصيل حسّاس الحركة (MPU6050) إلى لوحة الأردوينو،
وتوصيل المحركاتِ إلى لوحة الأردوينو عن طريق دارة القيادة، ومن ثمّ تغذية لوحة الأردوينو من خلال البطارية (4.7V
Li-ion).

مخطّط توصيل الروبوت
مخطّط توصيل الروبوت

تتمّ تغذية لوحة الأردوينو ودارة القيادة المحرّكات (L298N) مباشرة من خلال الرِّجْل Vin و12V على التوالي، حيث سيقوم منظِّم الجهد الموجود على لوحة الأردوينو بتخفيض الدَّخْل من 7.4V إلى 5V وبذلك ستتمّ تغذية الدّارة المتكاملة (ATmega IC) وحسّاس الحركة (MPU6050)، أمّا بالنسبة للمحرّكات المستمرّة فهي تعمل على جهد يتراوح بين 5V و12V ولكنّنا سنقوم بتوصيل السلك الموجب 7.4V للبطاريّة مع الدَّخْل 12V لدارة القيادة هذا سيجعل المحرِّكات تعمل عن جهد 7.4V.
الجدول التالي يوضِّح كيفية توصيل حسّاس الحركة (MPU6050) ودارة القيادة (L298N) إلى لوحة الأردوينو:

– يتمّ توصيل حسّاس الحركة بالأردوينو عن طريق الواجهة I2C ولذلك نستخدم أرجل SPI والتي هي الأرجل A4 وA5 للأردوينو.

– يتمّ توصيل المحرِّكات المستمرَّة إلى أرجل تعديل عرض النبضة PWM والتي هي D6,D9,D10,D11، حيث نقوم بتوصيل المحرِّكات إلى أرجل تعديل عرض النبضة PWM لأنّنا سنقوم بالتّحكُّم بسرعة المحرّك المستمرّ من خلال تعديل دورة العمل لإشارة PWM.

برمجة الروبوت

يجب علينا اختبار ما إذا كان الروبوت يتمايل للأمام والخلف باستخدام حسّاس الحركة (MPU6050) ومن ثمّ عند التمايل يجب تدوير العجلاتِ بتوافق مع جهة التمايل.
وفي نفس الوقت يجب علينا التحكُّم بسرعة العجلات، بحيث إذا ابتعد الحسّاس عن الموضع المركزيّ فإنّ العجلات ستدور ببطء وتزداد السّرعة مع زياد البعد عن الوضع المركزيّ، لتحقيقِ هذا المنطق نستخدم خوارزميّة PID والتي تجعل من الموضع المركزيّ كنقطة مرجعيّة وتحدِّد مستويات التشويش.
لمعرفة الموضع الحالي للروبوت نستخدم حسّاس الحركة (MPU6050) والذي يحوي على حسّاس تسارع وحسّاس موضع بستة محاور مدمجين، وللحصول على قيم حقيقية للموضع من الحسّاس نحتاج للقيم من حسّاسي التّسارع والموضِع، وذلك لأنّ قيمَ حسّاس التّسارع لها مشاكلُ في التشويش وقيمَ حسّاس الموضع تميل إلى الانحراف مع الوقت، ولذلك نقوم بدمج القِيم من الحسّاسَين للحصول على قيمة حقيقيّة.
ولكي لا نخوض في تعقيدات الحسابات فيما يتعلّق بخوارزمية الPID سنستخدم مكتباتٍ جاهزةً مطوَّرةً من قبل br3ttb and jrowberg، والآن لم يتبقَ لدينا إلا البدء بكتابة الكود وسنقوم بشرح الأجزاء المهمّة منه تباعاً، من الجدير بالذكر أن الكود هو كود جاهز لحسّاس MPU6050 ولكن سنقوم بتعديله بما يقتضيه عمل الروبوت من إضافة خوارزمية PIDوتقنيات التحكُّم في روبوت التوازن.

أولاً:

نقوم بتضمين المكتبات اللازمة:
– مكتبة I2C.
– مكتبة PID.
– مكتبة الحسّاس (MPU6050).

الكود البرمجي 1: التحميل من هنا

ثانياً:

والآن سنحدِّد القِيم اللازم أخذُها من حسّاس MPU6050، هنا سنحتاج إلى شعاع الجاذبيّة وقيم الكواتيرنيون، ثمّ حساب قيم yaw pitch وroll وسنخزِّن النتيجة النهائيّة في مصفوفة من نوع float باسم array ypr[3].

الكود البرمجي 2: التحميل من هنا

ثالثاً:

معايرة القِيم المناسبة للروبوت: لفهم فكرة المعايرة سنعتبر مثلاً أنّ مركز ثقل الروبوت محدّدٌ بشكل دقيق والعناصر متناظرة بالنسبة للمحور، ستكون القِيم البدائيّة 180 ولكن في معظم الحالات لا يمكن الحصول على هذه المثاليّة في التصميم، لذلك بعد وصل الأردوينو إلى الكمبيوتر وفتح السيريال سنقوم بتحريك الروبوت لنصل إلى حالة توازن تقريبيّة، وأثناء ذلك نراقب القِيم على السيريال وتكون القيم المقابلة لحالة التّوازن هي قِيم الset point، و قِيم KpوKdوKi يجب أن تعيّر بناءً على وضع الروبوت المتوازن، ويجب الانتباه إلى أنّه لا يوجد روبوتا توازن لهما نفس القيم لذلك لا مفرّ من المعايرة!

الكود البرمجي 3: التحميل من هنا

رابعاً:

سنقوم بتهيئة خوارزميّةPID بالبارامترات الّلازمة والتي هي الدَّخْل والخَرْج ومجموعة القِيم و Kp,Ki,Kd، يهمّنا أن نعرف أنّ الدّخْل هو قيمة yaw التي نقرؤها من الحسّاس MPU6050، حيث أنّ الخَرْج يمثّل القيمة التي سيتمّ حسابها من قبل الخوارزميّة نفسِها، أي أنّ الخوارزميّة تستخدِم الخَرْج الذي تقوم بحسابه لتعديل قيمة الدَّخل ليصبح أقربَ ما يكون إلى set point.

الكود البرمجي 4: التحميل من هنا

خامساً:

بداخل دالة SETUP سنهيئ MPU6050 بتعريف الـDMP(Digital Motion Processor) الذي سيساعد على دمج معلومات الاكسيلوميتر ومعلومات الجايروسكوب وإعطائنا قيمة حقيقية ودقيقة لyaw وpitch وroll، أيضاً بداخل دالة الsetup سنعرف أرجل الديجتال بخاصيّة تعديل عرض النبضة، في حالة هذه الدّارة الأرجل هي 6و9و10و11 أي سنعرفها كمخارج ونسند لهم قيمة low بشكل مبدئيّ.

الكود البرمجي 5: التحميل من هنا

سادساً:

في دالة loop نقوم بالتحقُّق من عمل الحسّاس MPU6050 فإن كان يعمل بشكل صحيح سنحسب PID ثمّ نعرض قِيم input  output على السيريال للتأكُّد من أنّ الأمور تجري على ما يرام، وبعدها بناءً على قيمة الخَرْج سيحدّد إن كان الروبوت سيتقدّم للأمام أو يتراجع للخلف أو يبقى كما هو.
ونعلم فرضاً أنّ الحسّاس يُعطي قيمة 180 في حالة كان الروبوت واقفاً بشكل سليم، يؤدي ذلك إلى الحصول على قِيم موجبة عند المَيَلان للأمام وقِيم سالبة عند المَيَلان إلى الخلف، بمعنى آخر: نفحص حالة الشّرط الذي يواجهه الروبوت ثم نستدعي  التابع الملائم للعمل

الكود البرمجي 6: التحميل من هنا

بينما خرج الـPID سيحدّد سرعة حركة الدواليب، حيث إذا كان الروبوت على وشك السقوط تكون حركة الدواليب بطيئة لتقومَ بالتصحيح، فإن لم تنفع هذه التصحيحات الصغيرة ستزداد سرعة الدواليب، وبالنسبة للعملية المعاكسة أي السقوط إلى الخلف سنقوم بضرب قيمة الخَرْج بـ -1 وبالتالي ستُعكَس جميع قيم التصحيحات لتعملَ بالاتجاه المعاكس.

الكود البرمجي 7: التحميل من هنا

الروبوت تلقائي التوازن
الروبوت تلقائي التوازن

وأخيراً بعد التأكد من التركيب والقطع سنحمِّل الكود البرمجيّ على الشريحة مع الحذر أثناء التعامل مع بطاريات الليثيوم، والتأكد مرة أخرى من التوصيلات، والانتباه من حدوث قصر في أي وضع من أوضاع الروبوت، نوصل التغذية ونفتح السيريال، إن كانت الأمور سليمة ستظهر قِيَم الحسّاس وسيكون الخرج مشابهاً لما يلي.

قِيَم الحسّاسات في شاشة المراقبة التسلسليّة
قِيَم الحسّاسات في شاشة المراقبة التسلسليّة

هنا نلاحظ ظهور قِيَم الدَّخْل والخَرْج لخوارزميّة PID بالشكل input => output، وإن كان الروبوت في وضع توازن مثاليّ سيكون الخَرْج 0 بينما الدّخل هو القيمة الحاليّة للحسّاس، والحرف F يعبِّر عن تقدُّم الروبوت إلى الأمام والحرف R يُعبِّر عن تراجع الروبوت إلى الخلف، ويُنصَح في مرحلة التهيئة الابتدائيّة أن يكون الأردوينو متّصِلاً لسهولة تعديل الكود وإعادة تحميله حتّى الحصول على القيم Kp,Ki,Kd المناسبة.


المصدر: هنا
ترجمة: حسام جنيدي, مراجعة: عبد الله الفارس, تدقيق لغوي: رنيم العلي, تصميم: علي العلي , تحرير: قحطان غانم