کنترل سرعت و جهت استپر موتور با رزبری پای و پایتون
محتویات
ولت ازسلام. آموزش کنترل استپر موتور با Raspberry Pi (آموزش رزبری پای #8) را آماده کردیم.
چگونه موتور پله ای را با رزبری پای کنترل کنیم؟
استپر موتور ها همیشه بخش جالبی برای من بوده اند. ما در قسمت قبلی آموزش رزبری پای، به طور کامل با نحوه کنترل موتور DC آشنا شدیم. پیشنهاد میشود قبل از خواندن این آموزش، قسمت قبلی را بخوانید.
قسمت قبل : چطور سرعت موتور DC را با Raspberry Pi کنترل کنیم؟
در این قسمت ، ما سرعت یک موتور پله ای را با استفاده از Raspberry Pi کنترل میکنیم. در استپر موتور ها همانطور که از نام آن ها مشخص است، حرکت موتور به صورت پله به پله است. انواع مختلفی از استپر موتور ها موجود است. در اینجا ما از محبوب ترین استپر موتور یعنی Unipolar Stepper Motor استفاده میکنیم. برخلاف موتور DC، ما میتوانیم استپر موتور را با دادن دستور العمل های مناسب، موتور پله ای را به هر زاویه ای که بخواهیم بچرخانیم.
این یک موتور چهار پله ای است و باید پالس های قدرت را با استفاده از مدار درایور موتور استپر به آن بدهیم. در مورد پین های GPIO در برد رزبری پای قبلا به طور کامل صحبت کرده ایم پس حتما قسمت های قبل را بخوانید. ترمینال های برق برد Raspberry Pi برای رانندگی استپ موتور ها کافی نیستندو برای چرخاندن استپر موتور ها به جریان بیشتری احتیاج داریم. این جریان را میتوانیم از منبع انرژی دیگری بگیریم. منبع انرژی دیگر میتواند باتری باشد. موتور پله ای ما دارای ولتاژ 9 ولت است بنابراین باتری 9 ولت به عنوان منبع تغذیه دوم استفاده میشود. ممکن است استپر موتور شما دارای ولتاژ دیگری باشد پس با دقت باتری را انتخاب کنید.
در صورتی که میخواهید به طور کامل با استپر موتور ها آشنا شوید مطلب زیر را بخوانید :
مانند قبل این آموزش را نیز با طراحی یک پروژه ادامه میدهیم.
توضیحات شماتیک راه اندازی استپر موتور
در اینجا ما از رزبری پای 2 Model B با سیستم عامل Raspbian Jessie استفاده می کنیم. در قسمت های قبل، در مورد کلیه نیازهای اولیه سخت افزار و نرم افزار بحث کرده ایم. تصویر زیر شماتیک مدار پروژه کنترل سرعت استپر موتور با رزبری پای را نشان میدهد.
موتور استپر از 200 مرحله برای انجام چرخش 360 درجه استفاده می کند پس یعنی هر چرخش 1.8 درجه است. همانطور که گفته شد ما در حال برنامه ریزی و رانندگی یک موتور چهار مرحله ای هستیم. بنابراین برای تکمیل چرخه باید چهار پالس ارائه دهیم. هر مرحله از این موتور 1.8 درجه از چرخش را تکمیل میکند. بنابراین برای تکیل چرخه به 200 پالس نیاز داریم. با یک تقسیم ساده متوجه میشویم 200/4=50 چرخه برای تکیل یک چرخش کامل مورد نیاز است.
ما هر یک از این چهار سیم را با ترانزیستور NPN 2N2222 متصل میکنیم. این ترانزیستور NPN، پالس منطقی را از رزبری پای میگیرد و سیم پیچ مربوطه را هدایت میکند. پس چهار ترانزیستور در حال دریافت چهار منطق از رزبری پای برای راندن چهار مرحله از موتور هستند. در اینجا باید توجه کنیم که اتصال نادرست ترانزیستور ممکن است تخته را به شدت تحت شعاع قرار داده و به آن آسیب برساند.
ما از دیود (1N4007) برای محافظت از ترانزیستور در برابر القاء Spiking استفاده خواهیم کرد. برای کاهش نوسانات ولتاژ، همانطور که در نمودار مدار نشان داده شده است، یک خازن 1000uF را به منبع تغذیه متصل خواهیم کرد.
همچنین پروژه کنترل استپر موتور با آردوینو را نیز مشاهده کنید.
قطعات مورد نیاز
- مقاومت 220 اهم یا 1 کیلو اهم – سه عدد
- استپر موتور
- دکمه – دو عدد
- ترانزیستور 2N2222 – چهار عدد
- دیود 1N4007 – چهار عدد
- خازن 1000uF
کد پروژه کنترل سرعت و جهت استپر موتور با رزبری پای
وقتی همه چیز را مانند شماتیک مدار متصل کردید، می توانیم 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)
ما برای کنترل کویل های استپر موتور از چهار پین خروجی استفاده میکنیم که با کد زیر معرفی میشوند.
IO.setup(5,IO.OUT) // تنظیم پین 5 به عنوان خروجی IO.setup(17,IO.OUT) // تنظیم پین 17 به عنوان خروجی IO.setup(27,IO.OUT) // تنظیم پین 27 به عنوان خروجی IO.setup(22,IO.OUT) // تنظیم پین 22 به عنوان خروجی
ما GPIO26 و GPIO19 را به عنوان پین ورودی تنظیم می کنیم. ما وضعیت دکمه ها را توسط این پین ها را تشخیص خواهیم داد.
IO.setup(19,IO.IN) // تنظیم پین 19 به عنوان ورودی IO.setup(26,IO.IN) // تنظیم پین 26 به عنوان ورودی
سپس یک شرط تعیین میکنیم. که اگر پین 26 که همان دکمه ما بود فعال شود (یعنی دکمه اول فعال شود) دستورات زیر یکبار اجرا میشوند.
if(IO.input(26) == False): // اگر دکمه فشرده شود
این دستور حلقه را 100 بار اجرا می کند و x از 0 به 99 افزایش می یابد.
for x in range (100):
while 1: برای حلقه بی نهایت استفاده می شود. در کد کامل ببینید در حلقه بی نهایت خود موتور ها را به حرکت در می آوریم. یعنی هر بار یکی از چهار پین خروجی خود را فعال میکنیم که باعث فعال شدن کویل های استپر موتور و به همین ترتیب حرکت آن میشوند.
توجه فرمایید با کد زیر و با استفاده از دکمه ها ما میزان تاخیر بین فعال شدن کویل ها پشت سر هم را تنظیم میکنیم.
for y in range(x): time.sleep(0.01) # تاخیر به مدت x*100msec if(IO.input(26) == False): #اگر دکمه 1 فشرده شده بود if(x<100): # و اگر ایکس زیر 100 بود x=x+1 #مقدار ایکس را یک عدد افزایش بده time.sleep(0.5) #تاخیر به مدت 500 میلی ثانیه if(IO.input(19) == False): #اگر دکمه 2 فشرده شده بود if(x>1): # و اگر ایکس بالای 1 بود x=x-1 #مقدار ایکس را یک عدد کاهش بده time.sleep(0.5) #تاخیر به مدت 500 میلی ثانیه
همه دستورات لازم برای دستیابی به کنترل استپ موتور را کار داریم. کد کامل در باکس زیر آورده شده است اگر سوالی دارید در نظرات اعلام بفرمایید.
کد کامل :
import RPi.GPIO as IO import time IO.setwarnings(False) x=1 IO.setmode (IO.BCM) IO.setup(5,IO.OUT) IO.setup(17,IO.OUT) IO.setup(27,IO.OUT) IO.setup(22,IO.OUT) IO.setup(19,IO.IN) IO.setup(26,IO.IN) while 1: IO.output(5,1) IO.output(22,0) for y in range(x): time.sleep(0.01) IO.output(17,1) IO.output(5,0) for y in range(x): time.sleep(0.01) IO.output(27,1) IO.output(17,0) for y in range(x): time.sleep(0.01) IO.output(22,1) IO.output(27,0) for y in range(x): time.sleep(0.01) if(IO.input(26) == False): if(x<100): x=x+1 time.sleep(0.5) if(IO.input(19) == False): if(x>1): x=x-1 time.sleep(0.5)
دو دکمه به رزبری پای متصل کرده ایم. یکی برای افزایش تاخیر بین چهار پالس و دیگری برای کاهش تأخیر بین چهار پالس. تأخیر سرعت را کنترل میکند. اگر تاخیر بیشتر باشد موتور بین هر مرحله ترمز می گیرد و چرخش آن کند است. اگر تأخیر نزدیک به صفر باشد، موتور با حداکثر سرعت می چرخد.
در اینجا باید به خاطر داشته باشیم که باید بین پالس ها تاخیر وجود داشته باشد. پس از دادن پالس ، موتور پله ای برای رسیدن به مرحله نهایی خود چند میلی ثانیه زمان را صرف می کند. اگر تاخیری بین پالس ها وجود نداشته باشد، استپر موتور به هیچ وجه حرکت نمی کند. به طور معمول تاخیر 50ms بین پالس ها خوب است. برای اطلاعات دقیق تر ، به دیتاشیت موتور خود نگاه کنید. بنابراین با دو دکمه می توان تأخیر را کنترل کرد که به نوبه خود سرعت موتور استپ را کنترل می کند.
قسمت بعد : آموزش راه اندازی شیفت رجیستر 74HC595 با Raspberry Pi
با سلام و ارادت بنده چند سال پیش میکروکنترلر AVR با کدویژن و همچنین نرم افزار پروتل 99 آموزش میدادم اما بدلایلی چند سال وقفه افتاده البته دوره های میکروهای PIC-ARM-FPGA گذرانده ام اما شناختی نسبت به رزبری پای و آردیونو ندارم که بعد از آشنایی با سایت شما خیلی مشتاقم مجددا شروع کنم فقط قسط دارم برای پسرم که علاقه مند است و بیس میکرو را دارد جهت کنترل یک خودرو در مسابقات مدرسه شروع کنم اگر راهنمایی بفرمائید ممنون میشم و اینکه هزینه ای هم داشته باشدتقدیم میکنم با تشکر فراوان
سلام عزیز
میتوانید از دوره های ما استفاده کنید که از 0 تا 100 آردوینو و سایر موارد را آموزش داده ایم
همچنین دوره های ما پشتیبانی دائمی دارند هر زمان بخواهید میتوانید سوالات خود را مطرح کنید
با سلام و خسته نباشید
سوالی داشتم این هست که ما پروژه ای داریم کهراجبه رسپری و زبان پایتون هست ولی لازم نیست ما از برد رسپری استفاده کنیم به همین علت باید از کتابخانه های فیک استفاده کنیم ولی من هرجا میگردم این کتابخانه های فیک رو پیدا نمیکنم
ازتون بابت این موضوع راهنمایی میخواستم