Skocz do zawartości

Pomocna odpowiedź

Napisano

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

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

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

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