Управление шаговым двигателем с помощью драйвера DRV8825 и Arduino
Если вы погружаетесь в мир робототехники, 3D-печати или создаёте свой собственный станок с ЧПУ, скорее всего, вам вскоре придётся столкнуться с шаговыми двигателями, такими как NEMA 17 или NEMA 23. Эти двигатели популярны, потому что обеспечивают точное, управляемое движение — идеально для проектов, требующих точного позиционирования. Но вот в чём загвоздка: эти двигатели потребляют много энергии. Им нужно гораздо больше электричества, чем Arduino может безопасно обеспечить самостоятельно.
Вот тут-то и пригодятся драйверы шаговых двигателей! И один из самых распространённых и удобных для начинающих вариантов — это драйвер шагового двигателя DRV8825. Он компактный, доступный и способен обеспечивать ток до 2 ампер на катушку — достаточно мощности для большинства малых и средних шаговых двигателей.
В этом руководстве мы покажем вам, как подключить драйвер DRV8825 к Arduino, установить ограничение тока для защиты двигателя, и рассмотрим несколько практических примеров, которые научат вас управлять направлением вращения, скоростью двигателя и даже запускать несколько двигателей одновременно.
Давайте начнём и добавим движение в ваш следующий проект!
Чип драйвера шагового двигателя DRV8825
В основе модуля лежит мощный чип микрошагового драйвера производства Texas Instruments — DRV8825. Несмотря на свой маленький размер, этот чип обладает мощными возможностями.
Этот драйвер способен работать с напряжением до 45 вольт и обеспечивать ток до 2,5 ампер. Этого достаточно для работы популярных шаговых двигателей, таких как NEMA 17 и NEMA 23.
Одна из лучших особенностей DRV8825 заключается в том, что он имеет встроенный «транслятор», который значительно упрощает управление шаговыми двигателями. Обычно вам пришлось бы посылать сложные электрические сигналы на четыре различных провода в точно определённом порядке, чтобы заставить шаговый двигатель вращаться. Транслятор выполняет всю эту сложную работу за вас. Вместо этого вам нужно управлять только двумя простыми выводами: один сообщает двигателю сделать шаг, а другой — в каком направлении двигаться. Вот так просто!
Ещё одна замечательная функция — микрошаг. Он позволяет двигателю двигаться более плавно, разбивая каждый полный шаг на более мелкие части — микрошаги. DRV8825 предлагает шесть различных режимов микрошага: полный шаг, полушаг, четверть шага, восьмая шага, шестнадцатая шага и тридцать вторая шага.
Для обеспечения безопасности и надёжности DRV8825 включает несколько защитных функций: защиту от пониженного напряжения, защиту от короткого замыкания, защиту от перегрузки по току, термическое отключение и защиту от сквозного тока. Эти функции помогают предотвратить повреждение как драйвера, так и вашего двигателя в случае неисправности.
Технические характеристики
Вот технические характеристики:
Выходное напряжение двигателя |
8.2V – 45V |
|---|---|
Логическое напряжение |
Встроенный выход 3.3V |
Постоянный ток на фазу |
1A |
Максимальный ток на фазу |
2.5A |
Разрешение микрошага |
full, 1/2, 1/4, 1/8, 1/16, and 1/32 |
Для получения дополнительной информации обратитесь к техническому описанию ниже.
Распиновка драйвера DRV8825
Модуль DRV8825 имеет всего 16 выводов, каждый из которых выполняет определённую функцию.
Давайте познакомимся со всеми выводами по порядку.
Выводы питания
В отличие от большинства драйверов шаговых двигателей, DRV8825 имеет только одно подключение питания.
Выводы VMOT и GND подают питание как на драйвер, так и на шаговый двигатель. В зависимости от типа используемого двигателя это напряжение может варьироваться от 8,2 В до 45 В.
Внимание:
Этот модуль использует низкоимпедансные керамические конденсаторы, которые, хотя и эффективны, делают его уязвимым для разрушительных LC-выбросов напряжения. Эти выбросы иногда могут превышать 45 В, что больше, чем DRV8825 может выдержать, даже если вы используете источник питания 12 В для двигателя. Когда это происходит, модуль драйвера может быть необратимо повреждён. Для защиты драйвера от этих опасных выбросов вы всегда должны подключать большой электролитический конденсатор (не менее 47 мкФ) между питанием двигателя (VMOT) и землёй, как можно ближе к драйверу.
Выводы микрошага
Драйвер DRV8825 предлагает шесть различных вариантов разрешения шага: полный шаг, полушаг, четверть шага, восьмая шага, шестнадцатая шага и тридцать вторая шага. Каждый режим по-разному делит шаги, чтобы обеспечить различные уровни точности.
DRV8825 имеет три специальных вывода для выбора разрешения микрошага: M0, M1 и M2.
Устанавливая различные логические уровни (HIGH или LOW) на этих выводах, вы можете выбрать любой из шести доступных режимов шага:
M0 |
M1 |
M2 |
Разрешение микрошага |
|---|---|---|---|
Low |
Low |
Low |
Полный шаг |
High |
Low |
Low |
Полушаг |
Low |
High |
Low |
1/4 шага |
High |
High |
Low |
1/8 шага |
Low |
Low |
High |
1/16 шага |
High |
Low |
High |
1/32 шага |
Low |
High |
High |
1/32 шага |
High |
High |
High |
1/32 шага |
Важно отметить, что эти выводы имеют внутренние стягивающие резисторы, которые удерживают их в состоянии LOW по умолчанию. Это означает, что если вы оставите эти выводы неподключёнными, двигатель будет автоматически работать в режиме полного шага.
Выводы управления
DRV8825 имеет два основных управляющих входа для управления работой двигателя: STEP и DIR.
STEP — основной управляющий вход для перемещения двигателя. Каждый раз, когда вы отправляете сигнал HIGH на этот вывод, двигатель перемещается на один шаг. Частота этих импульсов определяет скорость вращения двигателя — более частые импульсы приводят к более быстрому вращению.
Вывод DIR управляет направлением вращения двигателя. Когда вы устанавливаете этот вывод в HIGH, двигатель вращается по часовой стрелке, а когда в LOW — против часовой стрелки.
Оба этих входа имеют внутренние стягивающие резисторы, подтягивающие их к LOW по умолчанию. Если вашему проекту нужно вращение двигателя только в одном направлении, вы можете просто оставить DIR неподключённым.
Выводы управления состоянием питания
DRV8825 имеет три входных вывода, которые управляют тем, когда и как драйвер использует питание: EN, RST и SLP.
EN (Enable) — включает или отключает драйвер DRV8825. Поскольку это вывод с активным низким уровнем, подтягивание его к LOW включает драйвер, а подтягивание к HIGH отключает его. Хорошая новость: этот вывод по умолчанию внутренне подтянут к LOW, что означает, что драйвер включён, если вывод оставлен неподключённым. Вы можете использовать этот вывод, если вам нужна кнопка аварийной остановки, которая может быстро выключить двигатель для безопасности.
SLP (Sleep) — переводит драйвер в энергосберегающий спящий режим. Как и вывод EN, он также имеет активный низкий уровень, то есть когда вы подключаете этот вывод к LOW, драйвер переходит в спящий режим и потребляет очень мало энергии. Эта функция особенно полезна для экономии энергии, когда двигатель не используется.
RST (Reset) — ещё один вывод с активным низким уровнем, который сбрасывает драйвер при подтягивании к LOW, заставляя двигатель вернуться в исходное положение. Сброс полезен, когда вы хотите убедиться, что двигатель каждый раз стартует с одного и того же места.
Обратите внимание, что оба вывода SLP и RST подтянуты к LOW внутренними стягивающими резисторами. Однако это препятствует работе драйвера, поэтому для включения драйвера оба этих вывода должны быть установлены в высокое состояние.
Вы можете сделать это двумя способами: либо подключить их напрямую к логическому напряжению HIGH (от 2,2 до 5,25 вольт), либо подключить к цифровым выходным выводам микроконтроллера, чтобы они могли включаться или выключаться по мере необходимости вашей программой.
Вывод обнаружения неисправностей
DRV8825 имеет выход FAULT, который переходит в состояние LOW всякий раз, когда драйвер обнаруживает ошибку, такую как слишком большой ток (защита от перегрузки) или перегрев чипа (термическое отключение). Когда это происходит, драйвер отключается для защиты двигателя и схемы. Он остаётся выключенным до тех пор, пока не будет активирован вывод RESET или не будет снято и повторно подано питание двигателя (VMOT).
Выходные выводы
Выходные выводы двигателя — это место, где вы фактически подключаете шаговый двигатель к драйверу.
У биполярного шагового двигателя обычно две пары проводов. Выводы A1 и A2 подключаются к первой катушке вашего шагового двигателя, а выводы B1 и B2 — ко второй катушке.
Схема подключения драйвера DRV8825 к Arduino
Давайте пошагово разберём, как подключить драйвер шагового двигателя DRV8825 к шаговому двигателю и Arduino.
Шаг 1: Подключение питания
Первый шаг — обеспечить драйвер двигателя необходимой мощностью для работы шагового двигателя.
Начните с подключения внешнего источника питания к выводам VMOT и GND на DRV8825. Напряжение должно быть от 8,2 В до 45 В, в зависимости от требований вашего шагового двигателя.
Модуль имеет два вывода GND, которые служат общей землёй как для питания двигателя, так и для логических управляющих сигналов. Обязательно подключите один из выводов GND к выводу заземления Arduino, чтобы всё имело общую электрическую опорную точку.
Также обязательно разместите большой электролитический конденсатор (не менее 47 мкФ) между выводами VMOT и GND. Этот конденсатор помогает защитить драйвер, поглощая внезапные выбросы напряжения, которые в противном случае могут вызвать повреждение.
Шаг 2: Подключение управляющих выводов
После этого подключите выводы, которые непосредственно управляют движением двигателя: STEP и DIR. Вывод STEP управляет движением двигателя, а вывод DIR — направлением вращения. Вы можете подключить эти выводы к любым цифровым выходным выводам Arduino. В этом примере подключим STEP к цифровому выводу 3, а DIR — к цифровому выводу 2.
Шаг 3: Настройка микрошага
Теперь у нас есть три вывода микрошага: M0, M1 и M2. Драйвер DRV8825 имеет внутренние стягивающие резисторы на этих выводах, что означает, что если они оставлены неподключёнными, драйвер по умолчанию работает в режиме полного шага. В этом примере мы оставим их неподключёнными и будем использовать режим полного шага.
Шаг 4: Обработка выводов SLP и RST
Есть ещё два вывода, которые нужно учитывать: SLP и RST. Как вы уже знаете, оба этих вывода имеют активный низкий уровень, то есть для включения драйвера их нужно установить в высокое состояние. Поскольку по умолчанию они подтянуты к LOW внутренними стягивающими резисторами, они будут препятствовать работе драйвера. Чтобы включить драйвер, нам нужно установить оба вывода в высокое состояние. В этом проекте мы подключим их к выводу 5V на Arduino.
Шаг 5: Подключение шагового двигателя
Наконец, подключите шаговый двигатель к выходным выводам драйвера: A1, A2, B1 и B2. Подключите одну фазу шагового двигателя к A1 и A2, а другую фазу — к B1 и B2.
Шаг 6: Определение фаз шагового двигателя
Иногда самая сложная часть подключения шагового двигателя — это определить, какие провода принадлежат одной фазе. Вот два простых метода их идентификации:
Первый метод — поверните вал двигателя рукой — он должен вращаться свободно. Теперь возьмите два провода двигателя и на короткое время соедините их вместе. Удерживая эти провода соединёнными, попробуйте снова повернуть вал. Если вал внезапно стал гораздо труднее вращать, вы нашли фазу. Если ничего не изменилось, попробуйте другую комбинацию проводов.
Другой метод — используйте мультиметр в режиме проверки целостности цепи. Коснитесь щупами мультиметра двух проводов одновременно. Если мультиметр пищит или показывает целостность цепи, эти провода принадлежат одной фазе. Если молчит, попробуйте другую пару.
Определив обе пары, подключите одну пару к A1 и A2, а другую — к B1 и B2 — порядок не имеет значения.
В следующей таблице перечислены подключения выводов для соединения драйвера DRV8825 с Arduino:
| DRV8825 Motor Driver | Arduino | |
| RST | 5V | |
| SLP | 5V | |
| GND LOGIC | GND | |
| STEP | 3 | |
| DIR | 2 |
На изображении ниже показано, как собрать схему.
Система охлаждения — радиатор
Чип драйвера DRV8825 имеет максимальный номинальный ток 2,5 А на катушку, но в реальных условиях фактический ток, который вы можете обеспечить, сильно зависит от того, насколько хорошо вы можете охладить чип. Без дополнительного охлаждения DRV8825 обычно может обеспечить около 1,5 А на катушку, прежде чем начнёт перегреваться. Для безопасного использования более высоких токов — особенно выше 1,5 А — вам потребуется добавить радиатор или применить другой способ охлаждения.
По этой причине модули драйверов DRV8825 часто поставляются с небольшим радиатором в комплекте. Настоятельно рекомендуется установить радиатор перед использованием драйвера. При установке радиатора убедитесь, что он не касается соседних выводов или других электронных компонентов на плате.
Ограничение тока
Один из способов максимизировать производительность шагового двигателя — подать на него более высокое напряжение, чем указано в его номинальных характеристиках. В частности, использование более высокого напряжения обычно позволяет достичь более высоких частот шагов и увеличенного крутящего момента.
Рассмотрим пример для лучшего понимания. Предположим, вы используете шаговый двигатель с максимальным номинальным током 1 А и сопротивлением катушки 5 Ом. Это указывает на максимальное напряжение питания двигателя 5 В (1 А × 5 Ом = 5 В). Использование такого двигателя с 12 В позволит достичь более высоких частот шагов, но проблема в том, что если вы просто подключите 12 В напрямую, двигатель попытается потреблять слишком большой ток — значительно превышающий безопасный предел в 1 А. Когда это происходит, катушки внутри двигателя могут перегреться, что может необратимо повредить двигатель.
Чтобы безопасно использовать напряжение выше номинального напряжения двигателя, необходимо ограничить ток, протекающий через катушки двигателя. Именно поэтому драйвер шагового двигателя DRV8825 включает небольшой потенциометр для ограничения тока. Он позволяет установить максимальный ток, протекающий через катушки двигателя.
Правильно отрегулировав потенциометр, вы гарантируете, что двигатель никогда не будет потреблять больше тока, чем он может безопасно выдержать, что помогает предотвратить перегрев и сохранить ваш двигатель в безопасности.
Существует два основных способа настройки ограничения тока на DRV8825:
Метод 1:
В этом методе вы переводите драйвер в режим полного шага и используете мультиметр для прямого измерения тока, протекающего через одну из катушек, одновременно регулируя потенциометр ограничения тока.
Сначала проверьте техническое описание вашего шагового двигателя, чтобы найти его номинальный ток. Например, допустим, вы используете шаговый двигатель NEMA 17 с 200 шагами на оборот, рассчитанный на 1,5 А на катушку.
Подключите двигатель и драйвер, как описано в предыдущем разделе. Однако вместо подключения выводов STEP и DIR к цифровым выводам Arduino подключите оба напрямую к выводу 5V на Arduino. Это поддерживает двигатель под напряжением и удерживает его в фиксированном положении.
Обязательно отключите три вывода микрошага, чтобы установить драйвер в режим полного шага.
Далее поместите ваш амперметр (или мультиметр в режиме измерения тока) последовательно с одной из катушек двигателя, чтобы ток протекал от вашего измерительного прибора к катушке двигателя. Для этого отсоедините один провод от клеммы B1 или B2 на драйвере. Подключите один щуп амперметра к этой клемме, а другой щуп — к свободному проводу двигателя.
При подключённом и включённом питании вы должны увидеть показания тока на мультиметре. Теперь аккуратно поворачивайте потенциометр ограничения тока маленькой отвёрткой, наблюдая за показаниями на приборе. Регулируйте до тех пор, пока ток не будет соответствовать номинальному значению вашего двигателя — в данном случае 1,5 А.
Обратите внимание, что ток, который вы измеряете, составляет только 70% от фактической установки ограничения тока, так как обе катушки всегда включены и ограничены этим значением в режиме полного шага. Поэтому если вы позже включите режимы микрошага, ток через катушки может превышать этот измеренный ток полного шага на 40% (1/0,7) на определённых шагах; пожалуйста, учтите это при использовании данного метода для настройки ограничения тока.
Метод 2:
Более распространённый метод — особенно для начинающих — заключается в регулировке опорного напряжения, или Vref, на драйвере. Этот метод работает даже когда двигатель не подключён или не запитан.
Начните с проверки технического описания вашего шагового двигателя, чтобы найти его номинальный ток. Например, допустим, вы используете шаговый двигатель NEMA 17 с 200 шагами на оборот, рассчитанный на 1,5 А на катушку.
Подключите двигатель и драйвер, как описано в предыдущем разделе. Однако для этого метода вам не нужно подключать двигатель, так как вы работаете только с драйвером. Также обязательно отключите выводы STEP и DIR, так как они не будут использоваться в этом методе.
Теперь вычислите опорное напряжение по формуле: Vref = I_limit / 2. Где: I_limit — максимальный ток на катушку вашего двигателя (в амперах). Используя наш пример NEMA 17 с номинальным током 1,5 А: Vref = 1,5 / 2 = 0,75 вольт. Это означает, что вам нужно отрегулировать потенциометр, пока опорное напряжение не покажет ровно 0,75 вольт.
Установите мультиметр на измерение постоянного напряжения. Коснитесь чёрным щупом любой точки земли на плате драйвера, а красным щупом аккуратно коснитесь металлической верхней части потенциометра ограничения тока. Эта маленькая металлическая головка винта фактически служит тестовой точкой, показывающей опорное напряжение. Наблюдая за показаниями мультиметра, медленно поворачивайте потенциометр маленькой отвёрткой. Аккуратно регулируйте, пока не достигнете рассчитанного целевого напряжения — в нашем примере 0,75 вольт.
Вы можете сделать эту настройку быстро и легко, подключив один конец провода с зажимом «крокодил» к стержню металлической отвёртки, а другой конец — к мультиметру. Это позволяет измерять напряжение во время регулировки.
Мы попробовали оба метода настройки ограничения тока на драйвере DRV8825, и они дали примерно одинаковые результаты.
Независимо от того, какой метод вы используете, помните, что основная цель установки ограничения тока — защита вашего шагового двигателя. Работа двигателя с слишком большим током может дать больший крутящий момент в краткосрочной перспективе, но также вызывает больший нагрев двигателя, что может сократить срок его службы. С другой стороны, если ток установлен слишком низко, двигатель не будет повреждён, но может не иметь достаточной мощности для выполнения своей задачи. Ключ — найти оптимальное значение, при котором двигатель имеет достаточно мощности для выполнения своих задач, оставаясь при этом холодным и долговечным.
Пример кода Arduino 1 — Без библиотеки
В этом примере мы научимся управлять скоростью и направлением биполярного шагового двигателя с помощью драйвера DRV8825 и 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 драйвера DRV8825.
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 library от 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 драйвера DRV8825.
// Define pin connections
const int dirPin = 2;
const int stepPin = 3;
Далее мы указываем тип интерфейса двигателя. Значение 1 сообщает библиотеке, что мы используем драйвер шагового двигателя, такой как DRV8825, который работает с двумя управляющими выводами: 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 к вашей установке.
Как и первому двигателю, второму также нужна своя собственная плата драйвера DRV8825. Подключение второго драйвера практически идентично первому, за исключением того, что выводы 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();
}