الأربعاء، 12 يونيو، 2013

محركات السيرفو Servo motor الجزء الاول

محركات السيرفو  Servo motor


 الجزء الأول 


موضوع محركات السيرفو من المواضيع المتكررة التي طالما يسأل عنها المهتمين بعلوم الالكترونيات و الروبوتات , و لذلك احببت عرض سلسلة محركات السيرفو و كيفية التحكم بها ضمن بيئة أردوينو البرمجية Arduino IDE .

في البداية ما هو محرك السيرفو ؟

محرك السيرفو هو عبارة عن محرك يأتي مع علبة تروس Gear و ناقل حركة Shaft يعطي الحركة عزماً أكبر و دقة كبيرة , و يستطيع هذا المحرك الألتفاف 180درجة و في بعض الأنواع 360 درجة .


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

طريقة التحكم :

يتكون محرك السيرفو داخلياً من دارة تحكم "تكون في الغالب مايكروكنترولر " , و عندما نعطي المحرك نبضات Pulses بثابت زمني معين يدور المحرك للزاوية حسب هذا الثابت الزمني .

في كل نوع يختلف الثابت الزمني من محرك إلى الآخر حسب جهة التصنيع و النشرة الفنية التي تأتي مع محرك السيرفو .



في بيئة أردوينو البرمجية هناك مكتبة تسمى Servo Library مثبتة في البرنامج , هذه المكتبة تعطينا الإمكانية للتحكم في أغلب محركات السيرفو ذو ال180درجة , و مع نهاية هذه التدوينة ستكون لديك القدرة على استخدام اوامر هذه المكتبة عن طريق الأمثلة العملية .



ما ستحتاجه لتنفيذ هذه التجربة :




1)بطاقة أردوينو.

2)محرك سيرفو .
3)اسلاك توصيل.
4)مصدر تغذية خارجي" Power supply,battery "

طريقة التوصيل :



تذكر إذا كان محرك السيرفو الذي تملكه كبير أو يحتاج لتيار عالي , يجب توصيله مع مصدر جهد خارجي كالبطارية "و هو أفضل و أكثر أماناً 





لمحرك السيرفو الذي نستخدمه 3 اسلاك و هي :

1) مدخل تغذية Vcc "و يكون بين 4.8 - 6 فولت"
2) مدخل الأرضي Gnd
3) مدخل التحكم Data و الذي نرسل الأوامر عبره لمحرك السيرفو .


بعد هذا سنبدأ بالبرمجة :


هذا البرنامج البسيط يقوم بتدوير المحرك بمقدار 9 درجات كل مرة بثابت زمني 200ملي ثانية مع و عكس عقارب الساعة 

// created by Mohannad Rawashdeh

//for Genotronex blog

//connect  Data pin of servo with D9

#include <Servo.h>
Servo S3003; //Define the name of Servo object
int t=200;
int Servo_angle=0;// set the angle of servo 
void setup(){
  S3003.attach(9);//connect servo to Pin D9
 Serial.begin (9600);
}
void loop(){
  for(Servo_angle=0;Servo_angle<180;Servo_angle+=9) {
    S3003.write(Servo_angle);
    delay(t);
  }
   for(Servo_angle=180;Servo_angle>0;Servo_angle-=9) {
    S3003.write(Servo_angle);
    delay(t);
  }
  
}
لنتذكر أمراً مهماً جداً هو أن السيرفو يحتاج لنبضات دقيقة للتحكم به , و ليست كل مداخل المتحكم مؤهلة للتعامل مع محرك السيرفو .
يمكنك استخدام أي مدخل من المداخل التناظرية Analoge (A0-A5)  و استخدام المداخل الرقمية التي تدعم التعديل النبضي PWM و هي (D3,D5,D6,D9,D10,D11) " في بطاقات الأردوينو التي تستخدم المتحكم ATMEGA328 مثل الUNO  "

حتى تبدأ استخدام أي مكتبة يجب عليك وضع هذا الكود

#include<lib.h>


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

#include <Servo.h>

الآن نستطيع التعامل مع اوامر هذه المكتبة .
ثم يجب أن ننشئ اسماً لمحرك السيرفو لنتعامل معاه في البرنامج , يكتب الأمر على الصورة 

Servo Name;

Name: هو اي اسم تختاره للتعامل مع محرك السيرفو

لكي نُعرّف المدخل pin الذي اوصلنا محرك السيرفو معاه , نكتب الكود :

Name.attach(Pin Number);


Name: هو اسم محرك السيرفو الذي وضعناه في بداية البرنامج

Pin number: رقم المدخل الموصول معه محرك السيرفو 


لكي نرسل أمر للمحرك بالدوران , هذا الأمر بسيط و يكون بالشكل التالي :

