در قسمت 47 از آموزش آردوینو به بررسی کنترل موقعیت دورانی با سروو موتور پرداختیم. در این قسمت قصد داریم درباره کنترل چرخش سروو ها موتورها با استفاده از پتانسیومتر یا سنسور، کنترل سرعت سروو موتورهای چرخش مداوم (rotation servo motors) و کنترل سرووها موتورها با استفاده از دستورات کامپیوتری صحبت کنیم.
فرض کنید میخواهید جهت چرخش و موقعیت سروو موتور را با استفاده از یک پتانسیومتر کنترل کنید.
برای مثال، ممکن است بخواهید حرکت عمودی و افقی (Pan و Tilt) یک دوربین مدار بسته را کنترل کنید. این دستورالعمل میتواند با هر ولتاژ متغیری برای مثال، خروجی یک سنسور متصل شده به ورودی آنالوگ کنترلر کار کند.
شما میتوانید از همان کتابخانهای که در قسمت 47 آموزش آردوینو آمده است استفاده کنید، با این تفاوت که کد دستوری برای خواندن ولتاژ خروجی پتانسیومتر به آن اضافه میشود. این مقدار بهگونهای مقیاسبندی میشود که موقعیت پتانسیومتر (از 0 تا 1023) به بازهای از 0 تا 180 درجه نگاشت شود. تنها تفاوت در سیمکشی، اضافه شدن پتانسیومتر است؛ همانطور که در شکل 1 نشان داده شده است.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* * Servo With Sensor sketch * Control a servo with a sensor. */ #include <Servo.h> Servo myservo; // create servo object to control a servo int potpin = A0; // 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 val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo myservo.write(val); // sets position to the scaled value delay(15); // waits for the servo to get there } |

شکل 1: کنترل servo موتور با پتانسیومتر
توجه داشته باشید که رنگ سیم سیگنال استاندارد مشخصی ندارداین سیم بهرنگ سفید زرد یا نارنجی استفاده میشود. سیم تغذیه معمولا به رنگ قرمز و همیشه در وسط قرار دارد و سیم زمین (GND) معمولاً مشکی یا قهوهای است.
هر چیزی که بتوان آن را با تابع analog Read خواند (جهت کسب اطلاعات بیشتر به قسمتهای قبلی مراجعه کنید) قابلاستفاده است؛ برای مثال، میتوان از دستورالعملهای ژیروسکوپ و شتابسنج در قسمتهای قبلی استفاده کرد، بهطوری که زاویهی سروو موتور توسط چرخش (Yaw) ژیروسکوپ یا زاویهی شتابسنج کنترل شود.
همهی سروو موتورها قادر نیستند در کل بازهای که کتابخانهی Servo فراهم میکند حرکت کنند.
اگر سروو موتور شما به دلیل وجود محدودکنندهی مکانیکی در انتهای مسیر حرکت دچار وزوز (buzzing) میشود، سعی کنید بازهی خروجی را در تابع map کاهش دهید تا این وزوز متوقف شود.
برای مثال:
|
1 |
val=map(val,0,1023,10,170); |
فرض کنید میخواهید جهت چرخش و سرعت سروو موتورهایی را که برای چرخش پیوسته (Continuous Rotation) استفاده شدهاند، کنترل کنید.
برای مثال، از دو سروو موتور چرخش پیوسته برای به حرکت درآوردن یک ربات استفاده میکنید و میخواهید سرعت و جهت حرکت توسط اسکچ شما کنترل شود.
سروو موتور های چرخش پیوسته نوعی موتور دندهای هستند که امکان تنظیم سرعت در جهت جلو و عقب را فراهم میکنند. کنترل این نوع سروو موتور ها مشابه سروو موتورهای معمولی است.
سروو موتور با افزایش زاویه از ۹۰ درجه در یک جهت میچرخد و با کاهش زاویه از ۹۰ درجه در جهت مخالف میچرخد. جهت واقعی جلو یا عقب به نحوهی نصب سروو موتور ها بستگی دارد.
شکل 2 نحوهی اتصال برای کنترل دو سروو موتور را نشان میدهد.

