Управление шаговым двигателем
- Войдите на сайт для отправки комментариев
Вс, 28/08/2016 - 20:17
Подскажите, пожалуйста, как заставить шаговый двигатель отработать в обратную сторону на заданное количество шагов.
У меня ШД перемещает дозатор на заданное количество шагов 1 раз в сутки. И таких перемещений происходит 5. После этого он ждет перезапуска кнопкой reset. И все повторяется.
Что нужно дописать в скече, чтобы ШД после пятого перемещения вернул дозатор в исходное состояние, т.е. на 5 перемещений назад
#include <Stepper_28BYJ.h>
#define INTERVAL 1000UL*60*60*24 // интервал между включением (сутки)
char i = 0;
// количество шагов на одно включение
const int stepsPerRevolution = 1200;
// инициализируем библиотеку Stepper_28BYJ на выходы 8-11
Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 8,9,10,11);
void setup() {
// установим скорость 20 об/мин
myStepper_28BYJ.setSpeed(20);
// инициализируем последовательный порт
Serial.begin(9600);
}
void loop()
{
while(i < 5) //условие цикла
{
// храним время последнего включения
static unsigned long previousMillis = 0;
//проверяем не прошел ли нужный интервал, если прошел то
if(millis() - previousMillis > INTERVAL)
{
// шагаем 1 включение в одном направлении
Serial.println("counterclockwise");
myStepper_28BYJ.step(-stepsPerRevolution);
// сохраняем время последнего включения
previousMillis = millis();
i++;
}
}
}
Куда нужно прописать:
Serial.println("clockwise");
myStepper_28BYJ.step(stepsPerRevolution);
delay(500);}
Помогите новичку!
Код на железе не проверял
#include <Stepper_28BYJ.h> #define INTERVAL 1000UL*60*60*24 // интервал между включением (сутки) uint8_t Stepper_direction; // направление вращения 0 - по часовой 1 против uint8_t N_step = 1; // переменая шаг const int Max_step =5; // количество шагов в одном направлении uint32_t previousMillis ; // храним время последнего включения // количество шагов на одно включение const int stepsPerRevolution = 1200; // инициализируем библиотеку Stepper_28BYJ на выходы 8-11 Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 8,9,10,11); void setup() { // установим скорость 20 об/мин myStepper_28BYJ.setSpeed(20); // инициализируем последовательный порт Serial.begin(9600); previousMillis = millis(); } void loop() { if(millis() - previousMillis > INTERVAL) { //проверяем не прошел ли нужный интервал, если прошел то if (Stepper_direction) { // вращение против часовой Serial.println("counterclockwise"); myStepper_28BYJ.step(-stepsPerRevolution); // шагаем 1 включение в одном направлении N_step++; if (N_step = Max_step ) Stepper_direction = 0; previousMillis = millis(); } else{ Serial.println("clockwise"); // вращение по часовой myStepper_28BYJ.step(stepsPerRevolution); // шагаем 1 включение в одном направлении N_step--; if (N_step =1 ) Stepper_direction = 1; previousMillis = millis(); } } }Спасибо за помощь. Но двигатель не хочет работать как задумано: он или делает возвратно-поступательные движения, или все время крутиться в одном направлении. Зависит это от того, что поставить в 25 и 31 строчках: 0 и 1 или 1 и 0. Количество перемещений не подсчитывается.
Если Ваш код рабочий и за сутки делается перемещений в одном напрвлении 5*1200, значит назад Вам надо вернуть 6000. Если я првильно понял то попробуйте вот так. Если же нужно перемещение назад на 1200 то строчки (stepsPerRevolution = 6000; и stepsPerRevolution = 1200; ) закоментируйте в блоке if (i == 5)
#include <Stepper_28BYJ.h> #define INTERVAL 1000UL*60*60*24 // интервал между включением (сутки) char i = 0; // количество шагов на одно включение int stepsPerRevolution = 1200; // инициализируем библиотеку Stepper_28BYJ на выходы 8-11 Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 8, 9, 10, 11); void setup() { // установим скорость 20 об/мин myStepper_28BYJ.setSpeed(20); // инициализируем последовательный порт Serial.begin(9600); } void loop() { while (i < 5) //условие цикла { // храним время последнего включения static unsigned long previousMillis = 0; //проверяем не прошел ли нужный интервал, если прошел то if (millis() - previousMillis > INTERVAL) { // шагаем 1 включение в одном направлении Serial.println("counterclockwise"); myStepper_28BYJ.step(-stepsPerRevolution); // сохраняем время последнего включения previousMillis = millis(); i++; if (i == 5) { stepsPerRevolution = 6000; Serial.println("clockwise"); myStepper_28BYJ.step(stepsPerRevolution); delay(500); stepsPerRevolution = 1200; i = 0; } } } }Спасибо! Все заработало как Вы написали.
А не подскажете почему в моем скече не начинается цикл loop повторно? Тоже дозатор возвращатеся, но на этом цикл заканчивается.
#include <Stepper_28BYJ.h> #define INTERVAL 1000UL*5 // интервал между включением (сутки) char i = 0; char h = 0; // количество шагов на одно включение const int stepsPerRevolution = 1200; const int mystepsPerRevolution = 4000; // инициализируем библиотеку Stepper_28BYJ на выходы 8-11 Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 8,9,10,11); void setup() { // установим скорость 20 об/мин myStepper_28BYJ.setSpeed(40); // инициализируем последовательный порт Serial.begin(9600); } void loop() { while(i < 5) { //условие цикла // храним время последнего включения static unsigned long previousMillis = 0; //проверяем не прошел ли нужный интервал, если прошел то if(millis() - previousMillis > INTERVAL) { // шагаем 1 включение в одном направлении Serial.println("counterclockwise"); myStepper_28BYJ.step(-stepsPerRevolution); // сохраняем время последнего включения previousMillis = millis(); i++; } } while(h < 5){ Serial.println("clockwise"); myStepper_28BYJ.step(stepsPerRevolution); delay(100); h++; } }В Вашем коде i++; рано или позно становится 5 и нигде не обнуляетсе чтобы начать сначала, тоже самое и с h