Подключение шагового двигателя к Ардуино

Шаговый двигатель Arduino предназначен для точного позиционирования или перемещения объекта за определенное количество шагов вала. Плата Ардуино может управлять шаговым двигателем с помощью драйвера и библиотеки stepper.h. Рассмотрим принцип работы stepper motor, схему подключения шагового двигателя к Arduino, разберем управление шаговым двигателем 28BYJ-48 с помощью модуля UNL2003.
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- шаговый двигатель 28BYJ-48
- драйвер шагового двигателя ULN2003
- коннекторы
- библиотека Stepper.h
- Управление шаговым двигателем от Shield L293D
- Подключение и управление мотором от Ардуино
- Подключение модуля MOSFET IRF520N к Ардуино
Двигатель 28BYJ-48 с модулем UNL2003 — это бесщеточный синхронный двигатель. Как и все двигатели, он преобразует электрическую энергию в механическую. В отличие от двигателя постоянного тока, в котором вращается вал, вал шагового двигателя совершает дискретные движения, т.е. вращается не непрерывно, а пошагово. Каждый шаг вала (ротора) у stepper motor представляет собой часть полного оборота.
Шаговый двигатель принцип работы, устройство

шаговый мотор 28BYJ-48 характеристики
- Напряжение питания: 5В или 12В
- Число фаз: 4
- Номинальная скорость вращения: 15 оборот/мин
- Коэффициент редукции: 1/63.68395
- Количество шагов ротора: 64
- Крутящий момент: 450 г*см
- Размеры (диаметр,высота): 25×18 мм
В зависимости от конструкции используются три типа двигателей: с постоянными магнитами, с переменными магнитами и гибридные. В двигателях с постоянными магнитами количество шагов на один оборот вала достигает 48, т.е. один шаг соответствует повороту вала на 7,5°. Гибридные двигатели обеспечивают 400 шагов, подсчитав количество сделанных шагов, можно определить угол поворота ротора.
Вал двигателя вращается под действием сигнала, который управляет магнитным полем катушек статора двигателя. Сигнал генерируется драйвером шагового двигателя 28BYJ-48 (stepper motor). Магнитное поле, создаваемое электрическим током в обмотках статора, вращает вал, на котором установлены магниты. Количество шагов определяется в программе с помощью команд библиотеки Stepper.h.
Как подключить шаговый двигатель к Ардуино

Шаговый двигатель 28BYJ-48 с модулем UNL2003 управляется от Ардуино путем подачи импульсов на обмотки двигателя в определенной последовательности. Для облегчения управления шаговыми двигателями были созданы специальные библиотеки, но вращать вал двигателя можно и без библиотек. Подключите шаговый двигатель к микроконтроллеру, как показано на схеме выше, и загрузите следующую программу в плату.
Скетч управление шаговым двигателем Ардуино
#define in1 8 #define in2 9 #define in3 10 #define in4 11 // пауза между шагами, минимум 10 мс int dl = 20; void setup() < pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); >void loop()
Библиотека Stepper.h для шагового двигателя

