blog cover

توصيل محرّك السيرفو اس جي90 مع أردوينو أونو ار3

عندما يتعلّق الأمر باختيار المحرّك المناسب لمشروعٍ ما، قد تكون الخيارات كثيرةً إلى حدّ الإرباك — محرّكات خطوية (stepper)، ومحرّكات تيار مستمر (DC)، ومحرّكات دون فُرَش (brushless)، وغيرها. ولكلّ نوعٍ نقاط قوّته الخاصة. لكن إذا كنت تحتاج إلى تحكّمٍ دقيق في الحركة، فهناك خيارٌ واحدٌ واضح: محرّك السيرفو. أخبِر محرّك السيرفو إلى أين يتوجّه، فيذهب إلى هناك بدقّةٍ تامّة! الأمر بهذه البساطة!

اكتسبت محرّكات السيرفو شهرتها أول الأمر في عالم التحكّم عن بُعد (RC)، حيث استُخدِمت للتحكّم في توجيه سيارات التحكّم عن بُعد أو في قلّابات (flaps) طائرات التحكّم عن بُعد. ومع مرور الوقت، وجدت طريقها إلى الروبوتات والأتمتة، وبالطبع إلى عالم الأردوينو.

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

فلنشرع إذاً في العمل ونجعل ذلك السيرفو يتحرّك!

ما هو السيرفو وما الذي يجعله دقيقاً؟

داخل محرّك سيرفو هوايةٍ نموذجي، ستجد خمسة مكوّناتٍ رئيسية تعمل معاً: محرّك تيار مستمر (DC)، وعلبة تروس (gearbox)، وذراع سيرفو (servo horn)، ومقاومة متغيّرة (potentiometer)، ووحدة تحكّم.

Servo Motor Internal Structure Illustration

محرّك التيار المستمر (DC Motor): هو المكوّن الأساسي الذي يوفّر قوّة الدوران. وهو مشابهٌ لمحرّكات الهواية الموجودة في الألعاب، لكنّ طريقة التحكّم فيه هي ما يُحدِث الفارق كلّه. ويتّصل محرّك التيار المستمر بعمود الخرج عبر سلسلةٍ من التروس.

علبة التروس (Gearbox): تؤدّي علبة التروس (وهي منظومةٌ من التروس) دوراً بالغ الأهمية في زيادة عزم المحرّك وتحسين دقّة حركاته. فهي تخفّض سرعة المحرّك لكنها تزيد قوّته.

ذراع السيرفو (Servo Horn): هو ذراعٌ بلاستيكي (أو عجلة) مثبّتٌ على عمود الخرج (وهو الجزء الذي يدور فعلياً). ويمنحك ذراع السيرفو موضعاً لتثبيت ما تريد أن يحرّكه السيرفو — مثل ذراع روبوت أو دفّة طائرةٍ نموذجية.

المقاومة المتغيّرة (Potentiometer): هي مقاومةٌ متغيّرة تعمل كمستشعرٍ للموضع. وهي موصولةٌ مباشرةً بعمود الخرج. وكلّما دار عمود الخرج، تغيّرت قيمة المقاومة المتغيّرة. وهذا يُخبِر وحدة التحكّم بموضع المحرّك على وجه الدقّة.

وحدة التحكّم (Control Unit): هي "عقل" محرّك السيرفو. فهي تستقبل الإشارات من متحكّمٍ خارجي (مثل الأردوينو)، وتتحقّق من موضع المقاومة المتغيّرة، وتتحكّم في محرّك التيار المستمر.

وإليك كيف تعمل هذه الأجزاء معاً:

يعمل محرّك السيرفو باستخدام ما يُسمّى "نظام التغذية الراجعة ذي الحلقة المغلقة" (closed-loop feedback system).

servo motor closed loop system block diagram

عندما ترسل إشارةً إلى السيرفو تأمره بالتحرّك إلى موضعٍ معيّن، تستقبل وحدة التحكّم هذا الأمر.

