在Arduino草图中,步进电机无法响应按钮传感器
我正在使用在Arduino草图中,步进电机无法响应按钮传感器,arduino,Arduino,我正在使用AccelStepper库来控制我的步进电机,我很难弄清楚如何在按下按钮时让电机停止 我可以在电机从moveTo命令完成整个移动后使其停止,但无法在完成之前使其停止。我尝试使用嵌套在while循环中的if语句来让马达运行,但没有骰子 #包括 const int buttonPin=4//按钮销的编号 int buttonState=0; int电机速度=9600//每秒最大步数(约3转/秒,16微步) int motorAccel=80000//步数/秒/秒加速 int motorD
AccelStepper
库来控制我的步进电机,我很难弄清楚如何在按下按钮时让电机停止
我可以在电机从moveTo
命令完成整个移动后使其停止,但无法在完成之前使其停止。我尝试使用嵌套在while循环中的if语句来让马达运行,但没有骰子
#包括
const int buttonPin=4//按钮销的编号
int buttonState=0;
int电机速度=9600//每秒最大步数(约3转/秒,16微步)
int motorAccel=80000//步数/秒/秒加速
int motorDirPin=8//数字引脚8
int motorStepPin=9//数字引脚9
int state=0;
int currentPosition=0;
//设置加速器步进电机
//“1”表示我们正在使用驱动程序
加速步进器步进器(1,motorStepPin,motorDirPin);
无效设置(){
pinMode(按钮输入,输入);
步进电机。设置最大速度(电机速度);
步进电机。设定速度(电机速度);
步进电机。设置加速(电机加速);
stepper.moveTo(-12000);//移动2000步(接近顶部)
}
void循环(){
而(stepper.currentPosition()!=-10000)
stepper.run();
//移到下一个州
buttonState=digitalRead(buttonPin);
currentPosition=stepper.currentPosition();
//检查按钮是否按下。
//如果是,则按钮状态为高:
//如果步进器位于所需位置
如果(buttonState==HIGH){//需要找到一种方法来改变当前的move to命令
步进器。停止();
步进器。运行位置();
步进电机。移动到(12000);
}
if(步进器距离多哥()==0)
状态=1;
如果(状态==1){
步进器。停止();
步进器。运行位置();
步进电机。移动到(12000);
}
//必须尽可能经常调用这些命令,以确保顺利运行
//任何延迟都会导致运动不平稳
stepper.run();
}
我发现您的代码中有三个问题:
高
,并且可以是多个循环。您最好使用一个状态变量,该变量只触发一次按键操作stepper.moveTo()
和stepper.run()
方法,该方法允许使用几个周期进行交互stepper.currentPosition
到达-10000
。因此,在它到达之前,您肯定在阻塞,在每次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();
}
我发现您的代码中存在三个问题:
高
,并且可以是多个循环。您最好使用一个状态变量,该变量只触发一次按键操作stepper.moveTo()
和stepper.run()
方法,该方法允许使用几个周期进行交互stepper.currentPosition
到达-10000
。因此,在它到达之前,您肯定在阻塞,在每次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();
}
我不知道你是否已经弄明白了,但我偶然发现了这个线索,并注意到了一些可能解决或可能解决不了你的问题的东西。我现在也在和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();
}
}
我不知道这是否会起作用,但这样,如果按下按钮,按钮\状态变量应该会阻止步进机在设置为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();
}
}
我不知道这是否会起作用,但这样,如果按下按钮,按钮\状态变量应该会阻止步进机在设置为1时运行
希望这有帮助
只是一个路过的学生我断断续续地试图让程序接受状态机类型的运行模式,但出于某种原因,它拒绝这样做。虽然您的代码修复了我的一些问题,但出于某种原因,它仍然不响应按钮输入。我会继续改进它,让它做我想做的事情,但到目前为止,我还没有让它做我想做的事情。另外,不确定while loop()是什么意思,您的意思是在主循环运行时运行它吗?素描并不完全接受你在那里所做的,尽管我喜欢它的想法。嗯。。。我看到了你的评论,忘了发布答案,对不起:-s while loop()是个打字错误,我更正了