Рассмотрим управление шаговыми двигателями с помощью стандартной библиотеки Stepper.h, в которой реализовано множество дополнительных команд и функций. Схема подключения двигателя остается прежней. Основные характеристики двигателя 28BYJ-48: питание 5 или 12 вольт, 4-фазный двигатель, угол шага 5,625°. Порты драйвера IN1 — IN4 подключаются к любому цифровому выводу микроконтроллера Arduino.
Скетч управление 28BYJ-48 stepper motor Ардуино
#include «Stepper.h» const int stepsPerRevolution = 200; Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); void setup() < myStepper.setSpeed(60); >void loop()
Команды библиотеки Stepper.h Arduino
AccelStepper mystepper(DRIVER, step, direction); // Шаговый двигатель, управляемый платой
AccelStepper mystepper(FULL2WIRE, pinA, pinB); // Шаговый двигатель с Н-мостом
AccelStepper mystepper(FULL4WIRE, pinA1, pinA2, pinB1, pinB2); // Униполярный двигатель
mystepper.setMaxSpeed(stepsPerSecond); // Установка скорости оборотов в минуту
mystepper.setSpeed(stepsPerSecond); // Установка скорости в шагах за секунду
mystepper.setAcceleration(stepsPerSecondSquared); // Установка ускорения
mystepper.currentPosition(); // Возвращает текущее положение в шагах
mystepper.setCurrentPosition (long position); // Обнуляет текущую позицию до нуля
mystepper.targetPosition(); // Конечное положение в шагах
mystepper.distanceToGo(); // Вернуть расстояние до указанного положения
mystepper.moveTo(long absolute); // Переместиться в абсолютно указанное положение
mystepper.move(long relative); // Переместиться в относительно указанное положение
mystepper.run(); // Начать движение с ускорением, функцию следует вызывать повторно
mystepper.runToPosition(); // Начать движение до указанной точки
mystepper.runToNewPosition(); // Начать движение с ускорением до заданной позиции
mystepper.stop(); // Максимально быстрая остановка (без замедления)
mystepper.runSpeed(); // Начать движение с заданной скоростью без ускорения
mystepper.runSpeedToPosition(); // Начать движение без ускорения, до позиции
mystepper.disableOutputs(); // Деактивирует зарезервированные пины и устанавливает их в режим LOW. Снимает напряжение с обмоток двигателя, экономя энергию
mystepper.enableOutputs(); // Активирует зарезервированные пины и устанавливает их в режим OUTPUT. Вызывается автоматически при запуске двигателя
Заключение. Шаговый двигатель является идеальным приводом в 3D-принтерах, станках с ЧПУ и другом оборудовании. Соединение между модулем контроллера и двигателем 28BYJ-48 является простым, поскольку имеется разъем, который служит для направления соединения между устройствами. Модуль UNL2003 Arduino имеет четыре диода, которые показывают, какая катушка у stepper motor активна в каждый момент времени.
FAQ (часто задаваемые вопросы)
Какая используется библиотека для 28BYJ-48 ?
Для шагового двигателя 28BYJ-48 с модулем UNL2003 используется библиотека Stepper.h, ссылка на скачивание архива с библиотекой размещена в начале статьи.
Ошибка fatal error Stepper.h No such file or directory ?
Если при компиляции скетча появляется ошибка «Stepper.h No such file or directory», то это значит, что отсутствует библиотека Stepper.h в Arduino IDE. Следует скачать и установить библиотеку для двигателя, которая используется в программе.
Почему шаговый двигатель греется в состоянии покоя ?
При выключении двигателя с помощью команды mystepper.stop(); не все катушки двигателя отключаются от питания (на модуле UNL2003 будут гореть диоды). При остановке включается режим удержания положения ротора — это штатный режим работы библиотеки, но при этом шаговый двигатель будет греться и тратить энергию. Чтобы полностью отключить питание, следует перевести все пины Ардуино в режим LOW.
Как подключить мотор шилд Ардуино L293D

Сегодня мы разберем весьма полезное расширение для платы Arduino UNO — Motor Control Shield L293D, рассмотрим схему подключения к данному шилду сервомоторов, шаговых двигателей и моторов постоянного тока. Также вы можете ознакомиться с командами, используемых в библиотеке AFMotor.h, и попробовать различные скетчи для управления шаговыми двигателями и моторами постоянного тока на Ардуино.
Motor Shield L293D: схема, характеристики
Микроконтроллер Ардуино позволяет любому начинающему радиолюбителю изготавливать сложные автоматизированные устройства и проекты. Использование Motor Shield может стать полезным дополнением во в многих проектах на Arduino, так как позволяет подключить сразу 2 сервопривода, 2 шаговых двигателя и до 4 двигателей постоянного тока (с реверсом направления вращения ротора).

