Добавить в избранное

Шаговый двигатель 28BYJ-48 с Arduino: ULN2003, код и точное позиционирование

Чтение ≈ 4 мин

Подключение шагового двигателя 28BYJ-48 через драйвер ULN2003 к Arduino: принцип шагов, библиотека Stepper и AccelStepper, полный пример управления, режимы и точное позиционирование по шагам.

Что такое шаговый двигатель

Шаговик (stepper) крутится не свободно, а дискретными шагами — каждый импульс на обмотку поворачивает ротор на фиксированный угол. Это даёт точное позиционирование без датчика: сколько шагов послали — на столько и повернулся. Идеален для ЧПУ, 3D-принтеров, приводов шторок и камер.

28BYJ-48 — самый доступный шаговик: 5 В, редуктор 64:1, 2048 шагов на оборот выходного вала. В комплекте идёт драйвер ULN2003 — плата с транзисторами и индикаторами.

Подключение

ULN2003 IN1..IN4 ── Arduino D8, D9, D10, D11
ULN2003 + ── 5V (можно от платы для теста, лучше отдельное питание)
ULN2003 − ── GND (общий с Arduino!)
Разъём шаговика ── в ULN2003

На плате ULN2003 есть перемычка питания и место для конденсатора. Для одного 28BYJ-48 хватает 5V от Arduino; для нескольких или мощных шаговиков — отдельный источник.

Простой код: библиотека Stepper

Встроенная Stepper работает из коробки:

#include <Stepper.h>

const int STEPS_PER_REV = 2048;   // 28BYJ-48 с редуктором

Stepper motor(STEPS_PER_REV, 8, 10, 9, 11);  // порядок пинов важен!

void setup() {
    motor.setSpeed(10);           // оборотов в минуту — медленно и надёжно
}

void loop() {
    motor.step(512);              // четверть оборота
    delay(500);
    motor.step(-512);             // назад
    delay(500);
}

motor.step(n) — сдвинуться на n шагов (отрицательное — в другую сторону). Блокирует выполнение на всё время движения.

AccelStepper — разгон и точность

Встроенная библиотека проста, но без ускорения и блокирует loop. AccelStepper — стандарт для реальных проектов: плавный разгон/торможение, неблокирующее run(), позиционирование по абсолютной координате:

#include <AccelStepper.h>

// HALF4WIRE — точный режим для 28BYJ-48 (8 шагов на цикл обмоток)
AccelStepper motor(AccelStepper::HALF4WIRE, 8, 10, 9, 11);

void setup() {
    motor.setMaxSpeed(1000);        // шагов/сек
    motor.setAcceleration(200);     // шагов/сек² — плавный разгон
}

void loop() {
    motor.moveTo(2048);             // в позицию 1 оборот
    while (motor.distanceToGo() != 0) {
        motor.run();                // вызываем постоянно — он сам считает тайминги
    }

    delay(500);
    motor.moveTo(0);                // назад
    while (motor.distanceToGo() != 0) motor.run();
    delay(500);
}

run() вызывается в loop постоянно — он сам делает шаги по расписанию без delay. Это позволяет параллельно крутить серво, читать датчики, слушать Serial.

Режимы работы 28BYJ-48

28BYJ-48 — униполярный, 4 обмотки. Возможны режимы:

  • Полный шаг (FULL4WIRE) — 4 активных фазы, быстрее, грубее (2048 шагов на оборот вых. вала).
  • Полушаг (HALF4WIRE) — чередование 1-2 фазы, точнее вдвое (4096 полушагов), меньше вибрация — для 28BYJ обычно берут его.

AccelStepper с HALF4WIRE использует полушаговый режим — максимум точности из коробки.

Точное позиционирование и обратная связь

У шаговика нет датчика — позиция держится программно:

motor.moveTo(4096);              // в точку 2 оборота
motor.move(512);                 // сдвинуться на четверть оборота от текущей
long pos = motor.currentPosition(); // где сейчас
motor.setCurrentPosition(0);      // сбросить ноль (калибровка на начальном упоре)

