Skocz do zawartości

Linefollower - problem z kodem C


Pomocna odpowiedź

Napisano

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

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 😉

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