Симулятор шагового двигателя 28BYJ-48 онлайн: Stepper и ULN2003
28BYJ-48 — самый дешёвый шаговик в радиомагазине: 200 рублей за мотор с платкой ULN2003. У меня на нём была заслонка вентиляции: скетч крутил на 500 шагов, и заслонка открывалась. Через месяц я заметил, что моторчик пропускает шаги при питании от USB — напряжение проседало до 4,2 В, и крутящий момент падал. Сейчас бы я проверил логику сначала в браузере: задал 500 шагов, посмотрел, как стрелка на плашке проходит их, и только потом собирал бы стенд с отдельным питанием 5 В.
Мотор ставится на стенд симулятора из каталога: фиолетовый провод с меткой STP, четыре пина IN1-IN4 на D4-D7 (стандартный расклад ULN2003). Stepper.h(2048, IN1, IN3, IN2, IN4) — обратите внимание на порядок: 1-3-2-4, не 1-2-3-4, и это первая ловушка новичка. Ниже — стартовый скетч, поворот с плавным ускорением, honest границы модели и грабли с пропуском шагов.
Что эмулируется на стенде
28BYJ-48 в каталоге — деталь «Шаговый 28BYJ-48 + ULN2003»: четыре пина IN1-IN4 на D4-D7, фиолетовый провод с меткой STP. На плашке устройства стрелка повторяет поворот мотора: скетч вызывает Stepper.step(N), и стрелка сдвигается на N «фаз». У движка 2048 фаз на полный оборот (редукция 1:64 в редукторе 28BYJ-48), так что step(2048) — это полный круг. Скорость ограничена: больше 600 шагов/сек мотор пропускает, и в браузере это видно как «стрелка не дошла до конца».
- 4 пина IN1-IN4 на D4-D7: стандартный расклад для ULN2003; в скетче Stepper(2048, IN1, IN3, IN2, IN4) — порядок 1-3-2-4.
- 2048 шагов на оборот: внутренний редуктор 1:64 × 32 шага на самом роторе = 2048 фаз полного оборота.
- step(N): N положительных — по часовой, отрицательных — против; стрелка на плашке повторяет.
- setSpeed(rpm): скорость в оборотах в минуту; 15-20 rpm — паспортная, выше 25 — мотор пропускает шаги.
- Ручная прокрутка в карточке: повернуть стрелку на N шагов без скетча — для проверки стенда.
Стартовый скетч: поворот на 500 шагов
#include <Stepper.h> const int SHAGOV_NA_OBOROT = 2048;Stepper myStepper(SHAGOV_NA_OBOROT, 4, 6, 5, 7); // IN1, IN3, IN2, IN4 void setup() { myStepper.setSpeed(15); // 15 об/мин — паспортная скорость Serial.begin(9600);} void loop() { Serial.println("Po chasovoj 500 shagov"); myStepper.step(500); delay(2000); Serial.println("Protiv chasovoj 500 shagov"); myStepper.step(-500); delay(2000);}Запустите скетч — стрелка на плашке пройдёт 500 шагов по часовой, остановится на 2 с, и вернётся обратно. На плате тот же скетч крутит реальный 28BYJ-48 с той же скоростью 15 об/мин; полный оборот занимает 4 с. Полный разбор анатомии двигателя, фаз и редуктора — в уроке про 28BYJ-48 анатомию; стартовый скетч по строкам — в уроке про первый запуск 28BYJ-48.
Плавный разгон: ловушка пропуска шагов
#include <Stepper.h> Stepper myStepper(2048, 4, 6, 5, 7); void setup() { Serial.begin(9600);} void loop() { // Razgon: 5 -> 10 -> 15 ob/min myStepper.setSpeed(5); myStepper.step(200); myStepper.setSpeed(10); myStepper.step(200); myStepper.setSpeed(15); myStepper.step(1648); // itog = 2048 = polnyj oborot Serial.println("Oborot"); delay(2000); // Tormozhenie myStepper.setSpeed(10); myStepper.step(-200); myStepper.setSpeed(5); myStepper.step(-1848); delay(2000);}Разгон — простая защита от пропуска шагов: первые 200 шагов мотор едет медленно (5 об/мин), потом ускоряется до паспортных 15. Без разгона при старте под нагрузкой ротор не успевает за полем, и мотор «гудит, но не крутит» — типичная жалоба новичка. Полный разбор разгона и торможения с математикой — в уроке про ускорение и трапецию; разбор 28BYJ-48 против NEMA17 — в сравнении.
Граница: модель против живого мотора
| Проверка | Симулятор | Только железо |
|---|---|---|
| Stepper.step(N) — поворот на N шагов | да: стрелка на плашке | то же, плюс реальный ротор |
| setSpeed(rpm) — скорость оборотов в минуту | да: число, без инерции | то же, плюс инерция и момент |
| Направление: step(+N)/step(-N) | да: синхронно со знаком | то же |
| Пропуск шагов при перегрузке | нет: модель идеальная | да — мотор гудит, ротор стоит |
| Питание 5 В против USB | не моделируется | да — USB проседает, момент падает |
| Крутящий момент 0,3 кг·см на валу | не моделируется | да — паспорт при 5 В и 15 об/мин |
Браузер крутит стрелку без инерции и без просадки питания: модель идеальная. На плате при старте под нагрузкой ротор не успевает за полем, и мотор «пропускает» — стрелка в браузере прошла 500 шагов, а вал на плате — 480. На отдельном питании 5 В (не USB) мотор держит паспортные 0,3 кг·см, на USB — в два раза меньше. Поэтому в проектах с заслонкой или клапаном 28BYJ-48 всегда питают отдельно, не через борт 5V Arduino.
Грабли 28BYJ-48
- Порядок пинов 1-3-2-4: Stepper(2048, IN1, IN3, IN2, IN4), а не 1-2-3-4. Перепутали — мотор дрожит, но не крутит.
- Скорость выше 25 об/мин: мотор пропускает шаги. Паспортная 15, потолок — 20-25; выше — нужен драйвер с поддержкой микрошага.
- Питание от USB Uno: просадка до 4,2 В при 200 мА, момент падает. Отдельный блок 5 В или батарея 4×AA.
- Дребезг пинов при step(0): некоторые версии библиотеки на шаге 0 дёргают фазы, и мотор «гудит». Проверяйте if (N != 0) перед step.
- 28BYJ-48 против NEMA17: у первого редуктор 1:64 и момент 0,3 кг·см, у второго 200 шагов на оборот без редуктора и момент 4 кг·см. Для заслонки — 28BYJ, для ЧПУ — NEMA17.