Шаговый двигатель и его драйвер
Шаговый двигатель – основа точной робототехники. В отличие от двигателей постоянного вращения, один оборот «шаговика» состоит из множества микроперемещений, которые и называют шагами. Другими словами, мы можем повернуть вал двигателя в любой заданный угол, и зафиксировать его в этом положении. Грубым аналогом шагового двигателя является сервопривод. В отличие от сервопривода, шаговый двигатель не имеет ограничений в повороте вала и может вращаться на 360º. Кроме этого, управляя шаговым двигателем, мы можем не только контролировать его положение, но и скорость.
Для подключения шагового двигателя к Arduino, рекомендуется использовать специальную плату-драйвер. Обычно такие платы поставляются вместе с самими двигателями.
Самый очевидный пример применения шаговых двигателей — робот манипулятор. Чтоб механическая рука коснулась рабочим инструментом нужной точки, необходимо чтобы каждый из узлов повернулся на строго заданный угол. Погрешность в доли градуса в основании руки, приведет к огромной погрешности на её манипуляторе.
Промышленный манипулятор на шаговых двигателях |
Добиться такой точности управления шаговым двигателем позволяет его внутреннее устройство. На валу двигателя находятся постоянные магниты, которые поворачивают вал тот момент, когда на одну или несколько катушек статора двигателя подаётся электрический ток. Чем больше внутри двигателя таких катушек, тем точнее можно осуществить поворот (шаг) двигателя.
Подавая ток на одну или несколько катушек, мы добиваемся поворота вала двигателя в заданное положение. В анимации видно, что даже с небольшим количеством катушек на статоре, двигателем можно управлять достаточно точно. Для этого используются полушаговые и микрошаговые режимы. |
Для облегчения управления шаговым двигателем, можно использовать встроенную в Arduino IDE библиотеку <Stepper.h>. Ниже приведены примеры кода, позволяющие поворачивать вал двигателя по часовой стрелке и против часовой стрелки. Сравните количество кода при прямом управлении и при управление с помощью библиотеки:
// управление двигателем без использования библиотеки int in1 = 2; // назначаем пины катушек двигателя int in2 = 4; int in3 = 3; int in4 = 5; const int dl = 5; // задаём паузу между сигналами void setup() { pinMode(in1, OUTPUT); //пины катушек - на выход pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); } void loop() { // вращаем двигатель, включая и выключая нужные катушки digitalWrite( in1, HIGH ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, HIGH ); delay(dl); digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, HIGH ); delay(dl); digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, HIGH ); digitalWrite( in4, HIGH ); delay(dl); digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, HIGH ); digitalWrite( in4, LOW ); delay(dl); digitalWrite( in1, LOW ); digitalWrite( in2, HIGH ); digitalWrite( in3, HIGH ); digitalWrite( in4, LOW ); delay(dl); digitalWrite( in1, LOW ); digitalWrite( in2, HIGH ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); delay(dl); digitalWrite( in1, HIGH ); digitalWrite( in2, HIGH ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); delay(dl); digitalWrite( in1, HIGH ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); delay(dl); }
Скоростью двигателя можно управлять, уменьшая или увеличивая время задержки [dl]. В нашем случае, пауза между подачей сигналов составляет 5 мс.
#include <Stepper.h> // подключаем библиотеку const int IN1 = 2; // подключаем пины к катушкам мотора const int IN2 = 3; const int IN3 = 4; const int IN4 = 5; const int stepsPerRevolution = 256; // устанавливаем количество шагов на один оборот вала Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4); // инициализируем мотор void setup() { myStepper.setSpeed(60); // скорость: около 60 оборотов вала в минуту } void loop() { myStepper.step(2048); // 2048 шагов в одном направлении delay(500); // пауза в 0,5 секунды myStepper.step(-2048); // 2048 шагов в обратную сторону delay(500); // пауза в 0,5 секунды }
Обратите внимание, внутри шагового двигателя установлен редуктор с придаточным числом 8:1, т.е. за 1 оборот вала мотора, вал редуктора провернётся лишь на 1/8 оборота. Т.е. если задать двигателю поворот на 2048 шагов, то вал редуктора сделает полный оборот и провернётся на 360°. Знак “-” в команде с количеством шагов, позволяет вращать вал двигателя в обратную сторону.