Обзор драйвера шагового двигателя A4988
Сегодня расскажу о драйвере A4988, данный драйвер подойдет тем, кто планирует создать свой собственный 3D-принтер или станок ЧПУ с управлением шаговым двигателям.
Технические параметры
► Напряжения питания: от 8 до 35 В
► Установка шага: 1, 1/2, 1/4, 1/8, 1/16
► Напряжение логики: 3 В или 5.5 В
► Защита от перегрева: Есть
► Максимальный ток на фазу: 1 А без радиатора, 2 А с радиатором.
► Габариты модуля: 20 мм х 15 мм х 10 мм
► Габариты радиатора: 9 мм х 5 мм х 9 мм
Общие сведения о драйвере A4988
Основная микросхема модуля это драйвер от Allegro — A4988, которая имеет небольшие размеры (всего 8 мм х 6 мм), хоть микросхема и маленькая, но она может работать с выходным напряжение до 35 В с током до 1 А на катушку без радиатора и до 2 А с радиатором (дополнительным охлаждением). Для управления шаговым двигателем, необходимо всего два управляющих контакта (по сравнению с L298N необходимо четыре), один используется для управления шагами, второй для управления вращения двигателем.
Драйвер позволяет использовать пять вариантов шага, полный шаг, полшага, четверть шага, восьмой шаг и шестнадцатый шаг.
Распиновка драйвера A4988:
На драйвере A4988 расположено 16 контактов, назначение каждого можно посмотреть ниже:
► EN — включение и выключение модуля (0 — включен, 5 В — выключен).
► MS1, MS2 и MS3 — выбор режима микро шаг (смотрите таблицу ниже).
► RST — сброс драйвера.
► SLP — вывод включения спящего режима, если подтянуть его к низкому состоянию драйвер перейдет в спящий режим.
► STEP — управляющий вывод, при каждом положительном импульсе, двигатель делает шаг (в зависимости от настройки микро шага), чем быстрее импульсы, тем быстрее вращаться двигатель.
► DIR — управляющий вывод, если подать +5 В двигатель будет вращается по часовой стрелке, а если подать 0 В против часовой стрелки.
► VMOT & GND — питание шагового двигателя двигателя от 8 до 35 В (обязательное наличие конденсатора на 100 мкФ ).
► 2B, 2A, 1B, и 1A — подключение обмоток двигателя.
► VDD & GND — питание внутренней логики от 3 В до 5,5 В.
Если не планируете использовать вывод RST необходимо подключить его к выводу SLP, чтобы подтянуть его к питанию, тем самым включить драйвер.
Настройка микрошага
Драйвер A4988 может работать микрошаговом режиме, то есть может подавать питание на катушки с промежуточным уровням. Например, если взять двигатель NEMA17 с шагом 1.8 или 200 оборотов, в режиме 1/4, двигатель будет выдавать 800 шагов за оборот
Дня настройки микрошагов, драйвер A4988 имеет три выхода, а именно MS1, MS2 и MS3. Установив соответствующие логические уровни для этих выводов, можно выбрать режим микрошага.
Вывода MS1, MS2 и MS3 в микросхеме A4988 подтянуты резистором к земле, поэтому, если не подключать их, двигатель будет работать в режиме полного шага.
Система охлаждения A4988
При интенсивной работе микросхемы A4988 начинает сильно греется и если температура превысит придельные значение, может сгореть. По документации A4988 может работать с током до 2 А на катушку, но на практике микросхема не греется если ток не превышает 1 А на катушку. Поэтому если ток выше 1 А необходимо устанавливать радиатор охлаждения, который идет в комплекте.
Настройка тока A4988
Перед использованием мотора нужно сделать небольшую настройку, необходимо ограничить максимальную величину тока, протекающего через катушки шагового двигателя и ограничить его превышение номинального тока двигателя, регулировка осуществляется с помощью небольшого потенциометра.
Существует два способа настройки:
1. Замерить ток, для этого возьмем амперметр и подключим его в разрыв любой из обмоток (двигатель должен работать в полношаговом режиме), так же, при настройки ток должен составлять 70% от номинального тока двигателя.
2. Расчет значение напряжения Vref, согласно документации на A4988, есть формула I_TripMax = Vref / (8 × Rs), из которой мы можем получить формулу.
Vref = I_TripMax x 8 x Rs
где,
I_TripMax — номинальный ток двигателя
Rs — сопротивление на резисторе.
В моем случаи на драйвере A4988 установлены резисторы Rs = 0,100 Ом (R100), а номинальный ток двигателя 17HS4401 равняется 1,7 А.
Vref = 1,7 х 8 х 0,100 = 1,36 В
Мы рассчитали максимальное значение для двигателя 17HS4401, но при таком напряжение двигатель будет греться в режиме ожидания, необходимо уменьшить это значение на 70%, то есть:
Vref х 0,7 = 0,952 В
Осталось только настроить, берем отвертку и вольтметр, плюсовой шуп вольтметра устанавливаем на потенциометр, а шуп заземления на вывод GND и выставляем нужное значение.
Подключение драйвера шагового двигателя A4988 к Arduino UNO
Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Драйвер шагового двигателя A4988 x 1 шт.
► Шаговый двигатель 17HS4401 x 1 шт.
► Комплект проводов DuPont 2.54 мм, 20 см x 1 шт.
Подключение:
Теперь, можно приступить к сборке схемы. Первым делом, подключаем VDD и GND к 5 В и GND на Arduino. Контакты DIR и STEP подключим к цифровым контактам 2 и 3 на Arduino. Подключение шагового двигатель к контактам 2B, 2A, 1A и 1B.
Предупреждение: Подключение или отключение шагового двигателя при включенном приводе может привести к его повреждению.
Затем необходимо подключить контакт RST к соседнему контакту SLEEP, чтобы включить драйвер. Так-же контакты выбора микрошага необходимо оставить не подключенными, чтобы работал режим полный микрошаг. Теперь осталось подключить питание двигателя к контактам VMOT и GND, главное не забудьте подключить электролитический конденсатор на 100 мкФ, в противном случаи при скачке напряжение, модуль может выйти из строя.
Программа:
Теперь можно приступки к программной части и начать управлять шаговым двигателем с помощью драйвера A4988, загружайте данный скетч в Arduino.
Управление шаговым двигателем с помощью Arduino и драйвера A4988
Если вы планируете создать свой собственный 3D-принтер или станок с ЧПУ, вам нужно будет управлять несколькими шаговыми двигателями. Если использовать для этого только Arduino, то большая часть скетча будет занята кодом управления шаговыми двигателями и не останется много места для чего-то еще.
Данную проблему можно решить, использовав специальный автономный драйвер шагового двигателя — A4988.
Модуль A4988 может контролировать как скорость, так и направление вращения биполярного шагового двигателя, такого как NEMA 17, использую всего два вывода контроллера.
Вы знаете, как работают шаговые двигатели?
Шаговые двигатели используют зубчатое колесо и электромагниты (катушки), позволяющие вращать ось по одному шагу за раз.
Драйвер двигателя посылает высокий импульс на соответствующую катушку, которая в свою очередь притягивает ближайший зуб зубчатого колеса, в результате чего ось двигателя проворачивается на определенный градус (шаг).
- Последовательность импульсов определяет направление вращения двигателя.
- Частота импульсов определяет скорость двигателя.
- Количество импульсов определяет угол поворота.
Микросхема драйвера шагового двигателя A4988
Модуль собран на чипе A4988. Не смотря на свой малый размер (всего 0,8 ″ × 0,6 ″), но обладает хорошими характеристиками.
Драйвер шагового двигателя A4988 имеет высокую выходную мощность (до 35 В и 2 А) и позволяет управлять одним биполярным шаговым двигателем с выходным током до 2 А на катушку, например NEMA 17.
Для удобства работы драйвер имеет встроенный транслятор. Использование транслятора позволило уменьшить количество управляющих контактов до 2, один для управления шагами, а другой для управления направлением вращения.
Драйвер предлагает 5 различных разрешений шага, а именно:
- полный шаг
- 1/2 шага
- 1/4 шага
- 1/8 шага
- 1/16 шага
Распиновка драйвера A4988
Драйвер A4988 имеет всего 16 контактов, которые связывают его с внешним миром. Распиновка у A4988 следующая:
Давайте ознакомимся со всеми контактами по очереди.
Выводы питания
На самом деле A4988 требует подключения двух источников питания.
VDD и GND используется для управления внутренней логической схемой. Напряжение питания должно находиться в пределах от 3 до 5,5 В.
Vmot и GND для обеспечения питания шагового двигателя. Тут напряжение в пределах от 8 до 35 В.
Согласно datasheet, для питания двигателя требуется соответствующий разделительный конденсатор рядом с платой, способный выдерживать ток 4 А.
Предупреждение:
Этот драйвер имеет на плате керамические конденсаторы с низким ESR , что делает его уязвимым для скачков напряжения. В некоторых случаях эти выбросы могут превышать 35 В (максимальное номинальное напряжение A4988), и это может потенциально необратимо повредить плату и даже двигатель.
Один из способов защитить драйвер от таких скачков — подключить электролитический конденсатор емкостью 100 мкФ (или как минимум 47 мкФ) к контактам источника питания двигателя.
Выводы выбора микрошага
Драйвер A4988 допускает использование режима микрошага. Это достигается за счет подачи питания на катушки с промежуточными уровнями тока.
Например, если вы решите управлять шаговым двигателем NEMA 17 с шагом 1,8 градуса (200 шагов на оборот) в режиме 1/4 шага, то двигатель будет выдавать 800 микрошагов на оборот.
Драйвер A4988 имеет три вывода селектора размера шага (разрешения), а именно: MS1, MS2 и MS3. Установив соответствующие логические уровни на эти контакты, мы можем настроить двигатели на одно из пяти ступенчатых разрешений.
По умолчанию эти три контакта подтянуты к земле внутренним резисторам. Если мы оставим эти выводы не подключенными, то двигатель будет работать в режиме полного шага.
Выводы управления
Драйвер A4988 имеет два управляющих входа, а именно: STEP и DIR.
STEP — управляет микрошагом мотора. Каждый высокий импульс, отправляемый на этот вывод, приводит двигатель в действие на количество микрошагов, заданное выводами Microstep Selection (MS1, MS2 и MS3). Чем быстрее импульсы, тем быстрее будет вращаться двигатель.
DIR — управляет направлением вращения двигателя. Если на него подать высокий уровень, то двигатель будет вращается по часовой стрелке, а если низкий — против часовой стрелки.
Если вы просто хотите, чтобы двигатель вращался только в одном направлении, то вы можете соединить вывод DIR непосредственно с VCC или GND соответственно.
Выводы STEP и DIR не подтянуты внутренними резисторами, поэтому вы не должны оставлять их не подключенными.
Выводы управления питанием A4988
A4988 имеет три различных вывода для управления состоянием питания, а именно. EN, RST и SLP.
EN — вывод включения (0)/ выключения (1) драйвера A4988. По умолчанию на этом выводе установлен низкий уровень, поэтому драйвер всегда включен.
SLP — подача на данный вывод сигнала низкого уровня переводит драйвер в спящий режим, сводя к минимуму потребление энергии. Вы можете использовать это для экономии энергии.
RST — при подаче сигнала низкого уровня все входные данные STEP игнорируются, до тех пор пока не будет установлен высокий уровень. Низкий уровень также сбрасывает драйвер, устанавливая внутренний транслятор в предопределенное состояние Home. Исходное состояние — это в основном начальное положение, с которого запускается двигатель, и оно различается в зависимости от разрешения микрошага.
Если вам не нужно использовать вывод RST, вы можете подключить его к соседнему контакту SLP / SLEEP, чтобы вывести его на высокий уровень и включить драйвер.
Выводы для подключения шагового двигателя
Выходные контакты: 1B, 1A, 2A и 2B.
К этим выводам можно подключить любой биполярный шаговый двигатель с напряжением питания от 8 до 35 В.
Каждый выходной контакт модуля может обеспечить ток до 2 А. Однако величина тока, подаваемого на двигатель, зависит от источника питания системы, системы охлаждения и настройки ограничения тока.
Система охлаждения — радиатор
Чрезмерное рассеивание мощности микросхемы драйвера A4988 приводит к повышению температуры, которая может выйти за пределы возможностей микросхемы, что, вероятно, приведет к ее повреждению.
Даже если микросхема драйвера A4988 имеет максимальный номинальный ток 2 А на катушку, микросхема может подавать только около 1 А на катушку без перегрева.
Для достижения более 1 А на катушку требуется радиатор или другой метод охлаждения.
Драйвер A4988 обычно поставляется с радиатором. Желательно установить его перед использованием драйвера.
Настройка тока A4988
Перед использованием драйвера нам нужно сделать небольшую настройку. Нам нужно ограничить максимальный ток, протекающий через катушки шагового двигателя, и предотвратить превышение номинального тока двигателя.
На драйвере A4988 есть небольшой потенциометр, который можно использовать для установки ограничения тока. Вы должны установить ограничение по току равным или ниже номинального тока двигателя.
Для настройки тока шагового двигателя есть два метода:
Способ 1:
В данном случае мы собираемся установить ограничение тока путем измерения напряжения (Vref) на выводе «ref».
- Взгляните на техническое описание вашего шагового двигателя. Запишите его номинальный ток. В нашем случае мы используем NEMA 17 200 шагов/об, 12 В 350 мА.
- Переведите драйвер в полношаговый режим, оставив три контакта выбора микрошага отключенными.
- Удерживайте двигатель в фиксированном положении, не синхронизируя вход STEP.
- Во время регулировки измерьте напряжение Vref (один щуп мультиметра на минус питания, а другой к металлическому корпусу потенциометра).
- Отрегулируйте напряжение Vref по формуле:
ограничение тока = Vref x 2,5
Например, если ваш двигатель рассчитан на 350mA, вы должны установить опорное напряжение 0,14В.
Способ 2:
В данном случае мы собираемся установить ограничение тока, измеряя ток, протекающий через катушку двигателя.
- Взгляните на техническое описание вашего шагового двигателя. Запишите его номинальный ток. В нашем случае мы используем NEMA 17 200 шагов / оборот, 12 В 350 мА.
- Переведите драйвер в полношаговый режим, оставив три контакта выбора микрошага отключенными.
- Удерживайте двигатель в фиксированном положении, не синхронизируя вход STEP. Не оставляйте вход STEP висящим в воздухе, подключите его к источнику питания логики (5 В)
- Подключите амперметр последовательно с одной из катушек шагового двигателя и измерьте фактический ток.
- Возьмите небольшую отвертку и отрегулируйте потенциометр ограничения тока, пока не установите номинальный ток шагового двигателя.
Подключение драйвера шагового двигателя A4988 к Arduino UNO
Теперь, когда мы имеем всю необходимую информацию о драйвере A4988, мы можем перейти к подключению его к нашей Arduino Uno.
Подключения довольно простое. Начните с подключения VDD и GND (рядом с VDD) к контактам 5V и минус на Arduino. Входные контакты DIR и STEP подключите к цифровым контактам №2 и №3 на Arduino соответственно. Шаговый двигатель подключите к контактам 2B, 2A, 1A и 1B.
Предупреждение:
Подключение или отключение шагового двигателя при включенном драйвере может привести к его повреждению.
Затем подключите вывод RST к соседнему выводу SLP/SLEEP, чтобы драйвер оставался включенным. Также держите контакты выбора микрошага отключенными, чтобы двигатель работал в полношаговом режиме.
Наконец, подключите источник питания двигателя к контактам VMOT и GND. Не забудьте установить большой развязывающий электролитический конденсатор 100 мкФ на контакты источника питания двигателя, рядом с платой.
Код Arduino — простой пример
Следующий скетч даст вам полное представление о том, как управлять скоростью и направлением вращения биполярного шагового двигателя с помощью драйвера шагового двигателя A4988, и может служить основой для более практических экспериментов и проектов.
Пояснение к скетчу:
Скетч начинается с определения выводов Arduino, к которым подключены выводы STEP и DIR A4988. Мы также определяем stepsPerRevolution. Установите его в соответствии со спецификациями шагового двигателя.
В разделе setup() кода все контакты управления двигателем объявлены как цифровой выход.
В цикле loop() мы медленно вращаем двигатель по часовой стрелке, а затем быстро вращаем его против часовой стрелки с интервалом в секунду.
Управление направлением вращения: для управления направлением вращения двигателя мы устанавливаем вывод DIR в высокое или низкое положение. Сигнал высокого уровня вращает двигатель по часовой стрелке, а низкого — против часовой стрелки.
Скорость двигателя определяется частотой импульсов, которые мы посылаем на вывод STEP. Чем чаще импульсы, тем быстрее вращается двигатель. Импульсы — это не что иное, как установка высокого уровня, некоторое ожидание, затем установка низкого уровня и снова ожидание. Изменяя задержку между двумя импульсами, вы изменяете частоту этих импульсов и, следовательно, скорость двигателя.
Скетч Arduino — использование библиотеки AccelStepper
Управление шаговым двигателем без библиотеки идеально подходит для простых приложений с одним двигателем. Но если вы хотите управлять несколькими шаговыми двигателями, то вам понадобится библиотека.
Итак, для нашего следующего эксперимента мы будем использовать расширенную библиотеку шаговых двигателей под названием AccelStepper library. Она поддерживает:
- Ускорение и замедление.
- Одновременное управление несколькими шаговыми двигателями с независимым шагом для каждого двигателя.
Эта библиотека не включена в IDE Arduino, поэтому вам необходимо сначала установить ее.
Установка библиотеки
Чтобы установить библиотеку, перейдите в Эскиз> Include Library> Manage Libraries… Подождите, пока диспетчер библиотек загрузит индекс библиотек и обновит список установленных библиотек.
Отфильтруйте результаты поиска, набрав «Accelstepper». Щелкните первую запись и выберите «Установить».
Скетч Arduino
Вот простой код, который ускоряет шаговый двигатель в одном направлении, а затем замедляется, чтобы остановиться. Как только двигатель совершает один оборот, он меняет направление вращения. И он повторяет это снова и снова.
Пояснение к скетчу:
Мы начинаем с подключения недавно установленной библиотеки AccelStepper.
Определяем выводы Arduino, к которым подключаются выводы STEP и DIR A4988. Устанавливаем motorInterfaceType значение 1. (1 означает внешний шаговый драйвер с выводами Step и Direction).
Затем мы создаем экземпляр библиотеки с именем myStepper.
В функции setup() мы сначала устанавливаем максимальную скорость двигателя 1000. Затем мы устанавливаем коэффициент ускорения для двигателя, чтобы добавить ускорение и замедление к движениям шагового двигателя.
Затем мы устанавливаем обычную скорость 200 и количество шагов, например, 200 (поскольку NEMA 17 совершает 200 шагов за оборот).
В функции loop() мы используем оператор If, чтобы проверить, как далеко двигателю нужно проехать (путем чтения distanceToGo), пока он не достигнет целевой позиции (moveTo). Как только distanceToGo станет равен нулю мы переключаем двигатель в противоположное направление, изменив moveTo на противоположное значение относительно его текущего положения.
Теперь в конце цикла мы вызываем функцию run(). Это самая важная функция, поскольку шаговый двигатель не будет работать, пока эта функция не будет выполнена.
cnc-club.ru
Планирую построить фрейзер с чпу по такому принципу (http://www.instructables.com/id/Arduino . D-Printer/) При этом, поменяю тип передачи и управлять буду через CNC Shield v3 + А4988 на Arduino.
Стоит вопрос покупки двигателей. Есть ли возможность подключения представленного в инструкции Nema 23 Stepper Motor 425oz? A4988 на пределе выдаст всего 2А, чего как я понимаю, будет недостаточно.
В перспективе планирую увеличение рабочей области (раза в 2), хотел бы купить моторы с запасом по мощности.
Прошу прощения за примитивный вопрос и заранее спасибо за ответы.
nevkon Почётный участник
Сообщения: 2278 Зарегистрирован: 17 июл 2015, 10:25 Репутация: 289 Настоящее имя: Константин Откуда: Балаково (Саратовская обл.) Контактная информация:
Библиотека для шагового двигателя Arduino v2.2.0
Для подключения шаговых моторов к Arduino нужно использовать драйверы. Очень дешёвые и популярные моторы 28byj-48-5v часто продаются вместе со своим драйвером (транзисторная сборка ULN2003), подключить можно к любым 4-м пинам Ардуино и использовать.
Для работы с большими шаговиками (типа Nema 17) нужно использовать специализированные драйверы, ниже вы найдёте описания и схемы подключения для A4988, DRV8825 и TMC2208, драйверы такого формата подключаются и работают практически одинаково, т.к. разработаны для CNC шилдов и взаимозаменяемы. У этих драйверов нужно настроить ток при помощи крутилки на плате. Это можно сделать “на глаз”, заставив мотор вращаться и регулируя крутилку. Мотор должен вращаться, но не вибрировать как перфоратор и сильно не нагреваться. Лучше настроить ток по опорному напряжению Vref, у каждого драйвера оно считается по своей формуле (см. картинки ниже). Берём ток своего мотора из описания, подставляем в формулу вместо current, считаем, и накручиваем полученное напряжение крутилкой. Для измерения опорного напряжения нужно подключить щупы вольтметра к самой крутилке и пину GND.
Главное преимущество дорогущих драйверов TMC – отсутствие шума/свиста/вибраций при работе, так как драйвер своими силами интерполирует сигнал до микрошага 1/256.
БИБЛИОТЕКА
GyverStepper v2.4
Производительная библиотека для управления шаговыми моторами с Arduino
- Поддержка 4х пинового (шаг и полушаг) и STEP-DIR драйверов
- Автоматическое отключение питания при достижении цели
- Режимы работы:
- Вращение с заданной скоростью. Плавный разгон и торможение с ускорением
- Следование к позиции с ускорением и ограничением скорости
- Следование к позиции с заданной скоростью (без ускорения)
Совместимость
Совместима со всеми Arduino платформами (используются Arduino-функции)
УСТАНОВКА
- Библиотеку можно найти и установить через менеджер библиотек по названию GyverStepper в:
- Arduino IDE (Инструменты/Управлять библиотеками)
- Arduino IDE v2 (вкладка “Library Manager”)
- PlatformIO (PIO Home, вкладка “Libraries”)
ДОКУМЕНТАЦИЯ
Аааа почему так много всего?!
Библиотека содержит набор инструментов для разных сценариев работы с шаговыми моторами- StepperCore.h [класс Stepper]: ядро всех остальных классов, умеет быстро щёлкать пинами (AVR) и делать один шаг для настроенного типа драйвера. Поддерживает 4 фазы шаг/полушаг, а также step-dir драйверы.
- GyverStepper.h [класс GStepper]: основная тяжёлая библиотека, много настроек. Движение одного мотора с ускорением к заданной позиции или вращение с заданной скоростью. Не очень оптимальная работа в прерывании таймера.
- GyverStepper2.h [класс GStepper2]: новая облегченная версия GyverStepper, практически полностью с ней совместима. Более оптимальный целочисленный гибридный алгоритм движения с ускорением, лёгкий вес. Оптимизировано для работы в прерывании таймера.
- GyverPlanner.h [класс GPlanner]: многоосевой планировщик траектории, движение с ускорением (2 порядок). Остановка в каждой точке. Оптимальная работа в прерывании таймера.
- GyverPlanner2.h [класс GPlanner2]: многоосевой планировщик траектории, движение с ускорением (2 порядок). Планирование скорости на маршруте, оптимальное движение по точкам. Оптимальная работа в прерывании таймера.
Инициализация
Библиотека поддерживает два типа драйверов:
- STEPPER2WIRE — специализированный 2-х проводной драйвер для шагового мотора с интерфейсом STEP-DIR (+опционально пин EN), например A4988, DRV8825, TMC2208 и прочие.
- STEPPER4WIRE и STEPPER4WIRE_HALF — 4-х проводной фазовый драйвер (+опционально пин EN), т.е. полномостовой (например L298N, L9110S) или транзисторная сборка (например ULN2003).
- STEPPER4WIRE управляет мотором в полношаговом режиме (выше скорость и момент).
- STEPPER4WIRE_HALF — в полушаговом (меньше скорость и момент, но в два раза больше шагов на оборот и выше точность).
При инициализации указывается тип драйвера, количество шагов на оборот и пины:
- GStepper< STEPPER2WIRE> stepper(steps, step, dir); // драйвер step-dir
- GStepper< STEPPER2WIRE> stepper(steps, step, dir, en); // драйвер step-dir + пин enable
- GStepper< STEPPER4WIRE> stepper(steps, a1, a2, b1, b2); // драйвер 4 пин
- GStepper< STEPPER4WIRE> stepper(steps, a1, a2, b1, b2, en); // драйвер 4 пин + enable
- GStepper< STEPPER4WIRE_HALF> stepper(steps, a1, a2, b1, b2); // драйвер 4 пин полушаг
- GStepper< STEPPER4WIRE_HALF> stepper(steps, a1, a2, b1, b2, en); // драйвер 4 пин полушаг + enable
Где steps — количество шагов на один оборот вала для расчётов с градусами, step , dir , a1 , a2 , b1 , b2 — любые GPIO на МК, en — пин отключения драйвера EN, любой GPIO на МК. Пин en опциональный, можно не указывать.
Для 4-х пиновых драйверов: a1 и a2 — первая обмотка (первая фаза), b1 и b2 — вторая обмотка (вторая фаза). При использовании мотора 28byj-48 с родным драйвером нужно поменять крайние пины местами (например, подключаем D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе меняем 5 и 2: stepper(2048, 5, 3, 4, 2); , потому что на драйвере фазы выведены через одну, вот картинка). При подключении через мостовой драйвер — подключать и указывать пины по порядку выхода фаз из мотора (см. последнюю схему выше).
Количество шагов на оборот нужно для работы функций, которые устанавливают или читают параметр в градусах. Если они не нужны — количество шагов можно поставить любое (единичку). Если нужно — количество шагов нужно указывать с учётом редукторов и микрошагов:
- Пример 1: есть мотор NEMA 17, он имеет 200 полных шагов на оборот (по документации). Подключен через драйвер с настроенным микрошагом 1/16. При создании объекта библиотеки нужно указать 200*16 шагов.
- Пример 2: есть мотор 28byj-48-5v, имеет 32 полных шага на оборот и редуктор с соотношением 63.68395:1. Подключен через микросхему ULN2003. Итоговое количество шагов на оборот составляет 63.68395*32 == 2038 для режима полного шага ( STEPPER4WIRE ).
- Пример 3: подключим тот же самый мотор 28byj-48-5v, но в режиме полушага ( STEPPER4WIRE_HALF ). Количество шагов на оборот удвоится (32*2 == 64) и, с учётом редуктора, станет равным 4076 .
Время шага [NEW!]
Для драйверов STEP-DIR сделана задержка между переключением состояния пина STEP, эта задержка является минимальной, т.е. она может быть больше, чем нужно, но если будет меньше — возможна нестабильная работа драйвера. По умолчанию она составляет 4 микросекунды, но разным драйверам она нужна разная (для других драйверов см. даташит):
- A4988 — 1 мкс
- DRV8825 — 4 мкс
- TB6500 — 1 мкс
Также увеличение задержки может повысить стабильность работы при использовании длинных неэкранированных проводов от микроконтроллера к драйверу (к пину STEP).
Для изменения величины задержки сделай дефайн DRIVER_STEP_TIME перед подключением библиотеки:
Медленные скорости (new!)
В версии 1.6 скорость во всех режимах может быть задана в виде десятичной дроби (тип float ), то есть меньше одного шага в секунду. Минимальная скорость ограничена разрешением используемой в библиотеке micros() и составляет 1 шаг в час. Для удобного задания медленных скоростей появились макросы degPerMinute() и degPerHour() , которые нужно использовать совместно с setSpeedDeg() и setMaxSpeedDeg() :
Тик и тайминги
Самый главный метод библиотеки — tick() , при активной работе мотора его нужно вызывать как можно чаще. Тик имеет встроенный таймер на micros() и работает по нему. Если в коде программы присутствуют задержки на большее время, чем нужно мотору на текущей скорости, скорость мотора будет ограничена этой задержкой.
Узнать минимальный период вызова tick() (при установленной скорости) можно при помощи getMinPeriod() , который вернёт его в микросекундах. Также можно напрямую опрашивать переменную stepTime , в которой хранится текущий период. Эти инструменты можно использовать для организации работы шаговика в прерывании таймера (см. пример timerISR).
Также .tick() возвращает true , если мотор движется к цели или крутится по KEEP_SPEED и false , если мотор остановлен или приехал.
Метод getState() возвращает текущее состояние мотора аналогично tick() .
Смена направления
Можно глобально (для всех режимов) сменить направление вращения мотора при помощи reverse(true) .
Режимы работы
Библиотека имеет два режима работы с мотором, устанавливается при помощи setRunMode(mode) , где mode :
- FOLLOW_POS — режим плавного движения к заданной позиции с ускорением и ограничением скорости.
- KEEP_SPEED — режим вращения с заданной скоростью (знак скорости задаёт направление вращения).
Режим FOLLOW_POS
В этом режиме мотор следует на указанную позицию в шагах или градусах. Для её установки есть следующие методы:
- setTarget(pos) — установка абсолютной целевой позиции в шагах, принимает положительные и отрицательные значения (тип данных long ).
- setTarget(pos, type) — то же самое, но можно указать тип позиции type — абсолютная ABSOLUTE или относительная RELATIVE .
- setTargetDeg(pos) — установка абсолютной целевой позиции в градусах, принимает положительные и отрицательные дробные значения (тип данных float ).
- setTargetDeg(pos, type) — то же самое, но можно указать тип позиции type — абсолютная ABSOLUTE или относительная RELATIVE .
Примечание: абсолютная позиция — говоришь мотору повернуться на 300 шагов, он повернётся на позицию 300. При повторном вызове ничего не произойдёт. Относительная — говоришь повернуться на 300 — он повернётся на 300 относительно текущей позиции. Если вызвать ещё раз через некоторое время — цель сместится относительно текущей позиции вала.
Установленную целевую позицию можно прочитать:
- getTarget() — возвращает тип данных long
- getTargetDeg() — возвращает тип данных float
Дополнительно можно настроить максимальную скорость и ускорение при движении к целевой позиции:
- setMaxSpeed(speed) — установка максимальной скорости по модулю в шагах/секунду, тип данных float . По умолчанию 300.
- setMaxSpeedDeg(speed) — установка максимальной скорости по модулю в градусах/секунду, тип данных float .
- setAcceleration(accel) — установка ускорения по модулю в шагах/сек/сек, тип данных float . По умолчанию 300.
- setAccelerationDeg(accel) — установка ускорения по модулю в градусах/сек/сек, тип данных float .
Примечание: при установке ускорения в ноль 0 мотор будет двигаться к позиции с максимальной скоростью, заданной в setMaxSpeed() .
Также можно вручную установить текущую позицию мотора в шагах и градусах при помощи:
- setCurrent(long pos);
- setCurrentDeg(float pos);
- getCurrent();
- getCurrentDeg();
Режим KEEP_SPEED
В этом режиме мотор просто крутится с заданной скоростью. Скорость задаётся при помощи
- setSpeed(speed) — в шагах/секунду, положительные и отрицательные целые значения, тип данных float .
- setSpeedDeg(speed) — в градусах/секунду, положительные и отрицательные дробные значения, тип данных float .
(New!) Вторым аргументом можно передать включение плавного изменения скорости, по умолчанию стоит false ( NO_SMOOTH ). Смотри пример accelDeccelButton
- setSpeed(speed, smooth) — в шагах/секунду, положительные и отрицательные целые значения, тип данных float . smooth — SMOOTH или NO_SMOOTH
- setSpeedDeg(speed, smooth) — в градусах/секунду, положительные и отрицательные дробные значения, тип данных float . smooth — SMOOTH или NO_SMOOTH
Установленную скорость можно прочитать:
- getSpeed() — возвращает тип данных float
- getSpeedDeg() — возвращает тип данных float
Алгоритм планировщика скорости
В библиотеке реализовано два алгоритма планирования скорости для режима плавного движения к позиции с ненулевым ускорением:
- Мой алгоритм: скорость планируется с фиксированным периодом, что сильно разгружает процессор и позволяет работать на скоростях до 30’000 шагов в секунду (полностью загрузив процессор) без наличия посторонних задержек в коде. Сильная экономия процессорного времени оставляет возможность спокойно выполнять параллельно другой код и управлять несколькими моторами в разных режимах на хороших скоростях, и «ещё останется». Немного «резковат» при торможении. Активен по умолчанию.
- Модифицированный алгоритм из библиотеки AccelStepper: скорость планируется каждый шаг, что очень сильно нагружает процессор и ограничивает скорость до 7’000 шагов в секунду (полностью загрузив процессор) без наличия посторонних задержек в коде (в оригинальной библиотеке — 5’000 шагов/сек). Разгоняется и тормозит максимально плавно. Для активации нужно прописать дефайн #define SMOOTH_ALGORITHM перед подключением библиотеки в коде (см. пример smoothAlgorithm) или раскомментировать данный дефайн в файле библиотеки GyverStepper.h, находится сразу после описания.
Остановка и сброс
- stop() — плавная остановка с заданным в setAcceleration() ускорением от текущего положения мотора. Можно вызвать в режиме KEEP_SPEED для плавной остановки вращения! Смотри пример accelDeccelButton
- brake() — резкая остановка мотора. Если активен autoPower(true) — мотор будет отключен.
- reset() — brake() + сброс текущей позиции в 0 . Удобно для остановки и калибровки начала координат по концевику (смотри пример endSwitch).
Управление питанием
Питанием мотора/драйвера можно управлять вручную при помощи enable() и disable() . Данные методы включают и выключают пин Enable (если он указан при инициализации), а также снимают и возвращают питание на управляющие выводы (для 4х пинового драйвера).
Поведением пина EN (если он указан при инициализации) можно управлять при помощи invertEn(true) и invertEn(false) . По умолчанию установлено enable(false) переводит пин en в низкое состояние.
В библиотеке реализовано автоматическое управление питанием, включается при помощи autoPower(true) , по умолчанию оно отключено. В режиме FOLLOW_POS при достижении целевой позиции мотор будет автоматически отключен (будет вызван disable() ). При дальнейшей установке новой позиции мотор будет автоматически включен (будет вызван enable() ).
Отличия GStepper2
- GStepper2 гораздо легче и сильнее оптимизирована
- GStepper2 больше предназначена для движения по точкам траектории, но «следящий» режим в ней также работает
- GStepper2 оптимизирована для работы в прерывании таймера
- GStepper2 использует плавный алгоритм движения мотора по умолчанию
- GStepper2 скорее всего будет чуть больше нагружать микроконтроллер во время работы, чем GStepper. Но гораздо меньше, чем GStepper в режиме SMOOTH_ALGORITHM
Как работает GStepper
- Быстрый алгоритм (по умолчанию): в библиотеке заведено два таймера: таймер шагов (разный период) и таймер планировщика (10-30 миллисекунд). По таймеру планировщика производится перерасчёт траектории и вычисляется направление движения и текущая необходимая скорость. Из этой скорости получается новый период для таймера шагов.
- Плавный алгоритм (настройка SMOOTH_ALGORITHM): работает один таймер шагов, на каждом шаге производится перерасчёт скорости движения и времени до следующего шага.
Как работает GStepper2
- Плавный профиль (по умолчанию): здесь используется алгоритм плавного движения SMOOTH_ALGORITHM как в GStepper, но оптимизирован и ускорен в 2-3 раза. Все тяжёлые вычисления траектории производятся при задании новой целевой позиции в setTarget. Далее по таймеру шагов мотор шагает и быстро вычисляет новое время следующего шага. Это позволяет тратить минимум времени в прерывании таймера, если оно используется.
- Быстрый профиль (настройка GS_FAST_PROFILE): всё то же самое, но в таймере шагов происходит не вычисление, а выбор периода из заранее посчитанной таблицы, что позволяет двигаться с ускорением вплоть до скоростей 36000 шагов в секунду.
GStepper2, GPlanner и GPlanner2 являются нововведениями в библиотеке и работают чуть иначе, больше ориентированы на движение от точки к точке.
Быстрый профиль скорости (NEW!)
С версии 2.2.0 в GStepper2, GPlanner и GPlanner2 появился новый алгоритм планирования профиля скорости. Для его активации нужно прописать дефайн GS_FAST_PROFILE перед подключением библиотеки:
#define GS_FAST_PROFILE количество
Где количество — количество отрезков, на которые будет разбит участок разгона/торможения. На этих отрезках скорость будет одинаковой, то есть мотор будет разгоняться и тормозить «ступенчато». Чем больше отрезков — тем плавнее будет движение, в принципе можно ставить 10. Каждый отрезок добавляет 8 байт SRAM на экземпляр класса.
Зачем это нужно? Данный алгоритм заранее вычисляет скорость во всех точках траектории и не пересчитывает её на каждом шаге, что сильно снижает нагрузку на процессор и позволяет двигаться на участке разгона/торможения со скоростью до 30’000 шагов в секунду!
Изменение скорости/ускорения
Скорость и ускорение можно задать в любое время, они будут применены после остановки мотора в конечной точке!
Тикер
Движение мотора происходит внутри tick() , который нужно вызывать как можно чаще, например в loop() (или yield() , если в коде есть delay() ) tick() имеет встроенный таймер на micros() и крутит мотор с нужной скоростью.
Также есть не имеющий таймера tickManual() , который делает шаг, считает период и проверяет, не доехал ли мотор до цели. Его нужно вызывать с периодом, который можно получить из getPeriod() в микросекундах.
getPeriod() получает новое значение периода после очередного вызова tickManual() . Конструкция для работы в прерывании таймера может выглядеть так:
Здесь setPeriod() и stopTimer() — функции смены периода и остановки аппаратного таймера, реализация функций зависит от применяемой платформы и/или библиотек. Пока мотор крутится — таймер перезапускается на новый период, как только мотор приехал — останавливаем таймер.
Режим постоянной скорости
Для запуска режима вращения с постоянной скоростью достаточно вызвать setSpeed(скорость) / setSpeedDeg(скорость) . Скорость может быть отрицательной. Остановить мотор можно при помощи brake() . В данной реализации скорость не меняется плавно, то есть включается сразу на заданную и тормозится в 0 при остановке. В реальном применении этого достаточно для движения к концевику (см. пример homing для всех трёх классов).
Режим движения к позиции
При помощи setMaxSpeed() / setMaxSpeedDeg() задаётся максимальная скорость, которой может достигнуть мотор (суммарная квадратичная скорость по осям для GPlanner) во время движения к следующей точке. Эта настройка не имеет отношения к режиму вращения.
При помощи setAcceleration() можно задать ускорение в шагах/секунду^2, с которым будет меняться скорость. Если поставить ускорение 0 — мотор будет двигаться без ускорения, т.е. сразу с максимальной скоростью.
Для старта движения к позиции достаточно вызвать setTarget(позиция) / setTargetDeg(позиция) (кроме GPlanner2). После выполнения этой функции можно запросить у getPeriod() время до следующего тика и запустить таймер, если мотор работает в прерывании.
Если мотор находится в активном режиме движения к позиции и доезжает до цели — функция ready() однократно вернёт true . В примерах к библиотеке по этому условию «загружается» следующая точка траектории.
Во время движения к позиции можно остановиться:
- brake() — резко остановит мотор
- stop() — плавно остановит мотор с заданным ускорением
- pause() — мотор доедет до заданной позиции, но ready() не вернёт true
Для возобновления движения можно вызвать resume() , траектория мотора будет пересчитана и он двинется к последней заданной в setTarget() позиции.
Текущую позицию мотора (моторов, для GPlanner) можно прочитать как getCurrent() , установить через setCurrent() , а также сбросить в 0 через reset() .
GPlanner2 работает чуть иначе, так как содержит буфер траектории. Подробнее о нём читайте ниже