Урок 12 Средний 50 минут

Шаговый двигатель (28BYJ-48)

Управляйте точным угловым позиционированием с помощью шагового двигателя и драйвера ULN2003.

1

Подготовка оборудования

Компоненты для урока: ESP32, шаговый двигатель 28BYJ-48, драйвер ULN2003, внешний источник 5V

ESP32 DevKit

Любая версия (30/38 пинов)

⚙️

Двигатель 28BYJ-48

5V шаговый, редуктор 1:64, 512 шагов/оборот

🔌

Драйвер ULN2003

Транзисторная матрица для управления обмотками

🔋

Источник 5V

Отдельное питание (USB-зарядка или power bank)

2

Как работает шаговый двигатель

Принцип работы

Шаговый двигатель — это бесщёточный мотор, вращающийся дискретными шагами. В 28BYJ-48 есть 4 обмотки. Поочерёдная подача тока создаёт вращающееся магнитное поле, которое тянет ротор.

Полный шаг (Full Step) 4 фазы Больше момент
Полушаг (Half Step) 8 фаз Плавнее, 512 шагов/оборот
ℹ️

Двигатель 28BYJ-48 имеет встроенный редуктор 1:64. Поэтому для одного полного оборота вала нужно примерно 2048 шагов (в режиме полушага).

Принцип работы шагового двигателя: обмотки, ротор, дискретные шаги

Драйвер ULN2003

Драйвер ULN2003: входные пины IN1-IN4 и подключение к обмоткам двигателя
IN1 Обмотка A

→ GPIO 26 ESP32

IN2 Обмотка B

→ GPIO 27 ESP32

IN3 Обмотка C

→ GPIO 14 ESP32

IN4 Обмотка D

→ GPIO 12 ESP32

3

Схема подключения

Схема подключения 28BYJ-48 через ULN2003 к ESP32

Драйвер ULN2003 ↔ ESP32

1

IN1 → GPIO 26

2

IN2 → GPIO 27

3

IN3 → GPIO 14

4

IN4 → GPIO 12

Питание

1

VCC VCC (драйвер) → 5V внешний источник

2

GND GND (драйвер) → GND (общий с ESP32)

⚠️

ВАЖНО: ESP32 не должен питать двигатель — только управлять!

4

Установка библиотеки 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);
}
5

Точное позиционирование

Управление углом поворота в градусах — основа для роботизированных систем и точного позиционирования:

#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);
}
Serial Monitor: вывод углов поворота шагового двигателя
6

Практическое применение

Применения шагового двигателя: 3D-принтеры, роботизированные руки, камеры
🖨️

3D-принтеры

Шаговые двигатели обеспечивают точное перемещение экструдера и стола

🦾

Роботизированные руки

Точное управление суставами манипулятора с заданным углом

📷

Камеры и сканеры

Плавное панорамирование и наведение на объект

7

Решение проблем

Типичные проблемы при работе с шаговым двигателем 28BYJ-48

❌ Двигатель гудит, но не вращается

✅ Недостаточный ток — используйте отдельный источник 5V, не питайте от ESP32.

❌ Вращение нечёткое или пропуск шагов

✅ Снизьте скорость: stepper.setSpeed(5-8) вместо максимальной.

❌ Двигатель вращается в неверном направлении

✅ Поменяйте порядок пинов: Stepper(STEPS, 26, 14, 27, 12) → Stepper(STEPS, 12, 27, 14, 26).

❌ Перегрев двигателя

✅ Нормально во время работы. Но отключайте питание обмоток когда двигатель неподвижен.

8

Цех Испытаний

Отточите мастерство на реальных кейсах. Каждая карта — это шаг к полному пониманию точной механики.

Время прохождения
~90 минут суммарно
🔄
Уровень: Start 5m

Один оборот

Базовое движение: ровно один полный оборот вала и полная остановка.

Миссия

Подключите 28BYJ-48 к драйверу ULN2003, пины IN1–IN4 к GPIO 19, 18, 5, 17. Установите скорость stepper.setSpeed(10). Вызовите stepper.step(2048) — это ровно 1 полный оборот по часовой стрелке. После выполнения двигатель должен остановиться и больше не двигаться.

01
Уровень: Easy 10m

Маятник

Бесконечное вращение: 5 секунд вперёд, 5 секунд назад.

Миссия

В loop() реализуйте бесконечный маятник: stepper.setSpeed(10), затем stepper.step(2048) — вращение по часовой 5 секунд (при скорости 10 об/мин ≈ 2048 шагов), пауза delay(500), stepper.step(-2048) — против часовой, пауза delay(500). Цикл должен повторяться бесконечно без остановки.

02
🎯
Уровень: Normal 15m

Кнопка — шаг 90°

Точное позиционирование по нажатию кнопки.

Миссия

Подключите тактовую кнопку к GPIO 0 (встроенная кнопка BOOT на ESP32) с INPUT_PULLUP. При каждом нажатии кнопки выполняйте stepper.step(512) — поворот ровно на 90° (2048 / 4 = 512 шагов). После 4 нажатий вал делает полный оборот и возвращается в начало. Выводите в Serial номер текущего сектора (0–3).

03
🕹️
Уровень: Hard 20m

Потенциометр скорости

Аналоговый вход управляет скоростью и направлением шагового двигателя.

Миссия

Подключите потенциометр к GPIO 34 (ADC). Считывайте analogRead(34) в диапазоне 0–4095. Мёртвая зона в центре (1800–2200): двигатель стоит. Ниже 1800: вращение против часовой, скорость пропорциональна отклонению (1 об/мин при 1799, 15 об/мин при 0). Выше 2200: по часовой, 1–15 об/мин. Направление задавайте знаком в stepper.step(±1).

04
🕰️
Уровень: Expert 30m

Стрелочные часы

Имитация минутной стрелки: один оборот за 60 секунд.

Миссия

Реализуйте точную имитацию минутной стрелки: 2048 шагов за 60 секунд = 1 шаг каждые 60000/2048 ≈ 29.3 мс. Используйте millis() для точного тайминга (не delay). Каждые 29 мс вызывайте stepper.step(1). Дополнительно: добавьте кнопку для переключения между минутной (1 об/60с) и секундной (1 об/60с, шаг каждые 29мс без делителя) стрелками. Выводите прошедшее время в Serial каждые 10 секунд.

05
🚀

Свой Проект

Создайте свою уникальную модель в онлайн-симуляторе. Ограничений нет!

Открыть Симулятор →