Навчальні конструктори та DIY електроніка

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

2016-03-02

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

 

Автор: hobbytech


Комментарии:

  • ___123___Arduino: библиотека AccelStepper для шагового двигателя | HobbyTech___123___

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

    #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.
      Проверьте правильность и надёжность соединений

  • После отключения питания двигатель считает 0 то место где он остановился. Как можно решить проблему, что бы можно было управлять корректно потенциометром и после отключения питания?

    • Никак нельзя. Даже если запомнить в энергонезависимой памяти положение двигателя при выключении, то можно сдвинуть его с места когда он выключен и получить ошибку после включения. Похоже, вам требуется серводвигатель.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *


© HobbyTech 2016