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

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

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

به آموزش در مورد چگونگی کنترل موتور پله ای با استفاده از یک روتاری انکودر خوش آمدید. در این آموزش ما از موتور استپر معروف، محبوب و ارزان قیمت 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);
....

ما از بعضی متغیرها برای ذخیره موقعیت فعلی استفاده می کنیم ، زیرا می خواهیم موقعیت موتور پله ای را ردیابی کنیم تا بتوانیم آن را به حالت اولیه برگردانیم.

فیلم کنترل استپ موتور با رمزگذار چرخشی

به اینصورت ما میتوانیم یک استپر موتور را با استفاده از روتاری انکودر کنترل کنیم. فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.

همچنین اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید

پروژه ها رایگان هستند. برای دانلود فایل های پروژه باید در سایت عضو باشید. ثبت نام / ورود

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید
امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید
محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. مالکیتی بر مطالب ارائه شده ندارم. اکثر فعالیت بنده در زمینه ترجمه است. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *