آیا شما هم قصد دارید به پروژه خود، حرکت دورانی اضافه کنید؟ اگر چنین است، پس حتما به فکر راه اندازی سروو موتور با آردوینو که البته موضوع این مقاله است، افتادهاید. اما بهتر است پیش از آغاز راه اندازی این موتور، کمی بیشتر در مورد آن بدانید.
یکی از ویژگیهای این موتور این است که برخلاف موتورهای DC، با دقت بیشتری میتوانید موقعیت آنها را کنترل کنید. علاوه بر این، میتوانید از این موتور در بسیاری از پروژههای رباتیک خود نیز به عنوان مثال برای حرکت چرخشی چرخهای جلویی مدل کنترل از راه دور (RC) و چرخش سنسور دیدبان ربات استفاده کنید.
در ادامه به جزئیات بیشتری در مورد این موتور میپردازیم و راه اندازی آن را آغاز میکنیم.
سروو چيست؟
سروو (Servo) يک مفهوم كلی برای سيستمهای كنترل حلقه بسته است.
يک سيستم حلقه بسته برای تنظيم سرعت و جهت چرخش موتور، از فيدبک استفاده میکند تا به این شکل به نتیجه مطلوب برسد.
سروو موتورهای RC نيز عملكرد مشابهی دارند. اين سروو موتورها دارای يک موتور DC كوچک هستند كه از طريق يک گيربكس به شافت خروجی متصل میشوند. شافت خروجی نیز که به يک پتانسيومتر (pot) متصل است، بازوی سروو را حركت میدهد.
پتانسيومتر، فيدبک موقعيت را برای واحد كنترل سروو تامین میکند. واحد کنترل نیز با مقایسه موقعيت لحظهای موتور با موقعيت مورد نظر، موقعيت واقعی آن را براساس ميزان خطا تصحيح میكند تا موتور در موقعيت مورد نظر قرار بگیرد.
نحوه كار سروو موتور
برای راه اندازی سروو موتور با آردوینو ، حتما باید با نحوه عملکرد این موتور آشنا شوید.
شما میتوانید با ارسال یک سری پالس به خط سيگنال، سروو موتور را كنترل کنید. سروو موتورهای آنالوگ معمول، تقريبا هر 20 ميلی ثانيه يک پالس دريافت میكنند ( یه عبارتی سيگنال باید 50 هرتز باشد). همانطور که در تصویر زیر مشاهده میکنید، عرض این پالسها موقعيت زاويهای شافت سروو موتور را تعیین میکنند.
- اگر پالس به مدت زمان 1 ميلی ثانيه high باشد، زاويه سروو صفر درجه است.
- اگر پالس به مدت زمان 1.5 ميلی ثانيه high باشد، سروو در موقعيت مركزی قرار میگیرد.
- اگر پالس به مدت زمان 2 ميلی ثانيه high باشد، زاويه سروو 180 درجه خواهد بود.
- پالسهايی با عرض پالس بين 1 تا 2 ميلی ثانيه باعث حركت شافت سروو در گستره 180 درجه خواهند شد.
نکته:
برخی اوقات ممکن است دوره تناوب پالسها در برندهای مختلف سروو موتور متفاوت باشد. (به عنوان مثال دوره تناوب پالسها میتواند 0.5 ميلی ثانيه برای صفر درجه و 2.5 ميلی ثانيه برای 180 درجه باشد).
پينهای سروو موتور
سروو موتورها معمولا دارای سه پين هستند. این پینها عبارت اند از:
پین GND پين زمين مشترک مدار منطقی و موتور است.
پين 5V برای اعمال توان الكتريكی به سروو است.
پين Control ورودی سيستم كنترل است.
نکته:
رنگ سيمها در سروو موتورهای مختلف ممكن است متفاوت باشد، اما در همه آنها، سيم تغذيه 5V به رنگ قرمز، سيم GND به رنگ مشكی يا قهوهای و سيم Control نیز معمولا نارنجی يا زرد رنگ است.
سیم کشی – راه اندازی سروو موتور با آردوينو
اكنون که با این موتور و پینهای آن آشنا شدید، زمان راه اندازی سروو موتور با آردوینو رسیده است. در این پروژه از برد آردوینو UNO استفاده میکنیم. البته اگر شما بردهای دیگر آردوینو را تهیه کردهاید، باز هم میتوانید طبق این مقاله پیش بروید اما ممکن است پین بردهای مختلف آردوینو کمی باهم متفاوت باشند. به همین دلیل هنگام راه اندازی با بردهای دیگر حتما به این موضوع دقت کنید.
پیش از آغاز راه اندازی، اگر به قطعات این پروژه نیاز دارید، میتوانید از طریق لینکهای زیر آنها را تهیه کنید:
- سروو موتور SG50
جک آداپتور رو بردی مادگی - برد آردوینو UNO
- کابل نری USB نوع A به نری نوع B
- آداپتور دیواری 5 ولت
در این پروژه به عنوان نمونه از ميكرو سروو موتور SG90 استفاده میکنیم. اين مدل دارای ولتاژ كاری 4.8 ولت تا 6 ولت (بهطور معمول 5 ولت) است و توانایی چرخش تقريبا 180 درجه (90 درجه در هر جهت) را دارد. اين موتور در حالت بی باری جريان 10 ميلی آمپر و در زمان حركت، جريانی بين 110 تا 250 ميلی آمپر را مصرف میکند، بنابراين شما میتوانيد آن را با خروجی 5V آردوينو تغذيه كنيد.
اگر سروو موتوری داريد كه جريانی بيش از 250 ميلی آمپر مصرف میکند، برای تغذيه آن از منبع تغذيه جداگانهای استفاده کنید. برای اتصال سروو موتور به آردوینو، سيم قرمز را به پين 5V آردوينو (يا جک DC) و سيم مشكی یا قهوهای را به زمين متصل كنيد. همچنين، سيم زرد یا نارنجی را به پين 9 آردوينو كه دارای PWM است، وصل كنيد.
اگر از یک میکرو سروو استفاده میکنید، میتوانید مستقیما آن را از آردوینو تغذیه کنید.
كد آردوينو برای کنترل حرکت رفت و برگشت سروو موتور
در اینجا کد کنترل حرکت رفت و برگشت سروو موتور را از مثالهای نرم افزار آردوينو میگیریم. برای دسترسی به این مثال، طبق تصویر زیر، به زير منوی 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 دارد. اين كتابخانه دارای دستورات سادهای است كه با استفاده از آنها میتوانيد بهسرعت سروو موتور را در موقعيت زاويهای مورد نظر خود قرار دهيد.
اگر میخواهید از دستورات اين كتابخانه استفاده کنید، بايد به نرم افزار آردوینو بگویيد كه در حال استفاده از اين كتابخانه هستيد:
#include <Servo.h>
در گام بعد باید پين آردوینو را که قرار است به پین کنترل سروو موتور متصل شود، مشخص کنید.
int servoPin = 9;
سپس، با استفاده از خط زیر، شی servo را ایجاد کنید:
Servo servo;
در واقع با استفاده از اين روش میتوانید 8 عدد سروو تعريف کنید. به عنوان مثال اگر 2 عدد سروو داشته باشید، باید کدی به شکل کد زیر بنویسید:
Servo servo1;
Servo servo2;
برای ذخيره موقعيت زاويهای فعلی سروو از متغير angle بهصورت زير استفاده کنید:
int angle = 0;
در تابع Setup، شی servo را با دستور زير به پين كنترلی ارتباط دهید:
servo.attach(servoPin);
تابع loop در حقيقت شامل دو حلقه for است. حلقه اول زاويه شافت را در یک جهت افزايش میدهد و حلقه دوم زاویه شافت را خلاف آن افزایش میدهد.
با دستور زير میتوانید موقعیت سروو موتور را به زاویه مورد نظر خود تغییر دهید:
servo.write(angle);
مشکلات احتمالی راه اندازی سروو موتور با آردوینو
ممکن است تصمیم بگیرید سروو موتور را مستقیما با آردوینو راه اندازی کنید. در چنین حالتی سروو موتور ممکن است به درستی عمل نکند. دلیل این موضوع این است که سروو موتور در لحظات اولیه راه اندازی، توان زیادی را مصرف میکند و این مسئله باعث ریست شدن برد آردوینو میشود.
اگر با چنین مشکلی برخورد کردید، كافی است يک خازن الكتروليتی نسبتا بزرگ (مانند خازن 680 میکرو فاراد) بين GND و 5V قرار دهيد.
در اینجا خازن به عنوان يک منبع ذخيره الكتريسيته عمل میكند. بنابراين توان مورد نياز موتور در لحظات اولیه راه اندازی علاوه بر تغذيه آردوينو از خازن نيز كشيده میشود. توجه داشته باشید که پايه بلندتر (مثبت) خازن باید به پين 5V و پايه منفی به GND متصل شود.
كنترل سروو موتور با پتانسيومتر
در اين بخش يک پتانسيومتر به پروژه اضافه میكنيم. با این کار، شما میتوانید موقعيت سروو موتور را با یک ولوم تنظيم کنید. این پروژه، زمانیکه میخواهید حرکت سنسور متصل به سروو موتور را کنترل کنید، بسیار مفید و کاربردی خواهد بود. پتانسیومتر و قطعات جانبی این پروژه را میتوانید از طریق لینکهای زیر فراهم کنید:
سيم كشی
همانطور که در تصویر زیر مشاهده میکنید، از یک پتاسیومتر استفاده شده است. این پتانسیومتر میتواند هر مقداری بیشتر از 10 کیلو اهم داشته باشد. از دو پایهای که در دو طرف پتانسیومتر قرار دارد، یکی را به زمین و دیگری را به 5V آردوینو وصل کنید. پایه وسط آن را نیز به ورودی آنالوگ A0 متصل کنید.
كد آردوينو برای کنترل سروو موتور با پتاسیومتر
کدی که باعث میشود موقعیت سروو موتور توسط پتاسیومتر تعیین شود، از کدی که برای چرخش سروو موتور استفاده شد، آسان تر است.
#include <Servo.h>
int potPin = 0;
int servoPin = 9;
Servo servo;
void setup() {
servo.attach(servoPin);
}
void loop() {
int reading = analogRead(potPin);
int angle = map(reading, 0, 1023, 0, 180);
servo.write(angle);
}
همانطور که در دستور زیر میبینید، يک متغير جديد به نام potPin به کد اضافه شده است. potPin در واقع نامی است که در نرم افزار برای پین آنالوگ A0 آردوینو در نظر گرفته شده است. هدف شما این است که در تابع loop، مقدار پین آنالوگ A0 را که در واقع پین آردوینو است، بخوانید.
int reading = analogRead(potPin);
با این دستور، مقداری كه در متغیر reading ذخیره میشود، مقداری بين 0 تا 1023 خواهد بود. اما از آنجایی که سروو موتور تنها میتواند در محدوده 0 تا 180 درجه حرکت کند، به همین دلیل باید مقدار ذخیره شده در متغییر reading را نیز در همین محدوده نگه دارید.
برای این کار، میتوانید از تابع ()map استفاده کنید. اين تابع مقدار يک عدد را از يک محدوده به محدوده ديگری تغییر میدهد. به همین دلیل، خط زير محدوده متغیر reading را از 0 تا 1023 به 0 تا 180 تغییر خواهد داد.
int angle = map(reading, 0, 1023, 0, 180);
در آخر، از دستور ()write برای تغییر موقعيت سروو به زاویهای که توسط پتانسيومتر انتخاب شده است، استفاده کنید:
servo.write(angle);
کلام آخر
همانطور که قبلا به آن اشاره کردیم، کنترل سروو موتور کار چندان سادهای نیست و این باعث شده است که بسیاری از افراد به راه اندازی سروو موتور با آردوینو روی بیاورند، زیرا با آردوینو شما بهراحتی میتوانید این موتور را کنترل کنید.
به هر حال امیدواریم بتوانید از این مقاله نهایت استفاده را کنید. البته هر زمان که به مشکلی برخورد کردید، حتما با نوشتن دیدگاه خود، ما را در جریان بگذارید تا بتوانیم پاسخ گوی نیازهای شما باشیم.
۲۰ دیدگاه. Leave new
سلام وقت بخیر. لطفا درباره ی نوع سیم کشی بین اردوینو و منبع تغذیه ی دوم و موتور , برای زمانیکه موتور بیشتر از ۵ ولت نیاز داره , توضیح بفرمایید.ممنون.
سلام حامد عزیز،
میتونی از درایور موتور استفاده کنی یا اینکه با ترانزیستور این کار رو انجام بدی.
به زودی مقالهای درباره درایو رله با میکروکنترلر منتشر میکنیم که روش این مقاله رو میتونی برای قطع و وصل ولتاژهای بالای ۵ ولت به موتور استفاده کنی.
سلام چطوری بدون نیاز به اردینو یا پتانسومتر میتوانیم میکرو سروو رو بخرکت در بیاریم؟ با ولتاژ ۵ ولت
سلام و درود،
شما به هر حال به شکلی باید پالس مورد نیاز موتور رو بسازی، مثلا با استفاده آی سی ۵۵۵.
سلام وقت بخیر
چطور میشه کاری کرد که سروو به نقطه صفر برنگرده
من سروو رو با بلوتوث کنترل میکنم هر وقت بلوتوث رو قطع میکنم یا اردوینو رو ریست میکنم سروو به نقطه صفر میره
سلام رضای عزیز،
شما میتونی آخرین عددی که به servo.write پاس میدی رو جایی ذخیره کنی (مثلا در حافظه eeprom، که با قطع تغذیه هم قطع نشه) و در شروع کد، این عدد رو خونده و همین عدد رو پاس بدی تا موقعیت موتور تغییری نکنه. البته توجه داشته باش که حافظه eeprom تعداد دفعات نوشتن محدودی داره (حدود چند هزار بار).
سلام من مینی پلاتر ساختم سیم هارو طبق دئستورات به موتورا وصل کردم محور x و y حرکت دارن با برنامه بن باکس ولی محور z که همون سروو هیچ حرکتی ندارم مشکل از چیه تورو خدا راهنماییم کنید ممنون میشم حتی اگر امکان داره از واتساپ فیلم بفرستم کمکم کنید
سلام و درود به شما صالح عزیز
شما میتوانید اتصالات رو چک کنید، بررسی کنید که در کد پین درستی برای سروو انتخاب میکنید و اگر سروو صدای تیک تیک میدهد حتما از آمپر دهی تغذیه و قرار دادن خازن مطمئن بشید.
سپاس از همراهی شما
سلام ببخشید می خواستم بدونم با چه کدی می توان سرعت سروو موتور رو کنترل کرد بنده با سروو موتور mg996r کار می کنم و می خواهم سرعتش را کم کنم
اگر هم با کد نمیشود را دیگری برای کم کردن سرعت است؟
سلام و درود به امیرعلی عزیز
شما میتوانید برای کم کردن سرعت، میتونید سروو رو یک درجه یک درجه حرکت بدید و بین هر دو درجه یک تاخیر قرار بدید و طبیعتا با زیاد کردن این تاخیر، سرعت چرخش کم خواهد شد. توضیح بیشتر اینکه مثلا موتور قراره بین ۰ تا ۹۰ درجه چرخش کنه و وضعیت اولیه اون ۰ درجه هست، به جای اینکه به موتور دستور بدید به زاویه ۹۰ درجه برو، میگید اول برو به زاویه ۱، مدت زمان مشخصی صبر کن، برو به زاویه ۲، صبر کن و.. همینطور ادامه بده تا به ۹۰ درجه برسی. این ایده رو در این ویدیو میتونید ببینید:
https://www.youtube.com/watch?v=xyOQ4J4BroE
موفق باشید 🙂
سلام محبت میکنید کمکم کنید
یک ماشین کنترلی دست ساز ساخته خودم هستش از بورد گیرنده و کنترل ماشین شارژی بچه گانه استفاده کردم برای وصل کردن سرو موتور برای فرمان دادن چرخ های جلو به بورد گیرنده اصلی مشکل دارم چطور میتوانم سروو موتور را به بورد گیرنده دستگاه وصل کنم ؟سپاسگزارم کمکم کنید
درود برشما دوست عزیز
باید مشخص بشه که بورد گیرنده شامل چه قطعاتی هست. ممکن هست این برد اصلا قابلیت درایو سروو موتور رو نداشته باشد.
سلام چند سرو موتور رو میتوان با پتانسیومتر و آردینو uno کنترل کرد
سلام حامد عزیز
وقت شما هم بخیر
از نظر تئوری محدودیتی در این باره وجود ندارد چون میتوان با استفاده از شیفت رجیستر، با هر خروجی دیجیتال آردوینو چندین موتور را کنترل کرد اما باید توجه کرد که هرچه تعداد موتورها بیشتر شود سرعت کنترل همزمان آنها کاهش مییابد. همچنین لازم به ذکر نیست که در صورت استفاده از چندین موتور، تغذیه آنها حتماً باید به شکل مجزاء فراهم شود.
موفق باشید
با سلام. آیا میشه به سروو موتور دستوراتی داد که در زمانهای مختلف در زوایای متفاوت قرار بگیره از طریق آردینو؟ مثلاً بعد از ۱۰ ثانیه در زاویه ۹۰ و بعد از ۱۲۰ ثانیه در زاویه ۱۸۰؟
درود برشما دوست عزیز
بله٬ میشود. اگر مقاله رو با دقت بخوانید، با انجام تغییرات سادهای در کد می توانید عملکرد دلخواهتون رو پیادهسازی کنید.
سلام وقت بخیر من برای یک پروژه از تعداد زیادی سنسور و رله و تعدادی دکمه استفاده می کنم و برای منبع تغذیه نمیدونم باید چکار کنم چون وقتی برد رو به ۵ ولت وصل می کنم دو تا موتور سروو توانی برای حرکت ندارند و وقتی هم برد رو به ۱۲ ولت وصل می کنم قسمت های نزدیک جک اداپیتور بعد از چند ثانیه شدید داغ میشه و همچنین باید از ۱ منبع تغذیه حتما استفاده کنم .زیاد از الکترونیک سر در نمیارم.ممنون میشم راهنماییم کنید .
سلام دوست عزیز٬ ممنونیم از همراهی شما
ولتاژ مورد استفاده به ولتاژ مورد نیاز بردها و سنسورها و رلههای شما وابسته است. بنابراین اگر از رله ۱۲ ولت استفاده میکنید تغذیه ۵ ولت مناسب نیست و اتصال تغذیه ۱۲ ولت به سرو موتورها باعث آسیب رساندن به آنها میشود. بنابراین روش صحیح این است که ابتدا ولتاژ مناسب هر مصرف کننده را مشخص کنید. سپس متناسب با آن ولتاژ اعمال کنید. علاوه بر ولتاژ، منبع تغذیه باید بتواند جریان هر مصرف کننده را نیز تامین کند، علت حرکت نکردن سروو موتورها جریان کم تغذیه ۵ ولت شما است.
برای مثال فرض میکنیم رلهها ۱۲ ولت هستند و سایر اجزا به ۵ ولت کار میکنند. در اینصورت میتوانید یک آداپتور ۱۲ ولت حداقل ۲ آمپر را مستقیما به رلهها متصل کنید، سپس از یک مبدل dc/dc مانند شناسه ۰۵۰۳۰۳۰ استفاده کنید تا ۱۲ ولت را به ۵ ولت تبدیل کنید و از ۵ ولت برای تغذیه سایر اجزا استفاده کنید.
سلام من میخوام یک دستگاه درست کنم که این دستگاه کاربرد اصلیش به آرامی بالاو پایین کردن یک طرف ظرفه اسید برای خوردن مس فیبر الکرونیکی هست. میخواستم بدونم که چگونه برنامه نویسی این سروو رو انجام دهم تا بعد از مدت زمانی نسبتا طولانی به ارامی بازاو بالا برود با زاویه ای کم و همچنین بلعکس ان (در همان لحظه ای ک بالا میرود).و پس از انجام چند بار اینکار:به حالت افقی به ایستد؟در انتظار تایید بماند.به محض اینکه تایید شد،یک طرف ظرف را با زاویه ای بیشتربالا ببرد تا عملیات بعدی ان انجام شود.باید چکار کنم؟
درود برشما امیر عزیز
برای کاربرد مدنظر شما، سروو موتورهای مشابه موردی که در این مقاله بررسی کردیم، دقت و گشتاور حرکتی بالایی نداشته و سرعت زیادی دارند و مناسب حرکت دادن مایعات نیستند. بنابراین استفاده از استپرموتورهای دقیقتر مانند nema17 یا nema23 به همراه پیچ لید اسکرو یا بال اسکرو توصیه میشود. برای کد نویسی نیز با مطالعه کد همین مقاله و مقالههای مربوط به استپر موتور و درک کامل آن، میتوانید ترتیب حرکتی مدنظر خود را بنویسید و در انتها جهت فرمان دادن به موتورها، یک یا چند کلید به آردوینو متصل کنید.
موفق باشید