Подключение униполярного шагового двигателя 28BYJ-48 через драйвер ULN2003

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

Рассмотрим драйвер двигателя ULN2003 поближе.

драйвер двигателя ULN2003

На плате драйвера мы видим пины управления IN1, IN2, IN3, IN4, пины питания 5-12V (- +), светодиоды индикации шага и джампер, дающий возможность убирать питание поступающее на двигатель. К драйверу рекомендуется подключать внешнее питание, например батарейки, так как двигатель потребляет не мало тока и может просаживать (перезагружать) плату Ардуино при определенных нагрузках и в конце концов вывести плату Ардуино из строя. Но для одиночных тестов без особой нагрузки, питание можно подключить и от выхода 5V платы Arduino.

Схема подключения довольна проста. Пины IN1, IN2, IN3, IN4 драйвера ULN2003, подключаем к пинам 2, 3, 4, 5 платы Ардуино. Выход 5V платы Ардуино подсоединяем к пину (+) 5-12V драйвера двигателя, а выход GND платы Arduino соответственно к пину (-) 5-12V драйвера двигателя.

Подключение и управление униполярным шаговым двигателем 28BYJ-48 через драйвер ULN2003

При подключении к драйверу ULN2003 внешнего источника питания, вам необходимо будет объединить выводы земли (GND) платы Arduino и этого источника питания. Может это у кого-то вызовет затруднение, поэтому покажу как это сделать на макетной плате.

Подключение к драйверу ULN2003 внешнего источника питания

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

Библиотеку AccelStepper необходимо установить в вашу программу IDE Arduino. Делается это просто. Скачиваем zip-архив AccelStepper и разархивируем его в папку libraries вашей программы Arduino IDE (например, если вы используете Windows7, ваша папка libraries находится в папке "C:\Program Files (x86)\Arduino\"). После чего перезагрузите программу Arduino IDE и библиотека начнет работать. Для проверки, что вы все правильно сделали и библиотека AccelStepper правильно установилась, перейдите в меню (Файл - Примеры) и в развернувшемся списке примеров, вы должны увидеть пункт меню AccelStepper.

Запишем для примера в программу Arduino IDE минимально необходимый скетч управления шаговым двигателем 28BYJ-48 с помощью библиотеки AccelStepper.

#include<AccelStepper.h> // Подключаем библиотеку AccelStepper
#define HALFSTEP 8  // включаем полушаговый метод управления
 
// Определяем пины для управления шаговым двигателем
#define motorPin1  2 // к пину 2 платы Ардуино подключаем пин IN1 драйвера ULN2003
#define motorPin2  3 // к пину 3 платы Ардуино подключаем пин IN2 драйвера ULN2003
#define motorPin3  4 // к пину 4 платы Ардуино подключаем пин IN3 драйвера ULN2003
#define motorPin4  5 // к пину 5 платы Ардуино подключаем пин IN4 драйвера ULN2003
 
// Инициализируемся в последовательности (метод управления, IN1, IN3, IN2, IN4)
// stepMotor1 - это произвольно придуманное нами имя для двигателя 
AccelStepper stepMotor1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);

void setup() // НАСТРОЙКИ
  {
  stepMotor1.setMaxSpeed(1000.0); // Скорость вращения вала двигателя.
  stepMotor1.setAcceleration(3000.0); // Темп разгона-торможения двигателя.
  }
 
void loop() // ОСНОВНОЙ ЦИКЛ
  {
  stepMotor1.runToNewPosition(0); // устанавливаем вал двигателя в первую позицию
  stepMotor1.runToNewPosition(1000); // поворачиваем двигатель во вторую позицию на 1000 шагов вперед
  }

Данный скетч включает постоянное вращение вала двигателя "вперед-назад" на 1000 шагов. Задавать позиций двигателя внутри функции void loop () можно сколько угодно. То есть, строчек типа stepMotor1.runToNewPosition(1000); вы можете добавить сколько угодно много, с разными координатами. После выполнения всех позиционных команд по координатам вал вернется в первую позицию и начнет все сначала, так как наши команды расположены внутри функции непрерывного цикла void loop ().

Есть и другие приемы управления, но этот мне кажется самым простым для понимания людям, которые еще не сталкивались с программированием шаговых двигателей. Для более глубокого изучения, вы можете посмотреть другие примеры управления шаговыми двигателями, прямо в программе Arduino IDE в меню (Файл - Примеры - AccelStepper).

 

 

 

Комментарии  

 
+3 # Антон 29.05.2017 13:02
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, enable) {

}

//А перекрыть надо вот этот метод
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);
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
0 # VoltOm 29.05.2017 13:12
Антон, спасибо за Ваш полезный и уточняющий данную тему комментарий.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 

Добавить комментарий

Защитный код
Обновить

шт.
Корзина пуста
Принимаем к оплате: