Конфигурации Arduino и шаговых двигателей
Узнайте, как управлять различными шаговыми двигателями с помощью однополярных и двухполярных схем и Arduino.
Автор: Arduino. Последнее обновление: 25.01.2022
Шаговые двигатели, благодаря своей уникальной конструкции, можно контролировать с высокой степенью точности без каких-либо механизмов обратной связи. Вал шагового двигателя, оснащённый серией магнитов, управляется серией электромагнитных катушек, которые заряжаются положительно и отрицательно в определённой последовательности, точно перемещая его вперёд или назад небольшими «шагами».
Существует два типа шаговых двигателей — однополярные (Unipolar) и двухполярные (Bipolar), — и очень важно знать, с каким типом вы работаете. Для каждого из двигателей предусмотрена отдельная схема подключения. Приведённый ниже пример кода будет работать с обоими видами двигателей. Для получения информации о подключении ознакомьтесь со схемами для однополярного и двухполярного двигателей.
Управление шаговым двигателем осуществляется через цифровые пины 8, 9, 10 и 11 — как для однополярных, так и для двухполярных двигателей. Плата Arduino подключается к массиву Дарлингтона U2004 при использовании однополярного шагового двигателя или к H-мосту SN754410NE при использовании двухполярного двигателя.
Необходимые компоненты
Плата Arduino
Шаговый двигатель
Массив Дарлингтона U2004 (при использовании однополярного шагового двигателя)
H-мост SN754410NE (при использовании двухполярного шагового двигателя)
Источник питания, подходящий для вашего конкретного шагового двигателя
Соединительные провода
Макетная плата (breadboard)
Схема подключения
Ниже приведены схемы подключения для однополярных и двухполярных шаговых двигателей. В обоих случаях лучше всего питать шаговые двигатели от внешнего источника, так как они потребляют слишком много тока, чтобы питаться напрямую от платы Arduino.
Важно
Обе схемы ниже рассчитаны на четырёхпроводную конфигурацию. Двухпроводные конфигурации не будут работать с приведённым кодом.
Однополярная схема и принципиальная схема
Схема подключения однополярного двигателя с потенциометром. Изображение создано в Fritzing.
Принципиальная схема однополярного двигателя с потенциометром. Изображение создано в Fritzing.
Двухполярная схема и принципиальная схема
Схема подключения двухполярного двигателя с потенциометром. Изображение создано в Fritzing.
Принципиальная схема двухполярного двигателя с потенциометром. Изображение создано в Fritzing.
Примеры
MotorKnob
Шаговый двигатель повторяет повороты потенциометра (или другого датчика), подключённого к аналоговому входу 0.
#include <Stepper.h>
// измените это значение в соответствии с количеством шагов вашего двигателя
#define STEPS 100
// создаём экземпляр класса stepper, указывая
// количество шагов двигателя и пины,
// к которым он подключён
Stepper stepper(STEPS, 8, 9, 10, 11);
// предыдущее считанное значение с аналогового входа
int previous = 0;
void setup() {
// устанавливаем скорость двигателя 30 об/мин
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 об/мин:
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);
}
}