有麻烦我的步进电机在Arduino的草图我的按钮传感器响应(Having trouble getti

2019-09-28 00:03发布

我使用的AccelStepper库来控制我的步进电机,和我有困难,搞清楚如何得到我的电机停止时,我的按钮被按下。

我可以让电机停止,一旦它从完成其整个运动moveTo命令,但我不能让它停止在完成之前。 我已经使用如果嵌套while循环中的语句我使用,使电动机运行,但没有骰子尝试。

因为它代表的代码如下:

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

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


Answer 2:

我不知道你是否已经理解了它了,但我偶然发现了这个线索,并发现了一些可能会或可能不会解决你的问题。 我与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设置运行。

希望这可以帮助,

只是一个路过的学生



文章来源: Having trouble getting my stepper motor to respond to my button sensor in Arduino sketch
标签: arduino