Skocz do zawartości
BlackSkill

Kod linefollower - Kąty proste.

Pomocna odpowiedź

Cześć. Nie jest to mój kod tylko jednej osoby z forum. Większość w nim rozumiem.

Problemy mam z kątami prostymi. Lf wykręci na nich tylko z wyłączoną tą linijką.

Macie jakiś pomysł co poprawić ?

/* zgubienie trasy*/
	if(LS<prog && L<prog && S<prog && P<prog && PS<prog )
	{
		lewy(0,100);
		prawy(0,100);
	}

1. Do czego jest ICR1 w konfiguracji pwm. ? Na necie nikt tego nie konfiguruje.

2. Z innej beczki. Lepiej żeby czujniki były 10 cm od kół czy 5cm.

KOd : http://pokazkod.pl/b732cb581db56fd6e313a83468febc5c0777134198a6262375

Udostępnij ten post


Link to post
Share on other sites

Patrząc tylko na ten fragment kodu. Robot nie "widząc" linii żadnym czujnikiem porusza się w jednym kierunku przy stałej prędkości. Jeśli natrafi na kąt prosty, to z całą pewnością nie obróci się w miejscu, tylko przejedzie odrobinę dalej (z powodu bezwładności) i.... nie będzie widział linii żadnym czujnikiem.

Co wtedy zrobi, jeśli będziesz miał taki kod w programie? Ano, pojedzie prosto.

Możesz pokombinować tak: jeśli widzisz linię na którymś ze skrajnych czujników, to Twój robot będzie zakręcał w odpowiednim kierunku do momentu, kiedy nie zobaczy linii którymś z czujników "środkowych". Proste i skuteczne.

Co do odległości czujników od kół to są tu lepsi spece od LF, więc oddaję im głos 😉

Udostępnij ten post


Link to post
Share on other sites

Ogólnie, co do odległości nie ma złotej reguły. W szybkich, płynnie jeżdżących robotach zdecydowanie należy stawiać na duże odległości. Jednak w pierwszych, niekoniecznie szybkich robotach nie warto przesadzać z tym parametrem. Ustaw tyle ile wychodzi z budowy robota, pod warunkiem, że jest to wartość zbliżona do rozstawu kół - to powinna być optymalna odległość.

W programie musisz zapamiętywać, który czujnik widział poprzednio linie. Gdy pojazd zjedzie z trasy na podstawie zapamiętanej wartości będziesz wiedział, w którą stronę należy jechać, aby wrócić do linii.

Udostępnij ten post


Link to post
Share on other sites

Siedziałem nad tym dwie godziny. Korzystałem z tego , lecz nic nie dałem rady napisać

https://forbot.pl/blog/artykuly/podstawy/algorytm-linefollowera-c-poczatkujacych-id2722

Wiem że muszę zapisać odczyty z czujników do tablicy znaków. Próbowałem to zrobić lecz wyskakują mi błędy.

Nie wiem też jak później zapisać te dane do odczytu. Treket mógłbyś dopisać to do programu ?

Dla ciebie to pewnie 5 min roboty.

Jutro chciałem startować w Robotic area więc kąty proste by się przydały. Z góry dzięki !

Udostępnij ten post


Link to post
Share on other sites

Pokaż, to co pisałeś. Zobaczymy, gdzie masz błędy 🙂

Udostępnij ten post


Link to post
Share on other sites

Chwileczke bo pousuwałem tamto z kodu.

int tab_czujnikow[5] = {0,1,2,3,4}; 
void czytaj_adc() 
{ 
   for(int i=0; i<4; i++) 
   { 
       ADMUX &= 0b11100000; 
       ADMUX |= tab_czujnikow[i]; 
       ADCSRA |= _BV(ADSC); 
       while(ADCSRA & _BV(ADSC)) {}; 

       if(ADCH > 150)                    // odczyt 8 starszych bitów i progowanie; próg = 150 
           czujniki[i] = 1; 
       else 
           czujniki[i] = 0; 
   } 
}

I wywalało mi tu błąd. Wiec dodwałem zmienna int czujniki(5) nic to nie dawało.

Próbowałem też w ten sposób:


int czytaj_ADC(int save, int tab)
{
ADMUX = save;
ADMUX|=(_BV(ADLAR) | _BV(REFS0)) ;
ADCSRA|=_BV(ADSC);
while(!((ADCSRA&_BV(ADIF))>>ADIF));
return ADCH;
}

I tu chciałem to zrobić w ten sposób że save(0) = tab(1)

I później jakoś to wczytać w programie i na podstawie tego. Naprawdę nie umie pisać w c może troszke bascomie. C jedynie mniej wiecej rozumie (umiem sie połapać co na jakiej zasadzie działa 😋).

Muszę sie dopiero nauczyć. A za kod do kątów prostych byłbym bardzo wdzięczny i zobowiązany do nauki języka c 😉

