Шаговый двигатель 28BYJ-48 с драйвером ULN2003 и Arduino

Характеристики популярного шагового мотора 28BYJ-48, режимы работы, подключение через ULN2003 и управление библиотекой AccelStepper.
Что это за двигатель
Шаговый двигатель превращает электрические импульсы в поворот вала на определённый угол; наименьший такой угол называют шагом. Подобные моторы стоят в системах точного позиционирования: станках с ЧПУ, 3D-принтерах, обычных принтерах, манипуляторах. В любительской робототехнике широко распространён недорогой 28BYJ-48, который обычно идёт в комплекте с платой драйвера на микросхеме ULN2003.

| Напряжение питания | 5 В или 12 В |
| Число фаз | 4 |
| Коэффициент редукции | 1/63,68395 |
| Количество шагов ротора | 64 |
| Номинальная скорость | 15 об/мин |
| Крутящий момент | 450 г·см |
| Размеры (диаметр, высота) | 25 х 18 мм |
| Вес | 40 г |

Полный шаг и полушаг
Двигателем управляют в одном из двух режимов. В полношаговом на один шаг приходится последовательность из 4 ступеней импульсов, в полушаговом из 8.


Драйвер и подключение
ULN2003 представляет собой усилитель из семи пар транзисторов Дарлингтона. Входы IN1–IN7 предназначены для микроконтроллера, выводы GND и VCC для питания мотора. В рассматриваемых примерах задействованы четыре входа: IN1–IN4 соединены с выводами Arduino 8, 9, 10 и 11.
Выбор библиотеки
В Arduino IDE есть встроенная библиотека Stepper, но она умеет только полношаговую коммутацию. Пример на её основе (4076 шагов на оборот, вращение на один оборот по часовой стрелке и обратно с паузой в секунду) с этим мотором работает неправильно: вал движется лишь в одну сторону.
Проблему решает альтернативная библиотека AccelStepper. Она поддерживает ускорение и замедление, а также работу с несколькими двигателями. Объект создаётся с порядком выводов IN1, IN3, IN2, IN4 и режимом 8. В тестовом скетче задаются максимальная скорость 900, ускорение 100, скорость 200 и цель 2000 шагов; когда distanceToGo() возвращает ноль, направление меняется на противоположное. Двигатель при этом вращается плавно в обе стороны.
Пример: управление тремя кнопками
Для проекта понадобятся Arduino Uno, двигатель с драйвером, три кнопки и три резистора по 10 кОм. Кнопки подключены к выводам 5, 6 и 7. Назначение такое: кнопка 3 запускает вращение по часовой стрелке, кнопка 1 против часовой, кнопка 2 останавливает мотор.
Скетч в цикле опрашивает кнопки через функцию подавления дребезга. По нажатию устанавливается скорость 500 или -500 и поднимается флаг движения, либо вызывается stop() и флаг сбрасывается. Пока флаг активен, выполняется runSpeed(). Название выбранного режима выводится в последовательный порт на скорости 9600.
К исходному варианту функции антидребезга есть замечание: оператор return c стоит внутри условия if, из-за чего при кнопках без фиксации возможны ложные срабатывания. Корректнее вынести возврат значения за пределы условия.
Если двигатель не вращается
- Проверить правильность соединения драйвера с платой Arduino.
- Убедиться, что внешнего питания достаточно для двигателя.