Управление шаговым двигателем с Arduino и драйвером A4988 — Пошаговое руководство
В этом уроке Arduino мы узнаем, как управлять шаговым двигателем с помощью драйвера A4988. Вы можете посмотреть следующее видео или прочитать письменный урок ниже. A4988 — это драйвер с микрошагами для управления биполярными шаговыми двигателями, который имеет встроенный транслятор для простой работы. Это означает, что мы можем управлять шаговым двигателем всего с 2 выводами от нашего контроллера: один для управления направлением вращения, а другой для управления шагами. Драйвер предоставляет пять различных разрешений шагов: полный шаг, половинный шаг, четверть шага, восьмой шаг и шестнадцатый шаг. Также у него есть потенциометр для регулировки выходного тока, защита от перегрева и защита от перекрестного тока. Его логическое напряжение составляет от 3 до 5.5 В, а максимальный ток на фазу — 2А при хорошем дополнительном охлаждении или 1А постоянного тока на фазу без радиатора или охлаждения. Теперь давайте присмотрельнее рассмотрим распиновку драйвера и подключим его к шаговому двигателю и контроллеру. Начнем с 2 выводов в правом нижнем углу для питания драйвера: выводы VDD и Ground, которые нужно подключить к источнику питания 3–5.5 В, в нашем случае это будет наш контроллер — плата Arduino, которая выдает 5 В. Следующие 4 вывода для подключения двигателя. Выводы 1A и 1B будут подключены к одной катушке двигателя, а выводы 2A и 2B — к другой катушке. Для питания двигателя мы используем следующие 2 вывода: Ground и VMOT, которые нужно подключить к источнику питания от 8 до 35 В, и также нам нужно использовать развязывающий конденсатор не менее 47 мкФ для защиты платы драйвера от скачков напряжения. Следующие 2 вывода, Step и Direction — это выводы, которые мы фактически используем для управления движением двигателя. Вывод Direction управляет направлением вращения двигателя, и нам нужно подключить его к одному из цифровых выводов нашего микроконтроллера, в моем случае я подключу его к выводу номер 4 моей платы Arduino. С выводом Step мы управляем микрошагами двигателя, и с каждым импульсом, отправленным на этот вывод, двигатель делает один шаг. Это означает, что нам не нужно никакое сложное программирование, таблицы фаз, линии управления частотой и так далее, потому что встроенный транслятор драйвера A4988 заботится обо всем. Здесь также нужно упомянуть, что эти 2 вывода не подтянуты ни к какому напряжению внутренне, поэтому мы не должны оставлять их плавающими в нашей программе. Следующий вывод SLEEP: логический ноль переводит плату в спящий режим для минимизации потребления энергии, когда двигатель не используется. Следующий вывод RESET устанавливает транслятор в предопределенное домашнее состояние. Это домашнее состояние или домашняя позиция микрошага можно увидеть на этих рисунках из даташита A4988. Это исходные позиции, от которых начинается двигатель, и они различаются в зависимости от разрешения микрошага. Если входное состояние на этом выводе — логический ноль, все входы STEP будут игнорироваться. Вывод Reset — плавающий вывод, поэтому, если мы не собираемся управлять им в нашей программе, нам нужно подключить его к выводу SLEEP, чтобы притянуть его вверх и включить плату. Следующие 3 вывода (MS1, MS2 и MS3) предназначены для выбора одного из пяти разрешений шагов в соответствии с таблицей истинности выше. Эти выводы имеют внутренние подтягивающие резисторы вниз, поэтому, если мы оставим их неподключенными, плата будет работать в режиме полного шага. Последний, вывод ENABLE используется для включения или выключения FET-выводов. Логическая единица будет держать выводы отключенными. Вы можете приобрести компоненты на любом из сайтов ниже: Вот полная схема подключения. Я буду использовать драйвер в режиме полного шага, поэтому оставлю 3 вывода MS неподключенными и просто подключу выводы Direction и Step драйвера к выводам номер 3 и 4 на плате Arduino, а также Ground и 5В для питания платы. Также я буду использовать конденсатор 100 мкФ для развязки и адаптер 12В, 1.5А для питания двигателя. Я буду использовать биполярный шаговый двигатель NEMA 17, и его провода A и C будут подключены к выводам 1A и 1B, а провода B и D — к выводам 2A и 2B. Прежде чем подключить двигатель, мы должны отрегулировать ограничение тока драйвера, чтобы быть уверенными, что ток находится в пределах пределов тока двигателя. Мы можем сделать это, отрегулировав опорное напряжение с помощью потенциометра на плате, учитывая это уравнение: Однако это уравнение не всегда верно, так как существует разные производители плат драйвера A4988. Вот демонстрация моего случая: я отрегулировал потенциометр и измерил опорное напряжение 0.6В. Так что ограничение тока должно быть 0.6*2 = 1.2 А. Теперь, поскольку я использую драйвер в режиме полного шага, и согласно даташиту A4988 в этом режиме ток катушки может достигать только 70% от предельного тока, 1.2А * 0.7 будет равно 0.84А. Чтобы проверить это, я загрузил простой код, который посылает непрерывный логический ноль на вывод Step (чтобы мы могли лучше заметить ток) и подключил мой мультиметр последовательно с одной катушкой двигателя и включил питание. Я получил 0.5А, что означает, что уравнение не было верным для моего случая. Вот пример кода. Сначала мы должны определить выводы Step и Direction. В нашем случае это выводы номер 3 и 4 на плате Arduino, и они названы stepPin и dirPin. В разделе setup мы должны определить их как выходы. В разделе loop сначала мы установим вывод Direction в высокое состояние, что позволит двигателю двигаться в определенном направлении. Теперь, используя этот цикл for, мы заставим двигатель сделать один полный оборот. Поскольку драйвер установлен в режим полного шага, а наш шаговый двигатель имеет угол шага 1.8 градуса, или 200 шагов, нам нужно отправить 200 импульсов на вывод Step, чтобы сделать один полный оборот. Цикл for будет иметь 200 итераций, и каждый раз он установит вывод Step в высокое, а затем низкое состояние для создания импульсов. Между каждым digitalWrite нам нужно добавить некоторую задержку, от которой будет зависеть скорость двигателя. После этого полного оборота мы сделаем задержку в одну секунду, затем изменим направление вращения, установив dirPin в низкое состояние, и теперь сделаем 2 полных оборота с этим циклом из 400 итераций. В конце есть еще одна секунда задержки. Теперь загрузим код и посмотрим, как это будет работать. Я сделал еще один пример для этого урока, где я управляю скоростью двигателя с помощью потенциометра. Вот исходный код этого примера:Обзор


