راه اندازی سرو موتور با آردوینو

سرو موتور یا Servo motor  نوعی موتور الکتریکیه که برای راه اندازی سرو موتور با آردوینو اغلب از شیلد ها و درایور های مخصوص سروو موتور استفاده میکنن ، اما قراره ما در این مطلب و با استفاده از PWM و  کتابخانه ی Servo.h این موتور رو راه اندازی کنیم.

در مطلب سرو موتور چیست ؟ کامل توضیح دادم که این موتور چیه و چطور کار میکنه و درمورد ساختارش توضیح دادم ، اما خب اگه اونو نخوندید بهتره که یکبار نگاه بندازین 🙂

اما بازم یک توضیح کوتاه میدم درمورد این موتور:
سرووموتور ، موتور دقیقیه که روتور یا شافت اون رو میشه با زاویه ی دلخواهی تنظیم کرد. این دقت سبب میشه که این موتور جایگاه خوبی توی صنایع داشته باشه ، صنایعی مثل روباتیک . هواپیما سازی..

سرووموتور DC از سه قسمت عمده ی زیر تشکیل شده.

  1. موتور DC
  2. قسمت مکانیکی برای افزایش گشتاور
  3. مدار حسگر موقعیت و کنترل موتور

روتور این موتور برخلاف موتور DC به راحتی نمیچرخه ،و تحت عملکرد مداری الکترونیکی قرار داره و ما رو از طراحی مدار حسگر و کنترل موقعیت بی نیاز می کنه. همچنین این موتور تقویت کننده ی جریان هم داره و خروجی میکرو رو میشه مستقیم به موتور وصل کرد.

سرو موتور ها مدل های زیادی دارن ، اما بعنوان نمونه من سرو موتور SG92R رو در نظر میگیرم که نسبت به قیمت و حجم مناسبش پرکاربرده.

سرو موتور SG92R

این موتور 3 سیمه ، که دوسیم اون مربوط به تغذیه (قرمز و قهوه ای) و سیم دیگه سیم کنترلی هستش که به میکرو وصل میشه. بازه ی حرکت موتور 180 درجه هستش  که میشه با زاویه ی 90 درجه به طرفین بچرخه،

زاویه ی چرخش با عرض پالسی تعیین میشه که به سیم کنترلی اعمال میشه.با عرض پالس یک میلی ثانیه ، موتور 90 درجه به چپ ، 1.5 میلی ثانیه ، وسط و 2 میلی ثانیه ، موتور 90 درجه به راست میچرخه که این پالس های کنترلی هر 20 میلی ثانیه باید تکرار بشه.

یه چیز خیلی باحال کتابخونه ی Servo اینه که ، توابع کتابخونه ی Servo.h تا 12 موتور در بردهای معمولی و 48 موتور توی بردهای سری Mega  رو پشتیبانی میکنن.البته بدی هم داره ، مثلا توی بردهای غیر Mega ، هنگام استفاده از این توابع ، عملکرد PWM پایه های 9 و 10 غیرفعال میشه و توی بردهای Mega اگر تعداد موتور ها از 12 تا بیشتر بشه پایه های 11 و 12 خروجی PWM نمیدن.

توابع راه اندازی سرو موتور با آردوینو

تابع Servo

این تابع متغیری از نوع Servo تعریف میکنه که میشه با اون موتور رو کنترل کرد و باید برای هر موتوری که برد وصل میکنیم یک بار اونو با نامی متفاوت تعریف کنیم.

در واقع این تابع یک متغیر ایجاد میکنه و باید اسمی برای هر موتور بزاریم ، مثال اولو ببینید کامل متوجه میشید 😉

تابع servo.attach

این تابع شماره پایه ای رو مشخص میکنه که موتور به آن متصل میشه و قالب اون بصورت زیره:

pin:مشخصه که شماره پایه برای اتصال به موتور هستش.

min و max : پارامترهای min و max به ترتیب کمترین و بیشترین عرض پالس برای چرخش صفر و 180 درجه رو تعیین میکنه که این اعداد بصورت پیش فرض 544 و 2400 میکروثانیه در نظر گرفته شدن.

مثال 1:

تابع write :

این تابع برای تنظیم زاویه یا سرعت موتور به کار میره. مقدار زاویه میتونه از صفر تا 180 درجه متغیر باشه.اگر موتور با چرخش پیوسته ( سرو موتور 360 درجه ) استفاده کنیم که تنها قابلیت تنظیم سرعت داره ، ورودی صفر و 180 به ترتیب به معنای چرخش  با سرعت کامل در دو جهت مخالف و 90 بدون هیچ چرخشی هست.

 

مثال: یک برنامه که سروو موتور رو ابتدا از صفر تا 180 درجه و سپس بلعکس حرکت میده :

پروژه آموزش راه اندازی سرو موتور

توی این کد بیشترین مقدار عرض پالس رو برای چرخش 180 درجه ای 1000 و 2000 میکروثانیه در نظر گرفتیم .( همیشه قطعات دقت لازم رو ندارن و اگه این چرخش بدست نیومد ، با کمی سعی و خطا و بالا پایین کردن این ارقام، چرخش تصحیح میشه) در حلقه بی نهایت (void loop) هر 20 میلی ثانیه ، زاویه ی چرخش رو از صفر تا 180 درجه یک واحد افزایش میدیم و بعدش همین عمل رو از 180 تا صفر درجه بصورت کاهشی انجام میدیم.

 

و مثال دوم که با تغییر پتاسنیومتر زاویه ی چرخش سرو موتور تغییر میکنه:

 

تابع writeMicroseconds(uS)

