Skocz do zawartości

Linefollower - problem z kodem C


tabbi

Pomocna odpowiedź

Witam,

po wielu trudach udało się wreszcie odpalić pierwszego robota cały działa jednak jest problem z kodem otóż nie działa jak na leży, gdyby były możliwe jakieś wskazówki co do kodu - zamieszczam kod który teraz obsługuje robota.

/* przykład 2.1 "leds.c" */
/* 8 diod LED przłączonych do portu D */
/* ATmega 1MHz */

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>

int opoznienie(){
for(char i = 0; i < 50; i++) 
     _delay_ms(10);
  return 0;
}

int main(void)
{   

//wyjscia także do Mostka
DDRD=0xff;

//wyjscia Mostka H
DDRB=0xff;

DDRC=0x00;

//wejscia CZUJNIKÓW
//  DDRC  = 0x00;

PORTB |= _BV(1); 
PORTB |= _BV(2); 


 while(1){

//2 lewy czujnik
//4 srodkowy czujnik
//5 prawy czujnik





// STEROWANIE CZUJNIKAMI

//skrecanie w lewo
if(!(PINC & 1 << 5) && !(PINC & 1 << 4) && (PINC & 1 << 2))
{
PORTD &= ~_BV(2);  // LEWY silnik w przod OFF 
 _delay_ms(40);
 PORTD |= _BV(0);   // PRAWY SILNIK W przod ON
}

//gdy tylko z lewej wykrywa czujnik
if(!(PINC & 1 << 5) && (PINC & 1 << 4) && (PINC & 1 << 2))
{
PORTD &= ~_BV(2);  // LEWY silnik w przod OFF 
 _delay_ms(40);
 PORTD |= _BV(0);   // PRAWY SILNIK W przod ON
}


//skrecanie w prawo
if((PINC & 1 << 5) && !(PINC & 1 << 4) && !(PINC & 1 << 2))
{
PORTD |= _BV(2);  // LEWY silnik w przod ON
 _delay_ms(40);
 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod OFF
}

// gdy tylko z prawej wykrywa czujnik
if((PINC & 1 << 5) && (PINC & 1 << 4) && !(PINC & 1 << 2))
{
PORTD |= _BV(2);  // LEWY silnik w przod ON
 _delay_ms(40);
 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod OFF
}
/*	
//jesli nie wykrywa linii krecimy sie w kolko do tylu
if(!(PINC & 1 << 5) && !(PINC & 1 << 3) && !(PINC & 1 << 4))
{
PORTD |= _BV(3); // LEWY silnik w tyl ON
 _delay_ms(40);
 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod OFF
}



*/

// PRAWY SILNIK
 // PORTD |= _BV(0);   // przod
//	_delay_ms(10000);
 //  PORTD &= ~_BV(0);  // prawy silnik w przod off


  // PORTD |= _BV(1);   // tyl
	//_delay_ms(1000);
  //PORTD &= ~_BV(1);  // lewy silnik w tyl OFF 



/*
//LEWY SILNIK
   PORTD |= _BV(2);   // przod 
  _delay_ms(10000); 
   PORTD &= ~_BV(2);  // prawy silnik w przod OFF 


   PORTD |= _BV(3);   // tyl
  _delay_ms(10000);
  PORTD &= ~_BV(3);  // prawy silnik w tyl OFF 
*/

 }
}

Sterownie PWM na dole, jednak problem jest w tym że na sucho robot wykrywa czarna linie na białej kartce czy to czujniki lewe czy to czujniki prawe jednak przy puszczeniu go praktycznie nie skreca w prawo i lewe w poszukiwaniu linii a raczej kreci sie ciagle w kolko.

Jakby ktoś pomógł w kodzie czy to wskazówkach dotyczących kodu

Link do komentarza
Share on other sites

Robot może podskakiwać przy ruszaniu,m co powoduje zmainę odległości czujnikòw od podłoża co uniemożliwia prawidłowe wykrywanie linii.

Poza tym polecam ADC I autokalibracjé, chociaż na początek 😉

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.