راه اندازی سرو موتور با آردوینو
سرو موتور یا Servo motor نوعی موتور الکتریکیه که برای راه اندازی سرو موتور با آردوینو اغلب از شیلد ها و درایور های مخصوص سروو موتور استفاده میکنن ، اما قراره ما در این مطلب و با استفاده از PWM و کتابخانه ی Servo.h این موتور رو راه اندازی کنیم.
در مطلب سرو موتور چیست ؟ کامل توضیح دادم که این موتور چیه و چطور کار میکنه و درمورد ساختارش توضیح دادم ، اما خب اگه اونو نخوندید بهتره که یکبار نگاه بندازین 🙂
اما بازم یک توضیح کوتاه میدم درمورد این موتور:
سرووموتور ، موتور دقیقیه که روتور یا شافت اون رو میشه با زاویه ی دلخواهی تنظیم کرد. این دقت سبب میشه که این موتور جایگاه خوبی توی صنایع داشته باشه ، صنایعی مثل روباتیک . هواپیما سازی..
سرووموتور DC از سه قسمت عمده ی زیر تشکیل شده.
- موتور DC
- قسمت مکانیکی برای افزایش گشتاور
- مدار حسگر موقعیت و کنترل موتور
روتور این موتور برخلاف موتور DC به راحتی نمیچرخه ،و تحت عملکرد مداری الکترونیکی قرار داره و ما رو از طراحی مدار حسگر و کنترل موقعیت بی نیاز می کنه. همچنین این موتور تقویت کننده ی جریان هم داره و خروجی میکرو رو میشه مستقیم به موتور وصل کرد.
سرو موتور ها مدل های زیادی دارن ، اما بعنوان نمونه من سرو موتور 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 تعریف میکنه که میشه با اون موتور رو کنترل کرد و باید برای هر موتوری که برد وصل میکنیم یک بار اونو با نامی متفاوت تعریف کنیم.
1 2 |
Servo servo1; Servo servo2; |
در واقع این تابع یک متغیر ایجاد میکنه و باید اسمی برای هر موتور بزاریم ، مثال اولو ببینید کامل متوجه میشید 😉
تابع servo.attach
این تابع شماره پایه ای رو مشخص میکنه که موتور به آن متصل میشه و قالب اون بصورت زیره:
1 |
servo.attach(pin,min,max) |
pin:مشخصه که شماره پایه برای اتصال به موتور هستش.
min و max : پارامترهای min و max به ترتیب کمترین و بیشترین عرض پالس برای چرخش صفر و 180 درجه رو تعیین میکنه که این اعداد بصورت پیش فرض 544 و 2400 میکروثانیه در نظر گرفته شدن.
مثال 1:
1 2 3 4 5 6 7 8 9 10 |
include <Servo.h> Servo myservo; void setup() { myservo.attach(9); } void loop() {} |
تابع write :
این تابع برای تنظیم زاویه یا سرعت موتور به کار میره. مقدار زاویه میتونه از صفر تا 180 درجه متغیر باشه.اگر موتور با چرخش پیوسته ( سرو موتور 360 درجه ) استفاده کنیم که تنها قابلیت تنظیم سرعت داره ، ورودی صفر و 180 به ترتیب به معنای چرخش با سرعت کامل در دو جهت مخالف و 90 بدون هیچ چرخشی هست.
مثال: یک برنامه که سروو موتور رو ابتدا از صفر تا 180 درجه و سپس بلعکس حرکت میده :
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,1000,2000); // 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 } } |
توی این کد بیشترین مقدار عرض پالس رو برای چرخش 180 درجه ای 1000 و 2000 میکروثانیه در نظر گرفتیم .( همیشه قطعات دقت لازم رو ندارن و اگه این چرخش بدست نیومد ، با کمی سعی و خطا و بالا پایین کردن این ارقام، چرخش تصحیح میشه) در حلقه بی نهایت (void loop) هر 20 میلی ثانیه ، زاویه ی چرخش رو از صفر تا 180 درجه یک واحد افزایش میدیم و بعدش همین عمل رو از 180 تا صفر درجه بصورت کاهشی انجام میدیم.
و مثال دوم که با تغییر پتاسنیومتر زاویه ی چرخش سرو موتور تغییر میکنه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <Servo.h> Servo myservo; // create servo object to control a servo int potpin = 0; // analog pin used to connect the potentiometer int val; // variable to read the value from the analog pin void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023) val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180) myservo.write(val); // sets the servo position according to the scaled value delay(15); // waits for the servo to get there } |
تابع writeMicroseconds(uS)
این تابع پالسی با عرض دلخواه به سروو اعمال میکنه ، بازه ی زمانی بین 1000 میکروثانیه برای چرخش حداکثر پادساعت گرد ، 2000 میکروثانیه برای چرخش ساعت گرد و 1500 میکروثانیه برای چرخش به سمت وسطه. البته بدونید که این اعداد ممکنه دقیقا با موتور شما کارنکنه ولی با سعی و خطا عددی بین 700 تا 2300 میکروثانیه ، حداکثر چرخش رو برای شما ایجاد میکنه.
سرعت موتورهای با چرخش پیوسته ( سرو موتور 360 درجه ) نیز به همین ترتیب تغییر می کنه.
تابع read
این تابع زاویه ی کنونی چرخش سروو رو بعنوان خروجی میده که عددی بین 0 تا 180 درجه هست.
تابع attached
این تابع بررسی میکنه که آیا پایه ای به سروو متصل هست یا نه و خروجی اون true یا false هستش.
تابع detach
این تابع پایه ای که قبلا به سروو اختصاص داده شده بود رو آزاد میکنه و میشه پایه رو برای تولید پالس PWM به کار برد.
مثال:
میخوایم موتوری که به پایه 9 وصل هستش ر, به اندازه 90 درجه بچرخونیم و بعد پایه رو ازاد کنیم.
1 2 3 4 5 6 7 8 9 10 |
#include "Servo.h" Servo myservo; void setup(){ myservo.attach(9); } void loop(){ if(myservo.attached()){ myservo.write(90); myservo.detach(); }} |
اینم pdf سرو موتور و آموزش سایت adafruit به زبون انگلیسی . البته مطلبی که خوندین تمامی بخش های اونو پوشش میداد !
دوستان سوال داشتین یا از نظرتون جایی کامل توضیح داده نشده بود توی کامنتا بپرسین 🙂 قطعا ارتباط 2 طرفه آموزش هارو بهتر میکنه و به ما انرژی بیشتری میده.
سلام روز به خیر .
مهندس مطلب بسیار عالی بود . اما اگه یه سری اشتباهات نداشت نور الی نور بود .
مثلا اینکه به کلاس میگید تابع اصلا جالب نیست .
شما باید بگین کلاس Servo نه تابع سروو .
Servo یه کلاس هست که یه سری متدا واسه کار با اون داره . مثلا متد write مثلا متد read .
مثلا این کد :
Servo sr1;
یه آبجکت به نام sr1 از کلاس Servo میسازه …
اینا مفاهیم شی گرایی هستن که بهتره از همین ابتدا بهشون توجه بشه تا بد جا نیوفته …
سلام، از این دست کامنت ها شدیدا استقبال میکنم چون هیچ ویراستاری نوشته های منو مجددا بررسی نمیکنه بجز خواننده های وبسایت.
درست میگی ، در خیلی از مطالب مثل آموزش SD card و i2c و … سعی کردم از بیان صحیح هم استفاده کنم و کلاس و از تابع جدا کنم .حتی توی سری آموزشی هم چندین بار و چندین خط کلاس رو تعریف کردم اما اینجا فراموش شده مثل اینکه.
ولی یک چیزی هم که متاسفانه جا افتاده اینه که خیلی ها تابع سرچ میکنن و نوشتن کلاس گاهی به ضرر سایت و دیده نشدن اون میشه….
مرسی از نظرتون
سلام و خسته نباشید به شما،لطف کنین چگونگی راه اندازی شش موتوره همراه با برنامش،بگذارین توی سایت با تشکر
سلام مهندس اقا من یه مشکل بزرگ دارم اونم اینه که میخوام چرخش سروو مثلا از راستگرد به چپگرد تبدیل کنم جهت چرخش سروو رو چطوری تغییر بدم ؟ دمت گرم اگه کمک بکنی
سلام.ی تغییراتی باید داخل سروو و گیربکس ها بدی. انگلیسی سرچ کن توی یوتیوب آموزش هاش هست.
سلام من دو تا joy stick از دسته بازی برداشتم هرکاری می کنم نمی تونم v5 و gnd اش رو مشخص کنم ؟ باید چیکار کنم ؟ اینم از عکسش … ممنون میشم راهنماییم کنین
http://s8.picofile.com/file/8332619426/1532416924975_1432291960.jpg
سلام ممنونم از سایتتون.من یه برنامه نوشتم با جوی استیک و سروو.ولی هروقت با جوی استیک کار میکنم دستمواز روش برمیدارم سروو به حالت قبل برمیگرده.چیکار میتونم بکنم؟
آقا ناموسا دمت گرم
خیلی مردی
مخلصیم اقا احمد
😀 😀
سلام مهندس ممنون بابت سایت خوبتون
این پروژه رو نوشتم اما متاسفانه کامپایل نمیشه ممنون میشم علت رو بفرمایید 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 بزرگ بنویسید.