کنترل استپر موتور توسط جوی استیک دو محوره

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

کاربرد جوی استیک در این پروژه چیست؟
جوی‌استیک (joystick) وسیله‌ای‌ برای تبدیل حرکات فیزیکی دست انسان به سیگنال‌های الکتریکی است. به این صورت که با تبدیل حرکات دست به واحدهای محاسباتی ریاضی (زبان اسمبلی) سیگنال‌ دیجیتال تولید می‌کند. جوی استیک مورد استفاده در این پروژه یک ماژول ساده‌ با خروجی آنالوگ و قابلیت اندازه‌گیری مختصات اهرم جوی استیک در راستای دو محور X و Y می‌باشد. از این جوی استیک در ساخت انواع کنترلرهای ربات و کوادکوپتر و… نیز می‌توان استفاده کرد. روش‌های بسیاری برای کنترل حرکت استپر موتورها با استفاده از آردوینو وجود دارد. در این آموزش نحوه‌ی کنترل یک استپر موتور نما 17 توسط جوی‌استیک آنالوگ نشان داده خواهد شد. 

به منظور اتصال استپر موتور به آردوینو از درایور A4988 استفاده شده ‌است. این درایور قادر است استپر موتورهای دو قطبی تا ولتاژ 35 ولت و جریان 2 آمپر را راه‌اندازی کند. مطابق با میزان جریان مصرفی استپر ‌موتور که در اینجا 750 میلی‌آمپر در هر فاز است، درایور  A4988 انتخاب مناسبی است.

 

مواد اولیه :
# عنوان تعداد لینک
0 برد آردوینو 1 لینک خرید
1 استپر موتور نما17 1 لینک خرید
2 درایور استپر موتور A4988 1 لینک خرید
3 برد بورد 1 لینک خرید
4 منبع تغذیه 1 لینک خرید

مرحله 1 : اتصالات و دیاگرام مداری  

همانطور که در دیاگرام و جدول مشخص شده است، اتصالات بسیار ساده هستند. برای تغذیه‌ی درایور از یک منبع تغذیه‌ی 12 ولت 5 آمپر استفاده شده است. البته برای اینکه استپر بیشتر از طول کورس ماژول خطی مورد نظر حرکت نکند، از میکروسوئیچ نیز می‌توان استفاده کرد.

برای تغذیه‌ی درایور از یک منبع تغذیه‌ی 12 ولت 1 آمپر استفاده شده است. البته برای اینکه استپر بیشتر از طول کورس ماژول خطی مورد نظر حرکت نکند، از میکروسوئیچ نیز می‌توان استفاده کرد.

مرحله 2 : کدنویسی و تنظیمات نرم‌افزاری

به منظور تجسم بهتر نحوه‌ی کنترل حرکت استپرموتور، از هیچ کتابخانه‌ای در روند کد نویسی استفاده نشده است و توسط خاموش و روشن کردن پین Step درایور و ایجاد تاخیر ، موقعیت و سرعت استپر کنترل می‌شوند.

به دلیل عدم استفاده از میکروسوئیچ، در روند کدنویسی فرض شده است که در ابتدای حرکت، گیره تسمه در موقعیت میانی قرار داده شده است. بر اساس محاسبات انجام شده، به صورت تقریبی 25/10 چرخش کامل استپر موتور برای طی کردن فاصله‌ی بین موتور و پولی لازم است. اگر اسپر در حالت گام کامل 200 گام برای طی کردن یک دور بر دارد، آنگاه 2050 گام نیز برای طی کردن کل کورس لازم است. برای درک بیشتر فیلم آموزشی قرار داده شده را مشاهده کنید.

برنامه زیر را در آردوینو بارگذاری کنید.

/*
Partineh
Arduino Tutorial Series
Author: Shokoufeh Davarzani
Website: www.Partineh.com
*/

#define step_pin 3  // Pin 3 connected to Steps pin on EasyDriver
#define dir_pin 2   // Pin 2 connected to Direction pin
#define MS1 5       // Pin 5 connected to MS1 pin
#define MS2 4       // Pin 4 connected to MS2 pin
#define SLEEP 7     // Pin 7 connected to SLEEP pin
#define X_pin A0    // Pin A0 connected to joystick x axis

int direction;    // Variable to set Rotation (CW-CCW) of the motor
int steps = 1025; // Assumes the belt clip is in the Middle

void setup() {
pinMode(MS1, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(dir_pin, OUTPUT);
pinMode(step_pin, OUTPUT);
pinMode(SLEEP, OUTPUT);

digitalWrite(SLEEP, HIGH);  // Wake up EasyDriver
delay(5);  // Wait for EasyDriver wake up


/* Configure type of Steps on EasyDriver:
// MS1 MS2
//
// LOW LOW = Full Step //
// HIGH LOW = Half Step //
// LOW HIGH = A quarter of Step //
// HIGH HIGH = An eighth of Step //
*/

digitalWrite(MS1, LOW);      // Configures to Full Steps
digitalWrite(MS2, LOW);    // Configures to Full Steps

}

void loop() {
while (analogRead(X_pin) >= 0 && analogRead(X_pin) <= 100) {
if (steps > 0) {
digitalWrite(dir_pin, HIGH);  // (HIGH = anti-clockwise / LOW = clockwise)
digitalWrite(step_pin, HIGH);
delay(1);
digitalWrite(step_pin, LOW);
delay(1);
steps--;
}
}

while (analogRead(X_pin) > 100 && analogRead(X_pin) <= 400) {
if (steps < 512) {
digitalWrite(dir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)
digitalWrite(step_pin, HIGH);
delay(1);
digitalWrite(step_pin, LOW);
delay(1);
steps++;
}
if (steps > 512) {
digitalWrite(dir_pin, HIGH);
digitalWrite(step_pin, HIGH);
delay(1);
digitalWrite(step_pin, LOW);
delay(1);
steps--;
}
}

while (analogRead(X_pin) > 401 && analogRead(X_pin) <= 600) {
if (steps < 1025) {
digitalWrite(dir_pin, LOW);
digitalWrite(step_pin, HIGH);
delay(1);
digitalWrite(step_pin, LOW);
delay(1);
steps++;
}
if (steps > 1025) {
digitalWrite(dir_pin, HIGH);
digitalWrite(step_pin, HIGH);
delay(1);
digitalWrite(step_pin, LOW);
delay(1);
steps--;
}
}

while (analogRead(X_pin) > 601 && analogRead(X_pin) <= 900) {
if (steps < 1535) {
digitalWrite(dir_pin, LOW);
digitalWrite(step_pin, HIGH);
delay(1);
digitalWrite(step_pin, LOW);
delay(1);
steps++;
}
if (steps > 1535) {
digitalWrite(dir_pin, HIGH);
digitalWrite(step_pin, HIGH);
delay(1);
digitalWrite(step_pin, LOW);
delay(1);
steps--;
}
}

while (analogRead(X_pin) > 900 && analogRead(X_pin) <= 1024) {
if (steps < 2050) {
digitalWrite(dir_pin, LOW);
digitalWrite(step_pin, HIGH);
delay(1);
digitalWrite(step_pin, LOW);
delay(1);
steps++;
}
}
}