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

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

 image001

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


تقديم

للمحرك سيرفو ثلاث مرابط:

l سلك أحمر: مربط يوصل بالقطب الموجب (الطاقة)

l سلك أسود: مربط يوصل بالقطب السالب (الأرضية)

l  سلك أبيض: مربط الإشارة وبه يتم التحكم بزاوية دوران المحرك.

 image002

يتكون المحرك سيرفو من ثلاث أشياء رئيسية:

 

l  محرك عادي : يطلق عليه محرك DC أيضا.

l دارة متحكمة: ومن خلالها يتم التحكم بزاوية الدوران.

l  دوائر مسننة: تقيد حركته وتساعد على الدوران في زاوية محددة.

 

 

 image003

 image004

 


التحكم بالمحرك سيرفو

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

 image005


استعمالاتها

في الحوامات

 image006

 في الطائرات

 image007

 في الأذرع الآلية

 image008

 وفي الروبوتات ككل

 image009


تحويل المحرك سيرفو إلى محرك عادي

 

يمكنك الاضطلاع على المقالين:

المحرك سيرفو الجزء الأول.

المحرك سيرفو الجزء الثاني.

 

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

 


برمجة مباشرة

 

شيفرة بسيطة

لن تحتاج لكنترولور المحرك سيرفو بل يمكنك ايصاله مباشرة. فمن السهل جدا إيصال المحرك سيرفو بالميكروكنترولور. فمثلا باستعمال البطاقة Arduino يمكنك إيصاله كما هو مبين في الصورة التالية. تذكر أن المربط الثالث للمحرك يمكن إيصاله بإي من المرابط المنطقية للميكروكنترلور وقد تم إيصاله بالمربط 2 كما هو مبين في هذه الصورة.

 image010

 image011

هذه شيفرة بسيطة من أجل التحكم بالمحرك سيرفو برمجيا:

 

#define motoPin 2 // المربط المنطقي المتصل بمربط الاشارة للمحرك

 

void setup()

{

 pinMode(motoPin,OUTPUT);

}

 

void loop()

{

 for(int i = 0; i < 100; i++)

  {

     digitalWrite(motoPin,HIGH);

     delayMicroseconds(1850);

     digitalWrite(motoPin,LOW);

     delayMicroseconds(1850); 

  }

 

 for(int j = 0; j < 100; j++)

 {

     digitalWrite(motoPin,HIGH);

     delayMicroseconds(1250);

     digitalWrite(motoPin,LOW);

     delayMicroseconds(1250); 

 }

}

 

إضافة مقاومة متغيرة

يمكنك أيضا أن تتحكم بالمحرك من خلال مقاومة متغيرة (potentiometer). ما عليك إلا أن تصل مربطي الطاقة للمحرك والمقاومة المتغيرة بمنبع الطاقة ثم صل مربط الاشارة للمحرك بالمربط المنطقي 9 مثلا للبطاقة. ثم صل مربط الاشارة للمقاومة المتغيرة بمربط تناظري للبطاقة.

 image012

// Michal Rinott المؤلف الأصلي

// تحديث محمد السهلي

 

#include <Servo.h> 

Servo myservo; // انشأ متغيرا يمثل المحرك سيرفو

int potpin = 2;   // المربط التناظري للبطاقة المتصل بمربط الإشارة للمقاومة المتغيرة

int val;              //   متغير مساعد

 

void setup()

{

   myservo.attach(9);        //  نصل المربط المنطقي 9 بمربط الاشارة للمحرك

}

 

void loop()

{

   val = analogRead(potpin);             // قراءة قيمة المقاومة المتغيرة (ستكون محصورة بين 0 و 1023)

   val = map(val, 0, 1023, 0, 179);  //تحويل القيمة إلى قيمة محصورة بين 0 و179

   myservo.write(val);                     // نطبق القيمة المحولة على المحرك

   delay(15);                                  // ننتظر لبعض الوقت

}

 

التحكم من خلال لوحة المفاتيح أو ما شابه

وهذه الشيفرة متوسطة التطور تمكنك من التحكم بالمحرك من خلال لوحة المفاتيح مثلا عن طريق المنفذ متتالي:

 