Характеристики Мотор Шилд L293D
— для работы нужна библиотека AFMotor.h (скачать библиотеку);
— возможность подключения 2-х сервоприводов на 5 Вольт;
— возможность подключения 2-х шаговых двигателей от 6 до 12 Вольт;
— подключение до 4-х моторов с возможностью реверса направления вращения;
— контакты для подключения внешнего питания для двигателей;
— Motor Shield for Arduino совместим с платами Uno и Mega.
При подключении серводвигателей и моторов к Ардуино используются различные порты, к которым нельзя подключать другую периферию. Так, для серво используются цифровые порты 9 и 10, для шаговых двигателей и моторов используются порты с 3 по 8 и 12. Если вы желаете еще что-то подключить, то используйте 0 и 1 порт, 2 и 13, а также аналоговые входы (порты A0-A5 можно использовать как цифровые выходы).
Как подключить Motor Shield к Ардуино
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- Motor Shield L293D;
- сервомотор;
- двигатели постоянного тока;
- шаговый двигатель;
- провода «папа-мама», «папа-папа».
К Ардуино шилд подключается очень просто — он устанавливается на плату UNO прямо сверху. Обратите внимание, что без подключения внешнего источника питания к Motor Shield, логика и двигатели будут работать от 5 Вольт, что не всегда бывает достаточно. Поэтому скорость вращения моторов постоянного тока при подключении платы Ардуино от компьютера и блока питания будет значительно отличаться.

Обратите внимание, что даже если вы задали одинаковую скорость вращения в скетче, моторы в реальности могут вращаться с разной скоростью — на это оказывает влияние скорость самого двигателя, качество изготовления редуктора и колес. После подключения двигателей, как на схеме выше, загрузите следующий скетч (скачать библиотеку AFMotor и скетч можно здесь) для тестирования работы шилда:
Скетч для Motor Shield L293D Ардуино и моторов
#include // подключаем библиотеку для шилда AF_DCMotor motor1(1); // подключаем мотор к клеммникам M1 AF_DCMotor motor2(2); // подключаем мотор к клеммникам M2 void setup() < motor1.setSpeed(255); // задаем максимальную скорость мотора motor1.run(RELEASE); // останавливаем мотор motor2.setSpeed(255); // задаем максимальную скорость мотора motor2.run(RELEASE); // останавливаем мотор > void loop() < motor1.run(FORWARD); // задаем движение вперед motor2.run(FORWARD); // задаем движение вперед motor1.setSpeed(255); // задаем скорость движения motor2.setSpeed(255); // задаем скорость движения delay(2000); // указываем время движения motor1.run(RELEASE); // останавливаем мотор M1 motor2.run(RELEASE); // останавливаем мотор M2 motor1.run(BACKWARD); // задаем движение назад motor2.run(BACKWARD); // задаем движение назад motor1.setSpeed(255); // задаем скорость движения motor2.setSpeed(255); // задаем скорость движения delay(2000); // указываем время движения motor1.run(RELEASE); // останавливаем мотор M1 motor2.run(RELEASE); // останавливаем мотор M2 >
Пояснения к коду:
- Для каждого мотора следует присваивать свое имя AF_DCMotor motor1(1) ;
- Максимальная скорость вращения motor1.setSpeed(255) равна 255;
- Без команды motor1.run(RELEASE) мотор продолжит вращаться.
Для управления сервоприводами используется стандартная библиотека Servo.h, сами сервоприводы подключаются к цифровым выходам 9 и 10 через штырьки на краю платы. К шилду можно подключить только два сервопривода и два шаговых двигателя. Первый шаговый двигатель подключается к клеммам M1 и M2, а второй к клеммам M3 и M4. Схема подключения двигателей к Motor Shield L293D изображена далее.
Скетч для подключение серво и шаговых двигателей

