Skocz do zawartości

[C] Problem gdy lf zgubi linie


Grabki

Pomocna odpowiedź

Witajcie!

Zbliżają się zawody we Wrocławiu i bardzo chciałbym w nich wystartować. Od ponad pół roku specjalnie buduję robota, swojego pierwszego robota (nie licząc nieudanego światłoluba). Jest to linefollower.

Udało mi się już go uruchomić, ba już jeździ - sterują nim instrukcje na if'ach. Jednak przed jego budową postanowiłem dowiedzieć się co to jest ten cały tajemniczy PID. Napisałem instrukcji, które miałby nim sterować za pomocą tegoż to algorytmu. Na początek postanowiłem użyć samego członu P. Gdy robot jest nad linią to nie ma problemu, koła reaguję zmianą prędkości, Jednak gdy linia znajdzie się poza czujnikami, to oba koła jadą równą prędkością, a powinno jedno koło zwolnić jeszcze bardziej niż prędzej. Siedzę nad kodem już kilka godzin, kombinuję i nić. Dlatego postanowiłem poprosić Was o pomoc. Czy moglibyście zerknąć na kod poniżej? Co robię źle?

Z góry dzięki za pomoc.

Oto część kodu odpowiedzialna za wykrywanie lini:

while(1)
{

	pozycja = 0;
	ilosc = 0;

	//sprawdzenie czujników
	if(PINC & cz1)
	{
		pozycja -= 4;
		ilosc++;
	}

	if(PINC & cz2)
	{
		pozycja -= 2;
		ilosc++;
	}

	if(PINC & cz3) ilosc++;

	if(PINC & cz4)
	{
		pozycja += 2;
		ilosc++;
	}

	if(PINC & cz5)
	{
		pozycja += 4;
		ilosc++;
	}

	if(!ilosc)				//sprawdzenie czy jakś czujnik w ogóle wykrył linie
	{
		ilosc = 1;
		if(ppozycja < 0) pozycja = -8;
		else pozycja = 8;

	}

	ppozycja = pozycja;
	pozycja = pozycja / ilosc;		//obliczanei pozycji wg. wskazań czujników


... PID i sterowanie silnikami ...

   }
Link do komentarza
Share on other sites

Z prostego powodu - pozycja na starcie jest 0, więc jak żaden czujnik nie wykryje linii to taka też pozycja wychodzi z tej funkcji i robot jedzie prosto.

Zrób tak, że jak żaden z czujników nie wykrywa linii to nowa pozycja = starej pozycji (która powinna być maksymalnie wychylona w lewo lub prawo - w zależności od tego gdzie ostatnio była linia). To załatwi sprawę.

PS. Samo P jest słabe. Dorzuć resztę...

Link do komentarza
Share on other sites

MirekCz,

On chyba ma tam pamiętanie:

if(!ilosc)                //sprawdzenie czy jakś czujnik w ogóle wykrył linie
       {
           ilosc = 1;
           if(ppozycja < 0) pozycja = -8;
           else pozycja = 8;

       } 
ppozycja = pozycja;
       pozycja = pozycja / ilosc;

domyślam się, że ppozycja, to poprzednia pozycja...

Może więcej komentarzy do kodu?

Link do komentarza
Share on other sites

W sumie o to chodziło, chociaż nie używaj warunków typu (!ilość), bo można się łatwo przejechać i nie wiadomo na pierwszy rzut oka o co chodzi. Zawsze lepiej zrobić warunek typu if ( ilosc == 0 ) .

W sumie nie wiem dlaczego to nie działa, wyprowadź ten warunek na ilosc na jakąś diodę led i zobacz czy on działa tak jak się spodziewasz...

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

Wstawiłem do instrukcji odpowiedzialnej za brak linii sterowanie diodą. Zadziałało. Szukałem dalej, i okazło się, że zapomniałem zabezpieczyć OCR1A i OCR1B przed zapisaniem większej wartości niż 255. Dzięki.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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