Poprawne zapisanie pętli while, sterującej ruchem robota

0

Witam. Zacząłem się bawić w programowanie robotów Lego Mindstorms i mam pewnie problem. Otóż próbuję stworzyć coś przy pomocy pętli while, ale za cholerę nie mogę ogarnąć, co może być nie tak. Wydaje mi się, że powinno być wszystko dobrze, ale jednak nie jest.

Oto kod:

task main()
{

  while(SensorValue[touch] == 0)
  {
  	motor[leftMotor] = 100;
  	motor[rightMotor] = 100;

  }
  motor[leftMotor] = -50;
  motor[rightMotor] = -50;
  wait1Msec(1000);
}

Chodzi o to, że robot ma jechać dopóki nie wykrywa żadnego dotyku na czujniku. Jak wykryje, to ma się zacząć cofać, a w tej chwili dzieje się, tak, jakby całkowicie omijał pętlę i od razu cofa. Już kompletnie zgłupiałem i postanowiłem poradzić się na forum.

Problem leży na pewno w czymś bardzo banalnym, więc proszę nie bić, bo dopiero zaczynam :)

dodanie znacznika <code class="cpp"> - furious programming

0

A próbowałeś True lub False zamiast zera w warunku while-a? Być może ten sensor false (czyli zero) wysyła kiedy jest dotknięty, i stąd while się nie wykonuje.

0

jezeli omija petle to zrob

while(SensorValue[touch] != 0)
0

Właśnie teraz sprawdziłem i tak:

  • jak jest true, to wykonuje szarpnięcie do przodu ( jak dorzucę jakiś czas, np. wait1Msec ( 1000 ), to przez sekundę będzie jechał do przodu i zaczyna cofać - nie zapętla w ogóle
  • jak jest false, to od razu do tyłu jedzie.

@up
To też teraz sprawdziłem i dzieje się dokładnie tak samo, jak w przypadku " true ".

0

Wydaje mi się, że sensor działa na zasadzie przycisku a nie przełącznika czyli jest naciśnięty to ma wartość inną niż 0 a kiedy puszczony zero, aby wykrywać zmianę stanu musiałbyś nieustannie sczytywać wartość tego sensora i np. ustawić flagę czy jechać do przodu czy do tyłu na jego podstawie.
Widział bym to mniej więcej tak:

 
task main()
{
  int dir;
  dir = 1;
  while(true)
  {
     if (SensorValue[touch] != 0)
       dir = dir * -1;

    motor[leftMotor] = 100 * dir;
    motor[rightMotor] = 100 * dir;
    wait1Msec(1000); 
  }

}

Przy możliwej zmianie stanu co sekundę.

//mała pomyłka zmieniłem kod, ale dalej nie testowany

1 użytkowników online, w tym zalogowanych: 0, gości: 1