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

راه اندازی سروو با آردوینو و ایجاد PWM

نوشته شده توسط حسین فهیمی

به نام خدا

سروو موتور (Servo motor) یا موتور کنترل نوعی از موتورهای الکتریکی است که با هدف بکارگیری در سیستم‌های کنترل فیدبک طراحی می‌شود. این موتور ها قدرت زیادی دارند و میتوانند وزن زیادی را متحمل شوند. زاویه چرخش سروو موتور ها از ۰ تا ۱۸۰ درجه است اما سروو موتور هایی وجود دارند که میتوانند ۳۶۰ درجه هم دور بزنند. با استفاده میکرو کنترل ها و دادن پالس به آن می توانیم موقعیت شافت را بصورت دقیق مشخص کنیم ، سرعت عملکرد سروو موتور ها بسیار زیاد است . چون میزان لختی یا اینرسی در آن بسیار کم است  و همچنین قدرت زیادی دارند از آنها در موارد مختلف مانند هواپیما های مدل ، چرخش تخم های دستگاه جوجه کشی ، ساختن انواع بازو های الکترونیکی ، ساختن ربات های انسان نما و … مورد استفاده قرار می گیرند .

برای راه اندازی این نوع موتور ها ، باید پالسی بین ۱ تا ۲ میلی ثانیه ایجاد کرد.

لوازم مورد نیاز برای انجام پروژه :

 

اتصالات :

  • سیم زرد سروو(servo) به پین ۹ آردوینو (arduino)
  • سیم قرمز سروو(servo) به ۵v Vcc
  • سیم قهوه ای سروو(servo) به Gnd
  • Vcc و Gnd پتانسیومتر رو خودتون وصل کنید
  • خروجی پتانسیومتر به پین A0 آردوینو (arduino)

 

 

این هم از کد :

 

#include <Servo.h>
Servo myservo;
int pot;

void setup() {
  myservo.attach(9);
}

void loop() {
  pot = analogRead(A0);
  pot = map(pot, 0, 1023, 0, 180);
  myservo.write(pot);
}

 

فراخوانی کتابخانه سروو جهت ارتباط برقرار کردن با سروو(servo) موتور

#include <Servo.h>

 

ایجاد یک شی جدید از جنس سروو با نام myservo

Servo myservo;

 

ایجاد یک متغییر با نام pot که قرار است مقدار آنالوگ پتانسیومتر در آن ریخته شود

int pot;

 

شروع حلقه ی محدود Setup

void setup() {

 

مشخص کردن سریال کاری دریچه ی سریال

  Serial.begin(9600);

 

معرفی پایه ای که سروو به آن متصل است و پایان حلقه ی Setup

 myservo.attach(9);
}

 

شروع حلقه ی loop

 

void loop() {

 

خواندن مقدار آنالوگ پتانسیومتر (پین A0 آردوینو) و ریختن آن در رجیستر pot

  pot = analogRead(A0);

 

تناسب بندی توسط تابع map بین مقدار آنالوگ پتانسیومتر از ۰ تا ۱۰۲۳ بین درجه ی سروو(servo) از ۰ تا ۱۸۰

  pot = map(pot, 0, 1023, 0, 180);

 

دستور دادن به سروو(servo) توسط تابع write و رفتن در زاویه ی مورد نظر توسط پتانسیومتر

  myservo.write(pot);

 

نوشتن زاویه ی سروو(servo) در دریچه ی سریال

 Serial.println(pot);

 

صبر برای قرار گیری سروو(servo) در زاویه ی مورد نظر و پایان حلقه ی loop

 delay(100);
}

 

 

اگر بخواهیم سروو(servo) به صورت خودکار و بدون پتانسیومتر در درجه ای دلخواه قرار گیرد برنامه بدین شکل تغییر میکند :

#include <Servo.h>
Servo myservo;

void setup() {
  myservo.attach(9);
}

void loop() {
  myservo.write(180 تا ۰ از دلخواه درجه نوشتن);
}

 

اگه مشکلی داشتین تو قسمت نظرات بنویسید تا رفعش کنم….

درباره نویسنده

