Шаговый двигатель не изменяет направления движения!

Я управляю биполярным шаговым двигателем с драйвером a4988, используя библиотеку AccelStepper. Моя цель-нажать кнопку, и двигатель движется CW, затем еще одну кнопку для CCW.

Я посмотрел еще один пост с очень похожей проблемой, но решение, похоже, не очень подходит для библиотеки AccelStepper, которую я действительно хотел бы использовать, учитывая ее универсальность.

В настоящее время, какую бы кнопку я ни нажал, двигатель движется. Любая помощь будет очень признательна!

#include <AccelStepper.h>
AccelStepper stepperX(1, 3, 2);

void setup() {
  pinMode(8, INPUT)
  pinMode(9, INPUT);

  stepperX.setMaxSpeed(100.0);
  stepperX.setAcceleration(100.0);
}

int moveRight = 1000;              //arbitrarily high number
int moveLeft = -1000;              //arbitrarily low number

void loop() {
  while (digitalRead(8) == HIGH) { //when d8 button is pressed move left
    stepperX.moveTo(moveLeft);     //set move
    if (digitalRead(8) == LOW) {   //if not pressed, kill loop
      stepperX.stop();
      break;
    }
    stepperX.run();
  }

  while (digitalRead(9) == HIGH) { //when d9 button is pressed move right
    stepperX.moveTo(moveRight);    //set move
    if (digitalRead(9) == LOW) {   //if not pressed, kill loop
      stepperX.stop();
      break;
    }
    stepperX.run();
  }
}

, 👍1

Обсуждение

начните отладку, сократив код до перемещения CW на одну секунду ... остановитесь на одну секунду ... переместитесь на одну секунду ... остановитесь на одну секунду, @jsotola


1 ответ


1

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

Метод run должен вызываться постоянно, он запускает шаги. Поэтому я поместил его непосредственно в метод loop ().

Следующий прогон должен, надеюсь, переместить двигатель в положение 1000, если вы нажмете кнопку 8, в положение -1000, если вы нажмете кнопку 9, и останавливается, если обе кнопки выключены. У меня нет аппаратного обеспечения, доступного на данный момент, вы это просто слепое программирование. Используйте это как идею.

#include <AccelStepper.h>
AccelStepper stepperX(1, 3, 2);

void setup() 
{
  pinMode(8, INPUT)
  pinMode(9, INPUT);

  stepperX.setMaxSpeed(100.0);
  stepperX.setAcceleration(3.0);
}

int positivePosition = 1000;
int negativePosition = -1000;

void loop() 
{
  if ( digitalRead(8) == HIGH ) 
  { 
    stepperX.moveTo(positivePosition);
  }
  else if (digitalRead(9) == HIGH) 
  {
    stepperX.moveTo(negativePosition);
  }
  else
  {
    stepperX.stop();
  }
  stepperX.run();
}
,