این تابع پالسی با عرض دلخواه به سروو اعمال میکنه ، بازه ی زمانی بین 1000 میکروثانیه برای چرخش حداکثر پادساعت گرد ، 2000 میکروثانیه برای چرخش ساعت گرد و 1500 میکروثانیه برای چرخش به سمت وسطه. البته بدونید که این اعداد ممکنه دقیقا با موتور شما کارنکنه ولی با سعی و خطا عددی بین 700 تا 2300 میکروثانیه ، حداکثر چرخش رو برای شما ایجاد میکنه.

سرعت موتورهای با چرخش پیوسته ( سرو موتور 360 درجه ) نیز به همین ترتیب تغییر می کنه.
تابع read

این تابع زاویه ی کنونی چرخش سروو رو بعنوان خروجی میده که عددی بین 0 تا 180 درجه هست.

تابع attached

این تابع بررسی میکنه که آیا پایه ای به سروو متصل هست یا نه و خروجی اون true  یا false هستش.

تابع detach

این تابع پایه ای که قبلا به سروو اختصاص داده شده بود رو آزاد میکنه و میشه پایه رو برای تولید پالس PWM به کار برد.

مثال:
میخوایم موتوری که به پایه 9 وصل هستش ر, به اندازه 90 درجه بچرخونیم و بعد پایه رو ازاد کنیم.

اینم pdf سرو موتور و  آموزش سایت adafruit به زبون انگلیسی . البته مطلبی که خوندین تمامی بخش های اونو پوشش میداد !

آموزش سرو موتور PDF

 

دوستان سوال داشتین یا از نظرتون جایی کامل توضیح داده نشده بود توی کامنتا بپرسین 🙂 قطعا ارتباط 2 طرفه آموزش هارو بهتر میکنه و به ما انرژی بیشتری میده.

ADS

حمیدرضا مودت

یک مهندس الکترونیک ، علاقه مند به یاد دادن و یاد گرفتن پیرامون دانش برق و الکترونیک

مطالب مرتبط

11 دیدگاه‌

  1. ENERGY001 گفت:

    سلام روز به خیر .
    مهندس مطلب بسیار عالی بود . اما اگه یه سری اشتباهات نداشت نور الی نور بود .
    مثلا اینکه به کلاس میگید تابع اصلا جالب نیست .
    شما باید بگین کلاس Servo نه تابع سروو .
    Servo یه کلاس هست که یه سری متدا واسه کار با اون داره . مثلا متد write مثلا متد read .
    مثلا این کد :
    Servo sr1;
    یه آبجکت به نام sr1 از کلاس Servo میسازه …
    اینا مفاهیم شی گرایی هستن که بهتره از همین ابتدا بهشون توجه بشه تا بد جا نیوفته …

    • سلام، از این دست کامنت ها شدیدا استقبال میکنم چون هیچ ویراستاری نوشته های منو مجددا بررسی نمیکنه بجز خواننده های وبسایت.
      درست میگی ، در خیلی از مطالب مثل آموزش SD card و i2c و … سعی کردم از بیان صحیح هم استفاده کنم و کلاس و از تابع جدا کنم .حتی توی سری آموزشی هم چندین بار و چندین خط کلاس رو تعریف کردم اما اینجا فراموش شده مثل اینکه.
      ولی یک چیزی هم که متاسفانه جا افتاده اینه که خیلی ها تابع سرچ میکنن و نوشتن کلاس گاهی به ضرر سایت و دیده نشدن اون میشه….
      مرسی از نظرتون

  2. elyaserfani گفت:

    سلام و خسته نباشید به شما،لطف کنین چگونگی راه اندازی شش موتوره همراه با برنامش،بگذارین توی سایت با تشکر

  3. رضا گفت:

    سلام مهندس اقا من یه مشکل بزرگ دارم اونم اینه که میخوام چرخش سروو مثلا از راستگرد به چپگرد تبدیل کنم جهت چرخش سروو رو چطوری تغییر بدم ؟ دمت گرم اگه کمک بکنی

  4. علی گفت:

    سلام من دو تا joy stick از دسته بازی برداشتم هرکاری می کنم نمی تونم v5 و gnd اش رو مشخص کنم ؟ باید چیکار کنم ؟ اینم از عکسش … ممنون میشم راهنماییم کنین
    http://s8.picofile.com/file/8332619426/1532416924975_1432291960.jpg

  5. علی گفت:

    سلام ممنونم از سایتتون.من یه برنامه نوشتم با جوی استیک و سروو.ولی هروقت با جوی استیک کار میکنم دستمو‌از روش برمیدارم سروو به حالت قبل برمیگرده.چیکار میتونم بکنم؟

  6. احمد گفت:

    آقا ناموسا دمت گرم
    خیلی مردی

  7. shaker گفت:

    سلام مهندس ممنون بابت سایت خوبتون
    این پروژه رو نوشتم اما متاسفانه کامپایل نمیشه ممنون میشم علت رو بفرمایید fatal error: servodoth: No such file or directory
    #include


    #includ Servo.h
    Servo myservo ;
    int pos = 0;
    void setup() {
    // put your setup code here, to run once:
    myservo.attach(9,1000,2000);
    }
    void loop() {
    // put your main code here, to run repeatedly:
    for (pos = 0; pos= 0; pos -=1 ){
    myservo.write(pos);
    delay(15);
    }}

    اینم کدی که نوشتم و خطایی که داده
    با تشکر فراوان

    • سلام خواهش میکنم.
      کد رو داخل کامنت وقتی ارسال میکنین شاید کامل ارسال نشه.
      اما چیزی که از کد و ارور مشخصه اینِ که فایل هدر رو درست معرفی نکردین. خط اول برنامتون رو مطابق کد های داخل مطلب بنویسید .دقت کنید که servo رو باید با S بزرگ بنویسید.