در قسمت 46 از آموزش آردوینو به بررسی کنترل آرایهای از دیودهای نوری با استفاده از رجیسترهای انتقالی MAX72xx، افزایش تعداد خروجیهای آنالوگ با استفاده از مدارهای گسترشدهنده PWM و استفاده از یک آمپرمتر آنالوگ پنلی به عنوان نمایشگر پرداختیم. در این قسمت قصد داریم درباره کنترل موقعیت دورانی با Servo صحبت کنیم.
شما میتوانید با کنترل موتورها توسط آردوینو، اشیاء را به حرکت درآورید. انواع مختلفی از موتورها برای کاربردهای گوناگون مناسب هستند و این قسمت و چندین قسمت بعدی این آموزش، نحوه راهاندازی انواع مختلف موتورها با آردوینو را نشان میدهد.
شما با servo موتورها کار خواهید کرد؛ موتورهایی که مدارهای داخلی دارند و امکان حرکت به یک موقعیت (زاویه) یا چرخش با سرعت مشخص را فراهم میکنند. همچنین با موتورهای Brushed و بدون Brushless آشنا میشوید که با طراحیهای متفاوت، امکان چرخش با سرعتها و جهتهای مختلف را میدهند. در ادامه این آموزش، مطالبی درباره موتورهای پلهای (Stepper Motors) ارائه میشود که امکان حرکت موتور به تعداد پلههای مشخص در یک جهت یا برعکس را فراهم میکنند. علاوه بر موتورهای چرخشی، مطالبی درباره کار با رلهها و solenoids نیز وجود دارد.
servoها به شما اجازه میدهند حرکت فیزیکی را به دقت کنترل کنید، زیرا معمولاً بهجای چرخش مداوم، به یک موقعیت خاص حرکت میکنند. آنها برای چرخاندن چیزی در محدودهای از ۰ تا ۱۸۰ درجه ایدهآل هستند. اتصال و کنترل servoها آسان است زیرا مدار درایور موتور در خود servo تعبیه شده است.
servoها شامل یک موتور کوچک هستند که از طریق چرخدندهها به یک شفت خروجی متصل شده است. این شفت خروجی، بازوی servo را به حرکت درآورده و همچنین به یک پتانسیومتر متصل است تا بازخورد موقعیت را به مدار کنترل داخلی بدهد (شکل 1 را ببینید).
شما میتوانید servoهایی با چرخش پیوسته تهیه کنید که در آنها بازخورد موقعیت قطع شده است؛ بهاینترتیب، میتوانید به servo دستور دهید که با کنترل کمی بر سرعت، به طور مداوم در جهت عقربههای ساعت و خلاف جهت عقربههای ساعت بچرخد. این نوع servoها کمی شبیه موتورهای Brushed هستند، با این تفاوت که servoهای چرخش پیوسته از کد کتابخانه servo بهجای analogWrite استفاده میکنند و نیازی به شیلد موتور ندارند.
servoهای چرخش پیوسته استفاده آسانی دارند، زیرا نیازی به شیلد موتور ندارند. درایورهای موتور درون خود servo تعبیه شدهاند. نقاط ضعف آنها این است که محدودیتهایی در انتخاب سرعت و قدرت نسبت به موتورهای خارجی دارند و معمولاً دقت کنترل سرعت آنها بهخوبی servoهایی که با شیلد موتور کنترل میشوند نیست (زیرا الکترونیک آنها برای موقعیتیابی دقیق طراحی شده است، نه کنترل سرعت خطی).

شکل 1: اجزای داخلی یک servo موتور
servoها به تغییرات در مدتزمان یک پالس پاسخ میدهند. یک پالس کوتاه ۱ میلیثانیه یا کمتر باعث میشود servo به یک انتهای محدوده بچرخد؛ درحالیکه یک پالس با مدتزمان حدود ۲ میلیثانیه servo را به انتهای دیگر محدوده میچرخاند (شکل 2 را ببینید). پالسهایی که بین این دو مقدار قرار میگیرند، servo را به موقعیتی میچرخانند که متناسب با پهنای پالس است. هیچ استاندارد دقیقی برای رابطه بین پالسها و موقعیت وجود ندارد و ممکن است لازم باشد دستورات موجود در برنامه (sketch) خود را برای تنظیم محدوده servoهایتان کمی تغییر دهید یا آزمایش کنید.