После подключения Stepper Motor к шилду загрузите в плату следующий скетч:
#include // подключаем библиотеку для шилда int i; // вводим переменную // подключаем шаговый двигатель к порту 1 - M1, M2 // 48 - количество шагов для полного оборота AF_Stepper stepper(48, 1); void setup() < >void loop() < // делаем 48 шагов в одном направлении, DOUBLE - тип шага for (i = 0; i step(1, FORWARD, DOUBLE); delay(30); > // делаем 48 шагов в обратном направлении (BACKWARD) for (i = 48; i >= 0; i--) < stepper.step(1, BACKWARD, DOUBLE); delay(30); > >
Управление двигателями и серво от Ардуино
Подключение моторов, шаговых двигателей и сервоприводов к Arduino Uno позволит вам «оживить» свой проект — это самое интересное направление при изучении микроконтроллеров. В этом разделе вы найдете полную информацию про подключение и управление различными двигателями и движущимися механизмами на микроконтроллере Ардуино с примерами.
Подключение мосфета к Ардуино с мотором
Опубликовано: 18.01.2023 Отредактировано: 09.12.2023 На чтение: ≈ 3 минуты

Подключение транзистора к Arduino — рассмотрим применение транзисторов в автоматике и сделаем управление мотора с помощью mosfet транзистора
Подключение шагового двигателя к Ардуино
Опубликовано: 13.01.2023 Отредактировано: 09.12.2023 На чтение: ≈ 5 минут

Рассмотрим принцип работы и схему подключения шагового двигателя к Ардуино, разберем управление шаговым двигателем 28BYJ-48 с модулем UNL2003
Подключение и управление серво от Ардуино
Опубликовано: 25.12.2022 Отредактировано: 10.12.2023 На чтение: ≈ 5 минут

Сервопривод Ардуино применяется для точного управления движениями механизмов. Рассмотрим принцип работы и подключение micro servo к Arduino
Подключение и управление мотором Ардуино
Опубликовано: 24.12.2022 Отредактировано: 09.12.2023 На чтение: ≈ 3 минуты

Подключение двигателя постоянного тока к Arduino через MOSFET потребуется для создания автомобиля или лодки на базе Ардуино с радиоуправлением
Модуль MOSFET IRF520N Ардуино подключение
Опубликовано: 11.12.2022 Отредактировано: 10.12.2023 На чтение: ≈ 3 минуты

Модуль MOSFET Arduino на транзисторе IRF520, используется для управления нагрузками до 24 вольт. Рассмотрим подключение модуля к Arduino Uno
Motor Control Shield L293D Arduino подключение
Опубликовано: 07.12.2022 Отредактировано: 10.12.2023 На чтение: ≈ 4 минуты

Motor shield L293D Arduino — рассмотрим схему подключения сервомоторов, шаговых двигателей и двигателей постоянного тока к плате расширения
Подключение шагового двигателя к Arduino Uno
Шаговые двигатели с каждым годом находят все большее применение в мире электроники. Начиная от обычной камеры наблюдения до сложных станков с ЧПУ и роботов шаговые двигатели используются в качестве исполнительных механизмов, поскольку они обеспечивают точное управление. В этом проекте мы рассмотрим один из наиболее распространенных шаговых двигателей 28BYJ-48 и его подключение к плате Arduino с помощью модуля ULN2003.

Общие принципы работы шаговых двигателей
Внешний вид шагового двигателя 28BYJ-48 представлен на следующем рисунке:

Первый вопрос, который напрашивается при взгляде на этот рисунок – почему в отличие от обычного двигателя из этого шагового двигателя выходят 5 проводов различных цветов? Чтобы понять это давайте сначала разберемся с принципами работы шагового двигателя.
Начнем с того, что шаговые двигатели не вращаются, а “шагают”, поэтому они и называются шаговыми двигателями. То есть в один момент времени они будут передвигаться только на один шаг. Чтобы добиться этого в устройстве шаговых двигателей присутствует несколько катушек и на эти катушки нужно подавать питание в определенной последовательности чтобы двигатель вращался (шагал). При подаче питания на каждую катушку двигатель делает один шаг, при последовательной подаче питания на катушки двигатель будет совершать непрерывные шаги, то есть вращаться. Давайте более подробно рассмотрим катушки, присутствующие внутри шагового двигателя.

