سرو موتورها یکی از کاربردیترین موتورهای موجود در زمینه رباتیک هستند. در این پست قصد داریم به چگونگی راهاندازی سرو موتور MG90S با استفاده از برد آردوینو (Arduino Nano) در یکی دیگر از قسمت های پروژه های آردوینو بپردازیم.
سرو موتور چیست؟
Servo Motor یک موتور الکتریکی با سیستم کنترل فیدبک با دقت بسیار بالاست که میتوان شافت آن را در جهت و زاویه دلخواه تنظیم کرد.
سرو موتورها در صنایع رباتیک و تولیدات صنعتی کاربرد وسیعی دارند. سرو موتورها به دو دسته کلی سرو موتورهای DC و سرو موتورهای AC تقسیم میشوند.
یک سرور موتور از یک موتور DC به همراه یک برد کنترلکننده و تعدادی چرخدنده تشکیل شده است که نمای کلی آن را میتوانید در تصویر زیر مشاهده کنید:
تفاوتهای موتور DC و سرو موتور:
در موتورهای DC:
- کم یا زیاد کردن سرعت موتور با استفاده از PWM و تعیین جهت چرخش موتور
- امکان چرخش 360 درجه
- ناممکن بودن تعیین درجه چرخش و خواندن مقدار درجه فعلی موتور
در سرو موتورها:
- ناممکن بودن دور 360 درجه برای شافت (حداکثر 180 درجه امکان چرخش وجود دارد)
- سرعت و جهت چرخش مطرح نیست
- چرخش از 0 تا 180 درجه
- امکان تعیین قرارگیری در چه درجهای
- امکان خواندن مقدار درجه فعلی موتور
مدار اتصال سرو موتور به برد آردوینو:
سروها بهطورمعمول دارای سه سیم ورودی هستند: دو سیم اول (رنگهای قهوهای و قرمز) مربوط به تغذیه و سیم سوم (رنگ نارنجی) مربوط به ورود پالس PWM است.
دیتاشیت سرو موتور MG90s را میتوانید از سایت https://engineering.tamu.edu/ مشاهده کنید.
در این پروژه برد استفادهشده جهت راهاندازی Servo Motor، آردوینو نانو است. جهت ارسال سیگنال PWM به سرو موتور نیز از پایه D9 برد نانو استفاده شده است. با توجه به اینکه ولتاژ تغذیه سرو موتور MG90S بین 4.8 تا 6 ولت است، جهت تغذیه موتور میتوان از پایه 5V که بر روی برد قرار دارد، استفاده کرد.
کدهای آردینو جهت راهاندازی سرو موتور:
در خط 3 متغیری از نوع Servo با نام myservo تعریف شده است که جهت کنترل موتور از آن استفاده میشود. در خط 6 متغیر pos جهت میزان درجه شافت Servo Motor تعریف شده است. در خط 9 از تابع attach جهت تعیین شماره پایه برای ارسال سیگنال PWM به سرو موتور و از تابع write نیز در خطوط 15 و 19 جهت تنظیم زاویه موتور استفاده میشود. در این پروژه شافت سرو موتور ابتدا از صفر تا 180 درجه و سپس بهصورت عکس به چرخش درمیآید که برای این منظور از دو حلقه for استفاده شده است. فاصله هر درجه چرخش با درجه بعدی 15 میلیثانیه است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <Servo.h> Servo myservo; // create servo object to control a servo // twelve servo objects can be created on most boards int pos = 0; // variable to store the servo position void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } } |
سلام جناب خسته نباشید من سرو موتور mg90s رو سیم زرد در اردینو به پایه 9 و سیم قرمز به 5v وسیم قهوه ای رو gnd وصل کردم و سیم رو متصل کردم به کامپیوتر با ویندوز 10 و اینکه بعد از کتابخانه روی servo و بعد sweep اپلود کردم ولی هیچ حرکتی ندیدم تو این باره خیلی مشکل دلرم و اینکه مینی پلاتر و مینی سی ان سی درست کردم روی محور x y حرکت دارم ولی نمیتونم سرو موتور تکون بدم خلاصه تو کد نویسی و پیدا کردن مشکل جدی دارم هم روی شیلد ورژن 3 تست کردم هم l293 ولی به نتیجه نرسیدم نمیدونم مشکل از چیه لطفا کمکم کنید ممنون میشم
سلام.
برای اولین بار هست که با سروو کار میکنم و چون آشنایی ندارم بعضی چیزهای ساده برام سوال هست. یه سروو MG996R گرفتم و با آردوینو اونو فعال کردم. اما چندتا ایراد توی کار میبینم.
اول اینکه سروو بصورت دایم چیزی در حدود 100mA جریان می کشه. یعنی وقتی سیم مثبت و منفی سروو رو وصل میکنیم، آمپر صفر هست. اما به محض اتصال سیم (نارنجی) PWM سروو حدود 100mA جریان میکشه. فرقی هم نمیکنه که تو چه زاویه ای باشه. (این جریان غیر از جریان هنگام چرخش زاویه سروو هست).
آیا این طبیعی هست؟
و از اون مهمتر، اگر طبیعی هست، راهی به نظر تون میرسه که این جریان کشی بی مورد رو حذف کنم؟
چون میخوام پروژه نهایی رو با باطری راه اندازی کنم و مدیریت جریان خیلی برام اهمیت داره.
دوم اینکه انگار سروو تو حالت ثابت هم دایم درگیر هست. مثلا به سروو دستور میدم بره به زاویه 90 درجه. بعد از انجام دستور، انگار هنوز هم موتور سروو خیلی کم درگیر هست و صدا های ریز ریز میده. حتی گاهی سروو تکون های ریزی هم میخوره که نشون میده موتور سروو دایم داره حرکت های کمی میکنه. فرقی هم نداره سروو تو چه زاویه ای باشه.
آیا این مورد هم طبیعی هست؟
برد آردوینو، هم 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);
}
ممنون میشم اگه راهنمایی بفرمایید.
سلام دوست عزیز
در مورد جریان کشی زیاد مطمين نیستم
اما در مورد تکان ها و صدا ها دو تا عامل میتونه داشته باشه یکی ثابت فرکانسی pwm هست که تاثیر داره
و البته کیفیت خود سرور – همونطور که میدونید سرور از کنترل حلقه بسته استفاده میکنه و مدام موقعیت خودش رو اصلاح میکنه حالا اگر دقت adc یا پتانسومتر زاویه سنج کافی نباشه این مشکلات پیش میاد
سلام
ممنون از مطالب عالیتون
آیا این امکان هست که از سایر پایه هایی که pwm نیست برای راه اندازی سرو استفاده کرد؟این کار چگونه ممکن هست؟
ممنون از پاسخگویی شما استاد عزیز
بله امکانش هست با استفاده از متد های شبیه سازی pwm این کار رو انجام داد ولی مساله که مطرح میشه باری است که بر روی cpu میذاره و البته ممکنه زیاد دقت نداشته باشه اگر بخواید چنین کاری رو انجام بدید.