При потере шагов (заклинивание, слишком быстрый разгон) позиция «уплывёт» — для ответственных применений ставят концевик и привязку к нулю при старте:

void home() {
    while (digitalRead(LIMIT_PIN) == HIGH) {  // едем до упора
        motor.move(-10);
        motor.run();
    }
    motor.setCurrentPosition(0);              // здесь — ноль
}

Типичные проблемы

  • Дёргается, но не крутится: неверный порядок пинов (IN1..IN4 должны соответствовать обмоткам — порядок в Stepper(…, 8, 10, 9, 11) важен), недостаточное питание.
  • Пропуски шагов: слишком высокая скорость без разгона — setAcceleration, уменьшить setMaxSpeed.
  • Греется драйвер/мотор: нормально для 28BYJ; для больших шаговиков — ограничение тока на драйвере.
  • Позиция уплывает: механический упор или проскальзывание — концевик и периодическая калибровка.
  • Слишком медленно: для 28BYJ максимум ~15 об/мин; для скорости — NEMA17 + драйвер A4988/DRV8825 с шагом STEP/DIR.

Итог

28BYJ-48 + ULN2003 — дешёвый способ точного углового позиционирования: 2048 шагов на оборот, AccelStepper с HALF4WIRE и run() в loop — и вы управляете приводом шторки, радара или мини-ЧПУ. Помните про пины в правильном порядке, общий GND и калибровку нуля по концевику.

AccelStepper: ускорение и плавность

Stepper из Arduino IDE делает только равномерное движение — для плавных траекторий нужен AccelStepper:

#include <AccelStepper.h>

AccelStepper motor(AccelStepper::HALF4WIRE, 8, 10, 9, 11);

void setup() {
    motor.setMaxSpeed(1000);       // шагов/с
    motor.setAcceleration(200);    // разгон
}

void loop() {
    motor.moveTo(2048);            // абсолютная позиция
    while (motor.distanceToGo()) motor.run();   // шаги в фоне
    delay(500);
    motor.moveTo(0);
    while (motor.distanceToGo()) motor.run();
}

run() вызывается из loop без блокировок — мотор идёт с разгоном и торможением.

Драйверы для больших моторов

ULN2003 тянет только мелкие 28BYJ-48. Для NEMA-17 и серьёзной механики:

  • A4988 — до 2 А на фазу, микрошаг до 1/16.
  • DRV8825 — до 2.5 А, микрошаг до 1/32, работает тише.
  • TMC2208/TMC2209 — бесшумные, с UART-настройкой тока и StealthChop.

У драйверов типа A4988 интерфейс STEP/DIR: два пина — направление и импульс шага. AccelStepper поддерживает и их (DRIVER режим).

Микрошаг

Полный шаг — грубо и шумно. Драйверы умеют дробить шаг на 1/2, 1/4, 1/8…1/32 — плавнее и точнее, ценой пары процентов момента. Настраивается перемычками MS1–MS3 на драйвере.

Питание и охлаждение

NEMA-17 ест до 1.5 А на фазу — драйверу нужен радиатор и настройка тока подстроечником (Vref). Без настройки драйвер либо душит мотор, либо перегревается. Блок питания — 12 или 24 В, мотор берёт столько, сколько задаёт current limit.

Проекты на шаговиках

  • Поворот камеры с точным углом.
  • Шторы и жалюзи — известная длина = известное число шагов.
  • ЧПУ-плоттер / лазерный гравёр — 2–3 шаговика и ремни.
  • 3D-принтер и фрезер — та же механика.
  • Привод телескопа с компенсацией вращения Земли.

Частые проблемы

  • Мотор жужжит и не крутится: порядок обмоток нарушен — проверьте пины и последовательность.
  • Пропуски шагов: момента не хватает — снижайте ускорение или поднимайте ток на драйвере.
  • Греется без движения: ток удержания включён — disableOutputs() или auto-sleep.
  • Крутится не туда: перепутаны DIR или фазы.
Поделиться
Понравился материал?

Комментарии

Добавить комментарий