Странные вещи с библиотекой AccelStepper

GRiMmase
Offline
Зарегистрирован: 26.07.2012

 Задача:

Используя библиотеку AccelStepper повернуть ротор моего ШД на 360 градусов за X шагов (в моем случае за 4-е шага), затем выдержать паузу и снова повернуть на Х шагов и так бесконечно.

Модифицировав один из примеров библиотеки, у меня получился вот такой скеч:  

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper; // Defaults to 4 pins on 2, 3, 4, 5

int X = 4;

void setup()
{  
}

void loop()
{    
    for (int i=1; i <= X; i++){
    stepper.setMaxSpeed(200); 
    stepper.setAcceleration(50);
    stepper.runToNewPosition(0);
    stepper.setCurrentPosition(25600/X); // 25600 - шагов для разворота на 360 градусов
    }
delay (5000);
}

Но как ни странно, после запуска, ШД делает 3-и шага вместо 4-х по 25600/X и срабатывает delay(5000), а уже все последующие разы как положенно 4-е шага по 25600/Х.

Интересно это глюк библиотеки или тут есть подводный камень?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Может попробовать иначе (а то что-то логика процесса мне не очень понятна):

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper; // Defaults to 4 pins on 2, 3, 4, 5

int X = 4;

void setup()
{  
    stepper.setMaxSpeed(200); 
    stepper.setAcceleration(50);
}

void loop()
{    
    stepper.setCurrentPosition(0);
    for (int i=1; i <= X; i++){
    stepper.runToNewPosition(25600/X);
    }
delay (5000);
} 

В Вашем варианте при первом проходе и так позиция нулевая, вот перемещение в нулевую позицию и ни к чему не приводит. При второй интеррации начальная позиция не нулевая - коменде перемещения в 0 - работает.

GRiMmase
Offline
Зарегистрирован: 26.07.2012

AlexFisher

Если честно на ваш ответ и надеялся, т. к. с ваших постов узнал о библиотеке. Но увы, в вашем скече цикл не работает, после запуска, ШД поворачивается на 25600/X и далее срабатывает delay (5000)

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Извините, совсем страх потерял - забыл про переменную цикла. Вот, исправил:

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper; // Defaults to 4 pins on 2, 3, 4, 5

int X = 4;

void setup()
{  
    stepper.setMaxSpeed(200); 
    stepper.setAcceleration(50);
}

void loop()
{    
    stepper.setCurrentPosition(0);
    for (int i=1; i <= X; i++){
    stepper.runToNewPosition(i*25600/X);
    }
delay (5000);
} 

 

GRiMmase
Offline
Зарегистрирован: 26.07.2012

 Теперь еще интересней, ШД делает поворот на 25600/X, потом возвращается (причем чуть дальше чем 25600/X), далее опять поворот на 25600/X, и снова возврат (снова чуть дальше чем 25600/X) :) после этого уже delay (5000)

GRiMmase
Offline
Зарегистрирован: 26.07.2012

 Все, работает как надо! Если в вашем коде "stepper.setCurrentPosition(0);" поместить в начало цикла! 

Спасибо!

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper; // Defaults to 4 pins on 2, 3, 4, 5

int X = 4;

void setup()
{  
    stepper.setMaxSpeed(200); 
    stepper.setAcceleration(50);
}

void loop()
{    
    for (int i=1; i <= X; i++){
    stepper.setCurrentPosition(0);
    stepper.runToNewPosition(25600/X);
    }
delay (5000);
}
AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Странно... Но, возможно это из-за того, что происходит переполнение переменной int.  Попробуйте так, а то каждый раз вычислять в цикле то, что можно вычислить один раз перед циклом как-то неправильно :):

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper; // Defaults to 4 pins on 2, 3, 4, 5

int X = 4;

void setup()
{  
    stepper.setMaxSpeed(200); 
    stepper.setAcceleration(50);
    unsigned int step=25600/X;
}

void loop()
{    
    stepper.setCurrentPosition(0);
    for (int i=1; i <= X; i++){
    stepper.runToNewPosition(i*step);
    }
delay (5000);
} 

 Кстати, замена аргумента на (25600/X*i) или на (i*(25600/X)) тоже бы помогло, потому что предотвратило бы переполнение типа "int". Как вариант, X и i нужно было объявить как long, или написать (i*25600L/X)

GRiMmase
Offline
Зарегистрирован: 26.07.2012

 Да, ваш скеч из 3-го сообщения с (i*25600L/X) работает на ура! Спасибо, вы очень мне помогли.

i.roos
Offline
Зарегистрирован: 10.05.2016
#include <AccelStepper.h>
AccelStepper Stepper1(1,13,12); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988)
int dir = 1; //используется для смены направления
int Knop=2;
boolean kPRED=LOW;//переменная для сохранения предыдущего состояния
boolean l=false;//выключенный диод переменная 


    void setup() {  

 stepper1.setSpeed(3);
  stepper1.setAcceleration(200);

}
    {
     pinMode(Knop,INPUT);

    }
  boolean debounce( boolean last)
 {
  boolean seihas =digitalRead(Knop);
  if(last != seihas)
    {
  delay(5);
    seihas= digitalRead(Knop);
    }
     return seihas;
     }
    
 

     
                       
void loop(){
 
  sei=debounce( kPRED);
  if( kPRED==LOW  && sei==HIGH)
  {
    l=!l;
  }
 kPRED= sei;
 
  digitalWrite(dir,l);
              {

Stepper1.move(1600*dir); //устанавливает следующее перемещение на 1600 шагов (если dir равен -1 будет перемещаться -1600 -> противоположное направление)

}
Stepper1.run(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя
}


почему не работает подскажите пожалуйста? не могу ни как разобраться с библиотекой

stepper1.setSpeed(3) тут выскакивает ошиба

 

 
 
 
 
i.roos
Offline
Зарегистрирован: 10.05.2016

(