Ардуино: шаговый двигатель 28BYJ-48 и драйвер ULN2003
Шаговые двигатели — основа точной робототехники. В отличие от двигателей постоянного вращения, один оборот «шаговика» состоит из множества микроперемещений, которые и называют шагами. Другими словами, мы можем повернуть вал двигателя ровно на 90 градусов, и зафиксировать его в этом положении. Грубым аналогом шагового двигателя является серводвигатель.
Шаговики применяют там, где требуется очень точно дозировать перемещение актуатора. Самый очевидный пример — робот манипулятор. Чтоб механическая рука коснулась рабочим инструментом нужной точки, необходимо чтобы каждый из узлов повернулся на строго заданный угол. Погрешность в доли градуса в основании руки, приведет к огромной погрешности на эффекторе.
Другим известным примером может служить ЧПУ станок. Взять тот же 3D-принтер. Для точного перемещения печатающей головки применяют именно шаговые двигатели. В старых дисководах шаговики использовались для перемещения магнитной головки. А в современных фотоаппаратах микро-миниатюрные шаговые двигатели перемещают линзы.
В этом уроке мы с помощью контроллера Ардуино Уно запустим популярный в среде начинающих робототехников шаговый двигатель 28BYj-48. Этот миниатюрный шаговик имеет встроенный редуктор, который позволяет совершать очень точные перемещения выходного вала.
Так, в 4-шаговом режиме двигатель совершает 2048 шагов за один оборот. В 8-шаговом — 4096. Напряжение питания — 5 Вольт. Потребляемый ток — 160мА. А значит, для эксперимента нам будет достаточно штатного питания от USB.
В качестве драйвера для двигателя используем микросхему ULN2003, которую часто продают в паре с 28BYj-48. Вот так выглядит плата драйвера:
На плате есть 4 входа для микроконтроллера: IN1..IN4. Пять выходов на двигатель, и два контакта питания. Также есть перемычка, разрывающая цепь питания двигателя.
1. Подключение
Как правило, кабель двигателя 28BYj-48 уже имеет разъем с ключом, который вставляется в плату только в правильном положении. В противном случае, при подключении необходимо следовать цветовой схеме (см. рисунок). Контакты IN1..IN4 можно подключить к любым цифровым выходам Ардуино Уно.

И «детская» схема подключения

2. Программа: вариант №1
Что нужно сделать, чтобы шаговый двигатель сделал один оборот? Нужно подавать напряжение на его обмотки в строго определенной последовательности. Мы реализуем одну из нескольких схем коммутации, называемую полу-шаговой. Для этого, обратим внимание на таблицу коммутации:
| Полу-шаговая последовательность |
| ШАГ | A | B | A\ | B\ |
| 0 | 1 | 1 | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 |
| 2 | 0 | 1 | 1 | 0 |
| 3 | 0 | 0 | 1 | 0 |
| 4 | 0 | 0 | 1 | 1 |
| 5 | 0 | 0 | 0 | 1 |
| 6 | 1 | 0 | 0 | 1 |
| 7 | 1 | 0 | 0 | 0 |
В этой таблице, колонка A соответствует катушке, управляемой сигналом IN3. Колонка B — IN4. A\ и B\ — управляются через IN1 и IN2, соответственно.
Получается такая вот незамысловатая программа. Переменная dl в ней — это время, между соседними коммутациями.
int in1 = 2;
int in2 = 3;
int in3 = 4;
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, 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);
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);
}
Чтобы заставить двигатель двигаться быстрее или медленнее, необходимо будет изменить переменную dl. Увеличиваем паузу между коммутациями — двигатель вращается медленнее. Уменьшаем паузу — крутится быстрее.
2. Стандартная библиотека: вариант №2
Для управления шаговыми двигателями в Arduino IDE есть стандартная библиотека, которая осуществляет только полношаговый режим коммутации.
#include
const int IN1 = 2;
const int IN2 = 3;
const int IN3 = 4;
const int IN4 = 5;
const int stepsPerRevolution = 32; // шагов за один оборот
Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);
void setup() {
myStepper.setSpeed(5); // скорость 5 об/минуту
}
void loop() {
myStepper.step(stepsPerRevolution); // шаг в одном направлении
delay(500);
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution); // шаг в обратную сторону
delay(500);
}
6