⚙️ استپر موتور 28BYJ-48 با درایور ULN2003 و آردوینو: چرخش دقیق به درجه

✍️ تیم ووکوی فارسی ·

سروو فقط تا ۱۸۰ درجه می‌چرخد و موتور DC نمی‌داند کجا ایستاده. وقتی چرخش دقیق می‌خواهی، مثلاً یک صفحه‌ی گردان، عقربه‌ی ساعت یا دریچه‌ی غذای ماهی، سراغ استپر موتور می‌رویم. ارزان‌ترین و رایج‌ترینش استپر موتور 28BYJ-48 است که همیشه با برد کوچک ULN2003 می‌آید. در این آموزش طرز کارش را ساده می‌گوییم، سیم‌کشی را پایه به پایه انجام می‌دهیم و با دو کتابخانه‌ی Stepper و AccelStepper آن را می‌چرخانیم.

موتور پله‌ای چطور کار می‌کند؟

داخل موتور پله‌ای چند سیم‌پیچ دور یک آهنربای چرخان چیده شده. هر بار یکی از سیم‌پیچ‌ها برق‌دار شود، آهنربا یک «پله» به طرفش می‌چرخد. اگر سیم‌پیچ‌ها را به ترتیب و نوبتی روشن کنیم، موتور پله‌پله و منظم می‌چرخد. چون تعداد پله‌ها را خودمان می‌شماریم، همیشه می‌دانیم موتور کجاست؛ بدون هیچ سنسوری.

28BYJ-48 یک جعبه‌دنده‌ی کوچک هم دارد (تقریباً ۱ به ۶۴). خود موتور در هر دور ۳۲ قدم کامل برمی‌دارد، ولی محور بیرونی برای یک دور کامل حدود ۲۰۴۸ قدم لازم دارد. نتیجه: خیلی دقیق و پرزور، ولی کند؛ حداکثر حدود ۱۵ دور در دقیقه.

چرا درایور؟ هر سیم‌پیچ حدود ۲۰۰ میلی‌آمپر جریان می‌کشد، ولی یک پایه‌ی آردوینو فقط حدود ۲۰ میلی‌آمپر راحت می‌دهد. تراشه‌ی ULN2003 روی برد درایور هفت ترانزیستور قوی دارد که مثل کلید عمل می‌کنند: آردوینو فرمان می‌دهد و ترانزیستور جریان سنگین را از منبع تغذیه به سیم‌پیچ می‌رساند. چهار LED روی برد هم نشان می‌دهند کدام سیم‌پیچ روشن است.

پایه‌های برد ULN2003

پایهکار
IN1 تا IN4ورودی فرمان از آردوینو، یکی برای هر سیم‌پیچ
+ (یا VCC)تغذیه‌ی موتور، ۵ ولت برای 28BYJ-48 پنج‌ولتی
− (یا GND)زمین، مشترک با آردوینو
سوکت سفید ۵ پایهسیم موتور فقط از یک جهت در آن جا می‌رود

قطعه‌ها و سیم‌کشی

ULN2003آردوینو Unoتوضیح
IN1D8—
IN2D9—
IN3D10—
IN4D11—
+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);
}

توضیح خط به خط

💡 عدد دقیق یک دور 28BYJ-48 به‌خاطر نسبت دنده کمی کمتر از ۲۰۴۸ است (حدود ۲۰۳۸). برای پروژه‌ای که ساعت‌ها پشت سر هم می‌چرخد، مثل عقربه‌ی ساعت، این اختلاف جمع می‌شود؛ عدد را با آزمایش روی موتور خودت تنظیم کن.

پروژه‌ی کوچک: صفحه‌ی گردان نرم با 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، 10، 9، 11 است؟

کتابخانه‌ی Stepper سیم‌پیچ‌ها را به ترتیب IN1، IN3، IN2، IN4 می‌خواهد. اگر 8، 9، 10، 11 بنویسی، موتور فقط می‌لرزد و نمی‌چرخد.

یک دور کامل چند قدم است؟

در حالت قدم کامل حدود ۲۰۴۸ قدم و در حالت نیم‌قدم حدود ۴۰۹۶ قدم. علتش جعبه‌دنده‌ی تقریباً ۱ به ۶۴ داخل موتور است.

می‌توانم موتور را از ۵ ولت آردوینو برق بدهم؟

برای تست کوتاه با یک موتور بله، ولی برای پروژه‌ی واقعی یک منبع ۵ ولت جدا بهتر است و GND آن باید به GND آردوینو وصل باشد.

مقاله‌های مرتبط

🔌

ماژول رله با آردوینو: روشن و خاموش کردن یک مدار جدا، با نکات ایمنی

📡

کنترل آردوینو با ریموت کنترل مادون قرمز (IRremote نسخه‌ی جدید)

🟥

ماتریس LED ۸×۸ با MAX7219 و آردوینو: شکلک، انیمیشن و تاس الکترونیکی

🔧

کد آردوینو کار نمی‌کند؟ ۱۵ علت رایج، از سیم‌کشی تا تغذیه، با راه‌حل هر کدام

همه‌ی آموزش‌های سنسورها و ماژول‌ها ← · همه‌ی مقاله‌ها