والمقاومة المتغيّرة موصولةٌ فيزيائياً بعمود الخرج، لذا فهي تعرف دائماً الموضع الحالي للسيرفو. فعندما يدور المحرّك، يدور عمود الخرج، وتدور معه المقاومة المتغيّرة. وهذا الدوران يغيّر قيمة المقاومة، فينشأ جهدٌ يتوافق مباشرةً مع الموضع الحالي لعمود الخرج (ومن ثمّ المحرّك). ويعمل هذا الجهد كتغذيةٍ راجعة (feedback) لوحدة التحكّم.

وتقارن وحدة التحكّم باستمرارٍ بين جهد التغذية الراجعة هذا (الذي يمثّل الموضع الحالي للمحرّك) وإشارة الموضع المطلوب القادمة من المتحكّم الدقيق.

فإذا كان هناك فرقٌ (إشارة "خطأ") بين الموضع المطلوب والموضع الحالي، تضبط وحدة التحكّم قدرة محرّك التيار المستمر واتجاهه لتصحيح هذا الفرق.

وكلّما تحرّك المحرّك، تغيّر جهد التغذية الراجعة للمقاومة المتغيّرة، محدّثاً وحدة التحكّم باستمرارٍ بشأن الموضع الحالي للمحرّك.

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

وتحدث هذه العملية برمّتها بسرعةٍ فائقة وبشكلٍ متكرّر. فالسيرفو يتحقّق دائماً من موضعه ويُجري تعديلاتٍ دقيقة ليبقى تماماً حيث ينبغي أن يكون. ولهذا السبب تُجيد محرّكات السيرفو الحفاظ على موضعها، حتى عندما تحاول قوىً خارجية تحريكها.

وتُسمّى هذه المنظومة بأكملها "آلية السيرفو" (servomechanism) أو "السيرفو" اختصاراً. وهي تعمل كنظام تحكّمٍ ذي حلقةٍ مغلقة، مستخدمةً التغذية الراجعة السالبة (negative feedback) للتحكّم بدقّةٍ في سرعة المحرّك واتجاهه، ما يتيح له بلوغ موضعٍ معيّن والحفاظ عليه.

كيف تعمل محرّكات السيرفو؟

يتمّ التحكّم في محرّكات سيرفو الهواية باستخدام تقنيةٍ بارعة تُسمّى تعديل عرض النبضة (Pulse Width Modulation - PWM).

تعمل تقنية PWM عبر إرسال سلسلةٍ من النبضات الكهربائية إلى السيرفو على فتراتٍ منتظمة. وبالنسبة لمعظم محرّكات سيرفو الهواية، تُرسَل هذه النبضات نحو 50 مرة في الثانية (50 هرتز). وهذا يعني أن نبضةً جديدة تصل كلّ 20 مللي ثانية (جزء من خمسين من الثانية).

والأمر المهمّ حقاً للتحكّم في موضع السيرفو ليس عدد مرّات إرسال النبضات، بل مدّة استمرار كلّ نبضة. وتُسمّى هذه المدّة "عرض النبضة" (pulse width)، أو "دورة العمل" (duty cycle) لإشارة PWM إذا كنت تفضّل المصطلح الفنّي.

Servo Motor Working Timing Diagram

  • نبضةٌ قصيرة بطول 1 مللي ثانية تقريباً أو أقلّ تأمر السيرفو بالتحرّك إلى 0 درجة (إلى أقصى جانبٍ واحد).

  • نبضةٌ متوسّطة بطول 1.5 مللي ثانية تقريباً تضع السيرفو عند 90 درجة (في المنتصف تماماً).

  • نبضةٌ أطول بطول 2 مللي ثانية تقريباً تحرّك السيرفو إلى 180 درجة (إلى أقصى الجانب الآخر).

  • أمّا المواضع الواقعة بين هذه القيم، فنستخدم لها أعراض نبضاتٍ تقع بين هذه القيم. فمثلاً، إذا أردنا وضع السيرفو عند موضع 45 درجة (في منتصف المسافة بين 0 و90 درجة)، فسنستخدم نبضةً بطول 1.25 مللي ثانية تقريباً.

وهذا يعني أنه يمكننا التحكّم بدقّةٍ في الموضع الذي يشير إليه السيرفو تماماً، وذلك عبر التحكّم بعنايةٍ في مدّة استمرار كلّ نبضة. فوحدة التحكّم في السيرفو تستقبل هذه النبضات، وتقيس عرضها، وتحرّك المحرّك إلى الموضع المقابل.

