Двигать шаговый двигатель вперед и назад

Итак, я пытаюсь переместить шаговый двигатель на половину оборота (1024 шага), и как только это будет завершено, заставьте его двигаться вперед и назад примерно на 100 шагов в любом направлении.

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

void setup()
{ 
    stepper1.setMaxSpeed(1000);
    stepper1.moveTo(1024);
    stepper1.setAcceleration(100);
    Serial.begin(19200);
    while(!Serial);
}

void loop()
{
    stepper1.run();
    static int ctr = 0; //значение счетчика для хранения того, сколько раз происходило движение вперед и назад
    if(stepper1.currentPosition() == 1024){
      backMotion(stepper1.currentPosition());
      forthMotion(stepper1.currentPosition());
      ctr++;
    }
//    if(stepper1.currentPosition() == 824 && ctr > 0 && ctr < 30){
//      forthMotion(stepper1.currentPosition());
//    }
}  

void backMotion(int value){
    int current = value;
    int back_distance = current - 200; //расстояние для перемещения назад
    stepper1.moveTo(back_distance);
}

void forthMotion(int value) {
  int current = value;
  int forth_distance = current+200;
  stepper1.moveTo(forth_distance);
}

Поэтому, когда я вызываю функцию forthMotion сразу после функции backMotion, она будет просто двигаться вперед. Что для меня не имеет никакого смысла. Разве это не должно двигаться назад, а затем вперед в бесконечном цикле? Потому что он достигнет 1024, вернется к 824, снова достигнет 1024 и так далее, и так далее...

Кроме того, когда я вызываю функцию обратного перемещения, разве код Arduino не должен блокироваться в этом, больше ничего не выполняется во время работы?

Изменить: Код, похоже, работает, когда я раскомментирую оператор if в функции цикла.

, 👍2

Обсуждение

Пожалуйста, отредактируйте свой вопрос, чтобы включить [Минимальный, полный и проверяемый пример](http://stackoverflow.com/help/mcve) кода, а не только фрагментов. Ваш текущий фрагмент не показывает, какие библиотеки вы используете или как вы объявили и инициализировали объект "stepper1". В любом случае, пожалуйста, отредактируйте свой вопрос, чтобы включить эту информацию через MCVE., @James Waldby - jwpat7

Похоже, вам не хватает нескольких " stepper1.runSpeedToPosition();`, @Mikael Patel

@MikaelPatel - зачем мне нужна функция runSpeedToPosition?, @Zaid Humayun

В руководстве говорится: "Работает с выбранной в данный момент скоростью до тех пор, пока не будет достигнута целевая позиция". Возможно, вы захотите дать шаговому устройству некоторое время для завершения операции. http://www.airspayce.com/mikem/arduino/AccelStepper/MultiStepper_8pde-example.html, @Mikael Patel

Вам также необходимо определить, что такое "шаг 1" в вашей области., @Isaac Turner


2 ответа


0

Степперы обычно не имеют обратной связи о своем положении (в отличие от сервоприводов). Обычно вы просто указываете шаговому движку, сколько и как быстро вращаться. В отличие от сервоприводов, которым вы указываете, в какое положение поворачиваться.

Вы уверены, что используете степпер?

,

Ничто в опубликованном вопросе не подтверждает вашу теорию., @Chris Stratton


1

Думаю, решение может быть таким:

в обратном движении

void backMotion(){

    int back_distance = - 200; //расстояние, на которое нужно вернуться
    stepper1.moveTo(back_distance);
}

В движении вперед

void forthMotion() {
  
  int forth_distance = 200;
  stepper1.moveTo(forth_distance);
}

В цикле

void loop()
{
    stepper1.run();
    static int ctr = 0; // значение счетчика для хранения того, сколько раз произошло движение вперед и назад

    stepper1.moveTo(1024);
    while(ctr < 30){

      backMotion();
      delay(500);

      forthMotion();
      delay(500);
      ctr++;
    }
// if(stepper1.currentPosition() == 824 && ctr > 0 && ctr < 30){
// forwardMotion(stepper1.currentPosition());
// }
}  

Ваш основной код будет таким

void setup()
{ 
    stepper1.setMaxSpeed(1000);
    stepper1.moveTo(1024);
    delay(3000); // ждем пока степпер доберется до места назначения
    stepper1.setAcceleration(100);
    Serial.begin(19200);
    while(!Serial);
}

void loop()
{
    stepper1.run();
    static int ctr = 0; // значение счетчика для хранения того, сколько раз произошло движение вперед и назад

    while(ctr < 30){

      backMotion();
      delay(500);

      forthMotion();
      delay(500);
      ctr++;
    }
// if(stepper1.currentPosition() == 824 && ctr > 0 && ctr < 30){
// forwardMotion(stepper1.currentPosition());
// }
}  


void backMotion(){

    int back_distance = - 200; //расстояние, на которое нужно вернуться
    stepper1.moveTo(back_distance);
}


void forthMotion() {
  
  int forth_distance = 200;
  stepper1.moveTo(forth_distance);
}

,