Управление шаговым двигателем с модулем драйвера A4988 и Arduino
Если вы погружаетесь в мир робототехники, 3D-печати или создания собственного станка с ЧПУ, скорее всего, вы скоро столкнётесь с шаговыми двигателями, такими как NEMA 17 или NEMA 23. Эти двигатели популярны благодаря точному, управляемому движению — идеальному для проектов, требующих точного позиционирования. Но есть одна сложность: эти двигатели потребляют много энергии. Им нужно значительно больше электричества, чем Arduino может безопасно обеспечить самостоятельно.
Вот тут на помощь приходят драйверы шаговых двигателей! И один из наиболее широко используемых и удобных для начинающих вариантов — драйвер шагового двигателя A4988. Он компактный, доступный и способен обеспечивать ток до 2 ампер на катушку — достаточно мощности для большинства малых и средних шаговых двигателей.
В этом руководстве мы покажем вам, как подключить драйвер A4988 к Arduino, установить ограничение тока для защиты двигателя, и рассмотрим несколько практических примеров, которые научат вас управлять направлением, скоростью двигателя и даже запускать несколько двигателей одновременно.
Давайте начнём и добавим движение в ваш следующий проект!
Микросхема драйвера шагового двигателя A4988
Сердцем модуля является мощная микросхема микрошагового драйвера производства Allegro — A4988. Несмотря на малый размер, эта микросхема обладает мощными функциями.
Этот драйвер может работать с напряжением до 35 вольт и обеспечивать ток 2 ампера. Этого достаточно для работы популярных шаговых двигателей, таких как NEMA 17 и NEMA 23.
Одна из лучших особенностей A4988 — встроенный «транслятор», который значительно упрощает управление шаговыми двигателями. Обычно вам пришлось бы отправлять сложные электрические сигналы на четыре разных провода в точно правильном порядке, чтобы заставить шаговый двигатель вращаться. Транслятор делает всю эту сложную работу за вас. Вместо этого вам нужно управлять только двумя простыми выводами: один указывает двигателю сделать шаг, а другой — в каком направлении двигаться. Вот так просто!
Ещё одна отличная функция — микрошагование. Она позволяет двигателю двигаться более плавно, разбивая каждый полный шаг на меньшие части, называемые микрошагами. A4988 предлагает пять различных режимов микрошагования: полный шаг, полушаг, четверть шага, восьмая часть шага и шестнадцатая часть шага.
Для безопасности и надёжности A4988 включает несколько защитных функций: защиту от пониженного напряжения, защиту от короткого замыкания, защиту от перегрузки по току, тепловое отключение и защиту от сквозных токов. Эти функции помогают предотвратить повреждение как драйвера, так и вашего двигателя в случае неисправности.
Технические характеристики
Вот технические характеристики:
Выходное напряжение двигателя |
8V – 35V |
|---|---|
Входное логическое напряжение |
3V – 5.5V |
Постоянный ток на фазу |
1A |
Максимальный ток на фазу |
2A |
Разрешение микрошагования |
полный, 1/2, 1/4, 1/8 и 1/16 |
Для получения дополнительной информации обратитесь к техническому описанию ниже.
Распиновка драйвера двигателя A4988
Модуль A4988 имеет в общей сложности 16 выводов, и каждый вывод выполняет определённую функцию.
Давайте рассмотрим каждую группу выводов, чтобы понять, что они делают и как работают.
Выводы питания
A4988 требует два отдельных источника питания:
Выводы VDD и GND обеспечивают питание внутренней логической схемы A4988. Их можно подключить к любому напряжению от 3 В до 5,5 В.
В то же время,
Выводы VMOT и GND обеспечивают питание самого шагового двигателя. В зависимости от типа используемого двигателя это напряжение может составлять от 8 В до 35 В.
Предупреждение:
Этот модуль использует низко-ESR керамические конденсаторы, которые, хотя и эффективны, делают его уязвимым к разрушительным LC-выбросам напряжения. Эти выбросы могут иногда превышать 35 В, что больше, чем A4988 может выдержать, даже если вы используете только 12-вольтовый источник питания для двигателя. Когда это происходит, это может навсегда уничтожить ваш модуль драйвера. Для защиты драйвера от этих опасных выбросов вы должны всегда подключать большой электролитический конденсатор (не менее 47 мкФ) между питанием двигателя (VMOT) и землёй, рядом с драйвером.
Выводы микрошагования
Драйвер A4988 предлагает пять различных вариантов разрешения шага: полный шаг, полушаг, четверть шага, восьмая часть шага и шестнадцатая часть шага. Каждый режим по-разному делит шаги для обеспечения различных уровней точности.
A4988 имеет три специальных вывода для выбора разрешения микрошагования: MS1, MS2 и MS3.
Устанавливая различные логические уровни (HIGH или LOW) на этих выводах, вы можете выбрать любой из пяти доступных режимов шагания:
MS1 |
MS2 |
MS3 |
Разрешение микрошагования |
|---|---|---|---|
Low |
Low |
Low |
Полный шаг |
High |
Low |
Low |
Полушаг |
Low |
High |
Low |
Четверть шага |
High |
High |
Low |
Восьмая часть шага |
High |
High |
High |
Шестнадцатая часть шага |
Важно отметить, что эти выводы имеют внутренние стягивающие резисторы, которые удерживают их в состоянии LOW по умолчанию. Это означает, что если вы оставите эти выводы неподключёнными, двигатель автоматически будет работать в режиме полного шага.
Управляющие выводы
A4988 имеет два основных управляющих входа для управления работой двигателя: STEP и DIR.
STEP — это основной управляющий вход для перемещения двигателя. Каждый раз, когда вы подаёте сигнал HIGH на этот вывод, двигатель продвигается на один шаг. Частота этих импульсов определяет скорость вращения двигателя — более быстрые импульсы приводят к более быстрому вращению.
DIR управляет направлением вращения двигателя. Когда вы устанавливаете этот вывод в HIGH, двигатель вращается по часовой стрелке, а когда в LOW — против часовой стрелки. Если ваш проект требует вращения двигателя только в одном направлении, вы можете просто подключить этот вывод напрямую к VDD или GND.
Обратите внимание, что выводы STEP и DIR не подтянуты к какому-либо напряжению внутренне. Это означает, что вы никогда не должны оставлять ни один из этих выводов неподключённым (плавающим); всегда подключайте их к микроконтроллеру или подтягивайте к HIGH/LOW по необходимости.
Выводы управления состоянием питания
A4988 имеет три входных вывода, которые управляют использованием питания драйвером: EN, RST и SLP.
EN (Enable) включает или отключает драйвер A4988. Поскольку это вывод с активным низким уровнем, подтягивание его к LOW включает драйвер, а подтягивание к HIGH отключает его. Хорошая новость в том, что этот вывод внутренне подтянут к LOW по умолчанию, что означает, что драйвер включён, если вывод не подключён. Вы можете использовать этот вывод, если вам нужна кнопка аварийной остановки для быстрого выключения двигателя в целях безопасности.
SLP (Sleep) переводит драйвер в энергосберегающий спящий режим. Как и вывод EN, это также вывод с активным низким уровнем, что означает: при подключении к LOW драйвер переходит в спящий режим и потребляет очень мало энергии. Эта функция особенно полезна для экономии энергии, когда двигатель не используется.
RST (Reset) — ещё один вывод с активным низким уровнем, который сбрасывает драйвер при подтягивании к LOW, заставляя двигатель вернуться в исходное положение. Сброс полезен, когда вы хотите убедиться, что двигатель каждый раз начинает с одного и того же места.
Важно отметить, что вывод RST находится в плавающем состоянии. Если вы не планируете использовать функцию сброса, подключите вывод RST к соседнему выводу SLP. Это подтянет его к HIGH и обеспечит работу драйвера.
Выходные выводы двигателя
Выходные выводы двигателя — это место, где вы фактически подключаете шаговый двигатель к драйверу.
Обычно у биполярного шагового двигателя есть две пары проводов. Выводы 1A и 1B подключаются к первой катушке шагового двигателя, а выводы 2A и 2B — ко второй катушке.
Схема подключения драйвера шагового двигателя A4988 к Arduino
Давайте пошагово разберём, как подключить драйвер шагового двигателя A4988 к шаговому двигателю и Arduino.
Первый шаг — обеспечить драйвер двигателя необходимым питанием. A4988 требует два отдельных источника питания.
Шаг 1: Подключение питания двигателя
Сначала подключите источник питания двигателя к выводам VMOT и GND на A4988. Это питание должно составлять от 8 В до 35 В, в зависимости от требований вашего двигателя.
Не забудьте установить большой электролитический конденсатор (не менее 47 мкФ) между выводами VMOT и GND. Этот конденсатор помогает поглощать внезапные скачки напряжения, которые могут повредить драйвер.
Шаг 2: Подключение логического питания
Далее подайте питание на внутреннюю логическую схему A4988. Подключите выводы VDD и GND к выводам 5V и GND на Arduino.
Шаг 3: Подключение управляющих входных выводов
После этого подключите выводы, которые непосредственно управляют движением двигателя: STEP и DIR. Вывод STEP управляет движением двигателя, а вывод DIR — направлением вращения. Эти выводы можно подключить к любым цифровым выходным выводам Arduino. В этом примере подключим STEP к цифровому выводу 3, а DIR — к цифровому выводу 2.
Шаг 4: Настройка микрошагования
Теперь у нас есть три вывода микрошагования: MS1, MS2 и MS3. Драйвер A4988 имеет внутренние стягивающие резисторы на этих выводах, что означает: если они не подключены, драйвер по умолчанию работает в режиме полного шага. В этом примере мы оставим их неподключёнными и будем использовать режим полного шага.
Шаг 5: Обработка выводов SLP и RST
Есть ещё два вывода, которые нужно учесть: SLP и RST. Оба имеют активный низкий уровень, то есть они должны быть подтянуты к HIGH для работы драйвера. Вывод SLP по умолчанию в HIGH, но вывод RST находится в плавающем состоянии. Поэтому подключите вывод RST к соседнему выводу SLP, чтобы подтянуть его к HIGH и включить плату.
Шаг 6: Подключение шагового двигателя
Наконец, подключите шаговый двигатель к выходным выводам драйвера: 1A, 1B, 2A и 2B. Подключите одну фазу шагового двигателя к 1A и 1B, а другую — к 2A и 2B.
Шаг 7: Определение фаз шагового двигателя
Иногда самая сложная часть подключения шагового двигателя — определить, какие провода принадлежат одной фазе. Вот два простых метода:
Первый метод — повернуть вал двигателя рукой: он должен вращаться свободно. Теперь возьмите два провода двигателя и кратковременно соедините их вместе. Удерживая эти провода соединёнными, попробуйте снова повернуть вал. Если вал стал значительно труднее вращать, вы нашли фазу. Если ничего не изменилось, попробуйте другую комбинацию проводов.
Другой метод — использовать мультиметр в режиме прозвонки. Прикоснитесь щупами мультиметра к двум проводам одновременно. Если мультиметр пищит или показывает наличие цепи, эти провода принадлежат одной фазе. Если молчит, попробуйте другую пару.
Определив обе пары, подключите одну пару к 1A и 1B, а другую — к 2A и 2B — не беспокойтесь о порядке.
Система охлаждения — радиатор
Микросхема драйвера A4988 имеет максимальный номинальный ток 2 А на катушку, но в реальном использовании фактический ток, который вы можете подать, сильно зависит от того, насколько хорошо вы можете охлаждать микросхему. Без дополнительного охлаждения A4988 обычно может обеспечивать около 1 А на катушку, прежде чем начнёт перегреваться. Для безопасного использования более высоких токов — особенно выше 1 А — вам потребуется добавить радиатор или реализовать другой метод охлаждения.
По этой причине модули драйвера A4988 часто поставляются с маленьким радиатором в комплекте. Настоятельно рекомендуется установить радиатор перед использованием драйвера. При установке радиатора будьте осторожны, чтобы он не касался соседних выводов или других электронных компонентов на плате.
Ограничение тока
Один из способов максимизировать производительность шагового двигателя — подавать на него напряжение выше номинального. В частности, использование более высокого напряжения обычно позволяет достичь более высокой частоты шагов и увеличенного крутящего момента при шагании.
Давайте рассмотрим пример для лучшего понимания. Предположим, вы используете шаговый двигатель с максимальным номинальным током 1 А и сопротивлением катушки 5 Ом. Это указывает на максимальное напряжение питания двигателя 5 В (1 А × 5 Ом = 5 В). Использование такого двигателя с 12 В позволило бы достичь более высокой частоты шагов, но проблема в том, что если просто подключить 12 В напрямую, двигатель попытается потребить слишком много тока — значительно превышая безопасный предел 1 А. Когда это происходит, катушки внутри двигателя могут перегреться, что может навсегда повредить двигатель.
Для безопасного использования напряжения выше номинального необходимо ограничить ток, протекающий через катушки двигателя. Именно для этого драйвер шагового двигателя A4988 включает маленький потенциометр ограничения тока. Он позволяет установить максимальный ток, протекающий через катушки двигателя.
Правильно настроив потенциометр, вы гарантируете, что двигатель никогда не потребляет ток больше безопасного, что помогает предотвратить перегрев и защищает двигатель.
Существует два основных способа настройки ограничения тока на A4988:
Метод 1:
В этом методе вы переводите драйвер в режим полного шага и используете мультиметр для непосредственного измерения тока, протекающего через одну из катушек, одновременно регулируя потенциометр ограничения тока.
Сначала проверьте техническое описание вашего шагового двигателя, чтобы найти его номинальный ток. Например, допустим, вы используете шаговый двигатель NEMA 17 с 200 шагами на оборот, рассчитанный на 1,5 А на катушку.
Подключите двигатель и драйвер, как описано в предыдущем разделе. Однако вместо подключения выводов STEP и DIR к цифровым выводам Arduino подключите оба напрямую к выводу 5V Arduino. Это сохранит двигатель под напряжением и удерживающим фиксированную позицию.
Убедитесь, что три вывода микрошагования отключены для установки драйвера в режим полного шага.
Затем установите амперметр (или мультиметр в режиме измерения тока) последовательно с одной из катушек двигателя так, чтобы ток протекал от вашего измерительного прибора к катушке двигателя. Для этого отсоедините один провод от вывода 1A или 1B на драйвере. Подключите один щуп амперметра к этому выводу, а другой — к отсоединённому проводу двигателя.
С подключённым и включённым всем оборудованием вы должны увидеть показание тока на мультиметре. Теперь аккуратно поверните потенциометр ограничения тока маленькой отвёрткой, наблюдая за показаниями. Регулируйте, пока ток не совпадёт с номинальным значением вашего двигателя — в нашем случае 1,5 А.
Обратите внимание, что измеряемый ток составляет лишь 70% от фактической настройки ограничения тока, поскольку обе катушки постоянно включены и ограничены этим значением в режиме полного шага. Поэтому, если вы позже включите режимы микрошагования, ток через катушки сможет превысить измеренный ток полного шага на 40% (1/0,7) на определённых шагах; пожалуйста, учитывайте это при использовании данного метода для настройки ограничения тока.
Метод 2:
Более распространённый метод — особенно для начинающих — заключается в настройке опорного напряжения, или Vref, на драйвере. Этот метод работает даже когда двигатель не подключён и не запитан.
Начните с проверки технического описания вашего шагового двигателя, чтобы найти номинальный ток. Например, допустим, вы используете шаговый двигатель NEMA 17 с 200 шагами на оборот, рассчитанный на 1,5 А на катушку.
Подключите двигатель и драйвер, как описано в предыдущем разделе. Однако для этого метода вам не нужно подключать двигатель, поскольку вы работаете только с драйвером. Поэтому можно безопасно отключить как двигатель, так и источник питания двигателя. Также убедитесь, что выводы STEP и DIR отключены, так как они не используются в этом методе.
Теперь найдите токоизмерительные резисторы. Внимательно осмотрите плату драйвера A4988 и найдите маленькие SMD-резисторы, расположенные рядом с основной микросхемой драйвера.
На этих резисторах будет код, напечатанный сверху — что-то вроде «R050», «R100» или «R200». Этот код сообщает значение сопротивления: R050 означает 0,05 Ом, R100 означает 0,1 Ом, а R200 означает 0,2 Ом. Разные производители используют разные значения, поэтому вам нужно проверить вашу конкретную плату. В нашем примере предположим, что вы нашли «R100», что означает 0,1 Ом.
Рассчитайте опорное напряжение по формуле: Vref = I_limit × 8 × R_s, где: I_limit — максимальный ток вашего двигателя на катушку (в амперах), R_s — значение токоизмерительных резисторов (в омах). Используя наш пример NEMA 17 с номинальным током 1,5 А и токоизмерительными резисторами 0,1 Ом: Vref = 1,5 × 8 × 0,1 = 1,2 вольта. Это означает, что вам нужно настроить потенциометр, пока опорное напряжение не покажет ровно 1,2 вольта.
Установите мультиметр на измерение постоянного напряжения. Прикоснитесь чёрным щупом к любой точке заземления на плате драйвера, а красным щупом аккуратно прикоснитесь к металлической верхней части потенциометра ограничения тока. Эта маленькая металлическая головка винта фактически служит контрольной точкой, выдающей опорное напряжение. Наблюдая за показаниями мультиметра, медленно поворачивайте потенциометр маленькой отвёрткой. Осторожно регулируйте, пока не достигнете рассчитанного целевого напряжения — в нашем примере 1,2 вольта.
Давайте разберём ещё несколько примеров, чтобы убедиться, что вы понимаете, как применять эти расчёты к разным двигателям.
Пример 1: Если вы хотите быть более консервативным и ограничить двигатель на 1,5 А до 1 А для более холодной работы и долгого срока службы, вы установите: Vref = 1,0 × 8 × 0,1 = 0,8 вольта
Пример 2: Если у вас меньший шаговый двигатель, рассчитанный на 0,8 А на катушку с токоизмерительными резисторами R050 (0,05 Ом), вы установите: Vref = 0,8 × 8 × 0,05 = 0,32 вольта
Пример 3: Если у вас двигатель побольше, рассчитанный на 2,0 А на катушку с токоизмерительными резисторами R200 (0,2 Ом), вы установите: Vref = 2,0 × 8 × 0,2 = 3,2 вольта
Вы можете выполнить эту настройку быстро и легко, подключив один конец зажима-крокодила к стержню металлической отвёртки, а другой — к мультиметру. Это позволяет измерять напряжение одновременно с настройкой.
Мы попробовали оба метода настройки ограничения тока на драйвере A4988, и они дали нам примерно одинаковые результаты.
Какой бы метод вы ни использовали, помните, что главная цель настройки ограничения тока — защита вашего шагового двигателя. Работа двигателя со слишком большим током может дать больше крутящего момента в краткосрочной перспективе, но также вызывает более сильный нагрев двигателя, что может сократить срок его службы. С другой стороны, если установить ток слишком низким, двигатель не будет повреждён, но может не иметь достаточной мощности для выполнения своей задачи. Ключ — найти ту золотую середину, где двигатель имеет достаточно мощности для выполнения задач, оставаясь холодным и долговечным.
Пример кода Arduino 1 — без библиотеки
В этом примере мы узнаем, как управлять скоростью и направлением биполярного шагового двигателя с помощью драйвера A4988 и Arduino без использования какой-либо библиотеки. Этот простой скетч помогает увидеть, как именно управляющие сигналы влияют на поведение двигателя.
// Define pin connections & motor's steps per revolution
const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;
void setup() {
// Declare pins as Outputs
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
// Set motor direction clockwise
digitalWrite(dirPin, HIGH);
// Spin motor slowly
for (int x = 0; x < stepsPerRevolution; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
delay(1000); // Wait a second
// Set motor direction counterclockwise
digitalWrite(dirPin, LOW);
// Spin motor quickly
for (int x = 0; x < stepsPerRevolution; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
delay(1000); // Wait a second
}
Объяснение кода
Скетч начинается с определения выводов Arduino, подключённых к выводам STEP и DIR на A4988.
const int dirPin = 2;
const int stepPin = 3;
Мы также определяем переменную для хранения количества шагов, необходимых двигателю для одного полного оборота. В нашем случае это 200 шагов на оборот, что является стандартом для большинства шаговых двигателей NEMA 17. Если ваш двигатель имеет другое количество шагов на оборот, просто измените это значение.
const int stepsPerRevolution = 200;
В разделе setup() мы устанавливаем оба вывода STEP и DIR как выходы, чтобы Arduino мог отправлять через них сигналы.
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
В разделе loop() мы сначала заставляем двигатель вращаться по часовой стрелке на медленной скорости. Для этого устанавливаем вывод DIR в HIGH, что указывает двигателю вращаться по часовой стрелке. Затем запускаем цикл, который отправляет 200 импульсов на вывод STEP — по одному импульсу на каждый шаг двигателя. Между каждым импульсом мы ждём 2000 микросекунд (2 миллисекунды), что заставляет двигатель вращаться медленно.
// Set motor direction clockwise
digitalWrite(dirPin, HIGH);
// Spin motor slowly
for (int x = 0; x < stepsPerRevolution; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
delay(1000); // Wait a second
После завершения первого оборота мы делаем паузу на одну секунду. Затем меняем направление, установив вывод DIR в LOW, что заставляет двигатель вращаться против часовой стрелки. Мы снова отправляем 200 импульсов на вывод STEP, но на этот раз уменьшаем задержку между импульсами до 1000 микросекунд. Эта меньшая задержка заставляет двигатель вращаться вдвое быстрее в противоположном направлении. После ещё одной паузы в одну секунду весь цикл начинается снова.
// Set motor direction counterclockwise
digitalWrite(dirPin, LOW);
// Spin motor quickly
for (int x = 0; x < stepsPerRevolution; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
delay(1000); // Wait a second
Ключ к управлению скоростью двигателя заключается в регулировке задержки между сигналами HIGH и LOW, отправляемыми на вывод STEP. Меньшая задержка заставляет двигатель вращаться быстрее, а большая задержка — медленнее.
Пример кода Arduino 2 — использование библиотеки AccelStepper
Предыдущий скетч хорошо подходит для простых проектов с одним двигателем. Однако если вам нужно управлять несколькими шаговыми двигателями одновременно или вы хотите более плавное движение с ускорением и замедлением, вам понадобится что-то более продвинутое.
Вот тут на помощь приходит библиотека AccelStepper! Эта мощная библиотека специально разработана для более сложного управления шаговыми двигателями.
Поскольку эта библиотека не входит в стандартную поставку Arduino IDE, вам нужно установить её перед использованием.
Установка библиотеки
Для установки библиотеки:
Сначала откройте Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.
Введите «accelstepper» в поле поиска для фильтрации результатов.
Найдите библиотеку AccelStepper от Mike McCauley.
Нажмите кнопку Install, чтобы добавить её в Arduino IDE.
Код Arduino
Вот простой скетч, который заставляет двигатель ускоряться в одном направлении, а затем замедляться до полной остановки. После завершения одного полного оборота двигатель изменит направление и повторит процесс.
// Include the AccelStepper Library
#include <AccelStepper.h>
// Define pin connections
const int dirPin = 2;
const int stepPin = 3;
// Define motor interface type
#define motorInterfaceType 1
// Creates an instance
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
// set the maximum speed, acceleration factor,
// initial speed and the target position
myStepper.setMaxSpeed(1000);
myStepper.setAcceleration(50);
myStepper.setSpeed(200);
myStepper.moveTo(200);
}
void loop() {
// Change direction once the motor reaches target position
if (myStepper.distanceToGo() == 0)
myStepper.moveTo(-myStepper.currentPosition());
// Move the motor one step
myStepper.run();
}
Объяснение кода
Скетч начинается с подключения недавно установленной библиотеки AccelStepper.
#include <AccelStepper.h>
Затем мы определяем выводы Arduino, подключённые к выводам STEP и DIR на A4988.
// Define pin connections
const int dirPin = 2;
const int stepPin = 3;
Далее мы указываем тип интерфейса двигателя. Значение 1 сообщает библиотеке, что мы используем драйвер шагового двигателя, такой как A4988, который работает с двумя управляющими выводами: STEP и DIR.
// Define motor interface type
#define motorInterfaceType 1
Затем мы создаём экземпляр класса AccelStepper, предоставляя тип интерфейса двигателя и выводы Arduino, подключённые к плате драйвера:
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);
В функции setup() мы настраиваем несколько важных параметров:
setMaxSpeed()устанавливает максимальную скорость, которую двигатель может достичьsetAcceleration()управляет тем, как быстро двигатель ускоряется или замедляется — это помогает создать плавное движение вместо резких рывковsetSpeed()устанавливает начальную скоростьmoveTo()устанавливает первую целевую позицию, которая в данном случае составляет 200 шагов (один полный оборот для NEMA 17)
void setup() {
myStepper.setMaxSpeed(1000);
myStepper.setAcceleration(50);
myStepper.setSpeed(200);
myStepper.moveTo(200);
}
В функции loop() мы проверяем, достиг ли двигатель целевой позиции, используя distanceToGo(). Когда это значение становится равным нулю, это означает, что двигатель достиг пункта назначения. В этот момент мы меняем направление двигателя, устанавливая новую цель, противоположную текущей позиции. Это заставляет двигатель двигаться вперёд и назад бесконечно, меняя направление после каждого полного оборота.
Наконец, есть важный шаг — вызов функции run(). Эту функцию необходимо вызывать многократно в цикле. Именно она заставляет двигатель двигаться. Если вы забудете вызвать run(), двигатель не будет двигаться, даже если вы установили скорость и цель.
void loop() {
if (myStepper.distanceToGo() == 0)
myStepper.moveTo(-myStepper.currentPosition());
myStepper.run();
}
Пример кода Arduino 3 — одновременное управление несколькими шаговыми двигателями
В этом третьем примере мы будем одновременно управлять двумя шаговыми двигателями. Делать это вручную без библиотеки может быть очень сложно, но с помощью библиотеки AccelStepper это становится намного проще и удобнее.
Схема подключения
Для начала вам нужно добавить второй шаговый двигатель NEMA 17 к вашей установке.
Как и первый двигатель, второй также нуждается в собственной плате драйвера A4988. Подключение второго драйвера почти идентично первому, за исключением того, что нужно подключить выводы STEP и DIR второго драйвера к двум другим выводам Arduino. В этом примере мы используем вывод 5 для STEP и вывод 4 для DIR. Как только оба драйвера правильно подключены, вы готовы загрузить код.
На изображении ниже показано, как собрать схему.
Код Arduino
Вот скетч, который заставляет оба двигателя совершать возвратно-поступательные движения на 360 градусов, но в противоположных направлениях. Оба двигателя будут плавно ускоряться при начале движения и замедляться при приближении к концу хода.
// Include the AccelStepper Library
#include <AccelStepper.h>
// Define motor interface type
#define motorInterfaceType 1
// Creates two instances
AccelStepper stepper1(motorInterfaceType, 3, 2);
AccelStepper stepper2(motorInterfaceType, 5, 4);
void setup() {
// set the maximum speed, acceleration factor,
// initial speed and the target position for motor 1
stepper1.setMaxSpeed(1000);
stepper1.setAcceleration(50);
stepper1.setSpeed(200);
stepper1.moveTo(200);
// set the same for motor 2
stepper2.setMaxSpeed(1000);
stepper2.setAcceleration(50);
stepper2.setSpeed(200);
stepper2.moveTo(-200);
}
void loop() {
// Change direction once the motor reaches target position
if (stepper1.distanceToGo() == 0)
stepper1.moveTo(-stepper1.currentPosition());
if (stepper2.distanceToGo() == 0)
stepper2.moveTo(-stepper2.currentPosition());
// Move the motor one step
stepper1.run();
stepper2.run();
}
Объяснение кода
Код начинается с подключения библиотеки AccelStepper, как и в предыдущем примере.
#include <AccelStepper.h>
Далее мы указываем тип интерфейса двигателя, который сообщает библиотеке, что мы используем драйверы шаговых двигателей с выводами STEP и DIR.
// Define motor interface type
#define motorInterfaceType 1
Затем мы создаём два экземпляра класса AccelStepper — по одному для каждого двигателя. Для каждого экземпляра мы указываем тип интерфейса двигателя и выводы Arduino, подключённые к входам STEP и DIR каждого драйвера.
AccelStepper stepper1(motorInterfaceType, 3, 2);
AccelStepper stepper2(motorInterfaceType, 5, 4);
В функции setup() мы настраиваем несколько важных параметров для обоих двигателей:
Устанавливаем максимальную скорость 1000 шагов в секунду для обоих двигателей
Определяем значения ускорения для управления тем, как быстро каждый двигатель ускоряется или замедляется
Устанавливаем начальную скорость для каждого двигателя с помощью setSpeed()
Задаём каждому двигателю свою целевую позицию с помощью moveTo()
Поскольку наши шаговые двигатели требуют 200 шагов для одного полного оборота, мы используем 200 как целевое значение для первого двигателя. Чтобы второй двигатель вращался в противоположном направлении, мы устанавливаем его цель как -200.
void setup() {
// settings for motor 1
stepper1.setMaxSpeed(1000);
stepper1.setAcceleration(50);
stepper1.setSpeed(200);
stepper1.moveTo(200);
// settings for motor 2
stepper2.setMaxSpeed(1000);
stepper2.setAcceleration(50);
stepper2.setSpeed(200);
stepper2.moveTo(-200);
}
В функции loop() мы используем два отдельных оператора if — по одному для каждого двигателя — чтобы проверить, достиг ли каждый двигатель целевой позиции. Мы делаем это с помощью функции distanceToGo(), которая возвращает ноль, когда двигатель достигает цели. В этот момент мы меняем направление двигателя, устанавливая его цель на отрицательное значение текущей позиции, создавая непрерывное возвратно-поступательное движение.
Наконец, и самое главное, мы вызываем функцию run() для каждого двигателя. Этот шаг абсолютно необходим — без этих вызовов ни один двигатель не будет двигаться, даже если вы установили скорости и цели.
void loop() {
// Change direction once the motor reaches target position
if (stepper1.distanceToGo() == 0)
stepper1.moveTo(-stepper1.currentPosition());
if (stepper2.distanceToGo() == 0)
stepper2.moveTo(-stepper2.currentPosition());
// Move the motor one step
stepper1.run();
stepper2.run();
}