این مطلب بخش دوازدهم از آموزش جامع آردوینو (مبتدی و پیشرفته) است. در این قسمت قصد داریم به یکی از تجهیزات مهم در کارهای اتوماتیک به نام استپر موتور (Stepper motor) و نحوه راهاندازی بپردازیم. نحوه کار استپر موتور به گونهای است که برای ایجاد حرکتهای بسیار دقیق مناسب است. کارهایی که با استپر موتور قابل انجام است به روشهای دیگر یا قابل انجام نیست یا با صرف هزینه و زمان بیشتر امکانپذیر خواهد بود. اگر در اینترنت به پروژههای انجام شده با استپر موتور نگاهی بیندازید، خواهید دید که چه ایدههای جالبی در مورد آن وجود دارد: از ربات نقاش تا پرینتر سهبعدی و حتی دستگاههای صنعتی مانند CNC از استپر موتور استفاده میکنند.
قطعات مورد نیاز:
معرفی استپر موتور
استپر موتور مانند اکثر موتورهای DC دارای دو بخش اصلی است: روتور و استاتور. روتور محور چرخان و استاتور بخش بیرونی و ثابت موتور است. روتور یک آهنربای دائم و استاتور شامل تعدادی سیمپیچ است که با اعمال ولتاژ تبدیل به آهنربای موقف میشود. استپر موتور را از این جنبه که اعمال ولتاژ به آن بدون براش صورت میگیرد میتوان نوعی موتور براشلس دانست؛ اما مکانیزم حرکتی و نحوه کارکرد آن به حدی از موتورهای براشلس معمولی متفاوت است که معمولا استپر موتور را در این دسته قرار نمیدهند. ساختار داخلی استپر موتورها انواع مختلفی دارد که در اینجا قصد پرداختن به آنها را نداریم و تنها توضیحی کلی راجع به یک نوع متداول خواهیم داد.
روتور استپر موتور دندانههایی مانند یک چرخدنده دارد. از طرفی بر روی سیمپیچها نیز دندانههایی وجود دارد. فاصله دندانهها بر روی روتور و استاتور به گونهای طراحی شده که در آن واحد فقط دندانههای یک سیمپیچ میتواند روبروی دندانههای روتور قرار بگیرد. اگر یک سیمپیچ فعال شود، نزدیکترین دندانههای روتور را به خود جذب میکند. اگر این سیمپیچ غیر فعال شده و سیمپیچ مجاور فعال شود، روتور به اندازهای خواهد چرخید تا دندانههای آن مقابل سیمپیچ فعال قرار بگیرد. به این اندازه چرخش روتور یک گام (Step) میگویند.
هر چه تعداد گامهای استپر موتور در یک دور چرخش بیشتر باشد، دقت حرکتی آن بیشتر است. به حرکتی که توضیح داده شد، یک گام کامل (Full step) گفته میشود. روشهایی وجود دارد که میتواند استپر موتور را به اندازه کسر صحیحی از گام کامل (مثلا ½ ، ¼ ، …) بچرخاند که نحوه عملکرد آن فراتر از این مطلب است. با روشهای Microstepping میتوان موتور را تا ١/٢٥٦ یک گام کامل چرخاند.
دو نوع استپر موتور unipolar و bipolar وجود دارد. استپر موتور unipolar قادر است موتور را تنها در یک جهت بچرخاند در حالی که استپر موتور bipolar توانایی حرکت دادن موتور در دو جهت را دارد. به هر استپر موتور تعدادی سیم متصل است که معمولا هر کدام به یک سیمپیچ وصل است. با دادن ولتاژ با ترتیبی مشخص به سیمپیچها میتوان موتور را به حرکت در آورد. از آنجا که استپر موتور نیاز به ولتاژ و جریان نسبتا بالایی دارد، نمیتوانید با آردوینو به تنهایی آن را راهاندازی کنید و حتما نیاز به یک درایور مخصوص برای تامین برق موتور دارید. برخی درایورهای موتورهای DC قابلیت راهاندازی استپر موتور را نیز دارند. برای انتخاب درایور مناسب استپر موتور باید دقت کنید که جریان و ولتاژ موتور کمتر از جریان و ولتاژ درایور باشد. جریان برای موتور و درایور به ازای هر سیمپیچ سنجیده میشود. همچنین برای اطمینان، سعی کنید جریان موتور ½ یا ١/٣ درایور باشد.
راه اندازی استپر موتور با تراشه L293d
در این بخش میخواهیم یک موتور معروف به نام Nema17 را راهاندازی کنیم. این موتور نسبت اندازه خودش قدرت زیادی دارد و جریان نسبتا زیادی مصرف میکند. بنابراین اگر میخواهید از آن استفاده کنید یا باید باتری قوی در اختیار داشته باشید یا از یک منبع تغذیه خارجی استفاده کنید. من راه دوم را پیشنهاد میکنم چون به ندرت نیاز دارید که استپر موتور را در یک وسیله متحرک استفاده کنید. البته اگر موتور کوچکتری دارید، تمام مطالب برای راهاندازی آن یکسان بوده و بنابراین جای نگرانی نیست. استپر موتور نیز مثل موتور DC برای تامین توان راهاندازی نیاز به درایور دارد. درایورهای مختلفی برای کار با استپر موتور وجود دارند. معمولا درایورها توانایی راهاندازی موتور DC و استپر موتور را دارند (مانند L298) اما برای کار با هر کدام درایورهای خاصی متداول است. یک درایور پرکاربرد برای استپر موتور، L293D است که هم به صورت IC (تراشه) و هم به صورت ماژول موجود است. در این قسمت میخواهیم به راهاندازی استپر موتور با تراشه L293D بپردازیم.
IC را روبروی خودتان بگیرید به طوری که علامت U شکل در بالا قرار بگیرد. این تراشه ١٦ پایه دارد. شماره هر پایه و عملکرد هر کدام به صورت زیر است:
پایههای ٨ و ١٦ که تغذیه موتورها و تراشه هستند را به ترتیب به منبع تغذیه خارجی (مثلا 12V) و ولتاژ 5V وصل کنید. این درایور میتواند برای ولتاژهای تا 36V استفاده شود. همچنین تغذیه درایور حداکثر 7V است. پایههای ٤، ٥، ١٢ و ١٣ را به GND وصل کنید. برای محافظت از درایور در برابر حرارت تولید شده، میتوانید این پایهها را به یک هیت سینک (Heat sink) وصل کنید تا به خنکسازی آن کمک شود. پایههای ١ و ٩ فعالساز موتورها (Enable) بوده و دقیقا مانند Enable در درایور موتور DC عمل میکنند. پایه ٢ فرمان را از آردوینو گرفته (Input)، تقویت کرده و به موتور که به پین ٣ وصل شده میفرستد (Output). پایههای ٦-٧ ، ١٠-١١ و ١٤-١٥ نیز دقیقا وظیفهای مشابه پایههای 2 و 3 دارند. بیشتر استپر موتورها ٤ سیم دارند که هر کدام به یکی از پایههای گفته شده متصل میشود. پایه ١ سیمهای ٣ و ٦ و پایه ٩ سیمهای ١١ و ١٤ را فعال میکنند.
همان طور که قبلا توضیح داده شد، برای به حرکت در آوردن استپر موتور، باید سیمپیچهای آن به ترتیب مشخصی تحریک شوند. این ترتیب را میتوانید در دفترچه راهنمای هر موتور مشاهده کنید. معمولا برای جلوگیری از پیچیدگی کار با استپر موتور در آردوینو از کتابخانهstepper.hاستفاده میشود. به این ترتیب میتوانید سادهتر موتور را کنترل کنید. چیزی که برای راهاندازی موتور باید بدانید تعداد گامهای موتور در یک دور چرخش است و نیز اینکه هر سیم به کدام سیمپیچ وصل شده است. بقیه کار را به کتابخانه استپر موتور واگذار کنید.
برنامه زیر را در آردوینو بارگذاری کنید. این برنامه موتور را یک دور ساعتگرد و یک دور پادساعتگرد میچرخاند.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <Stepper.h>
#define stepsPerRevolution 200
// Coil#1: Red-Green
// Coil#2: Yellow-Blue
#define redWire 2
#define greenWire 3
#define yellowWire 4
#define blueWire 5
//Creating object for clockwise rotation
Stepper driveCW(stepsPerRevolution, redWire, greenWire, yellowWire, blueWire);
//Creating object for counter-clockwise rotation
Stepper driveCCW(stepsPerRevolution, greenWire, redWire, yellowWire, blueWire);
void setup()
{
}
void loop()
{
for (int i = 0; i < stepsPerRevolution; i++)
{
driveCW.step(1);
delay(20);
}
delay(1000);
for (int i = 0; i < stepsPerRevolution; i++)
{
driveCCW.step(1);
delay(20);
}
delay(1000);
}
در این برنامه ابتدا یک شیء برای حرکت ساعتگرد و یک شیء برای حرکت پادساعتگرد موتور تعریف شده است. برای تعریف استپر موتور باید تعداد گام در یک دور و سیمهای آن مشخص شود:
Stepper driveCW(stepsPerRevolution, redWire, greenWire, yellowWire, blueWire);
Stepper driveCCW(stepsPerRevolution, greenWire, redWire, yellowWire, blueWire);
دستور(step(nدر کتابخانه استپر موتور، موتور را به میزان n گام حرکت میدهد. با تنظیم تاخیر بین هر گام، سرعت چرخش موتور را میتوانید تغییر دهید:
for (int i = 0; i < stepsPerRevolution; i++)
{
driveCW.step(1);
delay(20);
}
در برنامه بالا دستور step موتور را با بالاترین سرعت ممکن به تعداد گام خواسته شده حرکت میدهد. به همین دلیل از دستور تاخیر برای کاهش سرعت موتور استفاده شد. روش دیگر کار با کتابخانه استپر موتور، کنترل سرعت است. در صورتی که از دستور(setSpeed(vاستفاده کنید، میتوانید سرعت موتور را (بر حسب دور بر دقیقه) تنظیم کرده و سپس از دستور step برای حرکت به میزان دلخواه استفاده کنید. با این کار دیگر نیازی به استفاده از تاخیر و حلقه for نیست. برنامه زیر از روش دوم برای کنترل موتور استفاده میکند:
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <Stepper.h>
#define stepsPerRevolution 200
// Coil#1: Red-Green
// Coil#2: Yellow-Blue
#define redWire 2
#define greenWire 3
#define yellowWire 4
#define blueWire 5
Stepper driveCW(stepsPerRevolution, redWire, greenWire, yellowWire, blueWire);
void setup()
{
driveCW.setSpeed(60);
}
void loop()
{
driveCW.step(stepsPerRevolution);
delay(1000);
driveCW.step(-stepsPerRevolution);
delay(1000);
}
راه اندازی استپر موتور با درایور A4988
A4988 یک درایور مخصوص استپر موتورهای کوچک و متوسط است که به دلیل ابعاد کوچکش بسیار مورد توجه بوده است. کار با این درایور ساده است چرا که تنها با دو ورودی سرعت و جهت، میتوانید موتورتان را کنترل کنید. این درایور توانایی تحمل 2A جریان و 35V ولتاژ را دارد. A4988 در درون خود مدارهای محافظتی و نیز یک هیت سینک کوچک برای دفع حرارت اضافی دارد. این درایور قابلیت راهاندازی موتور به صورت میکرواستپ تا ١/١٦ را دارد.
درایور A4988 ١٦ پایه دارد. پایههای STP و DIR میزان حرکت و جهت موتور را مشخص کرده و به آردوینو وصل میشود. با High یا Low کردن پایه DIR میتوانید موتور را در دو جهت مختلف به حرکت در آورید. پایههای 1A و 1B به مثبت و منفی یک کویل و پایههای 2A و 2B به مثبت و منفی کویل دیگر موتور متصل میشوند. پایههای VMOT و GND مجاور آن، تغذیه موتور و VDD و GND مجاور آن تغذیه برد درایور هستند. همچنین پایههای M1، M0 و M2 برای تعیین میکرواستپ موتور استفاده میشوند. با استفاده از جدول زیر میتوانید نحوه میکرواستپ موتور را تعیین کنید:
این پایهها با یک مقاومت Pull-down ،100kΩ شدهاند و بنابراین در حالت عادی در شرایط Low هستند. پس اگر پایههای میکرواستپ فرمانی دریافت نکنند، موتور با گام کامل کار خواهد کرد. برای شروع، پایههای STP و DIR را به پینهای ٢ و ٣ آردوینو و پایههای مربوط به موتور و تغذیه را مطابق آنچه گفته شد وصل کنید. همچنین پایههای RST و SLP را به یکدیگر وصل کنید. علاوه بر آن یک خازن 100μF بین پایههای مثبت و منفی منبع تغذیه متصل کنید تا نوسانات ولتاژ به درایور آسیب نزند. دقت کنید که پایه مثبت خازن (پایه بلندتر) را به VMOT وصل کنید. معمولا در کنار پایه منفی خازنها یک علامت منفی گذاشته شده است که تشخیص مثبت و منفی آن را سادهتر میکند.
حالا برنامه زیر را بر روی آردوینو بارگذاری کرده و نتیجه را مشاهده کنید.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#define stepPin 3
#define directionPin 2
#define stepsPerRevolution 200
void stepperRun(int steps, int speedRpm)
{
if (steps < 0)
{
digitalWrite(directionPin, LOW);
steps = abs(steps);
}
else
digitalWrite(directionPin, HIGH);
long fullStepTime = 1000000 * 60 / (stepsPerRevolution * speedRpm); // in microseconds
for (int i = 0; i < steps; i++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(fullStepTime / 2);
digitalWrite(stepPin, LOW);
delayMicroseconds(fullStepTime / 2);
}
}
void setup()
{
pinMode(stepPin, OUTPUT);
pinMode(directionPin, OUTPUT);
}
void loop()
{
stepperRun(stepsPerRevolution,20);
delay(1000);
stepperRun(-stepsPerRevolution,20);
delay(1000);
stepperRun(stepsPerRevolution*3,60);
delay(1000);
stepperRun(-stepsPerRevolution*3,60);
delay(1000);
}
در این برنامه یک تابع به نامstepperRunتعریف شده که تعداد گام و سرعت را دریافت کرده و موتور را به حرکت در میآورد. در این تابع برای اینکه بتوانیم موتور را پادساعتگرد بچرخانیم، پایه DIR را Low میکنیم.
if (steps < 0)
{
digitalWrite(directionPin, LOW);
steps = abs(steps);
}
else
digitalWrite(directionPin, HIGH);
تابعfullStepTimeزمان مورد نیاز برای هر گام را با توجه به سرعت موتور و تعدد گام در هر دور آن محاسبه میکند. برای یک حرکت پیوسته باید نصف این زمان پایه STP در حالت High و نصف آن در حالت Low قرار بگیرد.
long fullStepTime = 1000000 * 60 / (stepsPerRevolution * speedRpm); // in microseconds
for (int i = 0; i < steps; i++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(fullStepTime / 2);
digitalWrite(stepPin, LOW);
delayMicroseconds(fullStepTime / 2);
}
راه اندازی با درایور TB6560
در این قسمت قصد داریم یک درایور نسبتا حرفهای برای استپر موتور را معرفی کنیم. درایور TB6560 تواناییهای بسیار بیشتری نسبت به سایر موارد معرفی شده و البته قیمت بیشتری نیز دارد. این درایور میتواند تا 3A جریان را برای استپر موتور به راحتی تامین کند و به همین دلیل انتخاب مناسبی برای موتورهای قویتر خواهد بود. نحوه کار و اتصالات TB6560 تقریبا مشابه درایور A4988 است که در قسمت قبل معرفی شد. پایههای A- و A+ به دو سر یک سیمپیچ و پایههای B- و B+ به دو سر سیمپیچ دیگر موتور متصل میشوند. پایه CLK+ و CW+ به آردوینو وصل شده و به ترتیب برای ارسال تعداد گام و جهت حرکت استفاده میشوند. پایههای CLK- و CW- نیز به GND وصل میشوند. همچنین پایههای 24V+ و GND نیز به مثبت و منفی منبع تغذیه متصل میشوند. تراشهها و اجزای داخلی این درایور باعث شده است تا کنترل موتور با دقت بالایی صورت گیرد. همچنین TB6560 مدارات محافظتی در برابر جریان بالا و ولتاژ پائین دارد.
اولین چیزی که در مورد TB6560 در نگاه اول توجه را جلب میکند، وجود هیتسینک بزرگی بر روی این برد است. این هیتسینک میتواند حرارت زیادی را دفع کرده و امکان کار با جریانهای بالا تا 3A را بدهد. مورد متفاوت دیگری که در این درایور وجود دارد قرار داشتن تعدادی سوئیچ تنظیم بر روی آن است. این بخش از درایور بسیار اهمیت دارد و قبل از اینکه موتورتان را راهاندازی کنید حتما از صحیح بودن تنظیمات این بخش مطمئن شوید.
خوشبختانه تمام توضیحات مربوطه بر روی خود برد چاپ شده و نیاز نیست چیزی را به خاطر بسپارید. سه سوئیچ اول (SW1-SW2-SW3) به همراه سوئیچ s1 برای تنظیم جریان اعمالی به موتور استفاده میشوند. یک قابلیت جالب این درایور کنترل جریان موتور است. با تنظیم جریان با استفاده از سوئیچها میتوانید مقدار دلخواهی جریان به موتور بدهید. با کنترل جریان میتوانید گشتاور موتور را کنترل کنید. به بیان ساده، هرچه جریان بیشتری به موتور داده شود، قدرت آن بیشتر شده و البته فشار بیشتری به آن آمده و حرارت بیشتری نیز تولید میشود. قبل از تنظیم جریان حتما مطمئن شوید که موتور توانایی تحمل این مقدار جریان را دارد. اگر قدرت موتور برایتان اهمیتی ندارد و سرعت کاری بالایی ندارید، نیازی به بالا بردن جریان نیست. سوئیچهای s3 و s4 برای تنظیم میکرواستپ موتور است. این درایور میتواند موتور را با میکرواستپ تا ١/١٦ راهاندازی کند. سایر سوئیچها را در وضعیت صفر باقی بگذارید. برای راهاندازی موتور با TB6560 پایه CLK+ و CW+ را به پینهای ٣ و ٢ دیجیتال وصل کنید. در این قسمت من از یک موتور Nema17 و تغذیه 9V استفاده کردهام.
کدنویسی برای این درایور تفاوتی با درایور A4988 ندارد؛ پس دست به کار شوید و برنامهای برای آن بنویسید. برنامه من سرعت موتور را به آرامی زیاد کرده و سپس سرعت آن را کم میکند و در نهایت متوقف میشود.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#define stepPin 3
#define directionPin 2
#define stepsPerRevolution 200
void stepperRun(int steps, int speedRpm)
{
if (steps < 0)
{
digitalWrite(directionPin, LOW);
steps = abs(steps);
}
else
digitalWrite(directionPin, HIGH);
long fullStepTime = 1000000 * 60 / (stepsPerRevolution * speedRpm); // in microseconds
for (int i = 0; i < steps; i++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(fullStepTime / 2);
digitalWrite(stepPin, LOW);
delayMicroseconds(fullStepTime / 2);
}
}
void setup()
{
pinMode(stepPin, OUTPUT);
pinMode(directionPin, OUTPUT);
}
void loop()
{
for (int i = 1; i < 10; i++)
stepperRun(stepsPerRevolution * i / 4, 15 * i);
for (int i = 9; i > 0; i--)
stepperRun(stepsPerRevolution * i / 4, 15 * i);
delay(3000);
}
کنترل دستی استپر موتور با کلید
در این قسمت قصد داریم به عنوان یک پروژه کوچک موتور Nema17 را با درایور A4988 به صورت دستی کنترل کنیم. برای این کار میخواهیم از دو کلید برای حرکت ساعتگرد و پادساعتگرد استفاده کنیم. کلیدها انواع مختلفی دارند اما همگی کار مشابهی انجام میدهند. کار کلید برقرار کردن اتصال الکتریکی بین دو پایه در صورت فشرده شدن است. در اینجا ما از یک کلید چهار پایه ساده استفاده کردهایم. در کلیدهای چهار پایه، پایههای روبرو به یکدیگر وصل هستند؛ در واقع همان دو پایه در کلید موجود است و چهار پایه برای راحتی کار قرار داده شدهاند. در صورتی که کلید فشرده شود، دو پایه آن به هم اتصال مییابند. یک پایه را به 5V و پایه دیگر را به یک پین دیجیتال آردوینو وصل کنید. به این ترتیب در صورت فشردن کلید ولتاژ High به آن پایه ارسال خواهد شد. پایه دوم را با یک مقاومت به GND وصل کنید. در این صورت زمانی که کلید فشرده نشده، مقدار Low به آردوینو فرستاده میشود. اتصالات مدار A4988 مانند حالت قبل است. دو کلید را به پینهای ٨ و ١٣ آردوینو وصل کنید. همین پایه کلیدها را با یک مقاومت 220Ω به زمین و پایه دیگر را به 5V وصل کنید.
برنامه زیر را در آردوینو بارگذاری کنید. کلیدها را فشار دهید و نتیجه آن را ببینید. سعی کنید ایدههای دیگری را با استپر موتور پیادهسازی کنید.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#define stepPin 3
#define directionPin 2
#define stepsPerRevolution 200
#define forwardSwitch 8
#define backwardSwitch 13
void stepperRun(int steps, int speedRpm)
{
if (steps < 0)
{
digitalWrite(directionPin, LOW);
steps = abs(steps);
}
else
digitalWrite(directionPin, HIGH);
long fullStepTime = 1000000 * 60 / (stepsPerRevolution * speedRpm); // in microseconds
for (int i = 0; i < steps; i++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(fullStepTime / 2);
digitalWrite(stepPin, LOW);
delayMicroseconds(fullStepTime / 2);
}
}
void setup()
{
pinMode(stepPin, OUTPUT);
pinMode(directionPin, OUTPUT);
}
void loop()
{
bool isforward = digitalRead(forwardSwitch);
bool isbackward = digitalRead(backwardSwitch);
if (isforward)
{
stepperRun(stepsPerRevolution / 8, 60);
delay(1000);
}
else if (isbackward)
{
stepperRun(-stepsPerRevolution / 8, 60);
delay(1000);
}
}
نتیجهگیری
در این آموزش با استپر موتور و درایورهای مختلفی برای راهاندازی آن و همچنین با کتابخانه استپر موتور آشنا شدید. همان طور که دیدید روشهای راهاندازی، چه از نظر کدنویسی و چه از نظر سختافزاری بسیار متنوع است. تازه این همه روشهای ممکن نیست! اینکه شما از چه روشی - از تراشه کوچکی مثل L293D یا از درایور حرفهای TB6560- استفاده کنید بستگی به نیاز و کاربرد شما دارد.
در آموزش بعدی، نحوه کار با ماژول کارت SD را خواهید آموخت.
نظرات شما باعث بهبود محتوای آموزشی ما میشود. اگر این آموزش را دوست داشتید، همینطور اگر سوالی در مورد آن دارید، از شنیدن نظراتتان خوشحال خواهیم شد