Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Arduino草图中,步进电机无法响应按钮传感器_Arduino - Fatal编程技术网

在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()是个打字错误,我更正了