Содержание
Обзор шагового двигателя 28BYJ-48
Шаговые двигатели применяют в механических системах точного позиционирования – ЧПУ станках, 3d-принтерах, принтерах, роботах-манипуляторах. Шаговые двигатели преобразуют электрические импульсы в перемещение вала на определенный угол. Минимально возможный угол перемещения шагового двигателя, называется шагом.
В любительской робототехнике очень часто используют бюджетный шаговый двигатель 28BYJ-48, в комплекте с которым продается драйвер двигателя на микросхеме ULN2003, необходимый для подключения шагового двигателя к плате Arduino.
Рисунок 1. Шаговый двигатель 28BYJ-48 с драйвером на микросхеме ULN2003.
Характеристики шагового двигателя 28BYJ-48:
- Напряжение питания – 5В или 12В;
- Число фаз – 4;
- Коэффициент редукции – 1/63.68395;
- Количество шагов ротора – 64;
- Номинальная скорость вращения – 15 оборот/мин;
- Крутящий момент – 450 г*см;
- Размеры (диаметр,высота) –25x18 мм;
- Вес – 40 грамм.
Принципиальная схема шагового двигателя 28BYJ-48 приведена на рис. 2.
Рисунок 2. Принципиальная схема шагового двигателя 28BYJ-48.
Режимы работы двигателя
Для управления шаговым двигателем 28BYJ 48 используют один из двух режимов подключения.
- полношаговый режим – 4 ступени импульсов на 1 шаг;
- полушаговый режим – 8 ступеней импульсов на 1 шаг.
Сервоприводы, шаговые двигатели... Различные механические запчасти Arduino можно купить в нашем магазине 3DIY!
Подключение 28BYJ-48к плате Arduino
Драйвер двигателя состоит из 7 пар транзисторов Дарлингтона и является усилителем. Выводы IN1 – IN7 предназначены для подключения к микроконтроллеру, GND и VCC – для питания шагового двигателя. Схема подключения драйвера к плате Arduino показана на рисунке 3.
Рисунок 3. Подключение драйвера к плате Arduino.
Для управления шаговыми двигателями в Arduino IDE есть встроенная библиотека – Stepper. Данная библиотека осуществляет только полношаговый режим коммутации.
Рисунок 4. Библиотека Stepper
Загрузим на плату Arduino пример – скетч stepper_oneRevolution из Examples (см. листинг 1).
Листинг 1
// подключение библиотеки #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 скетч из листинга 2.
Листинг 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); 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(); }
Теперь скетч работает нормально, шаговый двигатель плавно.
Рисунок 5. Схема в сборе
Пример использования
В качестве примера создадим проект управления шаговым двигателем кнопками, подключенными к плате Arduino.
Будем использовать следующие компоненты:
- Плата Arduino Uno – 1;
- Шаговый двигатель 28BYJ-48 с драйвером – 1;
- Резистор 10 кОм – 3;
- Кнопка – 3;
- Провода.
Схема соединения представлена на рисунке 6.
Рисунок 6. Схема соединений
Реакция на нажатие кнопок:
- кнопка 3 – движение двигателя по часовой стрелке;
- кнопка 1 – против часовой стрелки;
- кнопка 2 – останов.
Скетч показан в листинге 3.
Листинг 3
// подключение библиотеки #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; } }
"В последнем скетче (листинг 3) я обнаружил неточность в функции устранения дребезга контактов, которая мешает корректной работе программы. Более корректно вынести оператор «return с» за рамки цикла «if». Иначе могут обрабатываться ложные срабатывания в случае использования кнопок без фиксации."
Имеется сейчас:
// устранение дребезга int deb (int l,int pin){ int c = digitalRead(pin); if (l != c) { // если изменение delay(5); c = digitalRead(pin); return c; } }
Более корректно:// устранение дребезга int deb (int l,int pin){ int c = digitalRead(pin); if (l != c) { // если изменение delay(5); c = digitalRead(pin); } return c; }
Загружаем скетч на плату Arduino и проверяем работу.
Рисунок 7. Схема в сборе.
Рисунок 8. Вывод данных в последовательный порт.
Часто задаваемые вопросы
- Проверьте правильность подключения драйвера к плате Arduino.
- Проверьте наличие достаточного внешнего питания для шагового двигателя.