پروژه کنترل استپر موتور با آردوینو و روتاری انکودر

سلام. پروژه کنترل استپر موتور با آردوینو و روتاری انکودر را آماده کردیم.
به آموزش در مورد چگونگی کنترل موتور پله ای با استفاده از یک روتاری انکودر خوش آمدید. در این آموزش ما از موتور استپر معروف، محبوب و ارزان قیمت 28BYJ-48 استفاده میکنیم. همچنین از موتور درایور ULN2003 برای تامین جریان مورد نیاز موتور استفاده میشود. موتور 28BYJ-48 خیلی سریع یا خیلی قوی نیست ، اما برای مبتدیان بسیار مناسب است که بتوانند با کنترل موتور پله ای توسط آردوینو آشنا شوند.
در این پروژه، روتاری انکودر به هر سمت و با هر سرعتی چرخانده شود، موتور پله ای نیز با همان سرعت و جهت میچرخد. فیلم عملکرد پروژه در انتهای صفحه قرار داده شده است.
فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.
مدار پروژه کنترل استپر موتور با آردوینو
تصویر زیر شماتیک مدار پروژه کنترل استپر موتور با آردوینو را نشان میدهد. ما برای کنترل استپر موتور از 4 پین و برای روتاری انکودر از 3 پین آردوینو استفاده میکنیم.
ما برای کنترل پله و 3 پین برای ماژول رمزگذار چرخشی از 4 پین استفاده می کنیم. پین 8-11 کنترل کننده موتور استپر هستند و پین 2-4 اطلاعاتی را از رمزگذار دوار (Rotary Encoder) دریافت می کنند. ما 5V و Ground را از UNO به رمزگذار دوار متصل می کنیم.
جهت کسب اطلاعات بیشتر، مقاله استپر موتور چیست را بخوانید.
کد پروژه کنترل موتور پله ای با انکودر دوار
کد کامل پروژه در انتهای صفحه قرار داده شده است. در اینجا بعضی از قسمت های کد را بررسی میکنیم.
در ابتدا کتابخانه استپر موتور را که به طور پیشفرض در آردوینو نصب است را فراخوانی میکنیم. سپس تعداد مراحل برای یک چرخش توسط شافت داخلی را وارد میکنیم که در اینجا 32 است. در مورد چرخش شافت خارجی این عدد 2048 است.
#include "Stepper.h" #define STEPS 32
سپس وقفه ها و متغیر های مورد نیاز را تعریف میکنیم. توضیحات در مقابل هر خط نوشته شده است.
volatile boolean TurnDetected; // تعریف تشخیص چرخش برای وقفه ها volatile boolean rotationdirection; // CW یا CCW چرخش const int PinCLK=2; // ایجاد وقفه ها با سیگنال CLK const int PinDT=3; // خواندن سیگنال DT const int PinSW=4; // خواندن سوئیچ فشار int RotaryPosition=0; // برای مرتب سازی موقعیت استپر موتور int PrevPosition; // موقعیت قبلی استپر موتور برای بررسی صحت int StepsToTake; // مقدار چرخش استپر موتور // تنظیم توالی مناسب برای استپر موتور // In1, In2, In3, In4 توالی 1-3-2-4 برای Stepper small_stepper(STEPS, 8, 10, 9, 11);
سپس در تابع void isr ()
ما طوری برنامه ریزی میکنیم که اگر CLK از حالت High به Low برود وقفه ایجاد شود.
void isr () { delay(4); // تاخیر برای خوانایی صحیح if (digitalRead(PinCLK)) rotationdirection= digitalRead(PinDT); // جهت چرخش else rotationdirection= !digitalRead(PinDT); // تشخیص چرخش برعکس TurnDetected = true; // تشخیص چرخش }
سپس به تابع void setup ()
میرسیم. در اینجا ما باید حالت پین ها را تعریف کنیم.
void setup () { pinMode(PinCLK,INPUT); // تعریف پین به عنوان ورودی pinMode(PinDT,INPUT); // تعریف پین به عنوان ورودی pinMode(PinSW,INPUT); // تعریف پین به عنوان ورودی digitalWrite(PinSW, HIGH); // تعریف حالت مقاومت پول آپ برای سوئیچ }
سپس در تابع Void Loop ()
ما به قسمت اصلی این پروژه میرسیم. در ابتدا سرعت استپر موتور را تعریف میکنیم. ما سرعت را روی 600 قرار دادیم و میتواند نهایتا 700 باشد.
small_stepper.setSpeed(600); if (!(digitalRead(PinSW))) { // چک کردن فشرده شدن سوئیچ if (RotaryPosition == 0) { // اگر دکمه فشرده بود } else { small_stepper.step(-(RotaryPosition*50)); RotaryPosition=0; // تنظیم مجدد موقعیت استپر موتور } }
و سپس باید عملکرد هایی که در صورت تشخیص چرخش روتاری انکودر انجام میشود را تعریف کنیم.
if (TurnDetected) { // اگر چرخش تشخیص داده شد PrevPosition = RotaryPosition; // ذخیره موقعیت قبلی در متغیر if (rotationdirection) { // اگر چرخش در جهت تشخیص داده شد RotaryPosition=RotaryPosition-1;} // کم کردن 1 از متغیر موقعیت استپر موتور else { // در غیر اینصورت RotaryPosition=RotaryPosition+1;} // اضافه کردن 1 از متغیر موقعیت استپر موتور TurnDetected = false; // جلو گیری از تشخیص چرخش در صورتی که چرخش جدید تشخیص داده شد if ((PrevPosition + 1) == RotaryPosition) { // چرخش موتور در جهت عقربه های ساعت StepsToTake=50; small_stepper.step(StepsToTake); } if ((RotaryPosition + 1) == PrevPosition) { // چرخش موتور در خلاف جهت عقربه های ساعت StepsToTake=-50; small_stepper.step(StepsToTake); ....
ما از بعضی متغیرها برای ذخیره موقعیت فعلی استفاده می کنیم ، زیرا می خواهیم موقعیت موتور پله ای را ردیابی کنیم تا بتوانیم آن را به حالت اولیه برگردانیم.
به اینصورت ما میتوانیم یک استپر موتور را با استفاده از روتاری انکودر کنترل کنیم.
موارد موجود در فایل : سورس کامل ، شماتیک
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
امروز این مدار را سرهم کردم و خیلی خوب کار کرد و میخواهم مشابه همین را با زبان میکروپایتون و برد esp32 پیاده کنم و یک سوال داشتم آیا میتوان همین مدار را با ماژول l298n هم اجرا کرد و در آخر تشکر میکنم از آقای رحیمی عزیز
سلام عزیز
بله قابل اجرا هست.
سلام
استاد داخل این پروژه که سرعت موتور پله ای روی ۶۰۰ قرار داده شده
میشه این عدد توسط یه ورودی به ادرینو داده بشه
نیاز به کامپیوتر نداشته باشه؟
سلام عزیز
بله میتونید از تبدیل آنالوگ به دیجیتال استفاده کنید و مثلا با یک پتانسیومتر سرعت را تنظیم کنید. یا میتوانید دو دکمه قرار دهید و سرعت را کاهش و افزایش دهید.
سلام
باتشکر از آموزش تان
میشه در این پرورژه بین نسبت چرخش وردودی وخروجی کنترل داشت برای مثال بایک دور چرخش ورودی
خروجی ۳دوریا نیم دور چرخش کند.
سلام عزیز
بله میشه این کار رو انجام داد و ساده هست
سلام مهندس
پروژه جواب میده حتی میتونید با ماسفت استپر بزرگ تری ره اندازی کنید فقط زمانی که استپر ثابت هست شفت استپر قفل میمونه یعنی دو تا ماسفت ها وصل هست و این باعث میشه در حالت سکون استپر داغ بشه کدی هست که زمانی که استپر در حالت سکون هست شفت استپر ازاد بشه تا داغ نشه .؟ ممنون
سلام و درود مهندس.
ممنون بابت آموزش خوبتون
یک سوال داشتم که در این برنامه آیا با چرخواندن چند دور انکودر به فرض مثال 3 دور شفت استپر هم به همون تعداد میچرخد یا فقط از 0 تا 360 درجه چرخش دارد