Шаговый двигатель может точно перемещаться на минимально возможный угол, называемый шагом. Для практических задач можно считать, что шаговый мотор немного похож на сервопривод. Можно задать ему повернуться в некоторое положение и можно рассчитывать получить достаточно стабильные результаты в нескольких повторных экспериментах. Обычно, сервоприводы ограничены углом поворота в диапазоне от 0 до 180°, шаговый же двигатель может вращаться непрерывно, подобно двигателю постоянного тока. Преимуществом шаговых двигателей является то, что можно достичь гораздо большей степени контроля над движением. К недостатком шаговых двигателей можно отнести несколько более сложное управление, чем в случаях с сервами или моторами постоянного тока.
28BYJ-48 — это маленький, дешевый, 5 вольтовый шаговый моторчик с редуктором. Передаточное число редуктора у него примерно 64:1, что позволяет получить вполне достойный крутящий момент для моторчика такого размера и скорость порядка 15 об/мин. С некоторыми программными хитростями для постепенного ускорения можно достичь более 25 об/мин. Эти маленькие шаговики вместе с небольшой платкой-драйвером на базе м/сх ULN2003 для использования совместно c Arduino UNO можно приобрести здесь за сущие копейки. Достаточно выгодное приобретение, если сравнивать с редукторным двигателем постоянного тока, контроллером двигателя и колесным энкодером!
Дешевизна и миниатюрность делает 28BYJ идеальным вариантом для небольших робототехнических приложений, а также для знакомства с управлением шаговыми двигателями, используя Arduino. Ниже представлена детальная спецификация шагового двигателя 28BYJ-48.
Тип мотора | Униполярный шаговый двигатель |
Число фаз | 4 |
Подключение | 5-выводов (к контроллеру двигателя) |
Рабочее напряжение | 5-12 вольт |
Частота | 100 Гц |
Сопротивление по постоянному току | 50 Ом ± 7%(25°C) |
Частота под нагрузкой | > 600 Гц |
Частота на холостом ходу | > 1000 Гц |
Крутящий момент | > 34.3 мН*м (120 Гц) |
Момент самопозиционирования | > 34.3 мН*м |
Стопорящий момент | 600-1200 г*см |
Тяга | 300 г*см |
Сопротивление изоляции | > 10 МОм (500 В) |
Класс изоляции | A |
Шум | < 35 дБ (120 Гц, без нагрузки, 10 см) |
Режим шага | Рекомендован полушаговый режим (8-шаговая управляющая сигнальная последовательность) |
Угол шага | Полушаговый режим: 8-шаговая управляющая сигнальная последовательность (рекомендовано). 5.625 градусов на шаг, 64 шага на оборот внутреннего вала мотора. Режим полного шага: 4-шаговая управляющая сигнальная последовательность. 11.25º/шаг, 32 шага на оборот внутреннего вала двигателя. |
Передаточное отношение редуктора | Производителем заявлено 64:1. Однако, некоторые пытливые товарищи с форума Arduino разобрали редуктор и определили, что, в действительности передаточное число равно 63.68395:1. Это означает, что в рекомендованном полушаговом режиме мы имеем: 64 шага на оборот мотора помноженное на передаточное число 63.684 ≈ 4076 шагов на полный оборот. |
Подключение к контроллеру ULN2003 | A (синий), B (розовый), C (желтый), D (Оранжевый), E (красный, средний вывод обмоток) |
Вес | 30г |
Двигатель имеет четыре обмотки, которые запитываются последовательно, чтобы повернуть вал с магнитом.
Когда используется полношаговый метод управления, две из четырех обмоток запитываются на каждом шаге. Идущая вместе с Arduino IDE библиотека Stepper использует такой способ. В техническом руководстве к 28BYJ-48 сказано, что предпочтительным является использование метода полушага, при котором сначала запитывается только 1 обмотка, затем вместе первая и вторая обмотки, затем только вторая обмотка и так далее. С 4 обмотками это дает 8 различных сигналов, как показано в таблице ниже.
Провод | → Направление вращения по часовой стрелке (1-2 фазы) | |||||||
---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
4 Оранжевый | ||||||||
3 Желтый | ||||||||
2 Розовый | ||||||||
1 Синий |
Подключение драйвера шагового двигателя ULN2003 к Arduino Uno
Плата драйвера шагового двигателя на базе микросхемы ULN2003, представляющей собой массив транзисторов, включенных по схеме Дарлингтона, позволяет достаточно просто управлять мотором 28BYJ-48, используя микроконтроллер. В нашем случае, в качестве управляющего микроконтроллера мы выберем плату Arduino Uno с микроконтроллером ATmega328. Помимо самой микросхемы ULN2003AN, на плате имеется пятиконтактный разъем для подключения к шаговику и четыре светодиода, показывающих, какая из обмоток запитана в текущий момент времени.
Также сбоку расположен джампер (два вывода под четырьмя резисторами), установка которого позволяет подавать питание на шаговый двигатель. Замечу, что питать мотор от 5 В Arduino не рекомендуется, так как мотор может потреблять ток, превышающий возможности Arduino. Лучше использовать внешний 5-12 В источник питания, выдающий ток не менее 1 А. Четыре управляющих входа помечены как IN1-IN4 и должны быть подключены к четырем цифровым выводам Arduino.
Подключите выводы IN1, IN2, IN3 и IN4 к пинам 3, 4, 5 и 6 Arduino Uno. Положительный контакт источника питания необходимо подключить к выводу, помеченному как «+», а землю источника питания к выводу «-» на плате контроллера. Если для питания Arduino и мотора используются различные источники питания, то необходимо объединить выводы «земля» источников вместе.
Библиотека AccelStepper
Стандартная библиотека Stepper, идущая с Arduino IDE, поддерживает только полношаговый метод управления и имеет сильно ограниченные возможности. Использовать ее можно только в очень простых приложениях, в которых используется только один мотор. Применение библиотеки Stepper для управления 28BYJ-48 является не самым эффективным решением.
Есть решение получше — это использовать библиотеку Accel Stepper. Эта библиотека очень хорошо работает совместно с шаговым мотором 28BYJ-48 (мотор почти не греется), а также поддерживает ускорение, что позволяет заставить мотор вращаться быстрее. Библиотека использует код, не блокирующий шаги и включает немало других приятных особенностей.
- Объектно-ориентированный интерфейс для 2, 3 или 4-выводных шаговых двигателей
- Поддержка ускорения и замедления
- Поддержка одновременно нескольких шаговых двигателей с независимой работой для каждого мотора
- Функции API не используют функцию delay и не прерывают работу
- Поддержка выбора функции для реализации шага позволяет работать совместно с библиотекой AFMotor
- Поддержка контроллеров шаговых двигателей таких как Sparkfun EasyDriver (основанных на микросхеме драйвера 3967)
- Поддержка низких скоростей
- Расширяемый API
- Поддержка подклассов
Как установить библиотеку в Arduino IDE.
Представленный ниже код медленно ускоряет мотор 28BYJ-28 в одном направлении, затем замедляется до остановки и вновь ускоряется, но уже вращаясь в противоположном направлении.
#include<AccelStepper.h> #define HALFSTEP 8 // Определение пинов для управления двигателем #define motorPin1 3 // IN1 на 1-м драйвере ULN2003 #define motorPin2 4 // IN2 на 1-м драйвере ULN2003 #define motorPin3 5 // IN3 на 1-м драйвере ULN2003 #define motorPin4 6 // IN4 на 1-м драйвере ULN2003 // Инициализируемся с последовательностью выводов IN1-IN3-IN2-IN4 // для использования AccelStepper с 28BYJ-48 AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); void setup(){ stepper1.setMaxSpeed(1000.0); stepper1.setAcceleration(100.0); stepper1.setSpeed(200); stepper1.moveTo(20000); } void loop(){ // Изменяем направление, если шаговик достигает заданного положения if(stepper1.distanceToGo()==0) stepper1.moveTo(-stepper1.currentPosition()); stepper1.run(); }
[add_ratings]
А вот почему они у меня так адово грелись...Надо будет снова их опробовать нос другой библиотекой...
Кстати,что бы увеличить крутящий момент можно движок переделать в биполярный... Там всего та надо среднюю точку перерезать... Правда тогда драйвер в комплекте не подойдет но я не думаю что это большая проблема...
AccelStepper не работает с ULN2003 для микрошагов.
Не заметил никакой разницы между этой библиотекой и другими. Правда я не специалист в программировании а просто использую готовые скетчи или делаю «микс». Увеличить обороты не получилось, что тут что в стандартной библиотеке одинаково. Разницы в микрошаге и полном шаге тоже не заметил. Как вживить регулировку скорости переменным резистором пока тоже не понял.
В теле скетча в комментариях написано: Для регулировки оборотов необходимо использовать линейный потенциометр на 10К, подключается движком к А0, другие два вывода к +5 и GND.
неплохо было бы объяснить, что делают использованные в программе методы AccelStepper
Какой метод вызывать чтобы шаговые двигатели просто крутились в нужном направлении с заданной скоростью? Безо всяких ускорений и прочего... По одному шагу за цикл loop, с возможностью поменять направление в каждой итерации цикла.
Метод step (1) из стандартной библиотеки мне подходил, но нужно чтобы несколько шаговиков крутились с разной скоростью, а в стандартной setSpeed () почему-то задает скорость всем сразу.
В AccelStepper во всех примерах заранее известно, сколько тысяч шагов в каком направлении надо сделать, а я хочу управлять в реальном времени.
Может, раньше не было в примерах, но теперь есть в ConstantSpeed.pde
void setup() { stepper.setMaxSpeed(1000); stepper.setSpeed(50); } void loop() { stepper.runSpeed(); }
У Вас в коде где то ошибка. Через некоторое время ардуино останавливается и начинает перезагружаться, скорее всего дело #define HALFSTEP 8 , в AccelStepper его попросту нет.
Так же интересует, как правильно подключить ULN2003 к внешнему питанию 12 вольт?
Может есть другие либы, где всё это уже реализовано без багов и доработок напильником?
таких либ, увы нет, и наверное не будет, в этом вся прелесть. Придется писать самому. ULN2003 предназначена для управления 12 вольтовой нагрузкой, просто не превышайте её возможностей.
#define HALFSTEP 8 — скорее всего ошибка .Я бы поставил #define HALFSTEP 4
Если поставите 4 — будет 4-шаговый режим. А 8 — для 8-шагового.
У меня скетч запустился сразу, ничего не допиливал. Драйвер и шаговик такой же, Arduino UNO.
С удовольствием посмотрю на реализацию вращения в одну, а потом в другую сторону через конструктор классов и direction forward (backward), которые упоминаются в справочнике AccelStepper. Отсчет шагов через moveTo не устраивает
Всем большой ПРИВЕТ! Помогите вставить две кнопки,нажатие на первую запускает движение в одну сторону и потом мотор просто останавливается,а нажатие на вторую кнопку запускает процесс в обратную сторону.Если нажимать одну и туже кнопку то мотор каждый раз начинает движение в одну сторону.
Вот так можно отнаследоваться от AccelStepper и получить нормальную поддержку 4096 шагов на один оборот:
class MyStepper : public AccelStepper {
public:
MyStepper (uint8_t interface = AccelStepper::FULL4WIRE, uint8_t pin1 = 2, uint8_t pin2 = 3, uint8_t pin3 = 4, uint8_t pin4 = 5, bool enable = true) : AccelStepper (interface, pin1, pin2, pin3, pin4) {
}
void step8 (long step) {
switch (step & 0×7)
{
case 0: // 1000
setOutputPins (0b0001);
break;
case 1: // 1100
setOutputPins (0b0011);
break;
case 2: // 0100
setOutputPins (0b0010);
break;
case 3: // 0110
setOutputPins (0b0110);
break;
case 4: // 0010
setOutputPins (0b0100);
break;
case 5: // 0011
setOutputPins (0b1100);
break;
case 6: // 0001
setOutputPins (0b1000);
break;
case 7: // 1001
setOutputPins (0b1001);
break;
}
};
};
MyStepper stepper (AccelStepper::HALF4WIRE, 2, 3, 4, 5);
// ...
stepper.moveTo (4096); //Будет ровно один оборот
Но вот я пока не могу понять в AccelStepper — это единицы измерения setSpeed, setMaxSpeed, setAcceleration и т.д.
Если moveTo — это количество шагов, то скорость — это кол-во шагов в минуту? Секунду? Или вообще в условных попугаях?
Каковы предельные работающие (еще на что-то влияющие) на том же 28BYJ-48?