在Arduino草图中,我的步进电机无法响应按钮传感器



我正在使用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();
}

我不知道你是否已经弄清楚了,但我偶然发现了这个线程,并注意到一些可能解决也可能解决不了你的问题的东西。我现在也在和accelstepper一起工作。

我有一种感觉,即使你使用.stop来停止电机,你仍然在分配一个新的目的地(steper.moveTo(12000)),之后你仍然运行底部的steper.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时运行。

希望这能有所帮助,

只是路过的学生

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

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

  2. 查看文档,您使用的是stepper.runToPosition(),它会阻塞直到到达目的地。所以你点击得越多,它就越有可能被屏蔽。您最好只使用stepper.moveTo()stepper.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();
}

最新更新