移动机器人设定的步数(Arduino)

时间:2012-12-19 22:55:26

标签: c arduino

我想让我的机器人移动一定数量的步骤,然后让它停下来。然而,循环似乎无限地运行。我使用void loop()的方式是否存在错误,或者可能是我编写'for'循环的方式?

    // walkerForward.pde - Two servo walker. Forward.
// (c) Kimmo Karvinen & Tero Karvinen http://BotBook.com
// updated - Joe Saavedra, 2010
#include <Servo.h> 

Servo frontServo;  
Servo rearServo;  
int centerPos = 90;
int frontRightUp = 75;
int frontLeftUp = 120;
int backRightForward = 45;
int backLeftForward = 135;

void moveForward(int steps)
{
  for (int x = steps; steps > 0; steps--) {
    frontServo.write(centerPos);
    rearServo.write(centerPos);
    delay(100);
    frontServo.write(frontRightUp);
    rearServo.write(backLeftForward);
    delay(100);
    frontServo.write(centerPos);
    rearServo.write(centerPos);
    delay(100);
    frontServo.write(frontLeftUp);
    rearServo.write(backRightForward);
    delay(100);
  }
}


void setup()
{
  frontServo.attach(2);
  rearServo.attach(3);
}

void loop()
{
    moveForward(5);
}

2 个答案:

答案 0 :(得分:1)

loop()函数在无限循环内执行(如果你检查Arduino IDE附带的主cpp文件,你会看到类似的东西:

int main()
{
    setup();
    for (;;) {
        loop();
    }
    return 0;
}

因此,要么将moveForward()函数的调用发送到setup()并将loop()作为空函数,要么在exit(0);之后调用loop() moveForward() 1}}。第一种方法如下:

void setup()
{
    frontServo.attach(2);
    rearServo.attach(3);

    moveForward(5);
}

void loop()
{
}

第二个看起来像这样:

void setup()
{
    frontServo.attach(2);
    rearServo.attach(3);
}

void loop()
{
    moveForward(5);
    exit(0);
}

答案 1 :(得分:0)

由于您可能希望最终只需要移动机器人5步,我建议使用变量标志来保持机器人状态。它仅在标志设置为true时执行移动例程。

如果您正在使用serial,当收到移动命令(以及步数,方向可能?)时,将标志设置为true,然后发出move命令。如果您使用传感器或按钮,则适用相同的逻辑。

在发生移动时,您需要一些逻辑来处理传入的移动命令(尽管使用紧密的移动循环,除非您使用中断,否则您实际上将无法响应传入的命令 - 但您想要考虑这种情况如果你打算建立一个完整的移动位固件,那就好了。

boolean shouldMove;

void setup()
{
 shouldMove = true;//set the flag
}

void loop()
{
  if (shouldMove){
    moveForward(5);
  }
}


void moveForward(int steps)
{
 shouldMove = false; //clear the flag
  for (int x = steps; steps > 0; steps--) {
   // tight loop controlling movement
  }
}

}