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

ardu_stepper_0Шаговые двигатели — основа точной робототехники. В отличие от двигателей постоянного вращения, один оборот «шаговика» состоит из множества микроперемещений, которые и называют шагами. Другими словами, мы можем повернуть вал двигателя ровно на 90 градусов, и зафиксировать его в этом положении. Грубым аналогом шагового двигателя является серводвигатель.

Шаговики применяют там, где требуется очень точно дозировать перемещение актуатора. Самый очевидный пример — робот манипулятор. Чтоб механическая рука коснулась рабочим инструментом нужной точки, необходимо чтобы каждый из узлов повернулся на строго заданный угол. Погрешность в доли градуса в основании руки, приведет к огромной погрешности на эффекторе.

Другим известным примером может служить ЧПУ станок. Взять тот же 3D-принтер. Для точного перемещения печатающей головки применяют именно шаговые двигатели. В старых дисководах шаговики использовались для перемещения магнитной головки. А в современных фотоаппаратах микро-миниатюрные шаговые двигатели перемещают линзы.

motor_stp64В этом уроке мы с помощью контроллера Arduino Uno запустим популярный в среде начинающих робототехников шаговый двигатель 28BYj-48. Этот миниатюрный шаговик имеет встроенный редуктор, который позволяет совершать очень точные перемещения выходного вала.

Так, в 4-шаговом режиме двигатель совершает 2048 шагов за один оборот. В 8-шаговом — 4096. Напряжение питания — 5 Вольт. Потребляемый ток — 160мА. А значит, для эксперимента нам будет достаточно штатного питания от USB.

В качестве драйвера для двигателя используем микросхему ULN2003, которую часто продают в паре с 28BYj-48. Вот так выглядит плата драйвера:

motor_drv_uln2003

На плате есть 4 входа для микроконтроллера: IN1..IN4. Пять выходов на двигатель, и два контакта питания. Также есть перемычка, разрывающая цепь питания двигателя.

Подключение

Как правило, кабель двигателя 28BYj-48 уже имеет разъем с ключом, который вставляется в плату только в правильном положении. В противном случае, при подключении необходимо следовать цветовой схеме (см. рисунок). Контакты IN1..IN4 можно подключить к любым цифровым выходам Arduino UNO.

stepper_схема

И «детская» схема подключения :)

stepper_bb

Программа: вариант №1

Что нужно сделать, чтобы шаговый двигатель сделал один оборот? Нужно подавать напряжение на его обмотки в строго определенной последовательности. Мы реализуем одну из нескольких схем коммутации, называемую полу-шаговой. Для этого, обратим внимание на таблицу коммутации:

Полу-шаговая последовательность
ШАГ A B A\ B\
0 1 1 0 0
1 0 1 0 0
2 0 1 1 0
3 0 0 1 0
4 0 0 1 1
5 0 0 0 1
6 1 0 0 1
7 1 0 0 0

В этой таблице, колонка A соответствует катушке, управляемой сигналом IN3. Колонка B — IN4. A\ и B\ — управляются через IN1 и IN2, соответственно.

Получается такая вот незамысловатая программа. Переменная dl в ней — это время, между соседними коммутациями.

int in1 = 2;
int in2 = 3;
int in3 = 4;
int in4 = 5;
const int dl = 5;

void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void loop() {
  digitalWrite( in1, LOW ); 
  digitalWrite( in2, LOW ); 
  digitalWrite( in3, HIGH ); 
  digitalWrite( in4, HIGH );
  delay(dl);

  digitalWrite( in1, LOW ); 
  digitalWrite( in2, LOW ); 
  digitalWrite( in3, HIGH ); 
  digitalWrite( in4, LOW );
  delay(dl);

  digitalWrite( in1, LOW ); 
  digitalWrite( in2, HIGH ); 
  digitalWrite( in3, HIGH ); 
  digitalWrite( in4, LOW );
  delay(dl);

  digitalWrite( in1, LOW ); 
  digitalWrite( in2, HIGH ); 
  digitalWrite( in3, LOW ); 
  digitalWrite( in4, LOW );
  delay(dl);

  digitalWrite( in1, HIGH ); 
  digitalWrite( in2, HIGH ); 
  digitalWrite( in3, LOW ); 
  digitalWrite( in4, LOW );
  delay(dl);

  digitalWrite( in1, HIGH ); 
  digitalWrite( in2, LOW ); 
  digitalWrite( in3, LOW ); 
  digitalWrite( in4, LOW );
  delay(dl);

  digitalWrite( in1, HIGH ); 
  digitalWrite( in2, LOW ); 
  digitalWrite( in3, LOW ); 
  digitalWrite( in4, HIGH );
  delay(dl);

  digitalWrite( in1, LOW ); 
  digitalWrite( in2, LOW ); 
  digitalWrite( in3, LOW ); 
  digitalWrite( in4, HIGH );
  delay(dl);
}

Чтобы заставить двигатель двигаться быстрее или медленнее, необходимо будет изменить переменную dl. Увеличиваем паузу между коммутациями — двигатель вращается медленнее. Уменьшаем паузу — крутится быстрее.

Стандартная библиотека: вариант №2

Для управления шаговыми двигателями в Arduino IDE есть стандартная библиотека, которая осуществляет только полношаговый режим коммутации.

#include <Stepper.h>

const int IN1 = 2;
const int IN2 = 3;
const int IN3 = 4;
const int IN4 = 5;

const int stepsPerRevolution = 32; // шагов за один оборот

Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4); 

void setup() {
  myStepper.setSpeed(5); // скорость 5 об/минуту
}

void loop() {
  myStepper.step(stepsPerRevolution); // шаг в одном направлении
  delay(500);
 
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution); // шаг в обратную сторону
  delay(500); 
}

Видео

Наконец, когда все подключено, и программа (один из двух вариантов) загружена на Arduino Uno, наблюдаем результат проделанной работы!

Шаговый двигатель 28BYJ-48 и драйвер ULN2003: 5 комментариев

  1. Добрый день! Подскажите:
    1. Программа сохраняется на драйвер?
    2. Программа может отрабатывать без контроллера, а только с драйвером?

    • Программа для контроллера. Драйвер — это ULN2003 весьма простое устройство, неспособное выполнять сложные действия. Есть более умные драйверы, например A4988. Ему достаточно передавать направление и такты. По сути, можно обойтись без контроллера: поставить 555 таймер на тактовый вход. Также на A4988 можно выставить кратность шага, вплоть до 1/16.

  2. Спасибо большое за статью. Правда данный мотор + контроллер на стандартной библиотеке работал довольно плохо и «заднего хода не было». Нашёл бесплатную библиотеку, специально написанную под данный моторчик (28BYJ-48): http://www.codeproject.com/Articles/699986/An-Arduino-Library-to-Control-the-BYJ-Stepper

  3. Для правильной работы этого драйвера (который является простой сборкой Дарлингтона) нужно изменить порядок подключения в примере. Там они идут по порядку 8,9,10,11; а нужно 8,10,9,11.

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

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>