Skocz do zawartości

Linefollower - poprawa osiągów


Pomocna odpowiedź

Napisano

Witam

Po zrobieniu swojego pierwszego linefollowera i zaprogramowaniu, przeszedł on próby i.. spełnia swoje zadanie podążania za linią, jednak robi to zbyt wolno. Do tematu załączam filmik i kod programu. Aby robot się nie gubił muszę ustawić go na prędkość 300 (wypełnienie PWM),a jak to wygląda widać na filmiku. Moje pytanie brzmi co zrobić, aby to poprawić, bo przekonany jestem, że bez regulatora PI można tu jeszcze coś zdziałać(?). Robot to najprostsza wersja linefollowera, atmega8 mostek l293d silniki pololu hp 30:1 i 3 transoptory. Mam jeszcze wątpliwości, co do zasilania, gdyż widać przy obciążeniu jak wyświetlacz lcd przygasa. Przy zasileniu z komputera usb robot zachowuje się inaczej. Z góry dziękuje za porady

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

volatile int wynik1;
volatile int wynik2;
volatile int wynik3;

volatile int wejscie;

ISR(ADC_vect)    //obsługa przerwania od ADC
{
      switch(wejscie)
      {

        case 3://gdy PC3
          wynik2=ADC;     //czujnik lewy
          break;


         case 2://gdy PC2	czujnik prawy
           wynik1=ADC;     
           break;

         case 1://gdy PC1  srodkowy
           wynik3=ADC;     
           break;
      }

      if(wejscie<3)
           wejscie++;
      else
           wejscie=1;

      ADMUX = 0;  //kasowanie rejestru

      ADMUX  |= (1<<REFS0)| wejscie; //Ustawianie nowych wartości

}



   int main(void)
   {
       volatile char buffer[5];

	LCD_Initalize();

	DDRB |= (1<<PB1)|(1<<PB2);
	DDRB |= (1<<PB0)|(1<<PB3)|(1<<PB4)|(1<<PB5);
	DDRC= 0x00;

          //PWM
       TCCR1A |= (1<<WGM10)|(1<<WGM11);  
       TCCR1A |= (1<<COM1A1);
       TCCR1A |= (1<<COM1B1);
       TCCR1B |= (1<<CS11);



      //kierunek obrotu kol
       PORTB |= (1<<PB0)|(1<<PB5); // PB0 PB3 - lewe kolo
       PORTB &= ~(1<<PB3);		 // PB5 PB4 - prawe kolo
       PORTB &= ~(1<<PB4);

   //szybkosc obrotu kol
       OCR1A = 0;
	OCR1B = 0;


	//ADC ustawienie
	    ADCSRA |= (1<<ADEN) //ADEN=1 włączenie przetwornika ADC 
		       |(1<<ADPS0) // ustawienie preskalera na 8  
                  |(1<<ADPS1) 
			   |(1<<ADIE)
			   |(1<<ADFR)
			   |(1<<ADSC);


	ADMUX |= (1<<REFS0); 


			wejscie=1;
	sei();


	while(1)
       {





	 if (wynik2>800) {					//jesli czujnik lewy na lini



						OCR1A = 0;		//lewy silnik
						OCR1B = 300;	//prawy silnik
					   }

		else if (wynik1>800){			//jesli czujnik prawy na lini


					   OCR1A = 300;
					   OCR1B = 0;		
					   }

		else {		
 					//jesli prosta
					   OCR1A = 300;
					   OCR1B = 300;	};


	}

}

Brak wspomnianego filmiku 😉

Z takim programem dużo szybciej nie pojedziesz. Z czasem będziesz musiał zaimplementować PD.

Chciałem dodać tutaj na forum ale nie można ładować plików mp4. No mam nadzieję, że chociaż trochę szybciej da radę. Przy zasilaniu z komputera wygląda to płynniej, jednak często się "gubi".

Zdzisiek, samo podświetlanie wyświetlacza może zabijać twoją 9V baterię o silnikach już nie wspomnę. Zmień zasilanie na coś poważniejszego, dodaj kilka czujników więcej i można wtedy myśleć o przyspieszeniu robota.

Coś poważniejszego, czyli rozumiem, że akumulatorek Li-Pol? Jeśli chodzi o czujniki to gorzej z wymianą, chyba, że zamienił bym moją płytkę na np. taką botland A chcąc się upewnić: regulatora na te 3 czujniki nie ma sensu robić?

Możesz próbować, na pewno uzyskasz lepsze efekty, niż teraz.

Z szybkich porad:

- lepszy akumulator

- rozsuń trochę koła

- dodaj chociaż regulator P 😉

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