⚙️ استپر موتور 28BYJ-48 با درایور ULN2003 و آردوینو: چرخش دقیق به درجه
سروو فقط تا ۱۸۰ درجه میچرخد و موتور DC نمیداند کجا ایستاده. وقتی چرخش دقیق میخواهی، مثلاً یک صفحهی گردان، عقربهی ساعت یا دریچهی غذای ماهی، سراغ استپر موتور میرویم. ارزانترین و رایجترینش استپر موتور 28BYJ-48 است که همیشه با برد کوچک ULN2003 میآید. در این آموزش طرز کارش را ساده میگوییم، سیمکشی را پایه به پایه انجام میدهیم و با دو کتابخانهی Stepper و AccelStepper آن را میچرخانیم.
موتور پلهای چطور کار میکند؟
داخل موتور پلهای چند سیمپیچ دور یک آهنربای چرخان چیده شده. هر بار یکی از سیمپیچها برقدار شود، آهنربا یک «پله» به طرفش میچرخد. اگر سیمپیچها را به ترتیب و نوبتی روشن کنیم، موتور پلهپله و منظم میچرخد. چون تعداد پلهها را خودمان میشماریم، همیشه میدانیم موتور کجاست؛ بدون هیچ سنسوری.
28BYJ-48 یک جعبهدندهی کوچک هم دارد (تقریباً ۱ به ۶۴). خود موتور در هر دور ۳۲ قدم کامل برمیدارد، ولی محور بیرونی برای یک دور کامل حدود ۲۰۴۸ قدم لازم دارد. نتیجه: خیلی دقیق و پرزور، ولی کند؛ حداکثر حدود ۱۵ دور در دقیقه.
چرا درایور؟ هر سیمپیچ حدود ۲۰۰ میلیآمپر جریان میکشد، ولی یک پایهی آردوینو فقط حدود ۲۰ میلیآمپر راحت میدهد. تراشهی ULN2003 روی برد درایور هفت ترانزیستور قوی دارد که مثل کلید عمل میکنند: آردوینو فرمان میدهد و ترانزیستور جریان سنگین را از منبع تغذیه به سیمپیچ میرساند. چهار LED روی برد هم نشان میدهند کدام سیمپیچ روشن است.
پایههای برد ULN2003
| پایه | کار |
|---|---|
| IN1 تا IN4 | ورودی فرمان از آردوینو، یکی برای هر سیمپیچ |
| + (یا VCC) | تغذیهی موتور، ۵ ولت برای 28BYJ-48 پنجولتی |
| − (یا GND) | زمین، مشترک با آردوینو |
| سوکت سفید ۵ پایه | سیم موتور فقط از یک جهت در آن جا میرود |
قطعهها و سیمکشی
- یک آردوینو Uno
- یک استپر موتور 28BYJ-48
- یک درایور ULN2003
- برای پروژهی دوم: یک دکمه
| ULN2003 | آردوینو Uno | توضیح |
|---|---|---|
| IN1 | D8 | — |
| IN2 | D9 | — |
| IN3 | D10 | — |
| IN4 | D11 | — |
| + | 5V (یا منبع ۵ ولت جدا) | برای کار طولانی منبع جدا بهتر است |
| − | GND | با منبع جدا، GNDها حتماً به هم وصل شوند |
کد کامل با کتابخانهی Stepper
کتابخانهی Stepper همراه آردوینو نصب است. این برنامه یک دور کامل جلو و بعد ربع دور عقب میرود.
// 28BYJ-48 + ULN2003 with the built-in Stepper library.
#include <Stepper.h>
const int STEPS_PER_REV = 2048; // full steps for one turn of the shaft
// Pin order is IN1, IN3, IN2, IN4 - this is NOT a typo!
Stepper motor(STEPS_PER_REV, 8, 10, 9, 11);
void turnDegrees(long degrees) {
long steps = degrees * STEPS_PER_REV / 360;
motor.step(steps); // negative = the other way
}
void setup() {
Serial.begin(9600);
motor.setSpeed(10); // RPM; the 28BYJ-48 is happy up to about 15
}
void loop() {
Serial.println("One full turn forward");
motor.step(STEPS_PER_REV);
delay(800);
Serial.println("Quarter turn back");
turnDegrees(-90);
delay(800);
}
توضیح خط به خط
Stepper motor(STEPS_PER_REV, 8, 10, 9, 11);مهمترین خط. کتابخانه سیمپیچها را به ترتیب IN1، IN3، IN2، IN4 روشن میکند. اگر 8، 9، 10، 11 بنویسی، موتور فقط ویز ویز میکند و میلرزد.setSpeed(10)سرعت به دور در دقیقه است. بالاتر از ۱۵ معمولاً موتور پله جا میاندازد یا اصلاً نمیچرخد.motor.step(n)دقیقاً n پله میرود؛ عدد منفی یعنی برعکس. این دستور تا تمام شدن حرکت منتظر میماند، پس در این مدت آردوینو کار دیگری نمیکند.turnDegreesدرجه را به قدم تبدیل میکند: ۹۰ درجه میشود ۵۱۲ قدم. چراlong؟ چون ۹۰ ضرب در ۲۰۴۸ میشود ۱۸۴۳۲۰ و درintآردوینو Uno (حداکثر ۳۲۷۶۷) سرریز میکند و موتور جهت عجیبی میرود.
پروژهی کوچک: صفحهی گردان نرم با AccelStepper
کتابخانهی AccelStepper دو برتری بزرگ دارد: موتور را نرم راه میاندازد و نرم نگه میدارد (شتاب)، و منتظر نمیماند، یعنی وسط حرکت میتوانی دکمه بخوانی. این برنامه با هر بار زدن دکمهی D2، صفحه را به موقعیت بعدی میبرد: ۰، ۹۰، ۱۸۰ و ۳۶۰ درجه. مثل یک ویترین گردان یا پایهی عکاسی.
// Smooth turntable: each button press moves to the next position.
#include <AccelStepper.h>
AccelStepper stepper(AccelStepper::FULL4WIRE, 8, 10, 9, 11);
const int BUTTON = 2;
const int LED = 13;
long targets[4] = {0, 512, 1024, 2048}; // 0, 90, 180 and 360 degrees
int slot = 0;
bool wasPressed = false;
void setup() {
Serial.begin(9600);
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED, OUTPUT);
stepper.setMaxSpeed(500); // steps per second
stepper.setAcceleration(300); // steps per second per second
}
void loop() {
bool pressed = digitalRead(BUTTON) == LOW;
if (pressed && !wasPressed) {
slot = (slot + 1) % 4;
stepper.moveTo(targets[slot]);
Serial.print("Going to ");
Serial.println(targets[slot]);
}
wasPressed = pressed;
stepper.run(); // call as often as possible, never delay()
digitalWrite(LED, stepper.isRunning() ? HIGH : LOW);
}
moveTo فقط مقصد را تعیین میکند و run() در هر دور loop در صورت لزوم یک قدم برمیدارد. برای همین در این برنامه هیچ delay بلندی نیست؛ هر تأخیری حرکت را کند و لرزان میکند. اگر بعد از رسیدن به مقصد موتور داغ شد، میتوانی با stepper.disableOutputs() سیمپیچها را خاموش کنی (ولی آن وقت محور زور نگه داشتن ندارد).
اجرا در شبیهساز
استپر و ULN2003 روی آردوینو Uno در تینکرکد فارسی رایگان اجرا میشوند. مثالهای آماده: موتور پلهای با Stepper، موتور پلهای نرم با AccelStepper و استپر نرم با پتانسیومتر. برای یادگیری با تمرین، درس موتور پلهای دقیق و بعد درس استپر نرم با AccelStepper را ببین. در شبیهساز چرخش محور و LEDهای درایور را میبینی و میتوانی با دیباگر قدمبهقدم جلو بروی.
اشکالهای رایج
- موتور میلرزد ولی نمیچرخد: ترتیب پایهها در کد 8، 9، 10، 11 است. آن را 8، 10، 9، 11 کن.
- با سرعت بالا نمیچرخد یا پله جا میاندازد:
setSpeedرا زیر ۱۵ نگه دار و در AccelStepper حداکثر سرعت را حدود ۵۰۰ تا ۷۰۰ قدم در ثانیه بگذار. - آردوینو وسط حرکت ریست میشود: موتور از پایهی 5V برد جریان زیادی میکشد. یک منبع ۵ ولت جدا بگذار و GNDها را به هم وصل کن.
- موتور داغ میشود: طبیعی است؛ سیمپیچها حتی در حالت ایستاده برق دارند. وقتی حرکت تمام شد، خروجیها را خاموش کن.
- AccelStepper حرکت نمیکند:
run()را صدا نزدهای یا درloopیکdelayطولانی هست. - جهت برعکس است: عدد قدم را منفی کن؛ لازم نیست سیمها را عوض کنی.
اگر چرخش کوتاهتر و سادهتر کافی است، سروو موتور با آردوینو را بخوان. ایدهی پروژهی مدرسه با موتور هم در پروژهی مدرسه با آردوینو هست و همهی پروژهها در صفحهی آردوینو.
استپر موتور را رایگان بچرخان ⚙️سؤالهای رایج
چرا ترتیب پایهها در کد 8، 10، 9، 11 است؟
کتابخانهی Stepper سیمپیچها را به ترتیب IN1، IN3، IN2، IN4 میخواهد. اگر 8، 9، 10، 11 بنویسی، موتور فقط میلرزد و نمیچرخد.
یک دور کامل چند قدم است؟
در حالت قدم کامل حدود ۲۰۴۸ قدم و در حالت نیمقدم حدود ۴۰۹۶ قدم. علتش جعبهدندهی تقریباً ۱ به ۶۴ داخل موتور است.
میتوانم موتور را از ۵ ولت آردوینو برق بدهم؟
برای تست کوتاه با یک موتور بله، ولی برای پروژهی واقعی یک منبع ۵ ولت جدا بهتر است و GND آن باید به GND آردوینو وصل باشد.