يمكن أن يساعدك الرسم المتحرّك أدناه على تصوّر كيفية توافق التغيّرات في عرض النبضة مع مواضع السيرفو المختلفة.

Servo Motor Working Animation

ليست كل محرّكات السيرفو متطابقةً تماماً

من المهمّ ملاحظة أن مدى عرض النبضة الدقيق قد يختلف اختلافاً طفيفاً بين طُرُز محرّكات السيرفو المختلفة. فبعض محرّكات السيرفو قد تستخدم مدىً مثل 0.5 مللي ثانية لِـ 0 درجة و2.5 مللي ثانية لِـ 180 درجة.

ولهذا السبب، من الجيّد دائماً الاطّلاع على ورقة البيانات (datasheet) المرفقة بمحرّك السيرفو المحدّد لديك. فورقة البيانات ستخبرك على وجه الدقّة بأعراض النبضات التي ينبغي استخدامها للمواضع المختلفة مع محرّك السيرفو الخاصّ بك.

توزيع أطراف محرّك السيرفو

تأتي جميع محرّكات سيرفو الهواية تقريباً بموصّلٍ قياسي من ثلاثة أطراف، بتباعدٍ قدره 0.1 بوصة. ومع أن الترميز اللوني للأسلاك قد يختلف بين العلامات التجارية، فإن الأطراف تُرتَّب عموماً بالترتيب نفسه.

وإليك تفصيلاً لتوزيع الأطراف:

Servo Motor Pinout

طرف GND هو طرف الأرضي.

طرف 5V يغذّي محرّك السيرفو بالطاقة. ومعظم محرّكات سيرفو الهواية تحتاج إلى جهدٍ يتراوح بين 4.8 و6 فولت لتعمل على نحوٍ سليم. وتوفير الجهد الصحيح أمرٌ مهمّ — فالجهد القليل جداً لن يمنح السيرفو قوّةً كافية، والجهد الزائد قد يُتلِفه.

طرف Control يستقبل إشارة تعديل عرض النبضة (PWM) من متحكّمٍ دقيق، وهي التي تحدّد موضع السيرفو.

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

توصيل محرّك السيرفو بلوحة أردوينو أونو

حسناً! لنوصّل محرّك سيرفو بلوحة أردوينو أونو ونرَ كيف يعمل.

في هذه التجربة، سنستخدم محرّك السيرفو الصغير SG90. وهذا المحرّك الصغير لكنّ القويّ يعمل بجهد 5 فولت (ويمكنه العمل بين 4.8 و6 فولت تيار مستمر)، ويمكنه الدوران حتى 180 درجة — 90 درجة في كلّ اتجاه.

من المهمّ ملاحظة أنه عندما يكون السيرفو ثابتاً دون حركة، فإنه لا يحتاج إلّا إلى نحو 10 مللي أمبير من التيار. لكنه عندما يتحرّك، يحتاج إلى أكثر من ذلك بكثير — بين 100 و250 مللي أمبير. وهذا يعني أنه في معظم المشاريع البسيطة، يمكننا تغذية السيرفو بالطاقة مباشرةً من طرف الـ5V في الأردوينو. لكن إذا كان السيرفو لديك يحتاج إلى أكثر من 250 مللي أمبير، فينبغي أن تستخدم مصدر طاقةٍ منفصلاً لتجنّب إتلاف الأردوينو.

لتوصيل محرّك السيرفو SG90 بالأردوينو:

وصّل السلك الأحمر بطرف 5V في الأردوينو.

وصّل السلك الأسود أو البنّي بطرف GND (الأرضي).

وصّل السلك البرتقالي أو الأصفر بالطرف رقم 9 في الأردوينو. وهذا الطرف يدعم تقنية PWM، ما يعني أنه قادرٌ على إرسال إشارة تعديل عرض النبضة (PWM) اللازمة للتحكّم في حركة السيرفو.

وإليك جدولاً مرجعياً سريعاً لتوصيلات الأطراف:

محرّك السيرفو

الأردوينو

5V

5V

GND

GND

Control (التحكّم)

9

يُرجى الرجوع إلى الصورة أدناه لمشاهدة طريقة التوصيل الصحيحة.

connecting servo motor to arduino uno sweep code

