روبوت رباعي الأرجل مزود بتحكم PCA9685 و12 محرك سيرفو

روبوت رباعي الأرجل مزود بتحكم PCA9685 و12 محرك سيرفو

مقدمة

ربما تعرف الروبوتات الصناعية التي تنفذ حركات محددة مسبقًا وتكون ثابتة في مكان معين، ولكن ماذا لو أردنا بناء روبوت قادر على الحركة من مكانه؟ هنا تظهر تحديات جديدة تحتاج إلى حل.

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

سوف نوضح أساسيات بناء وبرمجة حركات الروبوت، ثم يعود الأمر لخيالك في تطوير هذه الحركات وإضافة وحدات جديدة لتحسين أداء الروبوت.

لوازم

المكونات الإلكترونية:

  • عدد 12 محرك سيرفو صغير نوع MG90S.
  • عدد 1 متحكم PCA9685 لقيادة محركات السيرفو (12 بت، 16 قناة).
  • عدد 1 لوحة تحكم AZ-ATMEGA328DIP (معالج ATMEGA16U2).
  • عدد 1 لوحة تجارب مصغرة (Prototype Shield Mini Breadboard) لنموذج UNO R3.
  • وحدة أولتراسونيك HC-SR04.
  • وحدة مستقبل الأشعة تحت الحمراء KY-022.
  • عدد 1 جهاز تحكم عن بعد بالأشعة تحت الحمراء.
  • مجموعة أسلاك توصيل (Jumper wires).

المواد الخام:

  • خشب بالصا أو خشب حور رقائقي بسماكة 3 مم.
  • غراء خشب سريع الجفاف.
  • مطاط.

البرامج المطلوبة:

  • بيئة تطوير أردوينو (Arduino IDE).
  • مكتبة I2C (Wire.h - مدمجة).
  • مكتبة PCA9685 (Adafruit_PWMServoDriver.h).
  • مكتبة جهاز التحكم بالأشعة تحت الحمراء (IRremote.h).
  • مكتبة حساس الأولتراسونيك (SR04.h).
  • سكيتش quadruped_robot_home.ino
  • سكيتش quadruped_robot_pushups.ino
  • سكيتش quadruped_robot_shoulder.ino
  • سكيتش quadruped_robot_walk.ino

خطوة 1 : البناء والتجميع

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

وقبل البدء بتجميع الروبوت يجب ضبط جميع محركات السيرفو على زاوية 90 درجة، حيث تمثل هذه الزاوية المركز الحركي للمحركات، وكذلك يتم تجميع جميع الأجزاء في هذا الوضع المتوسط، مما يوفر لنا مرجعاً بصرياً أولياً لوضعية الأرجل، وهذا الضبط يجعل عملية تحديد قيم الوضع الابتدائي للروبوت في سكيتش Home.ino أكثر سهولة.

سنبدأ أولا بتركيب لوح الكتف، وهذه الأجزاء عبارة عن مكعب بطول حافة 31 مم، وأحد جوانب المكعب مفتوح، وهو الجانب المواجه لداخل الجسم، بينما يبلغ سمك الجدارين العلوي والسفلي 3 مم، أما الجانبان الآخران يكونان بسمك 6 مم حيث توجد الأجزاء المثبتة بعمود محرك السيرفو، وتبلغ سماكة المنطقة التي تحتوي على محور دوران جسم الروبوت أيضًا 6 مم.

وقبل تثبيت أجزاء محرك السيرفو لابد أن نقوم بفحص ألواح الكتف على الجسم، فنحن نحتاج للتأكد من تركيبها بشكل صحيح، حيث يجب أن يحتوي السطح الخارجي لكل لوح كتف على الجزء الذي يتم تثبيته بكل جزء علوي من الرجل.

ملاحظة تقنية: الأجزاء الحاملة لابد أن تكون بسماكة 6 مم  لتحمل الإجهادات، كما أن التوجيه الصحيح للوح الكتف يحقق حركة مثالية للأرجل، كما يجب فحص المحاذاة بدقة قبل التثبيت النهائي.

بعد ذلك ننتقل إلى الجزء السفلي من الساق والذي يكون بسماكة 6 مم، وفي الجزء العلوي سنقوم بتركيب القطعة التي تثبت بعمود محرك السيرفو، وفي الجزء السفلي من الساق سنقوم بلصق بعض القطع المطاطية لتحسين التماسك مع الأرض، وهنا يجب أيضًا الانتباه إلى طريقة تركيب قطعة التوصيل بمحرك السيرفو، حيث يتم تركيبها في الجزء السفلي من الساق على الجانب الأيمن في اتجاه معين، بينما على الجانب الأيسر يتم تركيبها في الاتجاه المعاكس.

