Skocz do zawartości

[Bascom] Line Follower algorytm


Pomocna odpowiedź

If P > 128 Then 
  P = 128 
Elseif P < -128 Then 
  P = -128 
End If

To są takie luźne przemyślenia 😃 miałem to usunąć zanim wstawie kod na forum, ale widać zapomniałem.

A tu czasami możesz dzielić przez zero:
Roznica = Sensor_value_sum / Sensor_on_black

Jak są dwa środkowe czujniki nad linią to ich wagi się znoszą i są równe 0, a przez zero nie można dzielić. :/

No tak. Sensor_value_sum to suma wag czujników (czyli dwa środkowe to -11 i 11 (+11)), a to ilość czujników nad czarną linią, czyli w naszym przypadku 2 i wychodzi nam wynik 0/2 = 0.

To można zrobić coś takiego?

If Roznica = 0 Then
  Pwm1a = 127
  Pwm1b = 127
End If

Nie ma takiej potrzeby. Jeśli uchyb (różnica) jest równa 0, to mamy:

P = Kp*Uchyb = 0

Nowa_prędkość = Tp + P = Tp

Czyli samo powinno ustawić się na domyślną prędkość, czyli 127.

No to sprawdź jakoś co się dzieje, wykorzystaj diody do debugowania. Włącz diodę przykładowo, gdy:

- linie wykryły dwa czujniki

- P = 0

- Nowa prędkość = Tp

Posprawdzaj sobie etap, po etapie 😉

Postanowiłem zrobić tak jak mi mówisz i przy P = 0 trochę szaleje, raz pali się dioda na skrajnym czujniku (lewym), na dwóch środkowych i na przedostatnim czujnikiem (prawym), a później już nic.

Ustawiłem tak, żeby jedna dioda (niebieska) świeciła kiedy P nie jest równe 0, a diodę (czerwoną) kiedy P jest równe 0 i dziwnie się to zachowuje, tzn. nie tak jak powinno.

Później ustawiłem diody, aby czerwona się zapaliła kiedy V_L_temp = Tp, a zapaliła się niebieska kiedy to nie jest równe i nic.

No dobra, zakładam, że pamiętałeś o gaszeniu i zapalaniu diod w dobrych miejscach.

Podaj proszę wagi wszystkich Twoich czujników oraz powiedz ile czujników na raz może widzieć linie.

Sensor_value(1) = -50

Sensor_value(2) = -30

Sensor_value(3) = -20

Sensor_value(4) = -10

Sensor_value(5) = 10

Sensor_value(6) = 20

Sensor_value(7) = 30

Sensor_value(8) = 50

Na raz widzieć linie może 2 albo 3. 3 to max ile moze na raz widzieć.

W takim razie przy liczeniu pozycji czasami mogą wyjść wartości z ułamkiem. Sprawdziłeś, co się wtedy dzieje, jakie masz wtedy wartości ?

Podpowiem Ci kolejność rzeczy jakie musisz posprawdzać bazując na "diodach" (chyba, że masz jakiś interfejs do debugowania):

1) Czy poprawnie działają wszystkie czujniki

2) Czy poprawnie liczona jest ilość czujników widzących linię

3) Czy poprawnie liczona jest pozycja. Nie ma takiej opcji, aby przy dwóch środkowych wyliczona pozycja była różna od 0, a przykładowo przy jednym skrajnym 50.

Bez sprawdzenia tych rzeczy będzie ciężko dalej badać sprawę 😉

W takim razie przy liczeniu pozycji czasami mogą wyjść wartości z ułamkiem. Sprawdziłeś, co się wtedy dzieje, jakie masz wtedy wartości ?

Szczerze to nie liczyłem (ale teraz policzyłem i się zgadza co mówiłeś). A muszę mieć takie wagi, że przy wyliczaniu nie będę mial wartości z ułamkiem?

Podpowiem Ci kolejność rzeczy jakie musisz posprawdzać bazując na "diodach" (chyba, że masz jakiś interfejs do debugowania):

Mam 4 LEDy.

Ad.1.

Czyli, czy do nich dochodzi napięcie i czy wykrywają poprawnie linie, tak?

Ad.2.

Raczej tak, jest to zrobione podobnie jak Ty masz w staaarym artykule "Człon P".

Ad.3.

To samo jak w pkt. 2. Podobie jak w Twoim artykule.

Co do wszystkich punktów miałem raczej na myśli konkretne testy. To znaczy, robisz sobie jakieś warunki świecenia diod w robocie i testujesz. Wtedy zobaczysz czy wszystko działa tak jak to zakładasz.

Ad.1.

Tak więc wziąłem się za testy czujników i co...? Piszę sobie kod (najzwyklejszy: Dim W As Word, Dim Sensor As Word, Const Granica = 600, dioda Led, Gosub Pomiar) i okazuje się, że każdy czujnik "niby nie widzi linii czarnej, (testowałem na każdym) bo inaczej jedna dioda zgasiła się, a druga zapaliła, a tu kicha, więc napisałem inny kod (odczytywanie czujników za pomocą For ... = 0 To 7 itp., sprawdzenie czy czujnik wykrył linie: If Sensor.sensor_num = 1 Then) jedna dioda do sprawdzenia, czy czujnik wykrył linie i co się okazuje...? Działa. Dioda mryga jak się listwą z czujnikami przejedzie przez czarną linie.

Punktu 2 i 3 nie sprawdzałem jeszcze, bo akumulator muszę naładować.

PS

Przy włączonym robocie listwa z czujnikami (może bardzie, czujniki) się baaardzo grzeją, może przesadzam, ale są wyczuwalnie gorące.

Możliwe, że tak. Dla rezystora 150R prąd wynosi ok. 33mA, co daje nam 165mW mocy na diodzie IR, a dla diody IR KTIR'a max. prąd to 50mA.

Dla rezystora 220R prąd i moc wynosi ok. 22mA, 110mW. A ja mam wlutowane rezystory 150R.

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