Skocz do zawartości

Kod linefollower - Kąty proste.


BlackSkill

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

Link do komentarza
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 😉

Link do komentarza
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.

Link do komentarza
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 !

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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 ?

Link do komentarza
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

Link do komentarza
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ę?

Link do komentarza
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.

Link do komentarza
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 🙂

Link do komentarza
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 😉

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.