Как можно видеть из рисунка, двигатель имеет однополярную катушку с 5 выводами. Но фактически это 4 катушки, на которые нужно подавать питание в определенной последовательности. На красные провода необходимо подать +5V, на остальные 4 провода необходимо подать землю чтобы запустить в работу соответствующую катушку. Мы будем использовать плату Arduino чтобы подавать питание на эти катушки в определенной последовательности и тем самым заставлять двигатель вращаться. Более подробно ознакомиться с принципами работы шаговых двигателей можно в статье про подключение шагового двигателя к микроконтроллеру AVR.
Так почему же этот двигатель называется 28BYJ-48? Честно говоря, мы не знаем точного ответа на этот вопрос. Некоторые наиболее важные технические характеристики этого шагового двигателя приведены на следующем рисунке.

На первый взгляд от такого количества характеристик может закружиться голова, но давайте попробуем выделить из них самые важные, те, которые нам понадобятся для дальнейшей работы. Во-первых, мы знаем, что это шаговый двигатель 5V, поэтому необходимо подавать на красный провод 5V. Также мы знаем что это четырехфазный шаговый двигатель поскольку в нем четыре катушки. Передаточное число этого двигателя — 1: 64. Это означает, что вал, который вы видите снаружи, сделает одно полное вращение в том случае, когда двигатель внутри сделает 64 оборота. Это происходит благодаря шестерням, которые включены между двигателем и выходным валом. Эти шестерни помогают в увеличении крутящего момента.
Еще одним важным показателем, который нам следует знать, является угол шага: 5.625°/64. Это значит что когда двигатель сделает последовательность в 8 шагов он будет поворачиваться на 5.625° при каждом шаге и за один полный оборот он сделает 64 шага (5.625*64=360).
Расчет шагов на оборот для шагового двигателя
Важно знать, как рассчитать количество шагов за один оборот для вашего шагового двигателя, потому что только тогда вы можете эффективно его запрограммировать.
В Arduino для управления двигателем мы будем использовать 4-шаговую последовательность, поэтому угол шага будет составлять 11.25°. Поскольку изначально он равен 5.625°(приведен в даташите), то для 8 шаговой последовательности получим 11.25° (5.625*2=11.25).
Справедлива следующая формула:
Количество шагов за оборот = 360 / угол шага.
В нашем случае 360/11.25 = 32 шага за оборот.
Зачем нужен драйвер мотора для управления шаговым двигателем
Большинство шаговых двигателей будут работать только с помощью модуля драйвера мотора. Это связано с тем, что микроконтроллер (в нашем случае плата Arduino) не может обеспечить достаточный ток на своих контактах ввода/вывода для работы двигателя. Поэтому мы будем использовать внешний драйвер мотора для управления нашим шаговым двигателем — модуль ULN2003 (купить на AliExpress). В сети интернет можно найти рейтинги эффективности различных драйверов мотора, но эти рейтинги будут меняться в зависимости от типа используемого шагового двигателя. Основной принцип, которого следует придерживаться при выборе драйвера мотора – он должен обеспечивать достаточный ток для управления шаговым двигателем.
Работа схемы
Схема подключения шагового двигателя к плате Arduino представлена на следующем рисунке.

