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

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.