Skocz do zawartości

Line follower


klimek4765

Pomocna odpowiedź

Witam, udalo mi sie skleic line followera na 3 transoptorach CNY70, ciekawostka bylo ze napisanie kodu wedlug koncepcji, ze robot ma podazac za linia ktora "odbija" swiatlo transoptora powodujac jego przewodzenie (dawac 1), zajelo jakies 5 min.

Po chwili zastanowienia jak zrobic z tego co mam pod reka linieza ktora mialby podazac zdalem sobie sprawe ze w sumie mam do dyspozycji w domu tylko czarna matowa izolacje, i w zwiazku z tym robot bedzie podazal za linia ktora nie odbija swiatla (daje 0) i naklepanie tego kodu zajelo mi juz z 3 godziny 🤯

Moim pytaniem jest czy ten kod, mimo ze dziala, moze zostac jakos upakowany do zgrabniejszej wersji?


#include <avr/io.h>


int main(void)
{
/* Wszystkie linie portu D będą wyjściami do ktorych podlaczone sa silniki*/
DDRB  = 0xff;

/* linie PD1,PD2, PD3 będą wejściamiz podciągnięciem do VCC */
DDRD  = 0x00;
PORTD = 0b00001110; // tu sa podlaczone transoptory

/* Początek nieskończonej pętli */
while(1)
{
	/* 
				ROZKLAD CZUJEK
	   ------PD3------PD2------PD1-------

	   */

	/* Jeśli lewa czujka wykrywa linie a pozostale dwie przewodza  */
	if(!((PIND &=~_BV(PD3)))&&(!((PIND &=_BV(PD2)))&&(!((PIND &=_BV(PD1))))))
	{
		 PORTB =0b00000100; //skret w lewo

	}



	/* Jeśli prawa czujka wykrywa linie a pozostale dwie przewodza*/
	if(!((PIND &=_BV(PD3)))&&(!((PIND &=_BV(PD2)))&&(!((PIND &=~_BV(PD1))))))
	{
		 PORTB =0b00000010; //skret w prawo

	}

	/* Jeśli srodkowa czujka wykrywa linie a pozostale dwie przewodza*/
	if(!((PIND &=_BV(PD3)))&&(!((PIND &=~_BV(PD2)))&&(!((PIND &=_BV(PD1))))))
	{

		PORTB =0b00000110; //jazda do przodu
	}

	// w razie skretu linii 90 stopni w lewo
		if(!((PIND &=~_BV(PD3)))&&(!((PIND &=~_BV(PD2)))&&(!((PIND &=_BV(PD1))))))
		{
			PORTB =0b00000100; //skret w lewo
		}
		// w razie skretu linii 90 stopni w prawo
		if(!((PIND &=_BV(PD3)))&&(!((PIND &=~_BV(PD2)))&&(!((PIND &=~_BV(PD1))))))
		{
			PORTB =0b00000010; //skret w prawo
		}
}
}

generalnie kierowalem sie ta koncepcja:

while (1)
{
   if((LEFT_SENSOR==1)&&(CENTER_SENSOR==0)&&(RIGHT_SENSOR==1))
       LATB |= GO_FRONT; // Case 1
   if ((LEFT_SENSOR==0)&&(CENTER_SENSOR==1)&&(RIGHT_SENSOR==1))
       LATB |= TURN_RIGHT // Case 2
   if ((LEFT_SENSOR==1)&&(CENTER_SENSOR==1)&&(RIGHT_SENSOR==0))
       LATB |= TURN_LEFT // Case 3
   if ((LEFT_SENSOR==1)&&(CENTER_SENSOR==1)&&(RIGHT_SENSOR==1))
       LATB |= STOP; // case 4
}// End of while(1
[quote][/quote]

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

Tak. PID.

Ogólnie chodzi o to że każdy czujnik ma masę, sumujesz te pod którymi jest linia i dzielisz przez ich ilość, a potem za pomocą odrobiny matematyki wyliczasz wartości dla silników

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

Ogólnie chodzi o to że każdy czujnik ma masę, sumujesz te pod którymi jest linia i dzielisz przez ich ilość, a potem za pomocą odrobiny matematyki wyliczasz wartości dla silników

Dla ścisłości, nie masę, a wagę, bo to średnia ważona 🙂

  • Lubię! 1
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.