Библиотека AccelStepper для Arduino позволяет управлять шаговыми двигателями и, в отличие от стандартной библиотеки Stepper, имеет следующие преимущества:
- поддержка ускорения и замедления
- поддержка одновременной работы нескольких шаговых двигателей с независимой работой каждого
- неблокирующие функции
- поддержка различных типов шаговых двигателей и микрошаговых режимов
- поддержка Adafruit Motor Shield
- поддержка SparkFun EasyDriver
- поддержка очень маленьких скоростей
- поддержка подклассов
Последнюю версию документации можно загрузить по ссылке (eng).
Рассмотрим основные функции библиотеки AccelStepper:
Определение и конфигурация моторов
AccelStepper mystepper(1, pinStep, pinDirection);
Шаговый двигатель, управляемый выделенной платой.
AccelStepper mystepper(2, pinA, pinB);
Биполярный шаговый двигатель, управляемый Н-мостом.
AccelStepper mystepper(4, pinA1, pinA2, pinB1, pinB2);
Униполярный двигатель, управляемый четырмя транзисторами.
mystepper.setMaxSpeed(stepsPerSecond);
Установка максимальной скорости. Скорость по умолчанию очень низкая, так что её требуется переопределить. При движении шаговый двигатель будет ускоряться до этой максимальной скорости и замедляться при подходе к концу движения.
mystepper.setAcceleration(stepsPerSecondSquared);
Установка ускорения, в шагах в секунду за секунду.
Управление положением
mystepper.moveTo(targetPosition);
Переместиться в абсолютно указанное положение. Само движение запускается функцией run().
mystepper.move(distance);
Переместиться в относительно указанное положение. Само движение запускается функцией run(). Значение distance может быть больше или меньше нуля.
mystepper.currentPosition();
Вернуть текущее абсолютное положение.
mystepper.distanceToGo();
Вернуть расстояние до указанного положения. Может использоваться для проверки, достиг ли двигатель указанной конечной точки.
mystepper.run();
Начать движение. Для продолжения движения двигателя следует вызывать функцию повторно.
mystepper.runToPosition();
Начать движение и подождать когда двигатель достигнет указанной точки. Функция не осуществляет возврата пока двигатель не остановится.
Управление скоростью
mystepper.setSpeed(stepsPerSecond);
Установить скорость в шагах за секунду. Само движение запускается функцией runSpeed().
mystepper.runSpeed();
Начать движение. Для продолжения движения двигателя следует вызывать функцию повторно.
Пример использования библиотеки AccelStepper
#include <AccelStepper.h> AccelStepper Xaxis(1, 3, 6); // pin 3 = step, pin 6 = direction AccelStepper Yaxis(1, 4, 7); // pin 4 = step, pin 7 = direction AccelStepper Zaxis(1, 5, 9); // pin 5 = step, pin 8 = direction void setup() { Xaxis.setMaxSpeed(400); Yaxis.setMaxSpeed(400); Zaxis.setMaxSpeed(400); Xaxis.setSpeed(45); Yaxis.setSpeed(25); Zaxis.setSpeed(80); } void loop() { Xaxis.runSpeed(); Yaxis.runSpeed(); Zaxis.runSpeed(); }
В нашем примере шаговые двигатели подключены к плате Arduino Uno через драйверы A4988.
Два мотора не получается запрограммировать, подскажите что не так...
#include <AccelStepper.h>
AccelStepper Stepper1(1,13,12); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988)
AccelStepper Stepper2(1,11,10);
int dir = 1; //используется для смены направления
void setup() {
Stepper1.setMaxSpeed(3000);
Stepper1.setAcceleration(13000);
Stepper2.setMaxSpeed(3000);
Stepper2.setAcceleration(13000);
}
void loop() {
int sensorReadingA0 = analogRead(A0);
int sensorReadingA1 = analogRead(A1);
int motorSpeedA0 = map(sensorReadingA0, 0, 1023, 0, 100);
int motorSpeedA1 = map(sensorReadingA1, 0, 1023, 0, 100);
if(Stepper1.distanceToGo()==0){
Stepper1.move(motorSpeedA0*dir);
dir = dir*(-1);
}
Stepper1.run();
if(Stepper2.distanceToGo()==0){
Stepper1.move(motorSpeedA1*dir);
dir = dir*(-1);
}
Stepper2.run();
}
Вы написали 12 и 13 для dir и step, это не ошибка? Судя по коду, 12 - step, 13 - dir.
Попробуйте уменьшить скорости и ускорение двигателей до гарантированно рабочих, например, 200 и 50.
Проверьте правильность и надёжность соединений
в 5й снизу строке ошибка,
Stepper2.move(....
должно быть
После отключения питания двигатель считает 0 то место где он остановился. Как можно решить проблему, что бы можно было управлять корректно потенциометром и после отключения питания?
Никак нельзя. Даже если запомнить в энергонезависимой памяти положение двигателя при выключении, то можно сдвинуть его с места когда он выключен и получить ошибку после включения. Похоже, вам требуется серводвигатель.
Здравствуйте у меня вопрос такого плана есть задумка сделать полуавтоматический сверлильный станок для печатных плат так вот нужно в скетч вписать два концевика и кнопку (педаль) один концевик начало(верхняя) начало начальная точка второй концевик конечная,да и кнопка выполнения команды так вот в начале ШД с большей скоростью начинает двигаться и замедляет постепенно до самых малых при достижении второго концевика возвращается с другой скоростью назад и остонавливается,как это сделать. Я учусь програмировать и не судите строго ну а паять я умею подключить смогу.Заранее спасибо.
Вадим,
как я понял, вам написать программу так, чтобы при нажатии на педаль шаговый двигатель выполнял движение от одного концевика к другому (опускал шпиндель сверлилки) и затем возвращался?
Разложите будущую программу на простые части, например по такому алгоритму:
1) при включении (или ресете) на макс. скорости ехать в одну сторону (вверх) пока не сработает верхний концевик
2) после этого в бесконечном цикле следить за нажатием педали
3) если педаль нажата, установить нужную скорость вращения шаговика (медленно) и крутить шаговик пока не сработает нижний концевой выключатель
4) перейти к шагу 1 (вернуть шпиндель на самый верх)
можно все эти шаги написать отдельными скетчами и тестировать по отдельности, а затем собрать.
Также для удобства отладки пишите в Serial.println("Now executing ...") (программа выполняет такой-то шаг)
+ можно при нажатии педали опускать шпиндель быстро до какой-то величины, например, толщины печатной платы + небольшой допуск (подвод сверла), а затем опускать медленно (само сверление).
Т.е. вам требуется изменять скорость в функции move(скорость) по ходу выполнения программы,
а функциями setMaxSpeed(ххх) и setAcceleration(ххх) в начале программы установить максимальные скорость и ускорение для вашего шагового двигателя с драйвером (путём подбора)
Здраствуйте . Кто может помочь с написанием короткого скетча?
В обще имеем драйвер А4988 ,мотор биполярный ну и ардуинка,так же 3 кнопки.
при нажатие на 1) кнопку мотор делает 2000 шагов в одну сторону. при нажатие 2) кнопки мотор делает 2000 шагов в обратную сторону ну и 3) кнопка это стоп.
Добрый день! Хочу сделать драйвер шагового двигателя на arduino и L298d для биполярного двигателя управление 2 пина шаг направление., Пожалуйста напишите простой пример как это сделать, и скажите может ли 1 ардуина управлять 2 или 3 L298d одновременно.
здравствуйте помогите написать скетч для двух разных моторов с двумя разными драйверами. с разными питаниями. 12/24 в
В примере мы создаём один экземпляр класса AccelStepper строкой:
AccelStepper Stepper1(1,13,12); //использует пин 12 и 13 для dir и step, 1 - режим "external driver"
вам надо создать ещё один
AccelStepper Stepper2(1, тут другие порты); //использует пин ХХ и ХХ для dir и step, 1 - режим "external driver"
А на эти порты уже подключаете любые драйверы на разные питания - неважно, лишь-бы управлялись они напряжением с порта Arduino, т.е. 5В.
А дальше командуете двумя отдельными двигателями Stepper1 и Stepper2