Закрыть
Шаговый двигатель 28BYJ-48 с драйвером ULN2003 и Arduino UNO

Шаговый двигатель 28BYJ-48 с драйвером ULN2003 и Arduino UNO

Шаговый двигатель может точно перемещаться на минимально возможный угол, называемый шагом. Для практических задач можно считать, что шаговый мотор немного похож на сервопривод. Можно задать ему повернуться в некоторое положение и можно рассчитывать получить достаточно стабильные результаты в нескольких повторных экспериментах. Обычно, сервоприводы ограничены углом поворота в диапазоне от 0 до 180°, шаговый же двигатель может вращаться непрерывно, подобно двигателю постоянного тока. Преимуществом шаговых двигателей является то, что можно достичь гораздо большей степени контроля над движением. К недостатком шаговых двигателей можно отнести несколько более сложное управление, чем в случаях с сервами или моторами постоянного тока.

28BYJ-48 — это маленький, дешевый, 5 вольтовый шаговый моторчик с редуктором. Передаточное число редуктора у него примерно 64:1, что позволяет получить вполне достойный крутящий момент для моторчика такого размера и скорость порядка 15 об/мин. С некоторыми программными хитростями для постепенного ускорения можно достичь более 25 об/мин. Эти маленькие шаговики вместе с небольшой платкой-драйвером на базе м/сх ULN2003 для использования совместно c Arduino UNO можно приобрести здесь за сущие копейки. Достаточно выгодное приобретение, если сравнивать с редукторным двигателем постоянного тока, контроллером двигателя и колесным энкодером!

Размеры шагового двигателя 28BYJ-48
Размеры шагового двигателя 28BYJ-48

Дешевизна и миниатюрность делает 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 шагов на полный оборот.
Подключение к контроллеру ULN2003A (синий), B (розовый), C (желтый), D (Оранжевый), E (красный, средний вывод обмоток)
Вес30г

Двигатель имеет четыре обмотки, которые запитываются последовательно, чтобы повернуть вал с магнитом.

Подключение выводов шагового двигателя 28BYJ-48
Подключение выводов шагового двигателя 28BYJ-48

Когда используется полношаговый метод управления, две из четырех обмоток запитываются на каждом шаге. Идущая вместе с Arduino IDE библиотека Stepper использует такой способ. В техническом руководстве к 28BYJ-48 сказано, что предпочтительным является использование метода полушага, при котором сначала запитывается только 1 обмотка, затем вместе первая и вторая обмотки, затем только вторая обмотка и так далее. С 4 обмотками это дает 8 различных сигналов, как показано в таблице ниже.

Провод→ Направление вращения по часовой стрелке (1-2 фазы)
12345678
4 Оранжевый
3 Желтый
2 Розовый
1 Синий

 

Подключение драйвера шагового двигателя ULN2003 к Arduino Uno

Плата драйвера шагового двигателя на базе микросхемы ULN2003, представляющей собой массив транзисторов, включенных по схеме Дарлингтона, позволяет достаточно просто управлять мотором 28BYJ-48, используя микроконтроллер. В нашем случае, в качестве управляющего микроконтроллера мы выберем плату Arduino Uno с микроконтроллером ATmega328. Помимо самой микросхемы ULN2003AN, на плате имеется пятиконтактный разъем для подключения к шаговику и четыре светодиода, показывающих, какая из обмоток запитана в текущий момент времени.

Плата управления на базе ULN2003
Плата управления на базе ULN2003

Также сбоку расположен джампер (два вывода под четырьмя резисторами), установка которого позволяет подавать питание на шаговый двигатель. Замечу, что питать мотор от 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
  • Поддержка подклассов
Библиотека AccelStepper
Библиотека AccelStepper
AccelStepper-1.48.zip
Version: 1.48
81.7 KiB
5551 Downloads
Детали

Как установить библиотеку в 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]

16 thoughts on “Шаговый двигатель 28BYJ-48 с драйвером ULN2003 и Arduino UNO

  1. А вот почему они у меня так адово грелись...Надо будет снова их опробовать нос другой библиотекой...

    Кстати,что бы увеличить крутящий момент можно движок переделать в биполярный... Там всего та надо среднюю точку перерезать... Правда тогда драйвер в комплекте не подойдет но я не думаю что это большая проблема...

  2. Не заметил никакой разницы между этой библиотекой и другими. Правда я не специалист в программировании а просто использую готовые скетчи или делаю «микс». Увеличить обороты не получилось, что тут что в стандартной библиотеке одинаково. Разницы в микрошаге и полном шаге тоже не заметил. Как вживить регулировку скорости переменным резистором пока тоже не понял.

    1. В теле скетча в комментариях написано: Для регулировки оборотов необходимо использовать линейный потенциометр на 10К, подключается движком к А0, другие два вывода к +5 и GND.

  3. неплохо было бы объяснить, что делают использованные в программе методы AccelStepper

  4. Какой метод вызывать чтобы шаговые двигатели просто крутились в нужном направлении с заданной скоростью? Безо всяких ускорений и прочего... По одному шагу за цикл loop, с возможностью поменять направление в каждой итерации цикла.

    Метод step (1) из стандартной библиотеки мне подходил, но нужно чтобы несколько шаговиков крутились с разной скоростью, а в стандартной setSpeed () почему-то задает скорость всем сразу.

    В AccelStepper во всех примерах заранее известно, сколько тысяч шагов в каком направлении надо сделать, а я хочу управлять в реальном времени.

    1. Может, раньше не было в примерах, но теперь есть в ConstantSpeed.pde

      void setup() { stepper.setMaxSpeed(1000); stepper.setSpeed(50); } void loop() { stepper.runSpeed(); }

  5. У Вас в коде где то ошибка. Через некоторое время ардуино останавливается и начинает перезагружаться, скорее всего дело #define HALFSTEP 8 , в AccelStepper его попросту нет.

    Так же интересует, как правильно подключить ULN2003 к внешнему питанию 12 вольт?

    Может есть другие либы, где всё это уже реализовано без багов и доработок напильником?

    1. таких либ, увы нет, и наверное не будет, в этом вся прелесть. Придется писать самому. ULN2003 предназначена для управления 12 вольтовой нагрузкой, просто не превышайте её возможностей.

    2. У меня скетч запустился сразу, ничего не допиливал. Драйвер и шаговик такой же, Arduino UNO.

  6. С удовольствием посмотрю на реализацию вращения в одну, а потом в другую сторону через конструктор классов и direction forward (backward), которые упоминаются в справочнике AccelStepper. Отсчет шагов через moveTo не устраивает

  7. Всем большой ПРИВЕТ! Помогите вставить две кнопки,нажатие на первую запускает движение в одну сторону и потом мотор просто останавливается,а нажатие на вторую кнопку запускает процесс в обратную сторону.Если нажимать одну и туже кнопку то мотор каждый раз начинает движение в одну сторону.

  8. Вот так можно отнаследоваться от 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); //Будет ровно один оборот

  9. Но вот я пока не могу понять в AccelStepper — это единицы измерения setSpeed, setMaxSpeed, setAcceleration и т.д.

    Если moveTo — это количество шагов, то скорость — это кол-во шагов в минуту? Секунду? Или вообще в условных попугаях?

    Каковы предельные работающие (еще на что-то влияющие) на том же 28BYJ-48?

Оставить ответ

Ваш email не будет опубликован.Обязательны поля помечены *