I fajnie by było gdyby na robotic area chociaż trase przejechał 😃 Ps. Bedziesz na RA ?

Udostępnij ten post


Link to post
Share on other sites
I wywalało mi tu błąd. W

Jaki błąd? Gdzie masz deklaracje tablicy czujniki[]?

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Error 1 'czujniki' undeclared (first use in this function) 67 3 GccApplication1

Message 2 each undeclared identifier is reported only once for each function it appears in

[ Dodano: 06-12-2014, 04:56 ]

A deklaracje tablicy czujniki dawałem nad int tablica_czujniki

[ Dodano: 06-12-2014, 04:56 ]

A deklaracje tablicy czujniki dawałem nad int tab_czujników

[ Dodano: 06-12-2014, 07:04 ]

A dobra rozumie xd

int czujniki[5];
int tab_czujnikow[5] = {0,1,2,3,4};
void czytaj_adc()
{
for(int i=0; i<4; i++)
{
	ADMUX &= 0b11100000;
	ADMUX |= tab_czujnikow[i];
	ADCSRA |= _BV(ADSC);
	while(ADCSRA & _BV(ADSC)) {};

	if(ADCH > 180)                    // odczyt 8 starszych bitów i progowanie; próg = 150
	czujniki[i] = 1;
	else
	czujniki[i] = 0;
}
}

Teraz da sie skompilować Czyli odczytane stany będa teraz w zmiennej czujniki() . Tylko jak przerwać zapisywanie/odczyt danych gdy lf bedzie na białej lini.

[ Dodano: 06-12-2014, 07:24 ]

http://pokazkod.pl/f53cdabb78932834de3b2c1eab39d18a0f96d9e07d61480300

Napisałem tam niby odczyt. Możesz to poprawić tak zeby działało ? Ja musze juz jechac i nie mam kiedy już tego poprawiać.

Wyskakuja tam takie bledy jak

Error 3 lvalue required as left operand of assignment 163 15

Error 1 unknown type name 'stop' 162 4

Warning 2 implicit declaration of function 'czujnik' [-Wimplicit-function-declaration] 163 4

Udostępnij ten post


Link to post
Share on other sites

Jeśli działało ci bez tego warunku, który dałeś w pierwszym poście, to wystarczyło napisać coś takiego:


       if(LS>prog && L<prog && S<prog && P<prog && PS<prog)
{

       // zakrecanie w lewo

             while(L<prog && S<prog && P<prog && PS<prog)
             {   
             //odczytywanie czujnikow w petli
             }

        }

To jest dla przypadku że lewy skrajny czujnik widzi linię. Zostanie ustawione zakręcanie w lewo i program wpadnie w pętlę. W tej pętli powinieneś sprawdzać stan czujników i zapisywać je do tych swoich zmiennych L,S,P,PS. Jeśli jakiś innych czujnik zobaczy linię, to nie zostanie spełniony warunek pętli while i program z niej wyjdzie, następnie wyjdzie z if'a.

Powinieneś wtedy analogicznie rozpatrzyć przypadki dla prawego skrajnego czujnika, oraz, jeśli chcesz to robić na if'ach, to wypadałoby również rozpatrzyć dla:

11100 11000 00011 00111

(0-czujnik nie widzi linii, 1- czujnik widzi linię)

Acha, i wywal ten warunek na 00000 w piz....daleko. On tylko przeszkadza.

Wydaje mi się że nie do końca umiesz napisać te rzeczy sam, więc szukasz rozwiązań po innych programach, trochę błądząc po omacku i komplikując sobie życie. Czy mam rację?

Udostępnij ten post


Link to post
Share on other sites

Napisaliśmy program z kumplai na RA w miedzyczasie. Zajeliśmy 13 miejsce na 22 chyba xd Może coś wiecej byśmy wyciśli ale baterie niestety padły a li-pola pożyczyliśmy dopiero na sam koniec, lecz ujawniły sie zimne luty na goldpinach od czujników i nie było czasu poprawic.

Udostępnij ten post


Link to post
Share on other sites

BlackSkill jak udało się Tobie napisać ten działający kod to pochwal się nim - pewnie przyda się innym, początkującym.

Ogólnie taką fajną zasadę na zgubienie linii przez lf'a masz tutaj opisaną. Wystarczy się dobrze zagłębić i "rozkminić" co nieco 🙂

Udostępnij ten post


Link to post
Share on other sites

Udostępnię później. Bo jest na lapku nie u mnie. Dodam lfa na forum 😉

A co do miejsca to inaczej troche xd Na ekranie na ra bylo inaczej na stronie jest inaczej. Coś namieszanie 😋 Ale jak na pierwsze zawody nie było źle 😉

Udostępnij ten post


Link to post
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!

Gość
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...