حسین فهیمی

تبادل نظر و رفع عیب با ثبت دیدگاه

۵۴ دیدگاه

  • یه اموزش هم برای موتور های ۳۶۰ درجه بزارید لطفا یا بگید چجوری با اردوینو کنترلش کنم خیلی نیاز دارم ممنون

    • سروو موتور ۳۶۰ درجه فرق زیادی با سروو ی ۱۸۰ درجه نداره !!! فقط برای سروو ی ۱۸۰ در قسمت write میتونید یه عدد از ۰ تا ۱۸۰ وارد کنید و سروو تو همون زاویه میمونه ولی در سروو موتور ۳۶۰ در قسمت write هر عددی وارد کنید موتور به همون تعداد دور میزنه!!! من اینجوری راه انداختمش…

  • ۱- دریچه ی سریال چیه و چرا ۹۶۰۰ انتخاب کردین
    ۲-مقدار ۰-۱۰۲۳ چی هست؟ واحدش چیه؟
    ممنون از مطلب بسیار مفیدتون

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

    • با سلام
      ضمن تشکر از توجه شما، خیر سرعت سروو موتور ثابت است و فقط میتوانید زاویه را کنترل کنید.

  • سلام خسته نباشید من دو تا سرو موتور MG996R رو با اردینو میخوام روشن کنم رو شن نمیشه…این برنامه هم دادم اما روشن نشد…
    باید چیکار کنم؟؟؟
    پروژه دنبال کننده خورشیدی هست..

  • سلام اگه میشه برنامه ای بزارین که بشه با اردینو پتانسیومتر رفت و برگشت سرو ها رو درست کرد.برای رباط بازو با چهار درجه ازادی وقابلیت۱۸۰درجه چرخش دارد.لطفا سریع جواب بدید

  • سلام، سروو ۳۶۰ درجه جهت و سرعت چرخشش فقط قابل تنظیمه.به این صورت که:
    servo.write(89-100)=سرعت۰

    servo.write(180)= سرعت( بیشترین)، جهت(چپگرد)
    servo.write(101)= سرعت( کمترین)، جهت(چپگرد)

    servo.write(0)= سرعت( بیشترین)، جهت(راست گرد)
    servo.write(88)= سرعت( کمترین)، جهت(راست گرد)
    برای اطلاع بیشتر:
    https://forum.arduino.cc/index.php?topic=521760.0

    • با سلام
      از توجه شما سپاسگزارم. پیشنهاد می‌شود موارد اینچنینی را همانند توضیحاتتان، ارایه بفرمایید. هدف ما تولید محتوای فارسی و کمک به توسعه وب فارسی می‌باشد.

  • سلام من تازه میخوام آردوینو رو شروع کنم لطفا برای یاد گیری مرجع خوب معرفی کنید
    برا راه اندازی یک سروو ۱٫۸ کیلو وات هم میشه از آردوینو استفاده کرد

  • سلام برای من ارور کتابخانه میده . نمیدونم باید کجا کتابخانه رو دانلود کنم .
    توی منابع کتابخونه ام هم #include نیست .
    لطفا کمکم کنید .

  • درود
    بابت اموزش کامل تون و وبسایت پر از آموزشتون تشکر میکنم.
    میخواستم ببینم آیا میشه سرعت چرخش سروو رو تنظیم کرد؟
    سپاس فراوان

    • با سلام
      بله امکان پذیر است.
      در این خصوص بایستی از تابع delay و یا استفاده از توابع switch case و for شرط های زمانی جهت حرکت شافت سرو موتور در نظر بگیرید.

  • ببخشید من مى خوام تو یک برنامه یک سروو رو با یک پتانسیومتر و یک سروو دیگه رو با پتانسیومتر دیگه کنترل کنم چطور مى تونم یک سروو دیگه توى برنامه بزارم با نام دیگه .

    • با سلام
      کافیست سرو دوم را با متغیر متفاوت دیگری تعریف نمایید. به عنوان مثال اگر دو سرو دارید به صورت زیر تعریف نمایید:
      myservo1;
      myservo2;
      و به همین ترتیب در کدها تعمیم دهید.

  • سلام
    برای راه اندازی ۳ استپر موتور و ۴ تا سروو موتور به صورت همزمان با آردوینو چه چیزی لازم هست؟

    • با سلام
      کاربر گرامی در این خصوص بایستی از توابع شرطی در برنامه نویسی آردوینو استفاده کنید که نیاز به دانش برنامه نویسی خواهد داشت.

  • سلام.
    برای اولین بار هست که با سروو کار میکنم و چون آشنایی ندارم بعضی چیزهای ساده برام سوال هست. یه سروو MG996R گرفتم و با آردوینو اونو فعال کردم. اما چندتا ایراد توی کار میبینم.

    اول اینکه سروو بصورت دایم چیزی در حدود ۱۰۰mA جریان می کشه. یعنی وقتی سیم مثبت و منفی سروو رو وصل میکنیم، آمپر صفر هست. اما به محض اتصال سیم (نارنجی) PWM سروو حدود ۱۰۰mA جریان میکشه. فرقی هم نمیکنه که تو چه زاویه ای باشه. (این جریان غیر از جریان هنگام چرخش زاویه سروو هست).
    آیا این طبیعی هست؟
    و از اون مهمتر، اگر طبیعی هست، راهی به نظر تون میرسه که این جریان کشی بی مورد رو حذف کنم؟
    چون میخوام پروژه نهایی رو با باطری راه اندازی کنم و مدیریت جریان خیلی برام اهمیت داره.

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

    برد آردوینو، هم Uno هم Mega دارم. اما عملکرد سروو با هر دو یک شکل هست.
    دستوراتی که برای تست اولیه و راه اندازی موقت سروو استفاده کردم به این شرح هست:

    #include
    int servopin3 = 3; //Servo signal pin is attached to pin 3
    Servo servo3; // define a servo No 2

    void setup() {
    servo3.attach (servopin3);
    }

    void loop() {
    servo3.write(0);
    delay (10000);
    servo3.write(105);
    delay (10000);
    }

    ممنون میشم اگه راهنمایی بفرمایید.

    • با سلام
      در نظر داشته باشید سرو موتور MG996 دارای ولتاژ ورودی ۴٫۸ ~ ۶ است و برای راه اندازی به ولتاژ ۶ ولت نیاز دارید که در این ولتاژ جریان عبوری بین ۵۰۰ تا ۹۰۰ میلی آمپر است و به همین دلیل به تنهایی با برد آردوینو راه اندازی نمی‌شود.

      • مجدد سلام
        ممنون از پاسخگویی.
        شاید درست این بود که در مطلب بالا عرض میکردم برای راه اندازی این سروو از منبع تغذیه مجزا استفاده کردم که زمین اون رو با آردواینو مشترک کردم. تصورم این بود که با گفتن مقدار آمپری که سروو تو حالت بی باری میکشه، متوجه عرضم میشید.
        لذا ممنون میشم با توجه به این موضوع پاسخ سوالاتم رو بفرمایید.

        • با سلام
          ضمن تشکر از توضیحات کامل شما، این مورد توسط بنده تست نشده است و در صورتیکه تست آن اجرا شود، حتما نتیجه را اعلام خواهم کرد. لذا از دیگر دوستانی که در این خصوص تجربه ای دارند، تقاضا میکنم در بحث شرکت کنند.

      • مجدد سلام
        علت رو پیدا کردم. ظاهرا بعد از دستور تغییر زاویه به سروو، آردوینو دایما پالس PWM رو ارسال میکنه. یعنی ارسال پالس PWM به هیچ وجه توسط آردوینو قطع نمیشه.
        اگر بخوام دقیقتر توضیح بدم؛ وقتی دستور ;servo3.write(0) رو به سروو میدیم؛ تا زمانی که دستور ;(servo3.write(105 به سروو داده نشده، پالس PWM برای قرار گرفتن در زاویه‌ی صفر درجه بطور دایم توسط آردوینو تولید میشه و به هیچ ‌وجه قطع نمیشه. این حالت هنگام ارسال زاویه ۱۰۵ درجه و یا هر زاویه دیگه هم به همین صورت ادامه داره.
        حالا سوالم اینه که چطور میتونم بعد از ارسال مثلا زاویه صفر درجه به سروو و قرار گرفتن سروو در زاویه مد نظر، ارسال پالس PWM توسط آردوینو تا زمان ارسال دستور جدید قطع بشه؟

  • سلام مطلب خیلی خوبی بود
    فقط اگه امکانش هست آموزش کنترل کردن سروو موتور بدون کتابخانه رو هم بزارید.

    • با سلام
      این مورد تست نشده است و پیشنهاد می‌شود از دستورات کتابخانه استفاده کنید.

  • سلام خسته نباشی من با برد نانو یک رادیو کنترل ساختم که همه چیش درسته فقط موقع برنامه نوشتن کامپایل نمیکنه اخرش ارور میده که عدد صفر کد برگشت نیست کد زیر اخرش فکر کنم ارور مربوطشه . تازه کارم این یعنی چی ممنون میشم کمکم کنید
    /sdk/hardware/tools/avr/bin/avr-g++ -no-canonical-prefixes -std=gnu++11 -c -g -Os -w -mmcu=atmega328p -DF_CPU=16000000L -DUSB_VID=null -DUSB_PID=null -DARDUINO=10812 -DIDE=”ArduinoDroid” -DARDUINO_ARCH_AVR -DARDUINO_AVR_UNO /build/sketch_sep03a.cpp -o /build/sketch_sep03a.cpp.o /sdk/hardware/tools/avr/bin/avr-gcc -no-canonical-prefixes -Os -Wl,–gc-sections -Wl,-T /sdk/hardware/tools/avr/avr/lib/ldscripts/avr5.x -mmcu=atmega328p -o /build/sketch_sep03a.cpp.elf /build/sketch_sep03a.cpp.o /coreBuild/core.a -L/build -lm /coreBuild/core.a(main.cpp.o): In function `main’:
    /sdk/hardware/arduino/cores/arduino/main.cpp:11: undefined reference to `setup’
    /sdk/hardware/arduino/cores/arduino/main.cpp:14: undefined reference to `loop’
    collect2: error: ld returned 1 exit status
    Return code is not 0

    • با سلام
      با توجه به اینکه سوال با آموزش مرتبط نیست و روند احرای پروژه مشخص نیست، امکان راهنمایی وجود ندارد.

  • سلام روز بخیر من برای پروژه باید ۷ سرو موتور به وسیله برد اردوینو نانو کنترل کنم که یک پایه pwm کم دارم باید چکار کنم هم در برنامه نویسی هم برای پین خروجی

  • زمانی که از کتابخانه تایمر ۱ استفاده میکنم دیگه خروجی های PWM که برای سروو استفاده شده کار نمیکنه باید چیکار کنم که هم وقفه تایمر ۱ داشته یاشم و همم بتونم از سروو استفاده کنم؟

    • با سلام
      کد برنامه در دسترس است. اگر با اروری مواجه شده اید ارور را ضمیمه کنید تا بررسی شود.

    • با سلام
      چه کدی را میفرمایید. کد پروژه در متن آموزش قرار گرفته شده است.

  • سلام جناب خسته نباشید من سرو موتور mg90s رو سیم زرد در اردینو به پایه ۹ و سیم قرمز به ۵v وسیم قهوه ای رو gnd وصل کردم و سیم رو متصل کردم به کامپیوتر با ویندوز ۱۰ و اینکه بعد از کتابخانه روی servo و بعد sweep اپلود کردم ولی هیچ حرکتی ندیدم تو این باره خیلی مشکل دلرم و اینکه مینی پلاتر و مینی سی ان سی درست کردم روی محور x y حرکت دارم ولی نمیتونم سرو موتور تکون بدم خلاصه تو کد نویسی و پیدا کردن مشکل جدی دارم لطفا کمکم کنید ممنون میشم

    • با سلام
      کاربر گرامی در نظر داشته باشید تغذیه سرو موتور را بایستی از منبع تغذیه جداگانه تامین کنید.