Arduino: библиотека AccelStepper для шагового двигателя

Шаговый двигательБиблиотека 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.

 

12 коментарів про “Arduino: библиотека AccelStepper для шагового двигателя

  • Два мотора не получается запрограммировать, подскажите что не так...

    #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

Залишити коментар до Юрий Скасувати коментар