أما الجزء العلوي من الساق فله أيضًا سماكة 6 مم، وعلينا عمل تجويف لتركيب محرك السيرفو، ويجب أن نكون حذرين لأن التجويف في الجزء العلوي من الجانب الأيمن يكون في جهة واحدة، بينما في الجانب الأيسر يكون في الجهة المقابلة، ويقوم محرك السيرفو العلوي بالتحكم في الجزء العلوي، بينما محرك السيرفو السفلي يتحكم في الجزء السفلي من كل ساق.

ملاحظة تقنية: القطع المطاطية في الأسفل تمنع الانزلاق، كما أن اتجاهات التركيب المعاكسة ضرورية لتحقيق التوازن، والسمك الذي اخترناه 6 مم يوفر المتانة المطلوبة للأجزاء المتحركة.

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

وبعد الانتهاء من تصنيع جميع الأجزاء، نبدأ عملية تجميع الروبوت وفق الخطوات التالية:

أولاً: مرحلة التركيب الأولي:

نقوم بتثبت محركي سيرفو في كل جزء علوي، ثم نركب المحركات الأربعة في جسم الروبوت الرئيسي.

ثانياً: تركيب الأرجل:

بعد اكتمال تركيب جميع المحركات نقوم بتثبيت كل ساق في مفصل الكتف المناسب لها.

ثالثاً: ضبط المحركات:

نحرص على أن تكون جميع محركات السيرفو مضبوطة مسبقاً على زاوية 90 درجة، ونستخدم هذا الضبط كمرجع أساسي للتجميع.

رابعاً: تركيب ألواح الكتف:

نقوم بتثبيت محور كل لوح كتف على الجسم، ثم نمرر عمود التوصيل عبر دعامة الجسم ليصل إلى المحور، ونكرر هذه العملية لألواح الكتف الأربعة

ملاحظات تقنية هامة:

  • سماكة عمود التوصيل 6 مم تمنع انحناء العمود تحت الضغط.
  • ضبط المحركات على 90° يضمن نقطة بداية متوازنة.
  • التجميع المتسلسل يضمن دقة التركيب.

وأخيراً بعد الانتهاء من تجميع الأجزاء الميكانيكية للروبوت، ننتقل إلى مرحلة التركيب الإلكتروني كالأتي:

أولاً: تركيب الغطاء العلوي للجسم:

نقوم بتثبيت غطاء الجسم الرئيسي بعناية ونتأكد من عدم عرقلة حركة الأجزاء الميكانيكية.

ثانياً: تركيب المكونات الإلكترونية:

نقوم بتثبيت لوحة متحكم PCA9685، ثم نركب لوحة AZ-ATMEGA328 الدقيقة، وأخيراً نضيف لوحة التوسعة (Shield).

ملاحظة: تتيح لك لوحة التوسعة (Prototype Shield) إضافة تحسينات وتعديلات على المشروع حسب احتياجاتك، حيث يمكنك ملاحظة وجود وحدة مستقبل الأشعة تحت الحمراء (IR receiver) المثبتة مسبقاً والتي سنستخدمها في الجزء الثاني من المشروع.

ثالثاً: التوصيلات الكهربائية:

نقوم بتوصيل جميع الوحدات الإلكترونية ونربط محركات السيرفو حسب مخطط الدائرة الكهربائية، ونتأكد جيداً من دقة جميع التوصيلات قبل التشغيل.

رابعاً: مرحلة البرمجة:

نبدأ أولاً بتحميل البرنامج على المتحكم ثم نختبر وظائف الروبوت الأساسية، ثم نقوم بتجهيز النظام للجزء الثاني من المشروع.

نصائح مهمة:

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

خطوة 2 : الوظائف وبرمجة السكيتش

نقوم باستخدام 12 محرك سيرفو من نوع MG90S كأجهزة تنفيذ للحركات، حيث تتميز هذه المحركات بتروس معدنية تزيد من متانتها، ويتم التحكم في هذه المحركات عبر متحكم PCA9685 الذي يتصل باللوحة الدقيقة (microcontroller) عبر منفذ I2C، حيث يستخدم هذا النظام فقط دبوسين للاتصال بين المتحكم الدقيق ووحدة PCA9685، مما يترك مساحة كافية للتوسعات المستقبلية.

ثم نحدد الموضع الذي يجب أن يتخذه كل محرك سيرفو في السكيتش البرمجي حتى تؤدي الحركات المجمعة للمحركات إلى سلسلة الحركات المطلوبة للروبوت، ويرسل المتحكم الدقيق أوضاع المحركات إلى وحدة تحريك المحركات عبر واجهة I2C.

