我想让我的机器人移动一定数量的步骤,然后让它停下来。然而,循环似乎无限地运行。我使用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);
}
答案 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
}
}
}