1

我正在使用该AccelStepper库来控制我的步进电机,但我很难弄清楚当我的按钮被按下时如何让我的电机停止。

一旦完成moveTo命令的整个运动,我可以让电机停止,但我无法让它在完成之前停止。我尝试使用嵌套在我用来让电机运行的 while 循环中的 if 语句,但没有骰子。

代码如下:

#include <AccelStepper.h>

const int buttonPin=4;  //number of the pushbutton pin

int buttonState=0;
int motorSpeed = 9600; //maximum steps per second (about 3rps / at 16 microsteps)
int motorAccel = 80000; //steps/second/second to accelerate
int motorDirPin = 8; //digital pin 8
int motorStepPin = 9; //digital pin 9
int state = 0;
int currentPosition=0;

//set up the accelStepper intance
//the "1" tells it we are using a driver
AccelStepper stepper(1, motorStepPin, motorDirPin); 

void setup(){  
    pinMode(buttonPin,INPUT);  
    stepper.setMaxSpeed(motorSpeed);
    stepper.setSpeed(motorSpeed);
    stepper.setAcceleration(motorAccel);
    stepper.moveTo(-12000); //move 2000 steps (gets close to the top)
}

void loop(){
    while( stepper.currentPosition()!=-10000)
        stepper.run();

    // move to next state
    buttonState = digitalRead(buttonPin);
    currentPosition=stepper.currentPosition();

    // check if the pushbutton is pressed.
    // if it is, the buttonState is HIGH:
    //if stepper is at desired location
    if (buttonState == HIGH ){//need to find a way to alter current move to command
        stepper.stop();
        stepper.runToPosition();
        stepper.moveTo(12000);
    }

    if(stepper.distanceToGo() == 0)
        state=1;

    if(state==1){
        stepper.stop();
        stepper.runToPosition();
        stepper.moveTo(12000);
    }
    //these must be called as often as possible to ensure smooth operation
    //any delay will cause jerky motion
    stepper.run();
}
4

2 回答 2

1

我不知道你是否已经想通了,但是我偶然发现了这个线程并注意到了一些可能会或可能不会解决你的问题的东西。我现在也在使用 accelstepper。

我感觉即使您使用 .stop 来停止电机,您仍然会分配一个新的目的地 (stepper.moveTo(12000)),之后您仍然在底部运行 stepper.run() 命令,导致步进器“向 12000 步运行”。也许试试这个?

uint8_t button_state = 0; // cf problem 1.
void loop() {
if (digitalRead(buttonPin) == HIGH) {
    if (button_state == 0) {
        stepper.stop();
        stepper.moveTo(12000);
        button_state = 1;
    }
} else {
    button_state = 0;
}
if (stepper.distanceToGo() == 0) {
    stepper.stop();
    stepper.moveTo(12000);
}
if(button_state = 0) {
    stepper.run();
}
}

我不知道这是否会起作用,但是这样一来,如果按下按钮,button_state 变量应该会阻止步进器在设置为 1 时运行。

希望这可以帮助,

只是一个路过的学生

于 2013-09-25T09:28:26.110 回答
0

我在您的代码中看到三个问题:

  1. 当您按下按钮时,它的状态将在您按下它HIGH 的整个过程中设置为,并且可以是几个循环。你最好使用一个状态变量来触发你想要在按钮按下一次时执行的操作。

  2. 查看文档,您正在使用stepper.runToPosition(),它会阻塞直到到达目的地。因此,您点击的次数越多,它就越可能被阻止。您最好只使用stepper.moveTo()andstepper.run()方法,该方法可以使用几个周期进行交互。

  3. 在循环开始时,您将代码块stepper.currentPosition设置为-10000. 因此,您肯定会一直阻塞直到它到达那里,从而消除每次loop()迭代的所有反应性。

你可以更好地完成你的loop()功能如下:

uint8_t button_state = 0; // cf problem 1.
void loop() {
    if (digitalRead(buttonPin) == HIGH) {
        if (button_state == 0) {
            stepper.stop();
            stepper.moveTo(12000);
            button_state = 1;
        }
    } else {
        button_state = 0;
    }
    if (stepper.distanceToGo() == 0) {
        stepper.stop();
        stepper.moveTo(12000);
    }
    stepper.run();
}
于 2013-06-29T23:14:55.527 回答