Странные вещи с библиотекой AccelStepper
- Войдите на сайт для отправки комментариев
Вс, 05/08/2012 - 19:29
Задача:
Используя библиотеку 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/Х.
Интересно это глюк библиотеки или тут есть подводный камень?
Может попробовать иначе (а то что-то логика процесса мне не очень понятна):
#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 - работает.
AlexFisher
Если честно на ваш ответ и надеялся, т. к. с ваших постов узнал о библиотеке. Но увы, в вашем скече цикл не работает, после запуска, ШД поворачивается на 25600/X и далее срабатывает delay (5000)
Извините, совсем страх потерял - забыл про переменную цикла. Вот, исправил:
#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); }Теперь еще интересней, ШД делает поворот на 25600/X, потом возвращается (причем чуть дальше чем 25600/X), далее опять поворот на 25600/X, и снова возврат (снова чуть дальше чем 25600/X) :) после этого уже delay (5000)
Все, работает как надо! Если в вашем коде "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); }Странно... Но, возможно это из-за того, что происходит переполнение переменной 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)
Да, ваш скеч из 3-го сообщения с (i*25600L/X) работает на ура! Спасибо, вы очень мне помогли.
#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) тут выскакивает ошиба
(