我想将机器人移动一个设定的步骤,然后将其停止。但是,循环似乎无限地运行。我使用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);
}
loop()
函数是在无限循环中执行的(如果您检查使用Arduino IDE寄发的主要CPP文件,您会看到类似的东西:
int main()
{
setup();
for (;;) {
loop();
}
return 0;
}
因此,要么将呼叫拨打到您的moveForward()
函数到setup()
并使loop()
成为空功能,要么在moveForward()
之后从loop()
中调用exit(0);
。第一种方法看起来像:
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);
}
,因为您可能最终想做的不只是移动机器人仅5个步骤,我建议使用一个变量标志来保持机器人状态。仅当将标志设置为真时,它才能执行运动例程。
如果您使用的是序列号,则在接收到移动命令时(可能的步骤数,方向?),您将标志设置为true,然后发出移动命令。如果您使用的是传感器或按钮,则使用相同的逻辑。
您将需要一些逻辑来处理动作时传入的运动命令(尽管有紧密的动作循环,除非您使用中断,否则您实际上将无法响应传入的命令 - 但是您想考虑此类命令如果您打算建立完整的固件动作)。
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
}
}
}