أردوينو – الدرس الخامس عشر – محرك السيرفو Servo Motor

مقدمة

في هذا الدرس ستتعلم كيفية التحكم بدوران محرك السيرفو ‘servo motor’.

أولاً ، ستقوم بتعلم كيفية تحريك المحرك بمختلف الاتجاهات، ومن ثم ستقوم باضافة مقاوم متغير ‘pot’ للتحكم بوضعيته.

محرك السيرفو

المواد والأدوات

محرك السيرفو

1× محرك سيرفو (TowerPro MG946R Servo)

arduino-lesson-12-lcd

1× مقاوم متغير 10kΩ variable resistor (pot)

Half-size Breadboard

1× لوحة التجارب (Half-size Breadboard)

Arduino Uno R3

 1× اردوينو اونو

Jumper wire pack

حزمة أسلاك توصيل (ذكر-ذكر)

Arduino cable

1× سلك اردوينو

100µF capacitor

1× مكثف (100µF capacitor)
اختياري

محرك السيرفو ‘servo motors’

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

servo motors

توصيل الدائرة محرك السيرفو

في هذه التجربة، اربط  محرك السيرفو ‘servo motor’ بالاردوينو.

محرك السيرفو

محرك السيرفو ‘servo motor’ لديه ثلاثة رؤوس ، اللون الأحمر لطاقة 5V ، اللون الأسود/أو البني للمخرج الأرضي GND ، واللون الأخير عادة مايكون برتقالي/أو أصفر يتم ربطه بالمنفذ الرقمي 9 ‘digital pin’.

يوجد مقبس بنهاة اسلاك محرك السيرفو ‘servo motor’ تسمح بوضع وربط اسلاك الـ jumper wires بها للربط مع لوح التجارب والأردوينو.

محرك السيرفو

الكود البرمجي محرك السيرفو

قم برفع الكود التالي على متحكم الاردوينو وستجد أن محرك السيرفو ‘servo motor’ يبدأ بالحركة مباشرة باتجاه واحد ثم العوده للاتجاه الآخر.

الكود يعتمد على المثال البرمجي ‘sweep’  الموجود بمكتبة أمثلة الأردوينو
File> Examples> Servo> Sweep

#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 motor’ عبر سلسلة من الذبذبات ، ولجعل العملية سهله  تم توفير مكتبة كود للاردوينو  ليسهل عليك عملية توجيه محرك السيرفو ‘servo motor’ للتوجيه لزاوية معينة.

الاوامر البرمجية للتحكم بمحرك السيرفو تماماً كالاوامر الأخرى في برنامج الأردوينو ولكن لأننا لانستخدمها بشكل دائم في كل المشاريع ، لذلك عليك استدعاء مكتبة اوامر التحكم بمحرك السيرفو ‘servo motor’ وذلك عبر الأمر التالي

#include <Servo.h>

 

وكالعادة نقوم بتحديد وتعريف المنفذ الذي يتم ربطه بمحرك السيرفو عبر المتغير ‘servoPin’ .

Servo servo;

 

لنقم برمجياً بتعريف محرك سيرفو من نوع سيرفو . المكتبة البرمجية وفرت لنا نوع للتعريف وهو ‘servo’ تماماً كالتعريفات الاخرى مثل ‘int’ و ‘float’ ..الخ

لذلك باستخدام تعريف النوع ‘servo’ يمكنك من أن تعرف حتى 8 محركات سيرفو مرتبطه بالأردوينو . التعريف يتم كالتالي

Servo servo1;
Servo servo2;

في دالة setup علينا ربط متغير ‘servo’ بالمنفذ الذي سيتحكم بمحرك السيرفو ، وذلك عبر الأمر التالي

  servo.attach(servoPin);

المتغير ‘angle’ يستخدم لتحديد الزاوية الحالية لمحرك السيرفو . بداخل دالة loop استخدمنا حلقتين ‘for loop’ وذلك لزيادة الزاوية في اتجاه واحد حتى 180 درجة ثم العودة والذهاب للجهة الأخرى.

الأمر

   servo.write(angle);

يطلب من السيرفو لتحديث موضعه من الزاوية التي تم تحديدها له.

توصيل الدائرة للموجه

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

كل ماعلينا فعله هو وضع المقاوم المتغير ‘pot’ وربطه بالمنفذ A0 بالأردوينو.

محرك السيرفو

الكود البرمجي للموجه

الكود البرمجي لتوجيه محرك السيرفو عبر المقبض أسهل من الكود السابق

#include <Servo.h>
 
int potPin = 0;  
int servoPin = 9;
Servo servo;
 
void setup()
{
  servo.attach(servoPin);  
}
 
void loop()
{
  int reading = analogRead(potPin);     // 0 to 1023
  int angle = reading / 6;              // 0 to 180
  servo.write(angle);  
}

 

هنالك متغير آخر يدعى ‘potPin’ .

لتحديد موضع السيرفو ، علينا تحويل القراءة التناظرية ‘analogRead’ من المنفذ A0. هذا سيعطينا قيمة مابين 0 و 1023 . وبما أن السيرفو يستطيع التحرك حتى زاوية 180 درجة كحد أقصى لذا علينا خفض الحد الأقصى من القيمة المقروءة. وذلك عبر قسمة الرقم على 6 وذلك سيعطينا قيمة مابين 0 و 170 والتي ستكون مناسبة.

المشاكل والإصلاحات

قد يحدث خلل أثناء عمل السيرفو ‘servo motor’. وقد يحصل هذا عندما يكون متحكم الأردوينو مرتبط “ببعض” منافذ الـUSB . هذا لأن المحرك يوجه الكثير من الطاقه، خصوصاً عند بدء عمل المحرك،مما قد يخفض الجهد Voltage بالأردوينو،فيتم اعادة تشغيله

