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);
}

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
  }
}

}

最新更新