Skocz do zawartości

[Bascom] Odczyt w linefollowerze granicy linii


Natanoj

Pomocna odpowiedź

Podepnę się pod temat, bo mam podobny problem. Zastanawiam się jak odczytywać w LF dodatkowo granicę linii. Mam 8 czujników i na razie używam 8 bitowej tablicy, linia/jej brak zapisywana jest do tablicy jako 1/0. Zastanawiam się czy zrobić drugą identyczną tablicę informującą o granicy linii, rozszerzyć już posiadaną do 16 bit, czy wprowadzić jakąś dodatkową zmienną, która będzie pamiętała pod którymi czujnikami znajduje się granica. Odczytuje czujniki analogowo i chciałbym to dodatkowo wykorzystać, ale nie wiem, które rozwiązanie najmniej spowolni wykonywanie pętli. Na razie działam w Bascomie na case'ach ale niedługo będę próbował pisać pid.

__________

Komentarz dodany przez: Sabre

Wydzieliłem post z tamtego tematu ponieważ nie był powiązany z nim praktycznie w żaden sposób.

Link do komentarza
Share on other sites

Natanoj, szczerze mówiąc to nie rozumiem o co Ci chodzi 🙂

Jak gęsto masz rozmieszczone czujniki? 8 czujników, które dają Ci 8 stanów to bardzo słaby wynik 🙂 10 stanów to minimum jakie z tego można wydobyć...

Link do komentarza
Share on other sites

Jeśli 8 bitów z czujników masz w tablicy czujniki[8] to:

lewa_granica_linii =0
if czujnik[0] = 1 then lewa_granica_linii=1
for i=0 to 6
 if czujnik[i+1]>czujnik[i] then lewa_granica_linii = i+1 'wykrywa w tablicy przejście z 0 na 1
 if czujnik[i+1]<czujnik[i] then prawa_granica_linii = i
next i

Wykrywasz granicę w 2 zmiennych. Oczywiście granica to kwestia umowna, czy mając dane z czujników 00110000 za granicę uznamy bit 6, czy 7 i 4 czy 3. Różnica zmiennych powinna dać grubośc linii - tzn. ile czujników powninno na raz widzieć linię. Róznica może być mniejsz jeśli linię "łapią" 2 skrajne czujniki a powinny normalnie "łapać" 3. To też w sumie jest jakaś informacja, że linia za bardzo wyjeżdża na boki.

  • Lubię! 1
Link do komentarza
Share on other sites

Dzięki za odpowiedzi. Postaram się dokładniej opisać o co mi chodzi.

Mam 8 czujników i maksymalnie 4 widzą linię, minimalnie 2. Po dołożeniu LCD okazało się jednak że w środkowym położeniu różnica w odczycie pomiędzy 2 środkowymi czujnikami które widzą linię, a tymi na granicy czarny/biały jest dość spora. Oczywiście możnaby zmienić w programie (nie mam autokalibracji) od jakich odczytów zaczyna się linia. Jednak chciałbym to dodatkowo wykorzystać, takie 2 w 1, śledzenie zarówno linii jak i jej granicy. Oprócz dokładniejszych odczytów, będę mógł też w przybliżeniu ustalić pod jakim kątem znajduje się robot w stosunku do linii. Mój kod ma teraz taką postać:

Case &B01100000      'linia pod czujnikami 2 i 3
         Pwm1a = 20    'to znaczy że zjeżdżam z trasy w lewo,
         Pwm1b = 120  'trzeba mocno skontrować by nie wypaść

Skoro miałbym dodatkowo wykrywać granicę linii, musiałbym mieć możliwość wpisania do zmiennej/tablicy 3 różnych znaków (linia/brak/granica). 3 bitowej zmiennej jednak nie ma, a 8 bitowa pewnie mocno spowolni mi wykonywanie programu. W moim rozumowaniu znacznie lepszym pomysłem jest dołożenie 2 tablicy 8 bitowej, z których np. jedna odpowiadałaby za linię/brak a druga za granicę/jej brak. Wyszło by coś takiego:

Case &B01100000      'linia pod czujnikami 2 i 3
       &B10010000      'granica linii pod czujnikami 1 i 2, czyli jestem równolegle do linii
         Pwm1a = 120   'środkowym czujnikiem robi się teraz 2 i 3
         Pwm1b = 120   'jestem na środku linii więc cała naprzód
                                'na następnym zakręcie będę dążył by środkowymi były czujniki 4 i 5

Jeżeli chodzi o składnie bascomową kod powyżej nie przejdzie, ale myślę że dobrze wyjaśnia o co mi chodzi. Teraz pytanie gdzie zapisywać które czujniki widzą granicę. Czy zrobić dodatkową zmienną która będzie przechowywać numery czujników widzących granicę, dołożyć drugą tablicę 8 bitową jak w przykładzie powyżej, czy może rozszerzyć już posiadaną do 16bit i wtedy 2 bity będą odpowiedzialne za 1 czujnik. Pierwszy bit będzie mówił o linii, a drugi o granicy. Chcę po prostu wiedzieć, który z tych sposobów najmniej spowolni wykonywanie pętli w programie.

Oczywiście biorę pod uwagę możliwość, że może po prostu za bardzo wybrzydzam i choćbym dodał mnóstwo dodatkowych zmiennych i tablic wykonywanie pętli głównej spowolni się w niezauważalnym stopniu. Proszę w takim razie o informację o takim stanie rzeczy.

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

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.