ELECTRONICS

Шаговый двигатель 28BYJ-48 и Arduino: подключение через ULN2003, библиотека Stepper, скетч

Шаговые двигатели и драйверыСкетч проверен компиляцией

28BYJ-48 с драйвером ULN2003 — самый дешёвый способ получить точный поворот: мотор с редуктором и плата с транзисторной сборкой продаются комплектом дешевле чашки кофе. Четыре сигнальных провода, питание 5 В, библиотека из коробки.

Момента у него мало и скорость низкая — примерно пятнадцать оборотов в минуту. Хватает на стрелку прибора, жалюзи, поворотный столик, кормушку. Для оси станка или робота-манипулятора нужен NEMA 17 с драйвером A4988.

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

ZC-A0591CHINA 16TYDZYULN2003APG步进电机MCUIN1IN2IN3IN4IN5IN6IN7
Наведите на провод или нажмите на него — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
IN1–IN4Входы обмоток, любые четыре цифровых вывода.
+ и −Питание мотора 5 В. У версии мотора на 12 В — 12 В.
IN5–IN7Свободные каналы ULN2003, к мотору не разведены.
Разъём мотораПятиконтактный с ключом, вставляется одним способом.

Характеристики

Тип
униполярный, 5 фаз выводов, редуктор 1:64
Шагов на оборот вала
2048 в полношаговом режиме, 4096 в полушаговом
Момент
около 34 мН·м
Скорость
до 15 об/мин
Питание
5 В, 240 мА
Драйвер
ULN2003, семь ключей Дарлингтона

Откуда 2048 шагов

У самого мотора 32 шага на оборот ротора, но между ротором и валом стоит редуктор примерно 1:64. Итого около 2048 шагов на оборот вала в полношаговом режиме — библиотека Stepper работает именно в нём. В полушаговом, который умеет AccelStepper, шагов вдвое больше и ход плавнее.

«Примерно» — потому что передаточное число редуктора не круглое: 63,68395. За сто оборотов набегает погрешность в половину оборота. Для стрелки неважно, для точного позиционирования — учитывать.

Библиотека

Stepper (встроенная)Уже в Arduino IDE, ставить не надо. Для разгона и неблокирующей работы — AccelStepper с типом FULL4WIRE или HALF4WIRE.

Готовый скетч

#include <Stepper.h>

const int STEPS_PER_REV = 2048;

// Порядок выводов именно такой: IN1, IN3, IN2, IN4
Stepper motor(STEPS_PER_REV, 8, 10, 9, 11);

void setup() {
  motor.setSpeed(12);          // об/мин, больше 15 мотор не потянет
}

void loop() {
  motor.step(STEPS_PER_REV);       // оборот по часовой
  delay(500);
  motor.step(-STEPS_PER_REV / 2);  // пол-оборота обратно
  delay(500);
}

Скетч собирается arduino-cli под Arduino UNO

Функция step блокирует плату на всё время движения: оборот на 12 об/мин — это пять секунд, в которые loop стоит.

Частые ошибки

Мотор дрожит на месте

Перепутан порядок выводов. В конструкторе Stepper пары идут накрест: 8, 10, 9, 11. Если подключили по порядку — исправьте в коде, не перепаивайте.

Крутится, но слабо и пропускает

Скорость выше 15 об/мин или питание с USB просело. Снизьте setSpeed и дайте отдельные 5 В.

Греется

Обмотки под током и в покое. Это норма для шагового, но если мотор ничего не держит — отключайте все четыре вывода после движения, digitalWrite LOW.

Плата перезагружается при старте

Ток мотора через стабилизатор UNO. Отдельное питание на + драйвера с общей землёй.

Не доезжает до точки после сотни оборотов

Редуктор 63,68, а не 64. Считайте шаги как 2037,9 на оборот или корректируйте по датчику положения.

Что понадобится