شکل 2: رابطه بین پهنای پالس و زاویه servo؛ بازوی خروجی servo به صورت متناسب با افزایش پهنای پالس از ۱ میلیثانیه تا ۲ میلیثانیه حرکت میکند.
اگرچه اکثر موتورها حرکت چرخشی ایجاد میکنند، solenoids با تأمین برق، حرکت خطی ایجاد میکنند. solenoid دارای یک هسته فلزی است که توسط میدان مغناطیسی ایجادشده در اثر گذر جریان از طریق سیمپیچ، حرکت میکند. رله مکانیکی نوعی solenoid است که تماسهای الکتریکی را وصل یا قطع میکند (یعنی یک solenoid است که یک کلید را فعال میکند). رلهها و solenoids مانند اکثر موتورها، جریان بیشتری نیاز دارند تا آردوینو بتواند به طور ایمن تأمین کند و مطالب این چند قسمت نحوه استفاده از ترانزیستور یا مدار خارجی برای کنترل این دستگاهها را نشان میدهند.
اکثر موتورهای جریان مستقیم (DC) ارزانقیمت، دستگاههای سادهای هستند که دارای دو سیم اتصال به Brushless (تماسهای الکتریکی) هستند که میدان مغناطیسی سیمپیچها را کنترل میکنند و هسته فلزی (آرماتور) را به حرکت درمیآورند. جهت چرخش را میتوان با معکوس کردن قطبیت ولتاژ روی تماسها تغییر داد. موتورهای DC در اندازههای مختلفی موجودند، اما حتی کوچکترین آنها (مثل موتورهای لرزش در تلفنهای همراه) نیاز به ترانزیستور یا کنترل خارجی دارند تا جریان کافی تأمین شود. قسمتهای بعدی نحوه کنترل موتورها با استفاده از ترانزیستور یا مدار کنترل خارجی به نام H-Bridge را نشان میدهند.
ویژگی اصلی در انتخاب موتور، گشتاور (Torque) است. گشتاور تعیین میکند موتور چقدر کار میتواند انجام دهد. معمولاً موتورهای با گشتاور بالاتر بزرگتر، سنگینتر بوده و جریان بیشتری نسبت به موتورهای با گشتاور کمتر مصرف میکنند.
موتورهای بدون Brushless معمولاً نسبت به موتورهای Brushed، در یک اندازه مشخص قدرتمندتر و کارآمدتر هستند، اما نیاز به کنترل الکترونیکی پیچیدهتری دارند. در مواردی که به مزیت عملکرد موتور بدون Brushless نیاز است، میتوان از قطعاتی به نام کنترلکنندههای سرعت الکترونیکی (Electronic Speed Controllers) که برای کنترل رادیو کنترلهای سرگرمی طراحی شدهاند، استفاده کرد، زیرا این کنترلرها با آردوینو بهراحتی قابلکنترل هستند، شبیه به نحوه کنترل یک Servo موتور.
موتورهای پلهای موتورهایی هستند که در پاسخ به پالسهای کنترلی، به میزان درجه مشخصی میچرخند. تعداد درجات در هر پله به نوع موتور بستگی دارد و میتواند از یک یا دو درجه در هر پله تا ۳۰ درجه یا بیشتر متغیر باشد.
دو نوع موتور پلهای که معمولاً با آردوینو استفاده میشوند عبارتاند از: دوقطبی (Bipolar) (معمولاً با چهار سیم متصل به دو سیمپیچ) و تکقطبی (Unipolar) (پنج یا شش سیم متصل به دو سیمپیچ). سیمهای اضافی در موتور پلهای تکقطبی بهصورت داخلی به مرکز سیمپیچها متصل شدهاند (در نسخه پنج سیمه، هر سیمپیچ یک نقطه مرکزی دارد و هر دو نقطه مرکزی به هم متصل میشوند).
شما میخواهید چرخش را با استفاده از زاویهای که در اسکچ خود محاسبه کردهاید، کنترل کنید. برای مثال، میخواهید سنسوری روی ربات در یک کمان بچرخد یا به موقعیتی که شما انتخاب میکنید حرکت کند.
از کتابخانه Servo که همراه آردوینو توزیع شده است استفاده کنید. سیمهای برق و گروند servo را به یک منبع تغذیه مناسب متصل کنید (یک hobby servo کوچک معمولاً میتواند از خط ۵ ولت آردوینو تغذیه شود). میتوانید سیمهای سیگنال servo را به هر پین دیجیتال آردوینو متصل کنید. در اینجا نمونه کد Sweep که همراه آردوینو توزیع میشود، آمده است؛ شکل 3 اتصالات را نشان میدهد:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* * Servo rotation sketch */ #include <Servo.h> Servo myservo; // create servo object to control a servo int angle = 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(angle = 0; angle < 180; angle += 1) // goes from 0 degrees to 180 degrees { // in steps of 1 degree myservo.write(angle); // tell servo to go to position in variable 'angle' delay(20); // waits 20 ms between servo commands } for(angle = 180; angle >= 1; angle -= 1) // goes from 180 degrees to 0 degrees { myservo.write(angle); // move servo in opposite direction delay(20); // waits 20 ms between servo commands } } |

