2012-12-19 3 views
2

로봇을 설정된 수만큼 이동 한 다음 정지 시키려고합니다. 그러나 루프는 무한히 실행되는 것처럼 보입니다. 내가 void loop()를 사용하는 방식에 실수가 있습니까? 아니면 아마도 'for'루프를 작성한 방식으로 오류가 있습니까?로봇 세트 이동 수 (Arduino)

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

답변

1

당신은 아두 이노 IDE와 함께 제공, 당신은 같은 것을 볼 수 있습니다 주요 CPP 파일을 확인하면 loop() 기능 (무한 루프에서 실행 : 그래서 중 하나를 넣어

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

setup()moveForward() 함수를 호출하고 loop()에게 빈 기능을 만들거나 moveForward()loop() 내에서 exit(0);를 호출 첫 번째 방법은 다음과 같습니다.

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

    moveForward(5); 
} 

void loop() 
{ 
} 

는 그리고 두 번째는 다음과 같습니다 : 당신은 아마 결국 로봇을 불과 5 단계를 이동보다 더 많은 일을 할 것이기 때문에

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

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

그 출구 (0)이 지원되지 않습니다 생각합니다. "for (;;) {}"를 사용하는 것이 더 좋습니다. –

+0

@EranW [지원됩니다.] (http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga137096a48cc0c731052cadfb69c39b34) –

+0

하나 OP가 로봇이 결국 5 단계 이상을 이동하여 프로그램을 종료하기를 원하기 때문에이 대답은 좋은 방법이 아닙니다. –

0

, 나는 로봇의 상태를 유지하는 변수 플래그를 사용하는 것이 좋습니다 것입니다. 플래그가 true로 설정된 경우에만 이동 루틴을 실행합니다.

시리얼을 사용하는 경우 이동 명령을 받았을 때 (그리고 단계 수, 아마도?) 플래그를 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 
    } 
} 

}