Skocz do zawartości

[Bascom] Line Follower algorytm


aixI

Pomocna odpowiedź

Robię to w taki sposób:

Zmiana - +/- do pwm
Sensor_value_sum - suma wartości wag czujników, które są nad linią
Sensor_on_black - ilość czujników nad linią

Roznica = Sensor_value_sum / Sensor_on_black
Zmiana = Roznica * Kp

[ Dodano: 14-03-2014, 16:55 ]

PS: A jak powinno być poprawnie?

Link do komentarza
Share on other sites

Jeśli masz zabezpieczenie przed dzieleniem przez 0, to sposób rozumowania jest dobry, nie wiem jak z implementacją, ale chyba też wygląda poprawnie, choć tak jak mówiłem nie znam Bascoma, więc nie mogę powiedzieć na 100% że jest dobrze.

Link do komentarza
Share on other sites

Jeśli masz zabezpieczenie przed dzieleniem przez 0, to sposób rozumowania jest dobry

A jeżeli nie mam zabezpieczenia przed dzieleniem przez 0, to bot zachowuje się tak jak mówiłem wcześniej, czyli stoi jak są dwa czujniki (środkowe) nad linią?

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

Treker chodzi mi głównie jak w line follower'ach z komparatorami jest ten cały odczyt robiony i przypisywanie wag do czujników, które są odczytywane cyfrowo na dowolne piny uC (np. jak jest 16 czujników + 4 komparatory lm339 i zajęte 2 porty uC na wyjścia z komparatorów).

Link do komentarza
Share on other sites

Łopatologicznie mówiąc, bez zagłębiania się w jakość takiego podejścia:

Stwórz sobie tablice np.: czujniki[16], następnie do każdej komórki tablicy wpisz "wartość" czujnika, czyli "0" lub "1". Pod odczytaniu komparatorów masz tablica ma być wypełniona przykładowo tak:

0000000000000110 - linia na prawym skraju linijki czujników

Dalej liczysz średnią pozycje. Zakładając, że każdy czujnik ma wagę, kolejno -8 +8, w powyższym przykładzie otrzymujemy sumę: 6 + 7 = 13. Dalej dzielisz przez ilość czujników, które wykryły linie i masz pozycje 😉

Link do komentarza
Share on other sites

Powiedzmy, że mam podłączone 16 czujników przez komparatory do dwóch portów uC, np. PORTD i PORTC (ATmeag8A).

Mam tablicę "Czujniki(16)"

następnie do każdej komórki tablicy wpisz "wartość" czujnika, czyli "0" lub "1".

Czyli coś w tym stylu?

If Czujniki(1) = 1 Then
    Czujnik(1) = 1
Else
    Czujnik(1) = 0
End If

i analogicznie dla "Czujniki(2)...(16)"

0000000000000110 - linia na prawym skraju linijki czujników.

Dalej liczysz średnią pozycje. Zakładając, że każdy czujnik ma wagę, kolejno -8 +8, w powyższym przykładzie otrzymujemy sumę: 6 + 7 = 13. Dalej dzielisz przez ilość czujników, które wykryły linie i masz pozycje 😉

Zakładając, że wagi czujników są od -8 do +8 to się zgadza i to rozumiem, ale jak mam sprawdzić pod którymi czujnikami jest linia? Na bitach? np. &B0000000000000000 - nie wiem czy w ogóle jest to dobry zapis :>

Link do komentarza
Share on other sites

Nie... To co napisałeś nie ma żadnego sensu - mówię o kodzie. Zastanów się, po prostu przypisujesz wartości pinów do tablicy, nie wiem co tam wymyśliłeś... W każdym razie wyszła Ci rekurencja, która nie ma sensu.

Zakładając, że wagi czujników są od -8 do +8 to się zgadza i to rozumiem, ale jak mam sprawdzić pod którymi czujnikami jest linia?

No przecież sam wcześniej przypiszesz stany czujników do tablicy, więc wystarczy sprawdzić w tablicy.

Link do komentarza
Share on other sites

Chyba zrozumiałem swój błąd. Nie wiem czemu mnie podkusiło, aby takie coś napisać 😃

Teraz powinno być dobrze.

If PIND.0 = 1 Then     - np. pierwszy czujnik
    Czujniki(1) = 1 
Else 
    Czujniki(1) = 0 
End If 
Link do komentarza
Share on other sites

No to to mamy z głowy 🙂 Teraz przypisanie wag do czujników, mam swój pewien pomysł ale pewnie zły 😃 Otóż chodzi mi o to, że jak mam tablice z czujnikami, czyli Czujniki(16) to to przyrównać tablicy z wagami: Wagi(16), czyli dla czujnika 1 waga będzie 1: Czujniki(1) = Wagi(1), a Wagi(1) = -8 (lewa strona linijki czujników). Tak jak mówiłem nie wiem czy dobrze ale takie coś mi się widzi :>

Link do komentarza
Share on other sites

Ok 🙂 Teraz ostatnim aspektem zostało liczenie średniej pozycji.

Na to składa się:

*Zsumowanie wag czujników, które są nad linią

*Dzielenie zsumowanych wag przez ilość czujników, które wykryły linię

*Pomnożenie wyniku przez współczynnik Kp

Hmm, teraz jak to zapisać w kodzie 😃

[ Dodano: 17-03-2014, 18:41 ]

Wykombinowałem takie coś:

Dim Czujniki(16) As Byte
Dim Wagi(16) As Integer

Dim X As Byte
Dim Sensor_value_sum As Integer
Dim Sensor_on_black As Byte

X = 1

Sensor_value_sum = 0
Sensor_on_black = 0

While X <= 16
    If Czujniki(x) = 1 Then
         Sensor_on_black = Sensor_on_black + 1
         Sensor_value_sum = Sensor_value_sum + Wagi(x)
    End If
X = X + 1
Wend

X = 0


Roznica = Sensor_value_sum / Sensor_on_black
Zmiana = Roznica * Kp
Link do komentarza
Share on other sites

Wcześniej pisałem, że dodałem else'a jednak on nie pomagał tylko przeszkodził w działaniu 😃

Teraz miałem czas i sprawdziłem to na stykówce z czterema czujnikami i ładnie działa (tzn. dioda LED, która idzie od nóżki uC zapala się i gaśnie jak którykolwiek z czterech czujników "wjedzie" na linie i z niej "zjedzie") to działa jak usunąłem else'a 😃 - ważne jest, że działa, później zobaczymy jak będzie z szesnastoma czujnikami 🙂

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.