شکل 3: اتصال یک servo برای آزمایش با نمونه اسکچ Sweep
این نمونه servo را بین ۰ تا ۱۸۰ درجه میچرخاند. ممکن است نیاز باشد کتابخانه را مجبور کنید تا موقعیتهای حداقل و حداکثر را تنظیم کند تا محدوده حرکت موردنظر خود را به دست آورید. فراخوانی Servo.attach با آرگومانهای اختیاری برای موقعیتهای حداقل و حداکثر، حرکت را تنظیم میکند:
|
1 |
myservo.attach(9,1000,2000); // use pin 9, set min to 1000 us, max to 2000 us |
ازآنجاییکه servoهای معمول به پالسهایی که بر حسب میکروثانیه اندازهگیری میشوند و نه درجه، واکنش نشان میدهند، آرگومانهایی که پس از شماره پین میآیند به کتابخانه servo اطلاع میدهند که در صورت درخواست ۰ درجه یا ۱۸۰ درجه، باید چند میکروثانیه استفاده شود. همه servoها در یک دامنه کامل ۱۸۰ درجه حرکت نمیکنند، بنابراین ممکن است لازم باشد با servo خود آزمایش کنید تا محدوده دلخواه را به دست آورید.
پارامترهای تابع servo.attach(pin, min, max) به شرح زیر است:
|
1 |
pin |
شماره پینی که servo به آن متصل شده است (میتوانید از هر پین دیجیتالی استفاده کنید).
|
1 |
min (optional) |
عرض پالس، بر حسب میکروثانیه، متناظر با زاویه حداقل (۰ درجه) در servo (مقدار پیشفرض ۵۴۴ است).
|
1 |
max (optional) |
عرض پالس، بر حسب میکروثانیه، متناظر با زاویه حداکثر (۱۸۰ درجه) در servo (مقدار پیشفرض ۲۴۰۰ است).
نیازهای توان بسته به نوع servo و میزان گشتاوری که برای چرخاندن شفت لازم است، متفاوت است.
هنگام اتصال چندین servo، ممکن است به یک منبع تغذیهٔ خارجی ۵ یا ۶ ولتی نیاز داشته باشید. اگر میخواهید از باتری استفاده کنید، چهار باتریقلمی AA گزینه مناسبی هستند. به خاطر داشته باشید که باید ground (منفی) منبع تغذیهٔ خارجی را به ground آردوینو متصل کنید.
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.