2014-12-10 3 views
0

나는 인코더 피드백 로봇을 가지고 있고, 나는, 일정 거리 로봇을 이동 기능을 사용하고 그것을 특정 각도를 켜려고합니다 그래서 예를 들면 :로봇을 일정 거리 이동하고 센서를 관리하는 방법은 무엇입니까?

void loop(){ 

    if (Obstacle==false){ // if no obstacles 

     forward(1000); // move forward 1000 mm 
     backward(1000); // move backward 1000 mm 

     //... 
    } 
} 

전달 기능 :

void forward(int distance){ // distance in mm 

    int desiredRotationNumber= round(distance/circumference) ; 

    int desiredTicks = encoderResolution * desiredRotationNumber; 

    if (counter < desiredTicks) // variable counter counts the pulses from the encoder 
    { 
     analogWrite(motor,255); 
    } 
    else 
    { 
     analogWrite (motor,0); 
    } 

} 

문제는 "if"조건을 사용하면 전달 함수가 한 번만 실행되고 프로그램은 다음 함수로 점프하지만 "while 루프"를 사용하면 이동 함수가 올바르게 실행되지만 실행되지 않습니다. 센서 등을 관리 할 수 ​​있어야합니다. , 비동기 작업 (이동 감지) 그 작업을 만들 수있는, 멀티 스레딩으로

while (distance > 0 && !Obstacle){ 
    forward(step); 
    distance-=step; 
    check_sensors(); 
} 

:

답변

2

은 당신이 아마 원하는 것은 단위로 사용자의 움직임을 차단하고, 이러한 증가의 각 사이에 센서를 확인하는 것입니다 변경 사항의 각 스레드에 경고하는 일종의 이벤트 게시를 사용하십시오. 여기서는 작업을 상호 연결하여 해당 기능을 시뮬레이트합니다 (유사하지만 더 효과적인 아이디어를 위해 코 루틴을 조사 할 수도 있음).

+0

감사합니다. 내 이동 기능에서 아무도 장애물을 찾지 못했지만 기능이 작동하지 않으면 어떻게 될까요? 내가 멈춘 마지막 이동 기능에서 이동 방향 집합을 어떻게 다시 시작할 수 있습니까? – Apastrix

+0

진행중인 이동 목록 (링크 된 목록 일 수도 있습니다)을 저장하는 메커니즘이 필요하고 하나씩 차례로 가져 오는 것이 좋습니다. 목록에서 쉽게 다시 시작할 수 있습니다. – didierc

+0

나는 머리를 숙이고 이것을 다시 시도 할 것이다. 다시 감사한다. – Apastrix