Что такое шаговый двигатель
Шаговик (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 или фазы.