Шаговый двигатель 28BYJ-48 и ULN2003: подключение к Arduino
28BYJ-48 — тот самый моторчик из каждого стартового набора: белая коробочка с редуктором и синяя плата ULN2003 рядом. Стоит он копейки, крутит шторки, заслонки и поворотные столики, но упирается новичка в два вопроса, на которых ломаются половина скетчей из интернета: сколько на самом деле шагов в обороте и почему мотор греется, даже когда стоит.
В нашем симуляторе моторчик живёт честно: карточка «Шаговый двигатель» из палитры «Макетка» с четырьмя пинами IN1-IN4, а скетч со Stepper.h исполняется по-настоящему — позиция на диске карты по шагам, скорость задаёт темп. Ниже — арифметика 2048 и 4096 без вранья, таблица фаз полушага, скетч и грабли питания.
2048 или 4096: арифметика без маркетинга
Сам мотор до редуктора делает 32 шага на оборот (11,25 градуса на шаг). Дальше планетарный редуктор с передаточным числом примерно 63,7:1 — не круглое 64:1, и это ключ к честным цифрам. В полушаговом режиме получается 32 × 63,7 × 2 ≈ 4076 шагов на оборот, в полном — около 2038. Библиотека Stepper.h не умеет полушаг, а почти все скетчи используют круглое 2048 — это удобное приближение, при котором оборот получается с небольшой недокруткой. Для шторки неважно, для поворотного столика с накоплением угла — уже важно. Полный разбор числа и откуда берётся 2038 — в уроке про передаточное число.
Почему в Stepper.h передают 2048: конструктор Stepper(шаги на оборот, пин1, пин2, пин3, пин4) умножает это число на скорость, чтобы перевести обороты в минуты в темп шагов. Зададите 2048 — setSpeed(15) даст честные пятнадцать оборотов в минуту с точностью до приближения. В симуляторе это число попадает на карточку как есть — в моём прогоне шаг(2048) при setSpeed(5) занял на dial ровно 2048 позиций.
Подключение: пять проводов мотора и четыре пина
| Что | Куда | Зачем |
|---|---|---|
| IN1, IN2, IN3, IN4 | четыре цифровых пина, в скетче — 8, 10, 9, 11 | фазы катушек, драйвер отдаёт по ним импульсы |
| GND платы ULN2003 | GND Arduino и минус питания | общая земля обязательна |
| Питание мотора 5 В | внешний БП или отдельный 5 В, не от ножки платы | две фазы по ~100 мА — на грани USB |
| Разъём мотора | белый штекер в плату ULN2003 | перепутать нельзя — ключ на разъёме |
Порядок пинов в конструкторе — классические грабли: катушки 28BYJ-48 идут не подряд, поэтому стандартный скетч выглядит как Stepper myStepper(2048, 8, 10, 9, 11) — десятка и девятка поменяны местами. Перепутаете порядок — мотор будет дёргаться на месте. Распиновку самой платы ULN2003 со светодиодами фаз я разбирать не буду — она с таблицей и схемой в отдельном обзоре драйвера.
Фазы полушага: восемь тактов на цикл
ULN2003 просто замыкает фазы на землю по команде с пинов. В полушаге фазы идут восемью тактами: IN1, затем IN1+IN2, затем IN2, IN2+IN3, IN3, IN3+IN4, IN4, IN4+IN1 — и цикл повторяется. Библиотека сама гонит эту последовательность, вручную её пишут только ради плавности или экономии: полное шагование вдвое грубее, но момент выше. В симуляторе на карточке видно суммарную позицию в шагах — последовательность фаз это внутренность библиотеки, её проверяют на живой плате по светодиодам ULN2003, они загораются по одному и по два в ритме тактов.
Скетч: оборот туда и обратно
Проверенный скетч: полный оборот по часовой, пауза, оборот обратно. step() — блокирующий вызов: на 5 об/мин оборот занимает 12 секунд, и всё это время loop() стоит. Скорости выше 15-16 об/мин 28BYJ-48 не вывозит — редуктор и момент кончаются, мотор начинает пропускать шаги.
#include <Stepper.h>const int SHAGOV = 2048; // приближение для Stepper.hStepper myStepper(SHAGOV, 8, 10, 9, 11); // порядок 8-10-9-11 важен! void setup() { Serial.begin(9600); myStepper.setSpeed(5); // 5 об/мин — комфортный темп Serial.println("start");} void loop() { Serial.println("cw 2048"); myStepper.step(SHAGOV); // блокирующий оборот по часовой delay(500); Serial.println("ccw 2048"); myStepper.step(-SHAGOV); // и обратно delay(500);}В симуляторе вставьте скетч и запустите: dial карточки «Шаговый двигатель» докрутится до 2048 и пойдёт обратно, Serial напечатает cw и ccw. Нагрев, момент и пропущенные шаги браузер не показывает — это физика железа: мотор греется потому, что при остановке катушки остаются под током удержания, и по ~100 мА на фазу текут часами. Питание берите с внешнего БП 5 В на ампер, а не от USB платы. Для плавных разгонов вместо Stepper.h берут AccelStepper — у нас есть обзор его подключения.