Управление шаговым двигателем

tolyaa
Offline
Зарегистрирован: 28.08.2016

Подскажите, пожалуйста, как заставить шаговый двигатель отработать в обратную сторону на заданное количество шагов.

У меня ШД перемещает дозатор  на заданное количество шагов 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);}

Помогите новичку!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Код на железе не проверял 

#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();
           }

    }
}

 

tolyaa
Offline
Зарегистрирован: 28.08.2016

Спасибо  за помощь. Но двигатель не хочет работать как задумано: он или делает возвратно-поступательные движения, или все время крутиться в одном направлении. Зависит это от  того, что поставить в 25 и 31 строчках: 0 и 1 или 1 и 0. Количество перемещений не подсчитывается.

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Если Ваш код рабочий и за сутки делается перемещений в одном напрвлении 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;
      }

    }
  }

}

 

tolyaa
Offline
Зарегистрирован: 28.08.2016

Спасибо! Все заработало как Вы написали.

А не подскажете почему в моем скече не начинается цикл 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++; 
       }
          }

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

В Вашем коде i++; рано или позно становится 5 и нигде не обнуляетсе чтобы начать сначала, тоже самое и с h