Name.write(val)

Name: هو اسم محرك السيرفو الذي وضعناه في بداية البرنامج

val : قيمة صحيحة محصورة بين 0 – 180

لنتذكر أمراً مهماً جداً هو أن السيرفو يحتاج لنبضات دقيقة للتحكم به , و ليست كل مداخل المتحكم مؤهلة للتعامل مع محرك السيرفو .

يمكنك استخدام أي مدخل من المداخل التناظرية Analoge (A0-A5) و استخدام المداخل الرقمية التي تدعم التعديل النبضي PWM و هي (D3,D5,D6,D9,D10,D11) " في بطاقات الأردوينو التي تستخدم المتحكم ATMEGA328 مثل الUNO " 


في الجزء الثاني سنتحدث فيه عن محركات السيرفو ذات الدوران الكامل 360 درجة , الى اللقاء 

25 التعليقات :

  1. عايزه اعرف ازاي احرك 2سيرفو في نفس الوقت

    ردحذف
    الردود
    1. فقط قومي بتعريف محركين عن طريق الامر
      S3003_1.attach(9);
      S3003_2.attach(10);

      حذف
  2. من فضلك أريد موضوع عن كل أوامر اردوينو ، وماذا نفعل في الكود عند اضافة شئ مثل اظافة محرك او حساس الخ... وشكرا

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

      يعتمد حسب الحساس او المحرك الذي تتم اضافته و متطلبات تشغيله , هذا الأمر ليس عاماً و انما يحتاج لممارسة دائمة حتى تصل لمراحل متقدمة في البرمجة و بناء الأنظمة المضمنة embedded sys

      حذف
  3. سؤال لو سمحت هنا ليه مستخدمتش drive ؟
    و ايه اهمية serial.begin ؟

    ردحذف
    الردود
    1. لان محرك السيرفو داخلياً يحتوي على دارة قيادة driver . هذه أكبر مزاياه .

      serial.begin أمر يبدأ فيه الأتصال مع الحاسوب و اظهار البيانات على شاشة السيريال

      حذف
    2. اولا شكرا على المجهود الرائع ..
      ما هي البيانات التي تقصدها بانها تظهر على الشاشة ؟
      انت ما استخدمت السيريال مع السيرفو مش هيك ؟
      شكرا لمجهودك وبارك الله فيك

      حذف
    3. قصدت السيريال مخصص لتبادل البيانات .

      نعم لم استخدمه مع السيرفو

      حذف
  4. السلام عليكم ورحمة الله
    شكرا جزيلا اخي على هذا الشرح الوافي

    عندي سؤال .. أنا أجيد استخدام برنامج المايكروسي للبيك .. هل أستطيع أن أشتغل بالاردوينو بواسطته ؟ لأني لا أفهم لغة الأردوينو

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

      البيك يمكن برمجته على برمجية مفتوحة المصدر اسمها Pinguino اما انه الأردوينو لغة صعبة فهذا غريب بصراحة ....

      حذف
  5. السلام عليكم ورحمة الله وبركاته
    شكرا للشرح الرائع
    كنت عاوز اعرف ازاى ابرمج محركين سيرفو للتحكم اليديوى بس لاسلكيا
    مثال : طائرة صغيره تعمل بالتحكم عن بعد ويوجد بها محركات سيرفو
    عند رفع الجناح وخفضه من خلال جهاز التحكم يديويا ترسل الداتا لاسلكيا الى محركات السريفو فى الطائره ... اتمنى ان تكون الفكره واضحه
    ويريت لو فى كتاب تدلنى عليه

    ردحذف
    الردود
    1. السؤال المهم ما نوع التحكم اللاسلكي ؟ هل هو ريموت متعدد القنوات 2.4GHz ؟ ان كان كذلك فيوجد مستقبل خاص لهذا الريموت و يدعم التحكم بالسيرفو بسهولة , و ان كان غير ذلك يرجى التوضيح اكثر

      حذف
  6. السلام عليكم
    ممكن شرح او تدلني على كتاب عن محركات السيرفو الكبيره (الصناعيه) واكون لك شاكر

    ردحذف
    الردود
    1. الأسهل هو الذهاب للنشرات الفنية الخاصة بالمحرك المطلوب يكون فيه معلومات مفصله لكل شيء .

      حذف
  7. لو سمحت ان عندي استفسار المواتير السيرفو عند فصل مصدر الطاقه يتم طلب هومنيج اوتوماتيك.
    انا عاوز افصل بين الهومنيج وبين عزل مصدر الطاقه. بمعني ان يطلب هومنيج لما انا احتاج فقط مش كل عطل يطلب مني هومنيج هذا لتوفير الوقت فيه طريقه لكدا وشكرا لحضراتكم

    ردحذف
    الردود
    1. لم افهم كلمة "" هومنيج ""

      حذف
    2. الرجوع لنقطه الزيرو

      حذف
    3. سنحتاج لحساس سرعه خاص بالروبوت Encoder لقياس المسافة التي سيقطعها الروبوت خلال زمن معين , ثم ستحتاج إلى بوسله compass لتحديد زاوية الحركة .
      البرنامج سيكون بحاجة لنباء خوارزمية خاصة لتخزين الثيم المعطاه و استدعاءها بطريقة تضمن تطبيق الوظيفة المطلوبة

      حذف
  8. السلام عليكم اخي الكريم
    شكرًا جزيلا علي هدا الشرح الرائع
    ولاكن اريد ان اشرح لك مشكلتي
    انا اعمل علي مشروع system control
    وهو ربط السيرفو موتور بي موديول RFID
    وقمت بي التوصيلات السليمة الموديول و السيرفو و عملت الكود و استعنت بي بعض الأصدقاء لعمل الكود وفكرة المشروع عندما تقوم بي سكان للبطاقة الافتراضية يتحرك السيرفو بدرجة 90
    وهدا الكود متاعي
    #include


    #include
    #include

    Servo microservo9g;

    #define SS_PIN 10
    #define RST_PIN 9
    // definitions pine modulo RC522
    MFRC522 mfrc522(SS_PIN, RST_PIN);

    // Leds indicators access released or denied
    int led_green = 5;
    int led_red = 6;


    int pos = 0;

    void setup()
    {

    pinMode(led_green, OUTPUT);
    pinMode(led_red, OUTPUT);

    // Define that o servo this connected a port digital 3
    microservo9g.attach(3);
    // Move o servo TO a position early (cancels closed)
    microservo9g.write(pos);
    // starts a serial
    Serial.begin(9600);
    // starts SPI bus
    SPI.begin();
    // Starts MFRC522
    mfrc522.PCD_Init();
    // posts early no serial monitor
    Serial.println("Scan your card");
    Serial.println();



    }

    void loop()
    {
    // Waits for the approximation of the Card
    if ( ! mfrc522.PICC_IsNewCardPresent())
    {
    return;
    }
    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial())
    {
    return;
    }
    // display UID on serial
    Serial.print("UID da tag :");
    String content= "";
    byte letter;
    for (byte i = 0; i < mfrc522.uid.size; i++)
    {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " " : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " " : " "));
    content.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    Serial.println();
    Serial.print("Message : ");
    content.toUpperCase();

    // head are the Cardboard1 It was shore
    if (content.substring(1) == "E3 44 19 13")
    {
    // lifts a cancel and lights the led green

    microservo9g.write(pos);

    digitalWrite(led_green, HIGH);
    Serial.println("Cardboard1 - released Access !");
    Serial.println();
    delay(150);
    microservo9g.write(pos);

    digitalWrite(led_green, LOW);
    }

    // head if the read was Cardboard2
    if (content.substring(1) == "54 74 1B 96")
    {
    Serial.println("Cardboard2 - Access Denied !!!");
    Serial.println();
    // Flashes the red LED
    for (int i= 1; i<5 ; i++)
    {
    digitalWrite(led_red, HIGH);
    delay(100);
    digitalWrite(led_red, LOW);
    delay(100);
    }
    }
    delay(500);
    }



    الموديول اشتغل تمام بس عندما أقوم بي سكان للبطاقة السيرفو لا يشتغل
    وأرجو الرد و شكرًا

    ردحذف
  9. اولا شكرااااا جداااااااااااااااا على المجهود ده
    ثانيا هل سيرفو 360 هيحتاج انزله مكتبه خاصه ؟

    ردحذف
  10. شكرا على المجهود بس فين الجزء التانى من المقال ؟
    شكرا مقدما

    ردحذف
  11. السلام عليكم
    سوالي كيف استطيع ان احسب زاوية دوران المحرك

    ردحذف
    الردود
    1. للتوضيح انا وصلت محرك معا الاردينو 328 معا مقاومة متغيره جهد من 0 الي5 فولت للعلم زاويةالمحرك 180 كيف نحسب زاويه دوران المحرك بالدقه

      حذف
  12. ينفع اعمل روبوت يحل متاهه باستخدام التراسونيك واحد ومحرك سيرفو

    ردحذف
  13. شكرًا على التوضيح
    وأريد من حضرتك إن شاء الله تدلني على شي
    عندي ماكينه Cnc foam cutter بها اربعه مواتير بها موتور عطلان كيف لي ان احصل عليه علما بان الموتور globe motors. ولقد انمحت بياناته والسريل نمبر وو

    ردحذف

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.