در این قسمت از آموزش نحوه کنترل سروو موتور با استفاده از پایتون شرح داده میشود.
سروو موتورها با پالسهای با طول متغییر کنترل میشوند. این امر به دقت زیادی در زمان بندی نیاز دارد. Raspberry Pi یک پایه دارد که به طور سخت افزاری و بدون تکیه بر سیستم عامل میتواند پالس تولید کند.
قطعات لازم راه اندازی سروو موتور با رزبری پای
برای ساخت این پروژه به قطعات زیر احتیاج دارید:
تعداد | قطعه |
1 | Raspberry Pi (مدل استفاده شده در این پروژه ورژن اولیه هست ولی شما از هر ورژن جدید میتوانید استفاده کنید. |
1 | سیم توسعه GPIO (سیم کشی از رزبری پای به روی برد برد)از سیم برد بوردی یک سر نری و یک سر مادگی هم میتوانید استفاده کنید. |
1 | سیم جامپر نری به نری |
1 | مینی بردبرد |
1 | سروو موتور |
1 | جاباتری نیم قلمی یا قلمی 4تایی به همرا باتری |
سروو موتورها
موقعیت شفت سروو موتور با طول پالس تعیین میشود. سروو باید تقریبا هر 20میلی ثانیه یک پالس دریافت کند. اگر این پالس برای 1 میلی ثانیه یک باشد در اینصورت زاویه شفت 0 درجه خواهد بود اگر این مدت 1.5 میلی ثانیه باشد سروو در موقعیت مرکزی قرار میگیرد و اگر 2 میلی ثانیه باشد زاویه سروو 180 درجه خواهد بود.
نقاط انتهایی سروو میتوانند مختلف باشند و خیلی از سرووها تنها 170 درجه میچرخند. اما سرووهای ‘پیوسته’ نیز وجود دارند که میتوانند تمامی 360 درجه را گردش کنند.
سخت افزار
تنها یک پایه روی Raspberry Pi وجود دارد که میتواند از این طریق پالس تولید کند. (این پایه در رزبری ورژن یک 18 GPIO میباشد. برای ورژنهای جدید تر به Pinout ها دقت کنید.) این پایه به سیم کنترل سروو متصل میشود. تغذیه سروو از یک باتری خارجی تامین میشود زیرا تغذیه کردن سروو از Raspberry Pi ممکن است باعث کرش کردن شود زیرا سروو هنگام شروع حرکت جریان زیادی میکشد. سرووها نیاز به ولتاژ 4.8~6 ولت DC برای موتور دارند، اما سطح سیگنال (خروجی پالس) میتواند 3.3ولت نیز باشد که به همین دلیل میتوان این پایه را مستقیما به خروجی GPIO Raspberry Pi متصل کرد.
سروو موتورها معمولا دارای یک سوکت 3 پایه هستند. سیم قرمز و قهوه ای برای تغذیه (قرمز مثبت) و سیم زرد یا نارنجی برای سیگنال کنترل میباشد. برای متصل کردن سوکت به بردبرد از سیمهای جامپر نری به نری استفاده کنید.
نرم افزار
ما از ابزار gpio wiringPi برای کنترل سروو استفاده میکنیم. نصب gpio را با دستور زیر انجام دهید:
sudo apt-get install -y wiringpi
نکته خیلی مهم: در ورژنهای جدید دو کانال PWM پیش بینی شده و برای اطلاعات بیشتر در مورد این پینها میتوانید Pinout برد خود را ببینید.
پایه شماره 18 را به عنوان خروجی PWM تنظیم کنید.
gpio -g mode 18 pwm
پایه #18 خروجی PWM دارد , اما باید آن را برای فرکانس خروجی مناسب تنظیم کنید. سرووها به خروجی فرکانس 50هرتز نیاز دارند.
برای ماژول PWM RaspberryPi , PWM Frequency in Hz = 19,200,000 Hz / pwmClock / pwmRange
اگر pwmClock 192 باشد و pwmRange 2000 فرکانس PWM 50هرتز را دریافت خواهیم کرد.
اکنون میتوانیم با استفاده از gpio این اعداد را تنظیم کنیم:
gpio pwm-ms gpio pwmc 192 gpio pwmr 2000
با دستور زیر میتوانید سروو را در کاملا به چپ (1میلی ثانیه) بچرخانید:
gpio -g pwm 18 100
با دستور زیر سروو در حالت وسط (1.5میلی ثانیه) قرار میگیرد:
gpio -g pwm 18 150
و با دستور زیر کاملا به راست (2میلی ثانیه ):
gpio -g pwm 18 200
سرووها معمولا به طیف وسیع تری از 1تا2میلی ثانیه پاسخ میدهند بنابراین میتوانید از 50(0.5میلی ثانیه) تا 250(2.5میلی ثانیه) را امتحان کنید. اکنون با این بازه تقریبا 200موقعیت مختلف برای سروو خود خواهید داشت.
توجه داشته باشید که PWM RaspberryPi خروجی پایداری ندارد و ممکن است مقداری jitter داشته باشد. البته در ورژنهای جدید شاید این مشکل حل شده باشد میتوانید به عنوان تمرین تجریه پایداری PWM رزبری پای را انجام و نتیجه را در زیر همین نوشته بذارید.
مثال پایتون
شما میتوانید از wiringPi در پایتون نیز استفاده کنید!
sudo apt-get install -y python-pip sudo pip install wiringpi
را اجرا کنید.
کد پایتون برای حرکت دادن سروو به چپ و راست به شرح زیر میباشد:
# Servo Control import time import wiringpi # use 'GPIO naming' wiringpi.wiringPiSetupGpio() # set #18 to be a PWM output wiringpi.pinMode(18, wiringpi.GPIO.PWM_OUTPUT) # set the PWM mode to milliseconds stype wiringpi.pwmSetMode(wiringpi.GPIO.PWM_MODE_MS) # divide down clock wiringpi.pwmSetClock(192) wiringpi.pwmSetRange(2000) delay_period = 0.01 while True: for pulse in range(50, 250, 1): wiringpi.pwmWrite(18, pulse) time.sleep(delay_period) for pulse in range(250, 50, -1): wiringpi.pwmWrite(18, pulse) time.sleep(delay_period)
در واقع ما در حال استفاده از توابع wiringPi هستیم اما در پایتون، بنابراین انجام همینکار با ابزار gpio و استفاده از دستورات مربوطه آن در پایتون نیز کار ساده ای است.
یک متغییر (delay_period) برای نگه داشتن زمان به ثانیه بین هر استپ سروو استفاده شده است.
حلقه while تا ابد ادامه خواهد داشت یا تا زمانی که روند برنامه با فشار دادن CTRL-C متوقف شود. درون حلقه دو حلقه for تقریبا مشابه وجود دارند. اولین آنها عرض پالس را از 0.5 میلی ثانیه تا 2.5 میلی ثانیه بالارونده میشمارد و دومی عرض پالس را از 2.5میلی ثانیه تا 0.5 میلی ثانیه به طور پایین رونده تغییر میدهد که باعث حرکت سروو به چپ و راست میشود.
برای نصب برنامه، از طریق SSH به RaspberryPi خود متصل شوید و دستور زیر را تایپ کنید:
$ nano servo.py
دستور بالا را در ویرایشگر جایگذاری کنید و سپس با CTRL-X و Y آن را ذخیره کنید.
برای اجرای برنامه سروو کافیست دستور زیر را در پنجره SSH خود وارد کنید:
$ sudo python servo.py
سروو باید بلافاصله شروع به حرکت کند.
تست و راه اندازی سروو موتور با رزبری پای
اگر میخواهید سروو سریعتر حرکت کند delay_period را به مقدار کمتری، مثلا 0.001 کاهش دهید. سپس با افزایش آن به مقدار 0.1 سرعت سروو را کم کنید.
منابع:
adafruit