آموزش کنترل سروو موتور با برد رزبری پای و پایتون
محتویات
سلام. چطور سروو موتور را با رزبری پای کنترل کنیم ؟ (آموزش Raspberry Pi #12) را آماده کردیم.
راه اندازی سروو موتور با برد رزبری پای
در این آموزش ما سروو موتور را با Raspberry Pi کنترل خواهیم کرد. قبل از رفتن به سروو بیایید در مورد PWM صحبت کنیم زیرا کنترل سروو موتور با استفاده از پالس های PWM انجام می شود.
فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.
پیشنهاد میکنم قبل از خواندن ادامه مطلب قسمت های قبل آموزش رزبری پای را بخوانید زیرا این آموزش ها پیوسته هستند.
- قسمت قبل : راه اندازی صفحه کلید لمسی (تاچ پد) با Raspberry Pi
- قسمت اول : رزبری پای Raspberry Pi چیست؟
PWM چیست ؟
ما قبلاً بارها در مورد PWM صحبت کرده ایم و بحث PWM را برای آردوینو و AVR به طور کامل آموزش داده ایم.
به تصویر بالا نگاه کنید. اگر سوئیچ به طور مداوم طی یک مدت زمان بسته باشد، ال ای دی در این مدت به صورت مداوم روشن خواهد ماند. اگر سوئیچ به مدت نیم ثانیه بسته باشد و برای نیم ثانیه دیگر باز باشد، ال ای دی فقط در نیمه اول یک ثانیه روشن خواهد شد. به نسبت روشن بودن ال ای دی در کل زمان ، چرخه وظیقه یا Duty Cycle گفته میشود. چرخه وظیفه را میتوانید به صورت زیر محاسبه کنید.
چرخه وظیفه = زمان روشن / (زمان روشن + زمان خاموش)
چرخه وظیفه = (0.5 / (0.5 + 0.5)) = 50٪
بنابراین متوسط ولتاژ خروجی 50٪ ولتاژ باتری خواهد بود.
این حالت برای یک ثانیه اتفاق می افتد و می توانیم شاهد باشیم که LED برای نیمی از ثانیه خاموش و LED در نیمه دوم روشن است. اگر فرکانس این عمل از یک بار در ثانیه به 50 بار در ثانیه تبدیل شود، چشم انسان نمی تواند این فرکانس را ثبت کند. برای یک چشم معمولی، چراغ LED طوری بنظر میرسد که انگار فقط با نصفه ولتاژ روشن است. یعنی فکر میکنیم دارای نیمی از روشنایی اصلی است. بنابراین با کاهش بیشتر زمان روشن بودن ال ای دی، درخشندگی بسیار کمتر به نظر میرسد.
چرخه وظیفه از 0 به 100 می رود. 0 به معنی کاملاً خاموش و 100 کاملاً روشن است. این نسبت وظیفه برای سروو موتور بسیار مهم است. موقعیت سروو موتور با این نسبت وظیفه تعیین می شود. (برای آموختن کامل استفاده از PWM در رزبری پای ببینید : چگونه از PWM در Raspberry Pi استفاده کنیم؟ (آموزش رزبری پای #6))
سروو موتور و PWM
سروو موتور ترکیبی از موتور DCT سیستم کنترل موقعیت و چرخ دنده ها است. سروو ها در دنیای مدرن کاربردهای زیادی دارند و به همین دلیل در شکل ها و اندازه های مختلفی در دسترس هستند. ما در این آموزش از سروو موتور SG90 استفاده خواهیم کرد که یکی از محبوب ترین و ارزان ترین سروو ها است. SG90 یک سروو 180 درجه است. بنابراین با این سروو می توانیم محورها را از 0 تا 180 درجه قرار دهیم.
یک سروو موتور به طور کلی دارای سه سیم است، یکی برای ولتاژ مثبت ، دیگری برای GND و دیگری برای تنظیم موقعیت است. سیم قرمز به برق متصل شده است، سیم قهوه ای به gnd وصل می شود و سیم زرد (یا سفید) به سیگنال ورودی وصل میشود.
پیشنهاد میکنم مقاله سروو موتور چیست را بخوانید.
در سروو ، ما یک سیستم کنترل داریم که سیگنال PWM را از پین سیگنال می گیرد. این سیگنال را رمزگشایی می کند و چرخه وظیفه را از آن دریافت می کند. پس از آن، این نسبت را با مقادیر موقعیتهای از پیش تعریف شده مقایسه می کند. اگر اختلاف در مقادیر وجود داشته باشد، موقعیت سروو را بر این اساس تنظیم می کند. بنابراین موقعیت محور سروو موتور بر اساس چرخه وظیفه PWM در پین سیگنال است.
فرکانس سیگنال PWM براساس نوع سروو موتور متفاوت است. برای SG90 فرکانس سیگنال PWM حدود 50 هرتز است. برای فهمیدن فرکانس عملکرد سروو خود، دیتاشیت مدل مربوطه را بررسی کنید. پس از انتخاب فرکانس ، نکته مهم دیگر در اینجا DUTY RATIO سیگنال PWM است.
جدول زیر موقعیت Servo را برای چرخه وظیفه خاص نشان می دهد. با انتخاب مقدار مناسب، می توانید سروو را در هر زاویه ای قرار دهید. مثلا برای 45º ، نسبت وظیفه باید 5 یا 5٪ باشد.
موقعیت | چرخه وظیفه |
0 درجه | 2.5 |
90 درجه | 7.5 |
180 درجه | 12.5 |
آموزش را با اجرای یک پروژه ادامه میدهیم.
شماتیک مدار پروژه
در اینجا ما از رزبری پای 2 Model B با سیستم عامل Raspbian Jessie استفاده می کنیم. در قسمت های قبل، در مورد کلیه نیازهای اولیه سخت افزار و نرم افزار بحث کرده ایم. تصویر زیر شماتیک مدار پروژه را نشان میدهد. همانطور که در تصویر زیر میبنید، برای این پروژه به قطعات خاصی احتیاج نداریم. تنها یک خازن 1000uF و یک سروو موتور SG90.
برنامه نویسی سروو موتور با رزبری پای
وقتی همه چیز را مانند شماتیک مدار متصل کردید، می توانیم Raspberry Pi را روشن کنیم تا برنامه را در پایتون (PYHTON) بنویسیم. کد کامل در انتهای صفحه قرار داده شده است. در اینجا در مورد قسمت های مهم کد صحبت میکنیم.
ما میخواهیم پرونده GPIO را از کتابخانه وارد کنیم. کد زیر باعث میشود بتوانیم پین های GPIO برد رزبری پای را برنامه ریزی کنیم. همچنین مانند قسمت قبلی آموزش، نام GPIO را به IO تغییر میدهیم. و هر بار بخواهیم به پین های GPIO مراجعه کنیم از کلمه IO استفاده میکنیم.
import RPi.GPIO as IO
بعضی اوقات، پین های GPIO که سعی در استفاده از آنها داریم، ممکن است عملکردهای دیگری را انجام دهند. در این حالت، هنگام اجرای برنامه، هشدارهایی دریافت خواهیم کرد. دستور زیر به PI می گوید هشدارها را نادیده گرفته و به برنامه ادامه دهد.
IO.setwarnings(False)
ما می توانیم پین های GPIO رزبری پای یا شماره پین آن یا شماره GPIO آن ها وارد کنیم. به طور مثال پین 35 روی برد Raspberry pi، همان پین GPIO 19 است. بنابراین ما میتوانیم آن را با 19 یا 35 معرفی کنیم.
IO.setmode (IO.BCM)
ما PIN39 یا GPIO19 را به عنوان پین خروجی تنظیم می کنیم. ما از این پین خروجی PWM دریافت خواهیم کرد.
IO.setup(19,IO.OUT)
بعد از تنظیم پین خروجی ، باید پین را به عنوان پین خروجی PWM تنظیم کنیم ،
p = IO.PWM(output channel , فرکانس سیگنال PWM)
دستور فوق برای تنظیم کانال و همچنین تنظیم فرکانس کانال است. “p” در اینجا متغیر است که می تواند هر چیزی باشد. ما از GPIO19 به عنوان کانال خروجی PWM استفاده می کنیم. “فرکانس سیگنال PWM”را 50 انتخاب خواهیم کرد، زیرا فرکانس کار SG90 حدود 50 هرتز است.
از دستور زیر برای شروع تولید سیگنال PWM استفاده شده است. “DUTYCYCLE” برای تنظیم نسبت “روشن به خاموش” است (که قبلاً توضیح داده شده)
p.start(DUTYCYCLE)
از دستور زیر برای ایجاد حلقه ای بی نهایت استفاده می شود، با این دستور عبارات داخل این حلقه بطور مداوم اجرا می شود.
While 1:
کد کامل :
import RPi.GPIO as IO # فراخوانی کتابخانه پین های GPIO import time # فراخوانی کتابخانه تاخیر IO.setwarnings(False) # عدم نمایش هشدار ها IO.setmode (IO.BCM) IO.setup(19,IO.OUT) # تنظیم پین 19 به عنوان خروجی p = IO.PWM(19,50) # تنظیم پین 19 به عنوان PWM و فرکانس 50 هرتز p.start(7.5) # ایجاد سیگنال با چرخه وظیفه 7.5 while 1: # ایجاد حلقه ی بی نهایت p.ChangeDutyCycle(7.5) # تغییر چرخه وظیفه برای رفتن سروو به زاویه 90 درجه time.sleep(1) # صبر به مدت 1 ثانیه p.ChangeDutyCycle(12.5)# تغییر چرخه وظیفه برای رفتن سروو به زاویه 180 درجه time.sleep(1) # صبر به مدت 1 ثانیه p.ChangeDutyCycle(2.5) # تغییر چرخه وظیفه برای رفتن سروو به زاویه 0 درجه time.sleep(1)
فیلم عملکرد و توضیحات کار با پروژه
برنامه بالا را در پایتون اجرا کنید. در اینجا ما سیگنال PWM را از پین 19 GPIO به سروو موتور میدهیم. چرخه وظیفه سیگنال PWM هر سه ثانیه به جای اول بر میگردد. بنابراین هر 1 ثانیه سروو موقعیت خود را تغییر میدهد.
قسمت بعد : نحوه اتصال ال سی دی کاراکتری به رزبری پای