أما الجزء المرهق والأكثر استهلاكاً للوقت في هذا المشروع هو تحديد القيم المناسبة لكل وضعية من وضعيات محركات السيرفو وضبط حركة كل ساق بشكل منسق وبالتالي تحقيق سلسلة الحركات المتناسقة للروبوت.

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

ولإضفاء الإثارة على مكونات الروبوت في هذا الجزء الأول من المشروع نقوم باستخدام مصدر جهد ثابت 5 فولت DC لتغذية مكونات الروبوت، ونظراً لأن المتحكم الدقيق يبقى متصلاً ببيئة تطوير أردوينو (Arduino IDE) عبر واجهة USB فيتم توفير الجهد الكهربائي للمتحكم عبر هذا الاتصال.

وفي الجزء الثاني من المقال نقوم بإضافة حساس المسافة HC-SR04 لقياس المسافة أمام الروبوت، ونستخدم أيضًا وحدة مستقبل الأشعة تحت الحمراء (IR receiver) مع جهاز تحكم عن بعد، كذلك نقوم بتركيب بطاريات لتوفير الطاقة اللازمة لحركة الروبوت بحرية.

خطوة 3 : شرح سكيتش Quadruped_robot_home.ino

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

السطران الأولان من الكود هما المكتبتان اللازمتان لتنفيذ المخطط بشكل صحيح وهم:
#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

حيث أن:

  • Wire.h: هي مكتبة اتصال I2C
  • Adafruit_PWMServoDriver.h: هي مكتبة ضرورية لاستخدام وحدة PCA9685

أما الأسطر الثلاثة التالية هي:

Adafruit_PWMServoDriver servoDriver_module = Adafruit_PWMServoDriver();

 

#define SERVO_MIN 100

#define SERVO_MAX 500

  • حيث أن:
    servoDriver_module: هي كائن للتحكم في أوضاع محركات السيرفو.
  • SERVO_MIN وSERVO_MAX: هي قيم الحافة الصاعدة والهابطة لوضعيات 0 و180 درجة لمحركات السيرفو.

بعد ذلك دالة الإعداد (setup) وهي كالتالي:


void setup() {

     Serial.begin(9600);

     servoDriver_module.begin();

     servoDriver_module.setPWMFreq(50);

     home();

}

حيث نُهيئ أولًا وحدة التحكم التسلسلية، وفي السطر التالي، وحدة PCA9685 من خلال الكائن الذي تم تنفيذه مسبقاً.

وباستخدام الدالة Begin سنححدد تردد عمل محركات السيرفو، مع تفعيل الدالة Setpwmfreq 50، وهو 50 هرتز، في السطر الأخير، نقوم بتفعيل الدالة Home.

بعد ذلك دالة الوضع الأولي (home) وهي كالتالي:

void home() {

     servoDriver_module.setPWM(0, 0, 420); // الجزء السفلي الأمامي الأيسر

     servoDriver_module.setPWM(1, 0, 360);

     servoDriver_module.setPWM(2, 0, 350);

     servoDriver_module.setPWM(4, 0, 400);

     servoDriver_module.setPWM(5, 0, 440);

     servoDriver_module.setPWM(6, 0, 280);

     servoDriver_module.setPWM(8, 0, 240);

     servoDriver_module.setPWM(9, 0, 220);

     servoDriver_module.setPWM(10, 0, 340);

     servoDriver_module.setPWM(12, 0, 190);

     servoDriver_module.setPWM(13, 0, 260);

     servoDriver_module.setPWM(14, 0, 260);

     delay(10000);

}

حيث أن:

  • كل سطر يحرك محرك سيرفو معين إلى وضعه الأولي.
  • المعلمة الثالثة في setPWM تحدد الوضعية المطلوبة.
  • التأخير 10 ثوانٍ (10000 مللي ثانية) لإعطاء الوقت للروبوت ليتخذ وضعه الأولي.

ملاحظات:

  • دالة loop تبقى فارغة في هذا السكيتش.
  • يتم تنفيذ الوضع الأولي مرة واحدة عند بدء تشغيل المتحكم الدقيق.
  • الكود المصدري يوضح أي محرك مسؤول عن أي جزء من الجسم.

خطوة 4 : شرح سكيتش Quadruped_robot_pushups.ino

يقوم هذا السكيتش بتشغيل حركات صغيرة للروبوت عبر محركات السيرفو الموجودة في الأجزاء العلوية والسفلية من الأرجل، وفي دالة loop يتم استدعاء دالة pushups بشكل متكرر، مما يجعل الروبوت يتحرك لأعلى ولأسفل بشكل متكرر.