شکل 2: کنترل دو سروو موتور
سروو موتور های کوچک معمولاً با تغذیهای در بازهی ۴٫۸ تا ۶ ولت کار میکنند. سروو موتور های بزرگتر ممکن است به جریان بیشتری نسبت به آنچه برد آردوینو میتواند از طریق پایهی V +5 تأمین کند نیاز داشته باشند؛ در این صورت باید از یک منبع تغذیهی خارجی استفاده شود.
میتوان از چهار باتری شارژی ۱٫۲ ولتی برای تغذیهی آردوینو و سروو موتور ها استفاده کرد. اگر قصد دارید آردوینو را نیز با همین باتریها تغذیه کنید، توجه داشته باشید که وارد یک محدودهی نسبتاً حساس میشوید:
از نظر تئوری میتوان با اتصال سیم مثبت باتریها به پایهی 5V آردوینو، آن را تغذیه کرد؛ اما این کار رگولاتور ولتاژ را دور میزند و ایدهی مناسبی نیست.
گزینهی دیگر، تغذیهی آردوینو از طریق پایهی VIN است که به حداقل ۶ ولت نیاز دارد. بااینحال این روش هم چندان ایدهآل نیست، زیرا ولتاژ کمتر از ۷ ولت ممکن است باعث ناپایداری آردوینو شود.
در نهایت، لازم است بین این محدودیتها و نیازهای توان Servo موتورها تعادل برقرار کنید تا به بهترین حالت ممکن برسید.
این اسکچ سروو موتور ها را از ۹۰ تا ۱۸۰ درجه میچرخاند که در سروو موتور های چرخش پیوسته به معنای تغییر سرعت متغیر است. بنابراین، اگر سروو موتور ها به چرخها متصل شده باشند، وسیله نقلیه به جلو حرکت میکند و بهتدریج سرعت آن افزایشیافته و سپس دوباره کاهش پیدا کرده و متوقف میشود.
ازآنجاکه کد کنترل سروو موتور در حلقهی loop قرار دارد، این روند تا زمانی که منبع تغذیه فعال باشد ادامه خواهد داشت:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/* * Continuous rotation */ #include <Servo.h> Servo myservoLeft; // create servo object to control a servo Servo myservoRight; // create servo object to control a servo int angle = 0; // variable to store the servo position void setup() { myservoLeft.attach(9); // attaches left servo on pin 9 to servo object myservoRight.attach(10); // attaches right servo on pin 10 to servo object } void loop() { for(angle = 90; angle < 180; angle += 1) // goes from 90 to 180 degrees { // in steps of 1 degree. // 90 degrees is stopped. myservoLeft.write(angle); // rotate servo at speed given by 'angle' myservoRight.write(180-angle); // go in the opposite direction delay(20); // waits 20 ms between servo commands } for(angle = 180; angle >= 90; angle -= 1) // goes from 180 to 90 degrees { myservoLeft.write(angle); // rotate at a speed given by 'angle' myservoRight.write(180-angle); // other servo goes in opposite direction } } |
شما میتوانید از کد مشابه برای سروو موتورهای چرخش پیوسته و سروو موتورهای معمولی استفاده کنید، اما توجه داشته باشید که سروو موتور های چرخش پیوسته ممکن است با ارسال دقیقا در ۹۰ درجه متوقف نشوند.
برخی از سروو موتورها دارای یک پتانسیومتر کوچک هستند که با تنظیم آن میتوان این مشکل را حل کرد، یا میتوانید چند درجه به عدد ۹۰ اضافه یا کم کنید تا سروو موتور در جای مطلوب متوقف شود.
برای مثال، اگر سروو موتور سمت چپ در ۹۲ درجه متوقف شود، میتوانید خطوط کد که مقدار زاویه را به سروو موتورمیفرستند، به شکل زیر تغییر دهید:
|
1 |
myservoLeft.write(angle+TRIM); // declare int TRIM=2; at beginning of sketch |
فرض کنید میخواهید دستورات لازم برای کنترل سروو موتور ها از طریق پورت سریال، را فراهم کنید.
شاید بخواهید سروو موتورها را از یک برنامهای که روی کامپیوتر اجرا میشود کنترل کنید.
میتوانید از نرمافزار برای کنترل سروو موتورها استفاده کنید. این روش مزیتی دارد: هر تعداد سروو موتور میتواند پشتیبانی شود.
بااینحال، برنامهی شما باید به طور مداوم موقعیت سروو موتورها را بهروزرسانی کند، بنابراین وقتی تعداد سروو موتور ها افزایش مییابد و پروژه شما نیاز به انجام کارهای دیگر هم دارد، منطق برنامه میتواند پیچیده شود.
این دستورالعمل، چهار سروو موتور را بر اساس دستورات دریافتشده از پورت سریال کنترل میکند.
دستورات به شکل زیر هستند:
در اینجا اسکچی ارائه شده است که چهار سروو موتور متصل به پایههای ۷ تا ۱۰ را کنترل میکند:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/* * Computer Control of Servos sketch */ #include <Servo.h> // the servo library #define SERVOS 4 // the number of servos int servoPins[SERVOS] = {7,8,9,10}; // servos on pins 7 through 10 Servo myservo[SERVOS]; void setup() { Serial.begin(9600); for(int i=0; i < SERVOS; i++) { myservo[i].attach(servoPins[i]); } } void loop() { serviceSerial(); } // serviceSerial checks the serial port and updates position with received data // it expects servo data in the form: // // "180a" writes 180 to servo a // "90b writes 90 to servo b // void serviceSerial() { if ( Serial.available()) { int pos = Serial.parseInt(); char ch = Serial.read(); if(ch >= 'a' && ch < 'a' + SERVOS) // If ch is a valid servo letter { Serial.print("Servo "); Serial.print(ch - 'a'); Serial.print(" set to "); Serial.println(pos); myservo[ch - 'a'].write(pos); // write position to corresponding servo } } } |
هر سیم سیگنال سروو موتور به یک پایه دیجیتال متصل میشود. سیمهای زمین همه سروو موتور ها به زمین آردوینو (Arduino GND) متصل میشوند.
سیمهای تغذیه servo ها به هم متصل میشوند، اگر سروو موتور ها جریان بیشتری نسبت به توان خروجی آردوینو نیاز داشته باشند ممکن است لازم باشد از منبع تغذیه خارجی ۵ یا ۶ ولت استفاده کنید .
یک آرایه به نام myservo برای نگهداری ارجاعات به چهار سروو موتور استفاده میشود.
یک حلقه for در بخش setup هر سروو موتور را در آرایه به پایههای متوالی که در آرایه servoPins تعریف شدهاند متصل میکند.
این برنامه از تابع parseInt برای دریافت مقادیر صحیح از طریق پورت سریال استفاده میکند.
اگر کاراکتر دریافتی حرف a باشد، مقدار زاویه به اولین سروو موتور در آرایه (سروو موتور متصل به پایه ۷) ارسال میشود. حروف b ،c و d در اینجا سروو موتور های بعدی را کنترل میکنند.
برای اطلاع بیشتر درباره نحوهی مدیریت مقادیر دریافتی از پورت سریال، به آموزشهای قبلی مراجعه کنید.
آموزش راهاندازی سروو موتور (Servo) با آردوینو +...
من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.