Управление шаговым двигателем с помощью микросхемы драйвера L293D и Arduino
Один из самых простых и недорогих способов управления шаговыми двигателями — это подключение микросхемы драйвера L293D к Arduino. Она может управлять как скоростью, так и направлением вращения любого униполярного шагового двигателя, например 28BYJ-48, или биполярного шагового двигателя, например NEMA 17.
Если вы хотите изучить основы микросхемы L293D, руководство по ссылке ниже будет очень полезным. Рекомендуется прочитать (или хотя бы бегло просмотреть) это руководство в первую очередь.
Управление шаговым двигателем с помощью H-моста
Поскольку микросхема L293D имеет два H-моста, каждый H-мост будет управлять одной из электромагнитных катушек шагового двигателя.
Подавая ток на эти электромагнитные катушки в определённой последовательности, вал шагового двигателя можно точно перемещать вперёд или назад небольшими шагами.
При этом скорость двигателя определяется частотой подачи тока на катушки.
На изображении ниже показано управление шаговым двигателем с помощью H-моста.
Управление униполярным шаговым двигателем (28BYJ-48)
В нашем первом эксперименте мы используем униполярный шаговый двигатель 28BYJ-48, рассчитанный на 5V. Он обеспечивает 48 шагов на оборот.
Прежде чем подключать двигатель к микросхеме, необходимо определить провода A+, A-, B+ и B- на двигателе, который вы планируете использовать. Лучший способ сделать это — проверить техническое описание двигателя. Для нашего двигателя это оранжевый, розовый, синий и жёлтый провода.
Обратите внимание, что в этом эксперименте мы не будем использовать общий центральный провод (красный).
Центральный провод используется просто для подачи тока на левую или правую сторону катушки, создавая эффект изменения направления тока без необходимости использования схемы, которая может менять направление тока.
Подключения довольно просты. Начните с подключения выхода 5V на Arduino к выводам Vcc2 и Vcc1. Подключите заземление к заземлению.
Также необходимо подключить оба вывода ENA и ENB к выходу 5V, чтобы двигатель был всегда включён.
Теперь подключите входные выводы (IN1, IN2, IN3 и IN4) микросхемы L293D к четырём цифровым выводам (12, 11, 10 и 9) на Arduino.
Наконец, подключите провода шагового двигателя A+ (оранжевый), A- (розовый), B- (жёлтый) и B+ (синий) к выходным выводам L293D (Out4, Out3, Out2 и Out1), как показано на иллюстрации ниже.
Схема подключения микросхемы драйвера L293D к шаговому двигателю 28BYJ-48 и Arduino
Управление биполярным шаговым двигателем (NEMA 17)
В нашем следующем эксперименте мы используем биполярный шаговый двигатель NEMA 17, рассчитанный на 12V. Он обеспечивает 200 шагов на оборот и может работать на скорости 60 об/мин.
Прежде чем подключать двигатель к микросхеме, необходимо определить провода A+, A-, B+ и B- на двигателе, который вы планируете использовать. Лучший способ сделать это — проверить техническое описание двигателя. Для нашего двигателя это красный, зелёный, синий и жёлтый провода.
Подключения довольно просты. Начните с подключения внешнего источника питания 12V к выводу Vcc2 и выхода 5V Arduino к выводу Vcc1. Убедитесь, что все заземления в схеме объединены.
Также необходимо подключить оба вывода ENA и ENB к выходу 5V, чтобы двигатель был всегда включён.
Теперь подключите входные выводы (IN1, IN2, IN3 и IN4) микросхемы L293D к четырём цифровым выводам (12, 11, 10 и 9) на Arduino.
Наконец, подключите провода A+ (красный), A- (зелёный), B+ (синий) и B- (жёлтый) от шагового двигателя к выходным выводам L293D (Out4, Out3, Out2 и Out1), как показано на иллюстрации ниже.
Схема подключения микросхемы драйвера L293D к шаговому двигателю NEMA и Arduino
Код Arduino — Управление шаговым двигателем
Следующий скетч даст вам полное представление о том, как управлять униполярным или биполярным шаговым двигателем с помощью микросхемы L293D. Код одинаков для обоих двигателей, за исключением параметра stepsPerRevolution.
Измените этот параметр в соответствии со спецификацией вашего двигателя, прежде чем запускать скетч. Например, для NEMA 17 установите значение 200, а для 28BYJ-48 — 48.
// Include the Arduino Stepper Library
#include <Stepper.h>
// Number of steps per output rotation
const int stepsPerRevolution = 200;
// Create Instance of Stepper library
Stepper myStepper(stepsPerRevolution, 12, 11, 10, 9);
void setup()
{
// set the speed at 20 rpm:
myStepper.setSpeed(20);
// initialize the serial port:
Serial.begin(9600);
}
void loop()
{
// step one revolution in one direction:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(500);
// step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(500);
}
Скетч начинается с подключения библиотеки Arduino Stepper. Библиотека Stepper входит в состав Arduino IDE и берёт на себя формирование последовательности импульсов, которые мы будем отправлять шаговому двигателю.
// Include the Arduino Stepper Library
#include <Stepper.h>
После подключения библиотеки мы определяем переменную stepsPerRevolution. Как следует из названия, это количество шагов на один оборот, указанное в характеристиках двигателя. Измените этот параметр в соответствии со спецификацией вашего двигателя. Например, для NEMA 17 установите значение 200, а для 28BYJ-48 — 48.
// Number of steps per output rotation
const int stepsPerRevolution = 200;
Далее мы создаём экземпляр библиотеки Stepper. В качестве параметров передаются количество шагов на оборот и номера выводов Arduino.
// Create Instance of Stepper library
Stepper myStepper(stepsPerRevolution, 12, 11, 10, 9);
В секции setup мы устанавливаем скорость шагового двигателя вызовом функции setSpeed() и инициализируем последовательную связь.
void setup()
{
// set the speed at 20 rpm:
myStepper.setSpeed(20);
// initialize the serial port:
Serial.begin(9600);
}
В секции loop мы просто вызываем функцию step(), которая поворачивает двигатель на заданное количество шагов со скоростью, определённой функцией setSpeed(). Передача отрицательного числа в эту функцию меняет направление вращения двигателя.
void loop()
{
// step one revolution in one direction:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(500);
// step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(500);
}