26 апреля 2016
Кравченко Виктор

Arduino Uno + шаговый двигатель 28BYJ-48 (5V) + драйвер ULN2003 (на модуле SBT0811)

Цифровые устройства Arduino Arduino Lang
01

Перед тем как приступить к экспериментам с шаговым двигателем, было бы не плохо ознакомиться с его устройством и принципом действия. Вкратце, шаговый двигатель — это двигатель, который способен осуществлять вращение на 1 шаг. Шаг — это угол, который обусловлен устройством каждого конкретного шагового двигателя. Основные характеристики:

Даташит на шаговый двигатель datasheet_step_motor_28BYJ-48.pdf (193 KB).
02
Рабочее напряжение
Число фаз4
Тип шагового двигателяУниполярный
Угол шагаПолушаговый режим: 5,625° (64 шага на оборот)
Шаговый режим: 11,25° (32 шага на оборот)
Предпочтительный режим работыПолушаговый
03
Схема устройства шагового мотора
Схема устройства шагового мотора
04

Для того, чтобы заставить двигатель вращаться по часовой стрелке, нужно попеременно подавать напряжение на его выходы в соответствии со следующей картой (для полушагового и шагового режимов):

05

Контакт мотораФазы для полушагового режима
12345678
Оранжевый+++
Желтый+++
Розовый+++
Синий+++
Контакт мотораФазы для шагового режима
1234
Оранжевый++
Желтый++
Розовый++
Синий++

06

Подключение напрямую к Arduino Uno

Первое подключение — самое простое напрямую к Arduino Uno. Обратите внимание — красный провод мотора не подключен.

07
Файл мотора для Fritzing28BYJ-48 Stepper Motor.fzpz (9,27 KB).
08

Скетч:

09 Arduino (C++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Контакты Bl Pi Ye Or int pins[] = {8, 9, 10, 11}; //Задаем пины по порядку int phases = 8; // для шагового режима установить 4 // Для шагового режима //bool motorPhases[4][4] = { // [phase][pin] //// -------- pins ---------- //// Winding A B A B //// Motor Pin 1 2 3 4 //// Color Bl Pi Ye Or // { 1, 1, 0, 0}, // { 0, 1, 1, 0}, // { 0, 0, 1, 1}, // { 1, 0, 0, 1} //}; // Для полушагового режима bool motorPhases[8][4] = { // [phase][pin] // -------- pins ---------- // Winding A B A B // Motor Pin 1 2 3 4 // Color Bl Pi Ye Or { 1, 1, 0, 0}, { 0, 1, 0, 0}, { 0, 1, 1, 0}, { 0, 0, 1, 0}, { 0, 0, 1, 1}, { 0, 0, 0, 1}, { 1, 0, 0, 1}, { 1, 0, 0, 0} }; void setup() { for (int i = 0; i < 4; i++) pinMode(pins[i], OUTPUT); } int phase = 0; int _step = 1; // Если у шага поменять знак, на -1 - изменится направление вращения. void loop() { phase += _step; if (phase > 7) phase = 0; if (phase < 0) phase = 7; for (int i = 0; i < 4; i++) { digitalWrite(pins[i], ((motorPhases[phase][i] == 1) ? HIGH : LOW)); } // Пауза на вращение на один шаг/полушаг delay(2); // Для шагового режима установить в 3 }
10

Добавим кнопку для изменения направления вращения и потенциометр для изменения скорости вращения:

11
Принципиальная схема
Принципиальная схема

Скетч для Fritzing — step_motor_02_button_potentiometr.fzz (17,9 KB)
12 Arduino (C++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Контакты Bl Pi Ye Or int pins[] = {8, 9, 10, 11}; //Задаем пины по порядку int buttonPin = 5; int potPin = A0; int phases = 8; // для шагового режима установить 4 // Для шагового режима //bool motorPhases[4][4] = { // [phase][pin] //// -------- pins ---------- //// Winding A B A B //// Motor Pin 1 2 3 4 //// Color Bl Pi Ye Or // { 1, 1, 0, 0}, // { 0, 1, 1, 0}, // { 0, 0, 1, 1}, // { 1, 0, 0, 1} //}; // Для полушагового режима bool motorPhases[8][4] = { // [phase][pin] // -------- pins ---------- // Winding A B A B // Motor Pin 1 2 3 4 // Color Bl Pi Ye Or { 1, 1, 0, 0}, { 0, 1, 0, 0}, { 0, 1, 1, 0}, { 0, 0, 1, 0}, { 0, 0, 1, 1}, { 0, 0, 0, 1}, { 1, 0, 0, 1}, { 1, 0, 0, 0} }; void setup() { for (int i = 0; i < 4; i++) pinMode(pins[i], OUTPUT); pinMode(buttonPin, INPUT); pinMode(potPin, INPUT); //Serial.begin(9600); } int phase = 0; int _step = 1; // Если у шага поменять знак, на -1 - изменится направление вращения. //int delaytime=1000; //В микросекундах для более точного регулирования скорости void loop() { int delaytime = map(analogRead(potPin), 0, 1023, 1000, 16000); bool isButtonDown = digitalRead(buttonPin); //Serial.println(isButtonDown); if (isButtonDown) { _step = -_step; delay(500); // Делаем паузу, чтобы отсеч дребезг } phase += _step; if (phase > 7) phase = 0; if (phase < 0) phase = 7; for (int i = 0; i < 4; i++) { digitalWrite(pins[i], ((motorPhases[phase][i] == 1) ? HIGH : LOW)); } // Пауза на вращение на один шаг/полушаг //delay(2);// Для шагового режима установить в 3 delayMicroseconds(delaytime); }
13

Подключаем через драйвер ULN2003A

В первую очередь необходимо пояснить, для чего же нужен драйвер, ведь при ближайшем рассмотрении схемы может возникнуть закономерный вопрос: А что же поменялось, помимо того, что в схеме появилась лишняя деталь и что же она делает, если даже код из скетча выше не изменился?

14
Вливаем первый скетч и... вуаля! Все работает!
Вливаем первый скетч и... вуаля! Все работает!
В нашем случае маркировка платы с драйвером ULN2003APG — ZC-A0591 (SBT0811). Это не играет принципиальной роли, потому что все подобные платы абсолютно одинаковые.

Файл драйвера ULN2003A для FritzingX113647 Stepper Driver Board.fzpz (13,3 KB).
15

Наш драйвер (микросхема ULN2003A) представляет из себя сборку Дарлингтона из семи независимых транзисторных пар Дарлингтона в одном корпусе. Каждая пара Дарлингтона представляет из себя каскад из двух биполярных транзисторов. Такая схема позволяет управлять мощными нагрузками с током до 500 мА и напряжением до 50 В на канал с помощью слабого тока микроконтроллера, такого как Arduino.




Скетч с использованием драйвера ULN2003A и внешнего источника питания на 9 В — step_motor_03_driver_9V.fzz (31,7 KB)
16

Таким образом драйвер ULN2003A позволяет управлять более мощными моторами, используя внешний источник питания (на примере 9 В мотора):

17
18 На заметку:
Необходимо иметь ввиду, что в случае подключения отдельного источника питания, земля обоих источников должна быть соединена! Это необходимо для того, чтобы у Arduino была единая точка отсчета.
19

Добавляем библиотеку Stepper.h

Теперь посмотрим, как можно управлять шаговым мотором при помощи предустановленной библиотеки Stepper.h. Эта библиотека имеет всего 4 функции:

20
Функция Описание
Stepper(steps, pin1, pin2)
Stepper(steps, pin1, pin2, pin3, pin4)
Создает новый экземпляр класса Stepper с заданными параметрами (вызывается в начале скетча перед процедурами setup() и loop()):
steps — число шагов в полном обороте двигателя
pin1...pin4 — выходы Arduino, к которым подключен двигатель
setSpeed(rpm) Устанавливает скорость вращения двигателя:
rpm — количество оборотов в минуту
step(steps) Команда на вращение на заданное количество шагов. При steps>0 в одну сторону, при steps<0 в противоположную.
steps количество шагов со скоростью, заданной функцией setSpeed(rpm)
Примеры с библиотекой Stepper.h на официальном сайте Arduino
21 Arduino (C++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <Stepper.h> // указываем количество шагов нашего мотора - в нашем случае 64 #define STEPS 64 // Создаем экземпляр класса Stepper, и указываем // количество шагов и пины подключния Stepper stepper(STEPS, 8, 9, 10, 11); // переменная для запоминания предыдущего значения int previous = 0; void setup() { // Устанавливаем скорость вращения в об/мин stepper.setSpeed(30); } void loop() { // новое значение полученное с датчика int val = analogRead(0); // При подключении датчика, 0 заменить на пин датчика // Прокрутить на разницу шагов между новым полученным значением и предыдущим stepper.step(val - previous); // Запоминаем новое полученное значение previous = val; }
23

Похожие запросы:

  • Stepper Motors and Arduino: 28BYJ-48 with ULN2003
  • Stepper Motor 5V 4-Phase 5-Wire & ULN2003 Driver Board for Arduino
  • Small Stepper Motor and Driver Board
  • Вопросы новичка, подключение шаговика
  • Шаговый двигатель 28BYJ-48 и драйвер ULN2003
  • Шаговый двигатель 28BYJ-48 с драйвером ULN2003 и Arduino UNO
  • Подключаем 5-вольтовый шаговый двигатель 28BYJ-48 к Arduino
comments powered by HyperComments