Мы использовали шаговый двигатель 28BYJ-48 и драйвер мотора ULN2003. Для подачи питания на 4 катушки шагового двигателя мы будем использовать контакты платы Arduino 8, 9, 10 и 11. Драйвер мотора запитывается от контакта 5V платы Arduino.
Но если вы будете подсоединять какую-нибудь нагрузку к шаговому двигателю, то вам потребуется внешний источник питания для драйвера мотора. Мы в нашем примере эксплуатируем шаговый двигатель без нагрузки, поэтому нам и хватило питания от платы Arduino. И не забудьте соединить землю платы Arduino с землей драйвера мотора.
Разработка программы для платы Arduino
Перед тем как начать писать программу для платы Arduino давайте разберемся что должно происходить внутри этой программы. Как мы уже говорили ранее, мы будем использовать метод 4-шаговой последовательности, то есть нам нужно будет сделать 4 шага чтобы выполнить один полный оборот двигателя.
| Номер шага | Контакты, на которое подается питание | Катушки, на которое подается питание |
| Шаг 1 | 8 и 9 | A и B |
| Шаг 2 | 9 и 10 | B и C |
| Шаг 3 | 10 и 11 | C и D |
| Шаг 4 | 11 и 8 | D и A |
На драйвере мотора есть 4 светодиода, по свечению которых можно судить о том, на какую катушку подается питание в конкретный момент. Более подробно все эти процессы можно посмотреть в видео, приведенном в конце статьи.
Мы напишем программу, в которой необходимое количество шагов для двигателя мы будем вводить в мониторе последовательного порта (serial monitor) платы Arduino. Полный текст программы приведен в конце статьи, здесь же мы рассмотрим наиболее важные его фрагменты.
Как мы рассчитали ранее, полное число шагов для полного оборота нашего шагового двигателя, равно 32, пропишем это в следующей строчке кода:
#define STEPS 32
Далее мы должны сказать плате Arduino через какие ее контакты мы будем управлять шаговым двигателем (то есть к каким ее контактам подключен драйвер мотора).
Stepper stepper (STEPS, 8, 10, 9, 11);
Примечание : последовательность номеров контактов, указанная в приведенной команде (8,10,9,11) – специально упорядочена таким образом чтобы подавать питание на катушки шагового двигателя в правильном порядке. Если вы измените номера контактов, к которым подключен шаговый двигатель, то вы соответствующим образом должны их упорядочить для подачи в приведенную команду.
Мы будем использовать специальную библиотеку для работы с шаговыми двигателями, поэтому для задания скорости вращения шагового двигателя мы можем использовать команду вида:
Для двигателя 28-BYJ48 скорость вращения можно установить в диапазоне от 0 до 200.
Теперь, чтобы двигатель сделал один шаг, мы можем использовать следующую команду:
Количество шагов, которое должен сделать двигатель, определяется переменной “ val ”. Поскольку мы имеем 32 шага (для оборота) и передаточное число 64 мы должны сделать 2048 (32*64=2048) “шагов” в этой команде для совершения одного полного оборота двигателя.
Значение переменной “val” в нашей программе мы будем вводить из окна монитора последовательной связи.
Работа проекта
Когда вы сделаете все необходимые соединения в аппаратной части нашего проекта у вас должна получиться примерно следующая конструкция:

Теперь загрузите код программы в плату Arduino UNO и откройте окно монитора последовательной связи (serial monitor). Как мы уже указывали, мы должны сделать 2048 шагов для совершения одного полного оборота, то есть если мы в окне монитора последовательной связи введем 2048, то вал шагового двигателя совершит один полный оборот по часовой стрелке, а сам двигатель в это время сделает 2048 шагов. Для вращения против часовой стрелки просто вводите нужное число шагов со знаком “–“. То есть если вы введете -1024, то вал мотора совершит пол-оборота против часовой стрелки. Чтобы протестировать работу проекта вы можете вводить любые числа.
Исходный код программы
Код программы достаточно простой. Я надеюсь после успешной реализации данного проекта вы сможете управлять любыми шаговыми двигателями с помощью платы Arduino.
#include // заголовочный файл библиотеки для работы с шаговыми двигателями
// измените необходимое число шагов в зависимости от модели вашего шагового двигателя
#define STEPS 32
// создайте класс для шагового двигателя и запишите для него правильную последовательность контактов
Stepper stepper(STEPS, 8, 10, 9, 11);
int val = 0;
void setup() <
Serial.begin(9600);
stepper.setSpeed(200);
>
void loop() <
if (Serial.available()>0)
<
val = Serial.parseInt();
stepper.step(val);
Serial.println(val); //for debugging
>
>