2

ロボットを一定のステップ数だけ動かしてから停止させたい。ただし、ループは無限に実行されているように見えます。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);
}
4

2 に答える 2

1

関数はloop()無限ループ内で実行されます(Arduino IDEに付属しているメインのcppファイルを確認すると、次のように表示されます。

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

したがって、関数の呼び出しをに入れてmoveForward()空の関数setup()を作成するか、の後に内部から呼び出します。最初のアプローチは次のようになります。loop()exit(0);loop()moveForward()

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

    moveForward(5);
}

void loop()
{
}

そして2番目のものは次のようになります:

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

void loop()
{
    moveForward(5);
    exit(0);
}
于 2012-12-19T22:59:59.530 に答える
0

最終的には、ロボットを5ステップだけ動かす以上のことをしたいと思うかもしれないので、可変フラグを使用してロボットの状態を保持することをお勧めします。フラグがtrueに設定されている場合にのみ、移動ルーチンを実行します。

シリアルを使用している場合、移動コマンドを受信したとき(およびステップ数、方向はおそらく?)、フラグを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
  }
}

}

于 2012-12-20T02:00:16.030 に答える