Skocz do zawartości

Nie działająca funkcja if w Arduino


krzysztofg0813

Pomocna odpowiedź

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ć.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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ć.

Link do komentarza
Share on other sites

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ł.

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.