/* تحكم بواسطة جهاز خارجي بالمحرك سيرفو

 * copyleft 2006 Tod E. Kurt <عنوان البريد الإلكتروني هذا محمي من روبوتات السبام. يجب عليك تفعيل الجافاسكربت لرؤيته.> المؤلف الأصلي

 * http://todbot.com/

 *

 * adapted from "http://itp.nyu.edu/physcomp/Labs/Servo"

 *  ترجمة محمد السهلي

 */

 

 // المربط المنطقي الموصل بالمحرك

 

int servoPin = 2;    

 

int pulseWidth = 0;      //      وسع الذبذبة المخصصة لزاوية المحرك

long lastPulse = 0;      //       آخر ذبذبة تم حسابها بالميليثانية

int refreshTime = 20;  //    الوقت المخصص بين كل ذبذبتين

int val;                           //            متغير مساعدة لقراءة الأمر من المنفذ المتتالي

 

int minPulse = 500;     //     أصغر وسع للذبذبة

int maxPulse = 2250;  // أكبر وسع للذبذة

 

void setup()

{

  pinMode(servoPin, OUTPUT);  //    مربط المحرك يعرف كمخرج

  pulseWidth = minPulse;              //           تهيئة المتغير

  Serial.begin(9600);                       //               تهيئة سرعة التحويل

  Serial.println("Servo control program ready");

}

 

void loop()

{

  val = Serial.read();      //قراءة قيمة القادمة من المنفذ المتتالي

  if (val >= '1' && val <= '9' )

  {

    val = val - '0';   //            تحويل القيمة إلى قيمة رقمية

    val = val - 1;    //            حصر القيمة بين 0 و 8

    pulseWidth = (val * (maxPulse-minPulse) / 8) + minPulse;  // تحويل إلى الميكروثانية

    Serial.print("Moving servo to position ");

    Serial.println(pulseWidth,DEC);

  }

  updateServo();   // تحديث موضع المحرك

}

 

// servoPi, pulsewidth, lastPulse, refreshTime  تستعمل المتغيرات

void updateServo()

{

  // تحريك رأس المحرك في كل 20 ميليثانية

  if (millis() - lastPulse >= refreshTime)

 {

    digitalWrite(servoPin, HIGH);         //     تشغيل المحرك

    delayMicroseconds(pulseWidth);  // طول الذبذبة

    digitalWrite(servoPin, LOW);          //       إيقاف المحرك

    lastPulse = millis();                           //            احتفاظ بقيمة الذبذبة

  }

}

 


تأليف محمد السهلي 

 


المراجع

 

http://www.acroname.com/robotics/info/articles/servo/servo.html

http://www.engineersgarage.com/articles/servo-motor

http://www.pyroelectro.com/tutorials/servo_motor/servomotor.html

http://servocity.com/html/how_do_servos_work_.html

http://lizarum.com/assignments/physical_computing/2008/servo.html

http://idblab.blogspot.com/2011/03/class-3.html

http://makeprojects.com/Wiki/Servos

http://arduino.cc/playground/Learning/SingleServoExample#.T0YKLXwkh_c.facebook


 

 

التعليقات   

 
wasem fouad
0 # wasem fouad 2016-10-21 13:07
كيف اتحكم بالسيرفو عندما يسمع اي صوت ؟
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير
 
 
HASSAN AHMED
+1 # HASSAN AHMED 2016-06-07 02:01
[fv]كيف اتحكم في 6 محركات سيرفو[/fv]
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير
 
 
إدارة إصنعها
0 # إدارة إصنعها 2016-06-07 02:23
صل كل محرك بمربط منطقي آخر كما فُعل مع المحرك المشروح في هذا المقال
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير
 
 
رضوان
+2 # رضوان 2016-05-26 11:29
جزاك الله خيرا واعانكم على مجهودكم في تبسيط هذه المواضيع ونشرها وفقكم الله
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير
 
 
حسن العلو
+2 # حسن العلو 2016-01-07 06:50
بارك الله فيك وشكرا لك على هذا الموضوع الرائع
متمنيا لك التوفيق والنجاح
واتمنى منك أن تنشر لنا موضوع مع البرنامج عن دارة تغذية موتور توجيه صحن الدش. لأن هذا الموضوع لم يوجد له شرح في الانترنت.
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير
 
 
zinou
+1 # zinou 2013-08-11 20:33
درس رائع :lol:
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير
 

أضف تعليق


كود امني
تحديث


Go to top