يتم حل هذه المشكلة عبر اضافة مكثف عالي ‘capacitor’  (470uF أو أعلى) يتم وضعه مابين 5V و GND.

capacitor breadboard design

المكثف ‘capacitor’ يعمل كخزان للتيار الكهربائي حيث يسمح للمحرك عند بدء تشغيله بأخذ التيار المخزن بالمكثف اضافة للتيار الذي يقوم بأخذه من الأردوينو.

النهاية الأطول للمكثف ‘capacitor’ هي النهاية الموجبة والتي يجب ربطها بـ5V. النهاية السالبة عادة يكون علامة ‘ – ‘ عليها.

أنشطة أخرى

حاول تقليل معدل التأخير ‘delay’ من 15 جزء من الثانية إلى 5 جزء من الثانية .
لاحظ اختلاف سرعة السيرفو.

حاول التحكم بمحرك السيرفو عن طريق شاشة الاتصال التسلسلي عوضاً عن المقاوم المتغير.

ملاحظة: لتتمكن من قراءة الرقم من شاشة الاتصال التسلسلي serial monitor تستطيع استخدام دالة Serial.parseInt() لقراءة الأرقام من شاشة الاتصال التسلسلي serial monitor




اردوينو – الدرس السابع عشر – المحرك الخطوي Stepper Motor

مقدمة

محرك Stepper motor ويدعى بالعربية المحرك الخطوي (محرك خطوة بخطوة) وهو محرك كهربائي يستخدم في الآلات الصغيرة التي تحتاج لدقة في التحكم مثل الطابعة وقاطع الليزر .. الخ

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

في هذا الدرس ستتعلم كيفية التحكم بالمحرك الخطوي stepper motor عبر الأردوينو ورقاقة التحكم L293D والتي استخدمناها بالدرس السادس عشر.

المحرك الخطوي 

المواد والأدوات

المحرك الخطوي 

المحرك الخطوي (5V Stepper Motor)

Dual-H-Bridge-Motor-Driver-for-DC-or-Steppers-600mA-L293D-600x450

دائرة متكاملة للتحكم بالمحرك(Dual H-Bridge  L293D)

Half-size Breadboard

1× لوحة التجارب (Half-size Breadboard)

Arduino Uno R3

 1× اردوينو اونو

Jumper wire pack

حزمة أسلاك توصيل (ذكر-ذكر)

Arduino cable

1× سلك اردوينو

توصيل الدائرة

محرك stepper motor لديه 5 اسلاك ، كما سنقوم باستخدام رقاقة L293D كاملة هذه المرة .

لاستخدام المحرك الخطوي بالمشروع يمكن استخدام اسلاك jumper wires وربطها بالمحرك عبر المقبس الموجود بنهاية اسلاكه الخمسة حتى تتمكن مر توصيله بلوح التجارب.

المحرك الخطوي 

لاحظ أن السلك الأحمر للمحرك لايتم ربطه بأي شيء.

الكود البرمجي

الكود التالي يستخدم شاشة الاتصال التسلسلي serial monitor ، لذلك بعد رفع الكود على الاردوينو وتشغيله ، قم بفتح شاشة الاتصال التسلسلي Serial Monitor وقم بإدخال رقم الخطوات ‘steps’.
جرب ادخال القيمة 500 ، هذا سيجعل المحرك يدور حتى درجة 360 درجة. قم بإدخال القيمة -500 وسيقوم المحرك بالدوران بشكل عكسي.

#include <Stepper.h>
 
int in1Pin = 12;
int in2Pin = 11;
int in3Pin = 10;
int in4Pin = 9;
 
Stepper motor(512, in1Pin, in2Pin, in3Pin, in4Pin);  
 
void setup()
{
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(in3Pin, OUTPUT);
  pinMode(in4Pin, OUTPUT);

  while (!Serial);
 
  Serial.begin(9600);
  motor.setSpeed(20);
}
 
void loop()
{
  if (Serial.available())
  {
    int steps = Serial.parseInt();
    motor.step(steps);
  }
}

كما تلاحظ يوجد مكتبة برمجية خاصة لدعم محرك stepper motor مما يجعل استخدام المحرك سهل جداً.

بعد اضافة مكتبة ‘stepper’ البرمجية ، يتم تعريف المنافذ  ‘in1’ – ‘in4’.

Stepper motor(768, in1Pin, in2Pin, in3Pin, in4Pin);

العامل المدخل الأول هو عبار عن عدد الخطوات ‘steps’ التي سينفذها المحرك.

بعد ذلك يقوم متحكم الأردوينو بإنتظار الأرقام المقترحة للادخال من خلال الاتصال التسلسلي Serial Monitor.

أخيراً ، الأمر التالي يقوم بتحديد السرعة للمحرك.

motor.setSpeed(10);

دالة loop واضحة ، حيث ينتظر الرقم المدخل (كنص) من خلال الاتصال التسلسلي Serial Monitor  ويتم تحويل النص لرقم عبر استخدام ‘parseint’. بعد ذلك يتم توجيه المحرك الخطوي بعدد خطوات الحركة.

المحرك الخطوي  Stepper Motor

المحرك الخطوي  Stepper motor يستخدم تروس والمغناطيس الكهربائي لدفع التروس خطوه بخطوه.

المحرك الخطوي 

أنشطة أخرى

حاول تغيير الأمر الذي يقوم بتحديد سرعة المحرك الخطوي.

 motor.setSpeed(20);

=قم بالتلاعب بالقيم والأسلاك لتتعرف على تأثير التغيرات التي قمت بها بالتجربة.