Библиотека AccelStepper

Robushka
Offline
Зарегистрирован: 18.02.2018

Всем привет. Начал пользоваться библиотекой AccelStepper, и у меня возникли небольшие вопросы. Первое, что я хотел реализовать - 100 шагов с постоянной скоростью (без ускорения), и у меня получился вот такой код:

#include <AccelStepper.h>

AccelStepper stepper(1,2,6);
void setup()
{  
      stepper.setMaxSpeed(1000);
}
void loop()
{
      stepper.moveTo(100);
      stepper.setSpeed(800);
      stepper.runSpeedToPosition();
}

Затем я попытался сделать небольшой цикл, чтобы данная последовательность действий повторялась 500 раз (к примеру). Т.е. количество шагов должно возрасти, но у меня ничего не получилось - двигатель совершает все те же 100 шагов. 

#include <AccelStepper.h>

AccelStepper stepper(1,2,6);
int i = 0;
boolean x = 0;

void setup(){
  Serial.begin(9600);
}

void loop(){
  while (x < 1) {
    for (i; i <= 500; i++) {
      stepper.setMaxSpeed(1000);
      stepper.moveTo(100);
      stepper.setSpeed(800);
      stepper.runSpeedToPosition();
      Serial.println(i);
    }
  x = x+1;
  }
}

Ну и сами вопросы:

1) В чем моя ошибка? 
2) Как сделать задержку в две секунды между шагами цикла?

sadman41
Offline
Зарегистрирован: 19.10.2016

1) Serial.println(i); <- сколько раз печатает в Serial Monitor ?

2) Зачем вы в цикле постоянно задаете setMaxSpeed и пр? Одного раза в setup() не хватает?

Robushka
Offline
Зарегистрирован: 18.02.2018

1) Печатает все 500
2) Одного раза в setup действительно не хватает. Скорость падает до отвратительного одного шага в секунду

sadman41
Offline
Зарегистрирован: 19.10.2016

Наверное сейчас более опытные товарищи подскажут, в чем конкретно дело... Я этим аксельстепом не пользуюсь, но нашел вот ссылку: http://arduino.ru/forum/programmirovanie/biblioteka-accelstepper#comment-23110

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

runSpeedToPosition, если память мне не изменяет не блокируется пока не доедет. Она вроде делает один шаг и возвращается.

Если Вы хотите, чтобы она сначала отработала до конца, а потом только начался второй проход цикла, Вам надо её дождаться.

Я давно с этим дела не имел и попробовать не на чем, но мне кажется (если склероз не изменил), то Вам надо строку 17 заменить на 

while (stepper.isRunning()) stepper.runSpeedToPosition();

или даже проще

while (stepper.runSpeedToPosition());

Попробуйте.

Robushka
Offline
Зарегистрирован: 18.02.2018

Ни один из способов не помог :т
Ничего не изменилось. Есть идеи? .-.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Других нет. Я давно этим не занимался, а попробовать не на чем, извините.

Robushka
Offline
Зарегистрирован: 18.02.2018
      Serial.println(i);
      while (stepper.isRunning()) stepper.runSpeedToPosition();

Переместил вывод i чуть выше и теперь цикл прогоняется только один раз и останавливается

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Насколько я помню moveTo привязан к абсолютным единицам. Смените его на move или попробуйте обнулять счетчик (setCurrentPosition) в цикле.

Robushka
Offline
Зарегистрирован: 18.02.2018

Все, я реализовал. Криво, глупо, но работает :)
Спасибо за наводки!


#include <AccelStepper.h>

AccelStepper stepper(1, 2, 6);
boolean x = 0;
int i = 1;

void setup()
{
  stepper.setMaxSpeed(1000);
}

void loop() {
  while (x < 1) {
    for (i; i <= 5; i++) {
      do {
        stepper.move(1000);
        stepper.setSpeed(400);
        stepper.runSpeedToPosition();
      }
      while (stepper.currentPosition() != 1000);
      stepper.setCurrentPosition(0);
      delay(1000);
    }
    x = x + 1;
  }
}