我正在使用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时运行。
希望这能有所帮助,
只是路过的学生
我在您的代码中看到三个问题:
-
当你按下按钮时,它的状态将在你按下它的整个时间内设置为
HIGH
,并且它可以是几个循环。您最好使用一个状态变量,该变量只触发您想在按下按钮时执行的操作一次。 -
查看文档,您使用的是
stepper.runToPosition()
,它会阻塞直到到达目的地。所以你点击得越多,它就越有可能被屏蔽。您最好只使用stepper.moveTo()
和stepper.run()
方法,这样可以使用几个循环进行交互。 -
在循环开始时,您制作代码块,直到
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();
}