Библиотека Accelstepper

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Azret, 13 мар 2017.

  1. Azret

    Azret Нуб

    Здравствуйте! Не совсем пойму как сменять направление вращения шагового двигателя.

    #include <AccelStepper.h>

    AccelStepper Xaxis(4, 2,3,4,5);
    AccelStepper Yaxis(4, 8,9,10,11);
    void setup() {

    Xaxis.setMaxSpeed(10000);
    Yaxis.setMaxSpeed(10000);

    Xaxis.setSpeed(5000);
    Yaxis.setSpeed(1500);
    }

    void loop()
    {
    Xaxis.runSpeed();
    Yaxis.runSpeed();
    }
     
  2. vvr

    vvr Инженерище

    Xaxis.setSpeed(-5000);
    Yaxis.setSpeed(-1500);

    и поедут в другую сторону))))
    только значения скорости многовато выставил....
    в описании библиотеки по этому поводу автор отписался.
     
  3. Azret

    Azret Нуб


    Спасибо!!!
     
  4. Gomez

    Gomez Гик

    Приподниму. Не могу понять единицы измерения setSpeed, setMaxSpeed, setAcceleration и т.д.

    В moveTo — это количество шагов, а скорость — это кол-во шагов в минуту? Секунду? Или вообще в условных попугаях?
    А ускорение - прирост шагов за секунду или что? :) По опытам вижу, что чем меньше setAcceleration, тем плавнее остановка и старт. :confused:
     
  5. vvr

    vvr Инженерище

    зайдите на сайт автора библиотеки и всё там расписано
     
  6. Onkel

    Onkel Гуру

    шаги в секунду, и ускорение - шаг/секунду за секунду.
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    /*
    http://www.airspayce.com/mikem/arduino/AccelStepper/
    Basic Usage
    You can create multiple AccelStepper objects, giving a unique name to each motor. AccelStepper can manage any number of motors, as long as you repetitively call their "run" functions.

    ////Defining & Configuring Motors
    AccelStepper mystepper(DRIVER, step, direction);              // Шаговый двигатель, управляемый выделенной платой.
    AccelStepper mystepper(FULL2WIRE, pinA, pinB);                // Биполярный шаговый двигатель, управляемый Н-мостом.
    AccelStepper mystepper(FULL4WIRE, pinA1, pinA2, pinB1, pinB2);// Униполярный двигатель, управляемый четырмя транзисторами.
    mystepper.setMaxSpeed(stepsPerSecond);            // Установка максимальной скорости (оборотов в минуту). Скорость по умолчанию очень низкая, так что её требуется переопределить. При движении шаговый двигатель будет ускоряться до этой максимальной скорости и замедляться при подходе к концу движения.
    mystepper.setAcceleration(stepsPerSecondSquared); // Установка ускорения, в шагах в секунду за секунду.

    ////Position Based Control
    mystepper.isRunning();                            // Возвращает true, если ШД в режиме вращения.
    mystepper.currentPosition();                      // Возвращает текущее абсолютное положение (в шагах).
    mystepper.setCurrentPosition (long position);     // Установить счетчик как текущую позицию. Полезно как задание нулевой координаты. Обнуляет текущую скорость до нуля.
    mystepper.targetPosition();                       // Конечное положение (в шагах).
    mystepper.distanceToGo();                         // Вернуть расстояние до указанного положения. Может использоваться для проверки: достиг ли двигатель указанной конечной точки.
    mystepper.moveTo(long absolute);                  // Переместиться в абсолютно указанное положение. Само движение запускается функцией run().
    mystepper.move(long relative);                    // Переместиться в относительно указанное положение. Само движение запускается функцией run(). Значение distance может быть больше или меньше нуля.
    mystepper.run();                                  // Начать движение с ускорением. Один шаг. Для продолжения движения следует вызывать функцию повторно как можно чаще - в loop() или иной функции.
    mystepper.runToPosition();                        // Начать движение и подождать когда двигатель достигнет указанной точки. БЛОКИРУЮЩАЯ ФУНКЦИЯ - функция не прерывается, пока двигатель не остановится!
    mystepper.runToNewPosition();                     // Начать движение с ускорением, до заданной позиции. БЛОКИРУЮЩАЯ ФУНКЦИЯ!
    mystepper.stop();                                 // Максимально быстрая остановка (без замедления), используя текущие параметры скорости и ускорения. Также задает новое конечное положение.

    ////Speed Based Control
    mystepper.setSpeed(stepsPerSecond);               // Установить скорость (в шагах за секунду). Само движение запускается функцией runSpeed().
    mystepper.runSpeed();                             // Начать движение с текущей заданной скоростью (без плавного ускорения). Для продолжения движения двигателя следует вызывать функцию повторно как можно чаще.
    mystepper.runSpeedToPosition();                   // Начать движение с текущей заданной скоростью (без плавного ускорения), до заданной позиции. БЛОКИРУЮЩАЯ ФУНКЦИЯ!

    ////Power Control
    mystepper.disableOutputs();                       // Деактивировать занятые пины и установить их в LOW. Снимает напряжение с обмоток двигателя, экономя энергию (вал при это может проворачиваться под внешними нагрузками)
    mystepper.enableOutputs();                        // Активировать зарезервированные пины и устанавивает их в режим OUTPUT. Вызывается автоматически при запуске движения.
    */
     
  8. Дополнительная инфа https://synxronica.com/index.php?page=31 (надо проверить).
     
    Tomasina нравится это.
  9. brokly

    brokly Гик

    mystepper.stop() , как раз останавливает мотор используя установленное ускорение, поэтому написанное в скобочках - неверно.
     
  10. sanik

    sanik Гик

    Подскажите как считать текущую позицию чтоб вывести например на дисплей?
     
  11. Tomasina

    Tomasina Сушитель лампочек Модератор

    4 поста выше:
    mystepper.currentPosition();
     
  12. sanik

    sanik Гик

    Спасибо! С этим разобрался)
    А нельзя ли с библиотекой MultiStepper.h запустить плавно моторы? У меня получилось только так
    Код (C++):

    gotoposition[0] = XInPoint;
      gotoposition[1] = YInPoint;

      motoreX.setMaxSpeed(speedX);
      motoreX.setAcceleration(accelerazione);
      motoreY.setMaxSpeed(speedY);
      motoreY.setAcceleration(accelerazione);
    StepperControl.moveTo(gotoposition);
      StepperControl.run();
    А если сделать так то ругается говорит что не работает с этой функцией
    Код (C++):
    speedX = map(mapspeed, 0, 1023, minSpeed, maxSpeed);
      speedY = map(mapspeed, 0, 1023, minSpeed, maxSpeed);
      gotoposition[0] = XInPoint;
      gotoposition[1] = YInPoint;

      motoreX.setMaxSpeed(speedX);
      motoreX.setAcceleration(accelerazione);
      motoreY.setMaxSpeed(speedY);
      motoreY.setAcceleration(accelerazione);
      //StepperControl.moveTo(gotoposition);
      if (StepperControl.distanceToGo() == 0) { //проверка, отработал ли двигатель предыдущее движение
        StepperControl.moveTo(gotoposition);
      }
      StepperControl.run();
     
  13. sanik

    sanik Гик

    Помогите! Не получается запустить 3 мотора.
    Если делаю так то все работает.
    Код (C++):
     motorX.setMaxSpeed(speedX);
        motorX.setAcceleration(accelerate);
        motorY.setMaxSpeed(speedY);
        motorY.setAcceleration(accelerate);
        motorX.moveTo(gotopositionX);
        motorY.moveTo(gotopositionY);
        while ((motorX.distanceToGo() != 0) || (motorY.distanceToGo() != 0)) {
          motorX.moveTo(gotopositionX);
          motorY.moveTo(gotopositionY);
          motorX.run();
          motorY.run();
        }
    А если сделать так то третий мотор не работает Хотя в других кусках кода где прописан от джойстика там все работает. Именно в этой функции отказывается
    Код (C++):
    motorX.setMaxSpeed(speedX);
        motorX.setAcceleration(accelerate);
        motorY.setMaxSpeed(speedY);
        motorY.setAcceleration(accelerate);
        motorZ.setMaxSpeed(speedZ);
        motorZ.setAcceleration(accelerate);
        motorX.moveTo(gotopositionX);
        motorY.moveTo(gotopositionY);
        motorZ.moveTo(gotopositionZ);

          while ((motorX.distanceToGo() != 0) || (motorY.distanceToGo() != 0) || (motorZ.distanceToGo() != 0)) {
            motorX.moveTo(gotopositionX);
            motorY.moveTo(gotopositionY);
            motorZ.moveTo(gotopositionZ);
            motorX.run();
            motorY.run();
            motorZ.run();
          }
    И еще подскажите как правильно записать выражение чтоб установить точку Home? Чтоб можно было в любой нужный момент поставить движки так как были при включении.
     
  14. yuramotor

    yuramotor Нуб

    а как использовать
    а как именно использовать mystepper.stop() можно пример
     
  15. Tomasina

    Tomasina Сушитель лампочек Модератор

  16. yuramotor

    yuramotor Нуб

    Код (C++):
    #include <AccelStepper.h>
    /////
    AccelStepper stepper(1,9,8);
    ////
    const byte btnPin =/*пин*/A0;
    bool btn;

    void setup()
    {
      pinMode(btnPin, INPUT_PULLUP);
      stepper.setMaxSpeed(1000);
      stepper.setAcceleration(1000);
    }
    ////
    void loop()
    {  
      btn = digitalRead(btnPin);
      if (!btn) {
      stepper.runSpeed();
      stepper.moveTo(8000);
      while(stepper.currentPosition() != 9000)
        stepper.run();
      stepper.stop();
      //stepper.runToPosition();
      //delay(30000);
      }
    }
    Реализую запуск с кнопки а остановка самостоятельная, посмотрите что не так
     
  17. Tomasina

    Tomasina Сушитель лампочек Модератор

    А что не так?
     
  18. yuramotor

    yuramotor Нуб

    Добрый вечер, Вот добился таких успехов, при первом нажатии на кнопку срабатывает реле через 3 секунды двигатель делает 100 шагов и реле отключается. Но при следующем нажатия кнопки реле срабатывает, а двигатель не реагирует. Как сделать чтобы повторялось вновь и вновь
    Код (C++):
    #include <AccelStepper.h>
    AccelStepper Stepper1(1,13,12);

         unsigned long mill;
         const byte btnPin = A0;
         bool btn;
         const byte relePin = 5;
         bool Myrele;
         unsigned long past;
         const unsigned long time1sec = 3000;
         unsigned long eventTime=0;

    void setup() {
     
          Stepper1.setMaxSpeed(3000);
          Stepper1.setAcceleration(1300);
         
          pinMode(btnPin, INPUT_PULLUP);
          pinMode(relePin, OUTPUT);
          digitalWrite(relePin, Myrele = 0);
         
    }

    void loop() {
     
           mill = millis();
            btn = digitalRead(btnPin);
           
            if (!btn) { /* если кнопка нажата*/
         
            digitalWrite(relePin, Myrele = 1); /*то вкл реле*/
            past = mill;
       }
          if (Myrele & mill - past >= time1sec) {/*если реле вкл больше 1 сек*/
           digitalWrite(relePin, Myrele = 0);/*то выкл*/
           past = mill;
       }

          if(!btn) eventTime=millis(); // засекли когда произошло событие
          if(eventTime && (millis()-eventTime>2000)) // проверям прошло ли XXXX миллесекунд с события
      {
         Stepper1.runSpeed();
         Stepper1.moveTo(100);
       
         while(Stepper1.currentPosition() != 100)
         Stepper1.run();
      }
     
    }
     
     
  19. vvr

    vvr Инженерище

    у вас в коде нет борьбы с дребезгом кнопки (без решения этого вопроса дальше двигаться нет смысла)
    и мотор врубается после удержания кнопки 2 сек.
     
  20. yuramotor

    yuramotor Нуб

    от добавил задержку против дребезга
    Код (C++):
    #include <AccelStepper.h>
    AccelStepper Stepper1(1,13,12);

         unsigned long mill;
         const byte btnPin = A0;
         bool btn;
         const byte relePin = 5;
         bool Myrele;
         unsigned long past;
         const unsigned long time1sec = 3000;
         unsigned long eventTime=0;

    void setup() {
          Stepper1.setMaxSpeed(3000);
          Stepper1.setAcceleration(1300);
       
          pinMode(btnPin, INPUT_PULLUP);
          pinMode(relePin, OUTPUT);
          digitalWrite(relePin, Myrele = 0);
       
    }

    void loop() {
           mill = millis();
            btn = digitalRead(btnPin);
         
            if (!btn) { /* если кнопка нажата*/
            delay(500);
            digitalWrite(relePin, Myrele = 1); /*то вкл реле*/
            past = mill;
       }
          if (Myrele & mill - past >= time1sec) {/*если реле вкл больше 1 сек*/
           digitalWrite(relePin, Myrele = 0);/*то выкл*/
           past = mill;
       }

          if(!btn) eventTime=millis(); // засекли когда произошло событие
          if(eventTime && (millis()-eventTime>2000)) // проверям прошло ли XXXX миллесекунд с события
      {
         Stepper1.runSpeed();
         Stepper1.moveTo(100);
       
         while(Stepper1.currentPosition() != 100)
         Stepper1.run();
      }
    }