آلية العمل:

  • تقوم محركات السيرفو الـ12 بتغيير أوضاعها ثم تعود إلى الوضعية الأولية المحددة في دالة .home
  • أسطر الكود مشابهة لتلك التي رأيناها سابقاً.
  • الدالة servoDriver_module.setPWM() تأخذ كمعاملات على رقم محرك السيرفو المراد تحريكه والوضعية الجديدة المطلوبة.

كما يظهر الرسم كيفية عمل حركات أجزاء الأرجل بناءً على تغيير أوضاع محركات السيرفو.

خطوة 5 : شرح سكيتش Quadruped_robot_shoulder.ino

وظيفة هذا السكيتش أنه يقوم بتحريك محركات السيرفو الموجودة في ألواح كتف الروبوت، وتكون أسطر الكود مشابهة أيضًا أخرى لما سبق، حيث أنه في دالة loop نستدعي باستمرار دالة shoulder التي تقوم بتحريك محركات سيرفو الكتف من الوضعية الأولية home إلى الوضعيات الجديدة، ويتم تحديد هذه الوضعيات أيضاً باستخدام الدالة servoDriver_module.setPWM.

خطوة 6 : شرح سكيتش Quadruped_robot_walk.ino

هذا السكيتش يمكن الجزء الأول الروبوت من المشي، ولتحقيق ذلك يجب برمجة تسلسل حركي ينفذ الحركات الصحيحة للأرجل مع الحفاظ على توازن الروبوت.

والفرق الرئيسي عن السكيتشات الأخرى هو إعلان متغير int movement_speed = 50 الذي يحدد فترة تأخير قدرها 50 مللي ثانية بين حركات محركات السيرفو.

int movement_speed = 50;

آلية المشي:

  1. الوضعية الأولية: نبدأ من وضع home الذي يتم استدعاؤه في setup.
  2. الخطوة الأولى: أولاً نرفع الرجل الأمامية اليسرى (المحرك 0)، ثم نحرك الجزء العلوي للأمام (المحرك 1)، ثم ننزل الرجل لتلامس الأرض.

servoDriver_module.setPWM(0, 0, 450);

delay(movement_speed);

servoDriver_module.setPWM(1, 0, 330);

delay(movement_speed);

servoDriver_module.setPWM(0, 0, 420);

delay(movement_speed);

  1. الخطوة الثانية (للحفاظ على التوازن): نكرر الحركة السابقة للرجل الخلفية اليمنى (المحركات 8 و9).

Servodriver_Module.setpwm(8, 0, 210);

delay(movement_speed);

Servodriver_Module.setpwm(9, 0, 250);

delay(movement_speed);

Servodriver_Module.setpwm(8, 0, 240);

delay(movement_speed);

  1. تحريك الجسم للأمام: نقوم بتحريك محركات الكتفين للخلف مما يدفع الجسم للأمام بينما تثبت الأرجل على الأرض.

Servodriver_Module.setpwm(13, 0, 230);

Servodriver_Module.setpwm(1, 0, 360);

Servodriver_Module.setpwm(5, 0, 470);

Servodriver_Module.setpwm(9, 0, 220);

delay(movement_speed);

  1. إكمال دورة المشي: نحرك الرجل الأمامية اليمنى (المحركات 12 و13)، ثم الرجل الخلفية اليسرى (المحركات 4 و5).

مثال لحركة الرجل الأمامية اليمنى:

Servodriver_Module.setpwm(12, 0, 140);

delay(movement_speed);

Servodriver_Module.setpwm(13, 0, 260);

delay(movement_speed);

Servodriver_Module.setpwm(12, 0, 190);

delay(movement_speed);

مثال لحركة الرجل الخلفية اليسرى:

servoDriver_module.setPWM(4, 0, 450);

delay(movement_speed);

servoDriver_module.setPWM(5, 0, 440);

delay(movement_speed);

servoDriver_module.setPWM(4, 0, 400);

delay(movement_speed);

العودة للوضعية الأولية:

تعود جميع المحركات في نهاية التسلسل الحركي إلى وضع home مع الاستدعاء المتكرر لـ walk في loop، ويستمر الروبوت في الحركة بشكل متواصل.

وكل هذا بمثابة الأساس لكي نتمكن من تحريك الروبوت بالشكل المطلوب.

لا توجد تعليقات حتي الآن.
تسجيل الدخول مطلوب

يجب عليك تسجيل الدخول لإضافة تعليق.

تسجيل الدخول