Skocz do zawartości

Nie działająca funkcja if w Arduino


Pomocna odpowiedź

Napisano

Witam, mam następujący problem napisałem kod na arduino uno r3 sterujący robotem omijającym przeszkod. Wszystko fajnie działa, oprócz funkcji if. Program pobiera dane z czujnika odległości ultradźwiękowego i zapisuje je w zmiennej( odczyt jest prawidłowy sprawdziłem) funkcja if ma za zadanie porównać wartość tej zmiennej z 20 i jeśli jest mniejsza wyłączyć prawy silnik i tego mim tego, że odczyt jest mniejszy nadal kręcą się dwa silniki. W czym problem jakiś mój głupi błąd w programie czy coś innego.

#define trig 8
#define echo 9

int lp=2;
int lt=3;
int pp=4;
int pt=5;
int dist;

void setup() {
 pinMode(lp, OUTPUT);
 pinMode(lt, OUTPUT);
 pinMode(pp, OUTPUT);
 pinMode(pt, OUTPUT);
 pinMode(trig, OUTPUT);
 pinMode(echo, INPUT);
 Serial.begin(9600);
}

void przod() {
 digitalWrite(lp, HIGH);
 digitalWrite(lt, LOW);
 digitalWrite(pp, HIGH);
 digitalWrite(pt, LOW);
}

void tyl() {
 digitalWrite(lp, LOW);
 digitalWrite(lt, HIGH);
 digitalWrite(pp, LOW);
 digitalWrite(pt, HIGH);
}

void hamulec() {
 digitalWrite(lp, LOW);
 digitalWrite(lt, LOW);
 digitalWrite(pp, LOW);
 digitalWrite(pt, LOW);
}

void prawo() {
 digitalWrite(lp, HIGH);
 digitalWrite(lt, LOW);
 digitalWrite(pp, LOW);
 digitalWrite(pt, LOW);
}

void lewo() {
 digitalWrite(lp, LOW);
 digitalWrite(lt, LOW);
 digitalWrite(pp, HIGH);
 digitalWrite(pt, LOW);
}

void loop() {
 przod();
 int czas;
 digitalWrite(8, HIGH);
 delayMicroseconds(1000);
 digitalWrite(8, LOW);
 czas = pulseIn(9, HIGH);
 dist = (czas/2) / 29.1;
 Serial.println(dist);

 if(dist<20) {
   lewo();
 }
} 

__________

Komentarz dodany przez: Treker

Kod programu, dla lepszej czytelności, należy umieszczać w tagach .

Proszę to poprawić.

Na początku procedury loop() zawsze uruchamiasz oba silniki:

void loop() { 
  przod(); 

Sprawdzenie, czy odległość jest mniejsza niż 20 wstawiłeś na końcu:

 if(dist<20) { 
   lewo(); 
 }
} 

Musisz pamiętać, że loop() jest wykonywana w pętli, czyli zaraz jak się skończy, rozpoczyna się na nowo. Więc jeśli ostatnią funkcją jest wyłączenie prawego silnika (lewo()), to kilka mikrosekund później procedura loop() zostanie uruchomiona od początku i włączy oba silniki wywołaniem przod();

Nawet nie zauważasz momentu wyłączenia silnika, ponieważ trwa to bardzo krótko, musiałbyś połączyć oscyloskop żeby to zaobserwować.

Dziękuje jakieś opóźnienie rozwiąże problem np.

If(dist<20) {
lewo();
delay(2000);
}

Albo  

if(dist<20) {
lewo();
}
delay (2000);

__________

Komentarz dodany przez: Nawyk

Używaj, proszę, znaczników [ code] i [ /code]

Musisz najpierw zrozumieć jak ten program działa. Nie ma sensu wpisywanie poleceń losowo, ani przepisywanie gotowego kodu. To bardzo prosty problem, jestem pewien że jak poświęcisz chwilę na zastanowienie to sam go rozwiążesz. Dostałeś podpowiedź - każesz robotowi skręcać, a za chwilę jechać prosto.

Jeśli jednak problem okaże się za trudny, to nie poddawaj się. Wróć do nauki programowania, poznaj podstawy, poćwicz na czymś łatwiejszym. A jak już opanujesz podstawy, to sam zobaczysz jak prosty jest problem który teraz chcesz żeby ktoś inny za Ciebie rozwiązał.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...