در این قسمت آموزش کنترل موتور DC با رزبری پای با استفاده از پایتون و آی سی L293D توضیح داده میشود.
در قسمت قبل ما از Raspberry Pi برای تولید پالسهایی برای کنترل موقعیت یک سروو موتور استفاده کردیم. در این قسمت از پالسها برای کنترل سرعت یک موتور DC معمولی و از آی سی L293D برای معکوس کردن جهت جریان گذرنده از موتور و در نتیجه جهت چرخش آن استفاده میکنیم.
قطعات مورد نیاز کنترل موتور DC با رزبری پای
برای ساخت این پروژه به قطعات زیر نیاز دارید:
تعداد | قطعه |
1 | RaspberryPi |
1
|
برد توسعه GPIO |
1 | بسته سیم جامپر نری به نری |
1 | مینی برد برد |
1 | موتور DC 6 ولت |
1 | آی سی کنترلر موتور L293D |
1 | توزیع سیستم عامل Occidentalis 0.2 یا جدیدتر |
1 | جاباتری قلمی یا نیم قلمی 4تایی به همراه باتری |
مدولاسیون پهنای پالس یا PWM
مدولاسیون پهنای پالس یا PWM روشی است برای کنترل توان. ما از این روش در اینجا برای کنترل مقدار توانی که به موتور میرود و در نتیجه کنترل سرعت چرخش آن استفاده میکنیم. دیاگرام زیر سیگنال PWM تولید شده در پایه PWM RaspberryPi را نشان میدهد:
هر 1/500 ثانیه خروجی PWM یک پالس تولید میکند. طول این پالس مقدار انرژی که موتور دریافت میکند را تعیین میکند . اگر پالس کلا قطع شود موتور توقف میکند، با یک پالس کوتاه به آرامی میچرخد، اگر پالس برای نیمی از زمان فعال باشد آنگاه موتور نصف انرژی که در صورتی که پالس تا زمان پالس بعدی یک میماند را دریافت میکند.
ماژول کرنل PWM
شما از ماژول کرنل سروو و PWM در قسمت قبلی آموزش برای کنترل سروو استفاده کردید . این بار از همان ماژول برای کنترل سرعت یک موتور استفاده خواهید کرد.
رابط کاربری ماژولها از یک نوع رابط فایل مانند استفاده میکند که در آن شما عملکرد پایه خروجی و در نتیجه سروو را با خواندن و نوشتن روی فایلهای خاصی کنترل میکنید. این امر ارتباط با پایتون یا زبانهای برنامه نویسی دیگر را بسیار آسان میکند.
فایلهای استفاده شده برای راه اندازی سروو در زیر لیست شدهاند. تمامی این فایلها در دایرکتوری /sys/class/rpi-pwm/pwm0/ یافت می شوند.
فایل | توضیح |
active | این فایل باید برای فعال 1 و برای غیرفعال 0 باشد . میتوانید آن را بخوانید تا ببینید که آیا پایه خروجی فعال است یا نه. همچنین میتوانید در آن بنویسید تا آن را فعال یا غیرفعال کنید. |
delayed | اگر این فایل 1 شود آنگاه هر تغییری که در فایلهای دیگر ایجاد کنید تاثیری نخواهند داشت تا زمانی که از فایل بالایی خروجی را فعال کنید. |
mode | در این فایل بنویسید تا حالت پایه خروجی را روی pwm , servo یا audio تنظیم کنید. ما آن را روی pwm تنظیم میکنیم . توجه داشته باشید که برای خروجی صوتی RaspberryPi نیز استفاده میشود. بنابراین نمیتوانید از صوت و کنترل موتور همزمان استفاده کنید. |
frequency | این فایل تعداد پالسهای تولید شده در یک ثانیه را تعیین میکند. |
duty | مقدار این فایل باید بین 0 تا 100 باشد و نمایانگر درصدی از پالس است که در آن موتور روشن است. هر چه این عدد بزرگتر باشد موتور سریعتر خواهد چرخید. |
آیسی L293D
این آیسی یک چیپ بسیار پرکاربرد است که میتواند دو موتور را مستقل از هم کنترل کند. ما در این آموزش تنها از نصف آن استفاده میکنیم. بیشتر پایههای سمت راست آیسی مربوط به کنترل موتور دوم هستند اما با Raspberry Pi ما تنها یک خروجی PWM داریم.
L293D دو پایه Vmotor+ 8 و 16 +V دارد. پایه +Vmotor 8 مربوط به تغذیه موتور و V+ 16 برای مدارات منطقی آیسی میباشد. ما پایه 16 را به پایه 5ولت Raspberry Pi و پایه 8 را به یک پک باتری متصل کردهایم.
سخت افزار
دو دلیل برای استفاده از چیپ L293D در این پروژه وجود دارد. اولین آنها این است که خروجی Raspberry Pi اصلا توان مورد نیاز برای راهاندازی یک موتور به طور مستقیم را ندارد و اتصال مستقیم این دو ممکن است به Raspberry Pi آسیب برساند.
دوم، در این آموزش، ما میخواهیم هم سرعت و هم جهت چرخش موتور را کنترل کنیم. این کار تنها با معکوس کردن جهت جریان در موتور امکان پذیر است که L293D دقیقا برای این منظور طراحی شده است و این کار را با دو پایه کنترلی انجام میدهد.
نرم افزار
از آنجایی که ما نیاز به کنترل پایههای L293D داریم (متصل به پایه های 4 و 17 GPIO) باید از کتابخانه GPIO نیز استفاده کنید.
راههای زیادی برای انتقال کد زیر به Raspberry Pi تان وجود دارد. آسانترین آنها اتصال به Raspberry Pi از طریق SSH و باز کردن یک ویرایشگر با دستور زیر است:
nano motor.py
سپس کد زیر را در آن جایگذاری کنید و با CTRL-X فایل را ذخیره کنید.
کد کنترل موتور
import RPi.GPIO as io io.setmode(io.BCM) in1_pin = 4 in2_pin = 17 io.setup(in1_pin, io.OUT) io.setup(in2_pin, io.OUT) def set(property, value): try: f = open("/sys/class/rpi-pwm/pwm0/" + property, 'w') f.write(value) f.close() except: print("Error writing to: " + property + " value: " + value) set("delayed", "0") set("mode", "pwm") set("frequency", "500") set("active", "1") def clockwise(): io.output(in1_pin, True) io.output(in2_pin, False) def counter_clockwise(): io.output(in1_pin, False) io.output(in2_pin, True) clockwise() while True: cmd = raw_input("Command, f/r 0..9, E.g. f5 :") direction = cmd[0] if direction == "f": clockwise() else: counter_clockwise() speed = int(cmd[1]) * 11 set("duty", str(speed))
این برنامه پایتون ابتدا دو پایه GPIO را در حالت خروجی تنظیم میکند. سپس از همان تابع که در قسمت قبلی آموزش نیز از آن استفاده کردیم (“set”) برای نوشتن روی ماژول کرنل PWM استفاده میکند. سپس از آن برای تنظیم پارامترهای PWM استفاده میکند.
دو تابع دیگر نیز تعریف شدهاند، “clockwise” و “counter_clockwise” که جهت چرخش موتور را با تغییر دوپایه ورودی تعیین میکنند.
اگر هر دو پایه کنترلی HIGH یا LOW باشند آنگاه موتور متوقف میشود. اما اگر IN1 HIGH و IN2 LOW باشد در یک جهت و معکوس کردن مقادیر IN1 و IN2 در جهت دیگر میچرخد.
حلقه اصلی برنامه منتظر شما میماند تا دستورها را به فرم یک حرف (“f” یا “r” ) و یک رقم بین 0 تا 9 وارد کنید. حرف جهت چرخش و عدد سرعت موتور را با ضرب در 11 برای بدست آوردن یک عدد بین 0 تا 99 که موردانتظار کتابخانه PWM است، تعیین میکند.
تست و راهاندازی موتور DC با رزبری پای
برای اجرای برنامه باید آن را به عنوان کاربر superuser اجرا کنید تا به پایههای GPIO دسترسی داشته باشید، بنابراین از کد زیر استفاده کنید:
sudo python motor.py
سپس از شما یک دستور خواسته میشود. چند دستور 2حرفی مانند زیر را وارد کنید:
$sudo python motor.py Command, f/r 0..9, E.g. f5 :f9 Command, f/r 0..9, E.g. f5 :r4 Command, f/r 0..9, E.g. f5 :
در اینجا آموزش کنترل موتور DC با رزبری پای هم به پایان رسید امیدواریم برایتان مفید واقع شده باشد.
منابع:
adafruit ،
لینک کتابخانه های استفاده شده ،