Официальный сайт компании Arduino по адресу arduino.cc
Странные вещи с библиотекой 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/Х.
Интересно это глюк библиотеки или тут есть подводный камень?
Может попробовать иначе (а то что-то логика процесса мне не очень понятна):
В Вашем варианте при первом проходе и так позиция нулевая, вот перемещение в нулевую позицию и ни к чему не приводит. При второй интеррации начальная позиция не нулевая - коменде перемещения в 0 - работает.
AlexFisher
Если честно на ваш ответ и надеялся, т. к. с ваших постов узнал о библиотеке. Но увы, в вашем скече цикл не работает, после запуска, ШД поворачивается на 25600/X и далее срабатывает delay (5000)
Извините, совсем страх потерял - забыл про переменную цикла. Вот, исправил:
Теперь еще интересней, ШД делает поворот на 25600/X, потом возвращается (причем чуть дальше чем 25600/X), далее опять поворот на 25600/X, и снова возврат (снова чуть дальше чем 25600/X) :) после этого уже delay (5000)
Все, работает как надо! Если в вашем коде "stepper.setCurrentPosition(0);" поместить в начало цикла!
Спасибо!
Странно... Но, возможно это из-за того, что происходит переполнение переменной int. Попробуйте так, а то каждый раз вычислять в цикле то, что можно вычислить один раз перед циклом как-то неправильно :):
Кстати, замена аргумента на (25600/X*i) или на (i*(25600/X)) тоже бы помогло, потому что предотвратило бы переполнение типа "int". Как вариант, X и i нужно было объявить как long, или написать (i*25600L/X)
Да, ваш скеч из 3-го сообщения с (i*25600L/X) работает на ура! Спасибо, вы очень мне помогли.
почему не работает подскажите пожалуйста? не могу ни как разобраться с библиотекой
stepper1.setSpeed(3) тут выскакивает ошиба
(