Распиновка драйвера A4988


Необходимые компоненты для этого урока Arduino
Схемы подключения

Ограничение тока A4988



Код Arduino и A4988
/* Simple Stepper Motor Control Example Code
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
// определяет номера пинов
const int stepPin = 3;
const int dirPin = 4;
void setup() {
// Устанавливает два пина как выходы
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
digitalWrite(dirPin, HIGH); // Включает двигатель для движения в определенном направлении
// Делает 200 импульсов для одного полного оборота
for(int x = 0; x < 200; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
delay(1000); // Задержка 1 секунда
digitalWrite(dirPin, LOW); // Меняет направление вращения
// Делает 400 импульсов для двух полных оборотов
for(int x = 0; x < 400; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
delay(1000);
}Язык кода: Arduino (arduino)/* Simple Stepper Motor Control Example Code
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
// Определяет номера пинов
const int stepPin = 3;
const int dirPin = 4;
int customDelay, customDelayMapped; // Определяет переменные
void setup() {
// Устанавливает два пина как выходы
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
digitalWrite(dirPin, HIGH); // Включает двигатель для движения в определенном направлении
}
void loop() {
customDelayMapped = speedUp(); // Получает пользовательские значения задержки из пользовательской функции speedUp
// Делает импульсы с пользовательской задержкой, зависящей от потенциометра, от которой зависит скорость двигателя
digitalWrite(stepPin, HIGH);
delayMicroseconds(customDelayMapped);
digitalWrite(stepPin, LOW);
delayMicroseconds(customDelayMapped);
}
// Функция для чтения потенциометра
int speedUp() {
int customDelay = analogRead(A0); // Считывает потенциометр
int newCustom = map(customDelay, 0, 1023, 300, 4000); // Преобразует считанные значения потенциометра от 0 до 1023 в желаемые значения задержки (300 до 4000)
return newCustom;
}Язык кода: Arduino (arduino)
Производственный процесс
- Умная копилка: управление монетоприёмником на Arduino Nano
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- Управление двумя шаговыми двигателями через джойстик на Arduino Nano — простой урок (Visuino)
- Точное управление сервоприводом через MPU6050 (Arduino, SG90, MG996R)
- Чтение температуры и влажности DHT11 через Blynk — пошаговый урок для Arduino
- Генерация музыкальных тонов на Arduino: полный спектр 88 клавиш пианино
- Удалённое управление автомобилем на Arduino Uno и Bluetooth: пошаговое руководство
- Мастерство Modbus на Arduino: пошаговое руководство
- Точное управление шаговым двигателем 28BYJ-48 с Arduino UNO и джойстиком
- Создание ИИ-ассистента-робота на Arduino и Python