Skocz do zawartości

[C] Problem gdy lf zgubi linie


Pomocna odpowiedź

Napisano

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

   }

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

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?

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

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.

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