Управление шаговыми двигателями с Arduino: унипольные и биполярные схемы
Как подключить и управлять унипольными и биполярными шаговыми двигателями через Arduino с примерами кода и схемами.
Шаговые двигатели — особый класс моторов, которые позволяют точно управлять положением вала без обратной связи. Вал такого двигателя оснащён серией магнитов и вращается под воздействием электромагнитных катушек, которые поочерёдно заряжаются в строго определённой последовательности. Благодаря этому мотор перемещается небольшими дискретными «шагами» — вперёд или назад.
Существует два типа шаговых двигателей: унипольные (Unipolar) и биполярные (Bipolar). Прежде чем собирать схему, важно точно определить, с каким типом вы работаете, — схемы подключения для них принципиально отличаются. Примеры кода ниже подходят для обоих типов. Ориентируйтесь на схемы unipolar и bipolar, чтобы правильно подключить свой мотор.
Управление шаговым двигателем (как унипольным, так и биполярным) осуществляется через цифровые пины 8, 9, 10 и 11. В зависимости от типа мотора между Arduino и обмотками двигателя устанавливается либо U2004 Darlington Array (для унипольного), либо SN754410NE H-Bridge (для биполярного).
Необходимые компоненты
- Плата Arduino
- Шаговый двигатель
- U2004 Darlington Array (для унипольного шагового двигателя)
- SN754410ne H-мост (для биполярного шагового двигателя)
- Источник питания, подходящий для вашего двигателя
- Соединительные провода
- Макетная плата (breadboard)
Схемы подключения
Ниже приведены схемы для обоих типов шаговых двигателей. В обоих случаях настоятельно рекомендуется питать двигатель от внешнего источника: шаговые моторы потребляют значительный ток, и запитывать их напрямую от Arduino не следует — это может повредить плату.
Важно: обе схемы ниже рассчитаны на четырёхпроводное подключение. Двухпроводные конфигурации с приведённым кодом работать не будут.
Унипольный шаговый двигатель — схема подключения
Схема подключения унипольного шагового двигателя с потенциометром (макетная плата). Изображение создано в Fritzing.
Принципиальная схема подключения унипольного шагового двигателя с потенциометром. Изображение создано в Fritzing.
Биполярный шаговый двигатель — схема подключения
Схема подключения биполярного шагового двигателя с потенциометром (макетная плата). Изображение создано в Fritzing.
Принципиальная схема подключения биполярного шагового двигателя с потенциометром. Изображение создано в Fritzing.
Как это работает
Ардуино использует встроенную библиотеку Stepper, которая берёт на себя формирование правильной последовательности импульсов для управления катушками. Вам достаточно указать количество шагов на оборот и задать скорость через setSpeed(). Всё остальное библиотека делает сама.
Драйверы — U2004 для унипольных и SN754410 для биполярных — нужны потому, что Arduino не способна напрямую обеспечить ток, достаточный для питания обмоток. Драйвер работает как усилитель: получает слабый управляющий сигнал от Arduino и коммутирует мощный ток от внешнего источника питания.
Примеры программ
MotorKnob
Шаговый двигатель повторяет положение потенциометра (или другого аналогового датчика), подключённого к аналоговому входу A0. Удобный способ проверить точность позиционирования.
#include <Stepper.h>
// измените это значение на количество шагов вашего двигателя
#define STEPS 100
// создаём экземпляр класса stepper, указывая
// количество шагов двигателя и пины, к которым он
// подключён
Stepper stepper(STEPS, 8, 9, 10, 11);
// предыдущее значение с аналогового входа
int previous = 0;
void setup() {
// устанавливаем скорость двигателя 30 RPM
stepper.setSpeed(30);
}
void loop() {
// считываем значение датчика
int val = analogRead(0);
// выполняем количество шагов, равное изменению
// показания датчика
stepper.step(val - previous);
// запоминаем предыдущее значение датчика
previous = val;
}
StepperOneRevolution
Двигатель совершает один полный оборот в одну сторону, затем один полный оборот в обратную. Простой тест для проверки правильности подключения и направления вращения.
#include <Stepper.h>
const int stepsPerRevolution = 200; // измените это значение в соответствии с количеством шагов на оборот
// для вашего двигателя
// инициализируем библиотеку stepper на пинах 8–11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
void setup() {
// устанавливаем скорость 60 rpm:
myStepper.setSpeed(60);
// инициализируем последовательный порт:
Serial.begin(9600);
}
void loop() {
// один оборот в одном направлении:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(500);
// один оборот в обратном направлении:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(500);
}
StepperOneStepAtATime
Двигатель делает по одному шагу с большим интервалом. Этот пример идеально подходит для отладки: если все четыре провода подключены к правильным пинам, каждый шаг будет в одном направлении. Если мотор «дёргается» или вращается хаотично — значит, провода перепутаны.
#include <Stepper.h>
const int stepsPerRevolution = 200; // измените это значение в соответствии с количеством шагов на оборот
// для вашего двигателя
// инициализируем библиотеку stepper на пинах 8–11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
int stepCount = 0; // количество шагов, выполненных двигателем
void setup() {
// инициализируем последовательный порт:
Serial.begin(9600);
}
void loop() {
// выполняем один шаг:
myStepper.step(1);
Serial.print("steps:");
Serial.println(stepCount);
stepCount++;
delay(500);
}
StepperSpeedControl
Двигатель вращается по часовой стрелке. Скорость вращения определяется положением потенциометра: чем выше его значение, тем быстрее вращение. Имейте в виду, что функция setSpeed() задаёт задержку между шагами, поэтому на малых скоростях двигатель может реагировать на изменения потенциометра с заметным запозданием.
#include <Stepper.h>
const int stepsPerRevolution = 200; // измените это значение в соответствии с количеством шагов на оборот
// для вашего двигателя
// инициализируем библиотеку stepper на пинах 8–11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
int stepCount = 0; // количество шагов, выполненных двигателем
void setup() {
// в setup ничего делать не нужно
}
void loop() {
// считываем значение датчика:
int sensorReading = analogRead(A0);
// приводим его к диапазону от 0 до 100:
int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
// устанавливаем скорость двигателя:
if (motorSpeed > 0) {
myStepper.setSpeed(motorSpeed);
// выполняем 1/100 оборота:
myStepper.step(stepsPerRevolution / 100);
}
}
Типичные ошибки и советы по отладке
- Мотор гудит, но не вращается. Скорее всего, слишком мал ток от внешнего источника питания или неправильно подключены провода обмоток. Проверьте даташит на ваш конкретный двигатель.
- Мотор вибрирует на месте или делает хаотичные шаги. Провода обмоток перепутаны. Используйте пример
StepperOneStepAtATime, чтобы найти правильную последовательность. - Arduino перезагружается при запуске мотора. Двигатель потребляет слишком много тока и просаживает питание. Обязательно используйте отдельный источник питания для мотора.
- Мотор греется даже в покое. Это нормально для шаговых двигателей — ток через обмотки течёт постоянно. Если перегрев критичный, рассмотрите драйверы с функцией отключения тока в покое.
- Направление вращения противоположно ожидаемому. Поменяйте местами два провода одной из обмоток.