难以让我的步进电机响应Arduino草图中的按钮传感器

时间:2013-06-29 22:09:25

标签: arduino

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

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

The code as it stands is as follows:

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

2 个答案:

答案 0 :(得分: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时运行。

希望这有帮助,

刚过学生

答案 1 :(得分:0)

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

  1. 当你按下按钮时,它的状态将被设置为HIGH 整个时间你按下它,它可以是几个循环。你最好使用一个状态变量来触发按钮按下你想要做的一次。

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

  3. 在循环开始时,您将进行代码阻止,直到stepper.currentPosition到达-10000。所以你肯定会阻塞它,直到它到达那里,删除每loop()次迭代的所有反应。

  4. 您最好按照以下方式使用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();
    }