01 |
Перед тем как приступить к экспериментам с шаговым двигателем, было бы не плохо ознакомиться с его устройством и принципом действия. Вкратце, шаговый двигатель — это двигатель, который способен осуществлять вращение на 1 шаг. Шаг — это угол, который обусловлен устройством каждого конкретного шагового двигателя. Основные характеристики: |
Даташит на шаговый двигатель datasheet_step_motor_28BYJ-48.pdf (193 KB).
|
02 |
|
|
03 |
Схема устройства шагового мотора
|
|
04 |
Для того, чтобы заставить двигатель вращаться по часовой стрелке, нужно попеременно подавать напряжение на его выходы в соответствии со следующей картой (для полушагового и шагового режимов): |
|
05 |
|
|
06 |
Подключение напрямую к Arduino Uno Первое подключение — самое простое напрямую к Arduino Uno. Обратите внимание — красный провод мотора не подключен. |
|
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 |
Добавим кнопку для изменения направления вращения и потенциометр для изменения скорости вращения: |
|
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 для Fritzing — X113647 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 В мотора): |
|
18 | На заметку: |
Необходимо иметь ввиду, что в случае подключения отдельного источника питания, земля обоих источников должна быть соединена! Это необходимо для того, чтобы у Arduino была единая точка отсчета.
|
|
19 |
Добавляем библиотеку Stepper.h Теперь посмотрим, как можно управлять шаговым мотором при помощи предустановленной библиотеки Stepper.h. Эта библиотека имеет всего 4 функции: |
|
20 |
|
Примеры с библиотекой 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 |
Похожие запросы:
|
|