بمجرّد توصيل كلّ شيء، تصبح جاهزاً للتحكّم في محرّك السيرفو باستخدام كود الأردوينو!

المثال الأول في الأردوينو – الكنس (Sweep)

لنبدأ باستخدام أحد الأمثلة المدمجة في بيئة الأردوينو. افتح قائمة Examples (الأمثلة)، وانتقل إلى Servo، ثم اختَر كود Sweep.

servo sweep example

بمجرّد تحميل الكود، ارفعه إلى لوحة الأردوينو لديك. وإذا كان كلّ شيء مُعدّاً على نحوٍ صحيح، فسترى عمود محرّك السيرفو يتأرجح ذهاباً وإياباً عبر 180 درجة.

#include <Servo.h>

int servoPin = 9;
Servo servo;
int angle = 0;  // servo position in degrees

void setup() {
  servo.attach(servoPin);
}

void loop() {

  // scan from 0 to 180 degrees
  for (angle = 0; angle < 180; angle++) {
    servo.write(angle);
    delay(15);
  }

  // now scan back from 180 to 0 degrees
  for (angle = 180; angle > 0; angle--) {
    servo.write(angle);
    delay(15);
  }
}

شرح الكود:

التحكّم في محرّك السيرفو بسيطٌ في الواقع، وذلك بفضل مكتبة Servo التي تأتي مع الأردوينو. فهذه المكتبة تمنحنا أوامر سهلة لنُخبِر السيرفو بالموضع الذي نريده أن يتحرّك إليه على وجه الدقّة.

وأول ما نفعله في كودنا هو تضمين مكتبة Servo هذه.

#include <Servo.h>

بعد ذلك، علينا أن نُخبِر الأردوينو بالطرف الذي يتّصل به السيرفو لدينا..

int servoPin = 9;

ثم نُنشئ كائن سيرفو (servo object) سنستخدمه للتحكّم في محرّكنا.

Servo servo;

يمكنك التحكّم في ما يصل إلى ثمانية محرّكات سيرفو بهذه الطريقة. فلو كان لديك محرّكا سيرفو مثلاً، لكتبت:

Servo servo1;
Servo servo2;

نحتاج أيضاً إلى متغيّرٍ يُسمّى angle لتتبّع الموضع الذي يشير إليه السيرفو لدينا.

int angle = 0;

في دالة setup()، نربط كائن السيرفو لدينا بالطرف الذي اخترناه سابقاً. وهذا يُخبِر الأردوينو بالطرف الذي ينبغي أن يرسل الإشارات إلى السيرفو.

servo.attach(servoPin);

الآن، في دالة loop()، نحرّك السيرفو أولاً من 0 درجة إلى 180 درجة. ونستخدم حلقة for تزيد الزاوية بمقدار درجةٍ واحدة في كلّ مرة. وفي كلّ دورةٍ من الحلقة، يحرّك الأمر servo.write(angle); السيرفو إلى موضعه الجديد. وللحفاظ على سلاسة الحركة، نضيف فترة توقّفٍ قصيرة قدرها 15 مللي ثانية بعد كلّ حركة.

// scan from 0 to 180 degrees
for (angle = 0; angle < 180; angle++) {
  servo.write(angle);
  delay(15);
}

بمجرّد وصول السيرفو إلى 180 درجة، نجعله يعود إلى 0 درجة. ونفعل ذلك بحلقة for أخرى تُنقِص الزاوية بمقدار درجةٍ واحدة في كلّ مرة حتى نعود إلى 0.

// now scan back from 180 to 0 degrees
for (angle = 180; angle > 0; angle--) {
  servo.write(angle);
  delay(15);
}

بعد الوصول إلى 0 درجة، تبدأ العملية بأكملها من جديد. وهذا يجعل السيرفو يتأرجح باستمرارٍ ذهاباً وإياباً بين 0 و180 درجة.

هذا المثال طريقةٌ رائعة لرؤية كيف يمكننا التحكّم في السيرفو بأوامر بسيطة. وبمجرّد أن تفهم هذا، يمكنك البدء بتغيير الكود لتجعل السيرفو يقوم بأشياء مختلفة، مثل التوقّف عند زوايا معيّنة أو التحرّك بسرعاتٍ مختلفة.