Skocz do zawartości

[Bascom] Line Follower algorytm


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?

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.

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ą?

Widzę, że temat mi umknął, a byłem wzywany tam do odpowiedzi 😉 Jeśli są jakieś konkretne pytania do mnie to słucham.

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

Ł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 😉

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

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.

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 

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

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
  • 2 tygodnie później...

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 🙂

Teraz powinno być ok, else szkodził, ponieważ za każdym razem, gdy trafiało na brak linii zerowało wcześniejsze "zapamiętania" czujników.

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