Шаговый двигатель (28BYJ-48)
Управляйте точным угловым позиционированием с помощью шагового двигателя и драйвера ULN2003.
Подготовка оборудования
ESP32 DevKit
Любая версия (30/38 пинов)
Двигатель 28BYJ-48
5V шаговый, редуктор 1:64, 512 шагов/оборот
Драйвер ULN2003
Транзисторная матрица для управления обмотками
Источник 5V
Отдельное питание (USB-зарядка или power bank)
Как работает шаговый двигатель
Принцип работы
Шаговый двигатель — это бесщёточный мотор, вращающийся дискретными шагами. В 28BYJ-48 есть 4 обмотки. Поочерёдная подача тока создаёт вращающееся магнитное поле, которое тянет ротор.
Полный шаг (Full Step) 4 фазы Больше момент Полушаг (Half Step) 8 фаз Плавнее, 512 шагов/оборот Двигатель 28BYJ-48 имеет встроенный редуктор 1:64. Поэтому для одного полного оборота вала нужно примерно 2048 шагов (в режиме полушага).
Драйвер ULN2003
→ GPIO 26 ESP32
→ GPIO 27 ESP32
→ GPIO 14 ESP32
→ GPIO 12 ESP32
Схема подключения
Драйвер ULN2003 ↔ ESP32
IN1 → GPIO 26
IN2 → GPIO 27
IN3 → GPIO 14
IN4 → GPIO 12
Питание
VCC VCC (драйвер) → 5V внешний источник
GND GND (драйвер) → GND (общий с ESP32)
ВАЖНО: ESP32 не должен питать двигатель — только управлять!
Установка библиотеки Stepper
Используем встроенную библиотеку Arduino Stepper или популярную AccelStepper.
#include <Stepper.h>
// 2048 шагов для одного оборота (режим полушага)
const int STEPS_PER_REV = 2048;
// Порядок пинов для 28BYJ-48: IN1, IN3, IN2, IN4
Stepper stepper(STEPS_PER_REV, 26, 14, 27, 12);
void setup() {
Serial.begin(115200);
stepper.setSpeed(10); // 10 об/мин (максимум ~15)
Serial.println("Шаговый двигатель готов!");
}
void loop() {
Serial.println("Оборот по часовой стрелке...");
stepper.step(STEPS_PER_REV);
delay(1000);
Serial.println("Оборот против часовой стрелки...");
stepper.step(-STEPS_PER_REV);
delay(1000);
} Точное позиционирование
Управление углом поворота в градусах — основа для роботизированных систем и точного позиционирования:
#include <Stepper.h>
const int STEPS_PER_REV = 2048;
Stepper stepper(STEPS_PER_REV, 26, 14, 27, 12);
// Шаги на 1 градус
const float STEPS_PER_DEGREE = STEPS_PER_REV / 360.0;
void rotateDegrees(float degrees) {
int steps = (int)(degrees * STEPS_PER_DEGREE);
stepper.step(steps);
Serial.print("Повернули на ");
Serial.print(degrees);
Serial.println(" градусов");
}
void setup() {
Serial.begin(115200);
stepper.setSpeed(8);
Serial.println("Позиционирование по градусам");
}
void loop() {
rotateDegrees(90); // +90°
delay(500);
rotateDegrees(90); // ещё +90°
delay(500);
rotateDegrees(-180); // -180°
delay(1000);
}
Практическое применение
3D-принтеры
Шаговые двигатели обеспечивают точное перемещение экструдера и стола
Роботизированные руки
Точное управление суставами манипулятора с заданным углом
Камеры и сканеры
Плавное панорамирование и наведение на объект
Решение проблем
❌ Двигатель гудит, но не вращается
✅ Недостаточный ток — используйте отдельный источник 5V, не питайте от ESP32.
❌ Вращение нечёткое или пропуск шагов
✅ Снизьте скорость: stepper.setSpeed(5-8) вместо максимальной.
❌ Двигатель вращается в неверном направлении
✅ Поменяйте порядок пинов: Stepper(STEPS, 26, 14, 27, 12) → Stepper(STEPS, 12, 27, 14, 26).
❌ Перегрев двигателя
✅ Нормально во время работы. Но отключайте питание обмоток когда двигатель неподвижен.
Цех Испытаний
Отточите мастерство на реальных кейсах. Каждая карта — это шаг к полному пониманию точной механики.
Один оборот
Базовое движение: ровно один полный оборот вала и полная остановка.
Подключите 28BYJ-48 к драйверу ULN2003, пины IN1–IN4 к GPIO 19, 18, 5, 17. Установите скорость stepper.setSpeed(10). Вызовите stepper.step(2048) — это ровно 1 полный оборот по часовой стрелке. После выполнения двигатель должен остановиться и больше не двигаться.
Маятник
Бесконечное вращение: 5 секунд вперёд, 5 секунд назад.
В loop() реализуйте бесконечный маятник: stepper.setSpeed(10), затем stepper.step(2048) — вращение по часовой 5 секунд (при скорости 10 об/мин ≈ 2048 шагов), пауза delay(500), stepper.step(-2048) — против часовой, пауза delay(500). Цикл должен повторяться бесконечно без остановки.
Кнопка — шаг 90°
Точное позиционирование по нажатию кнопки.
Подключите тактовую кнопку к GPIO 0 (встроенная кнопка BOOT на ESP32) с INPUT_PULLUP. При каждом нажатии кнопки выполняйте stepper.step(512) — поворот ровно на 90° (2048 / 4 = 512 шагов). После 4 нажатий вал делает полный оборот и возвращается в начало. Выводите в Serial номер текущего сектора (0–3).
Потенциометр скорости
Аналоговый вход управляет скоростью и направлением шагового двигателя.
Подключите потенциометр к GPIO 34 (ADC). Считывайте analogRead(34) в диапазоне 0–4095. Мёртвая зона в центре (1800–2200): двигатель стоит. Ниже 1800: вращение против часовой, скорость пропорциональна отклонению (1 об/мин при 1799, 15 об/мин при 0). Выше 2200: по часовой, 1–15 об/мин. Направление задавайте знаком в stepper.step(±1).
Стрелочные часы
Имитация минутной стрелки: один оборот за 60 секунд.
Реализуйте точную имитацию минутной стрелки: 2048 шагов за 60 секунд = 1 шаг каждые 60000/2048 ≈ 29.3 мс. Используйте millis() для точного тайминга (не delay). Каждые 29 мс вызывайте stepper.step(1). Дополнительно: добавьте кнопку для переключения между минутной (1 об/60с) и секундной (1 об/60с, шаг каждые 29мс без делителя) стрелками. Выводите прошедшее время в Serial каждые 10 секунд.
Свой Проект
Создайте свою уникальную модель в онлайн-симуляторе. Ограничений нет!
Назад к урокам:
📚Все уроки
Вернуться к списку уроков