Шаговые двигатели применяют в механических системах точного позиционирования – ЧПУ станках, 3d-принтерах, принтерах, роботах-манипуляторах. Шаговые двигатели преобразуют электрические импульсы в перемещение вала на определенный угол. Минимально возможный угол перемещения шагового двигателя, называется шагом.
В любительской робототехнике очень часто используют бюджетный шаговый двигатель 28BYJ-48, в комплекте с которым продается драйвер двигателя на микросхеме ULN2003, необходимый для подключения шагового двигателя к плате Arduino.
Шаговый двигатель 28BYJ-48 с драйвером на микросхеме ULN2003.
Характеристики шагового двигателя 28BYJ-48:
- Напряжение питания – 5В или 12В
- Число фаз – 4
- Коэффициент редукции – 1/63.68395
- Количество шагов ротора – 64
- Номинальная скорость вращения – 15 оборот/мин
- Крутящий момент – 450 г*см
- Размеры (диаметр, высота) –25x18 мм
- Вес – 40 грамм
Принципиальная схема шагового двигателя 28BYJ-48 приведена на рисунке ниже.
Принципиальная схема шагового двигателя 28BYJ-48.
Режимы работы двигателя
Для управления шаговым двигателем 28BYJ 48 используют один из двух режимов подключения.
Полношаговый режим – 4 ступени импульсов на 1 шаг
Контакт | Такты | |||
1 | 2 | 3 | 4 | |
A - orange | 1 | 0 | 0 | 1 |
B - yellow | 0 | 1 | 1 | 0 |
C - pink | 1 | 1 | 0 | 0 |
D - blue | 0 | 0 | 1 | 1 |
Полушаговый режим – 8 ступеней импульсов на 1 шаг
Контакт | Такты | |||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
A - orange | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
B - yellow | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
C - pink | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
D - blue | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
Подключение 28BYJ-48к плате Arduino
Драйвер двигателя состоит из 7 пар транзисторов Дарлингтона и является усилителем. Выводы IN1 – IN7 предназначены для подключения к микроконтроллеру, GND и VCC – для питания шагового двигателя.
Схема подключения драйвера к плате Arduino показана ниже.
Подключение драйвера ULN2003 к плате Arduino.
Для управления шаговыми двигателями в Arduino IDE есть встроенная библиотека – Stepper. Данная библиотека осуществляет только полношаговый режим коммутации.
Библиотека Stepper
Загрузим на плату Arduino пример – скетч stepper_oneRevolution из Examples
// подключение библиотеки
#include <Stepper.h>
// создание экземпляра объекта:
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
Stepper s28BYJ-48(4076, IN1, IN2, IN3, IN4);
void setup() {
// установка скорости
s28BYJ-48.setSpeed(60);
// запуск последовательного порта
Serial.begin(9600);
}
void loop() {
// движение в направлении по часовой 1 оборот
s28BYJ-48.step(4076);
delay(1000);
// движение в направлении против часовой 1 оборот
s28BYJ-48.step(-4076);
delay(1000);
}
К сожалению, данный скетч отрабатывает неверно, двигатель движется только в одном направлении. Для правильной работы необходимо использовать альтернативные библиотеки, например Accel Stepper. Библиотека Accel Stepper поддерживает не только равномерное движение, но и замедление/ускорение двигателя и работу с несколькими двигателями. Загружаем на плату Arduino скетч ниже
// подключение библиотеки
#include <AccelStepper.h>
// создаем экземпляр AccelStepper
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
AccelStepper s28BYJ-48(8, IN1, IN3, IN2, IN4);
void setup(){
s28BYJ-48.setMaxSpeed(900.0);
s28BYJ-48.setAcceleration(100.0);
s28BYJ-48.setSpeed(200);
s28BYJ-48.moveTo(2000);
}
void loop(){
// Изменяем направление, если пройдено заданное число шагов
if(s28BYJ-48.distanceToGo()==0)
s28BYJ-48.moveTo(-stepper1.currentPosition());
s28BYJ-48.run();
}
Теперь скетч работает нормально, шаговый двигатель плавно.
Схема в сборе
Пример использования
В качестве примера создадим проект управления шаговым двигателем кнопками, подключенными к плате Arduino.
Будем использовать следующие компоненты:
- Плата Arduino Uno – 1
- Шаговый двигатель 28BYJ-48 с драйвером – 1
- Резистор 10 кОм – 3
- Кнопка – 3
- Провода
Схема соединения представлена ниже.
Схема соединений
Реакция на нажатие кнопок:
- кнопка 3 – движение двигателя по часовой стрелке;
- кнопка 1 – против часовой стрелки;
- кнопка 2 – останов.
Скетч показан в листинге ниже
// подключение библиотеки
#include <AccelStepper.h>
// создаем экземпляр AccelStepper
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
AccelStepper s28BYJ-48(8, IN1, IN3, IN2, IN4);
// клавиши выбора режима
int pinBut []={5,6,7};
int lBut []={0,0,0};
int cBut[]={0,0,0};
//
boolean go=false;
void setup(){
Serial.begin(9600);
s28BYJ-48.setMaxSpeed(1000);
s28BYJ-48.setAcceleration(100);
s28BYJ-48.setSpeed(-500);
Serial.begin(9600);
}
void loop() {
// проверка нажатия кнопок выбора программ
for(int i=0;i<3;i++) {
cBut[i] = deb(lBut[i],pinButtons[i]);
// если нажатие...
if (lastButtons[i] == 0 && currentBut[i] == 1) {
switch(i) {
case 0: // против часовой
s28BYJ-48.setSpeed(500);
go=true;
Serial.println("CW");
break;
case 1: // стоп
s28BYJ-48.stop();
go=false;
Serial.println("stop");
break;
case 2: // по часовой
s28BYJ-48.setSpeed(-500);
go=true;
Serial.println("CCW");
break;
default:
break;
}
}
lBut[i] = cBut[i];
}
if(go==true)
s28BYJ-48.runSpeed();
}
// устранение дребезга
int deb (int l,int pin){
int c = digitalRead(pin);
if (l != c) { // если изменение
delay(5);
c = digitalRead(pin);
return c;
}
}
Загружаем скетч на плату Arduino и проверяем работу.
Схема в сборе.
Вывод данных в последовательный порт.
Что делать если
Нет перемещения шагового двигателя
Проверьте наличие достаточного внешнего питания для шагового двигателя