Skocz do zawartości

[Bascom] Line Follower algorytm


Pomocna odpowiedź

Proszę:

Opis:

Pozycja_docelowa = 0

Tp = 127

V_l_temp = 0

V_p_temp = 0

Zmiana = 0

Aktualna_pozycja = Suma / Black
Uchyb_regulacji = Pozycja_docelowa - Aktualna_pozycja
Zmiana = Uchyb_regulacji * Kp


V_l_temp = Tp + Zmiana                                      'lewy
V_p_temp = Tp - Zmiana                                      'prawy


If Black >= 0 Then
 Pwm1a = V_l_temp                                          'Pwm1a => lewy
 Pwm1b = V_p_temp                                          'Pwm1b => prawy
End If


'lewy
If V_l_temp > 255 Then
  V_l_temp = 255
Elseif V_l_temp < -255 Then
  V_l_temp = -255
End If

'prawy
If V_p_temp > 255 Then
  V_p_temp = 255
Elseif V_p_temp < -255 Then
  V_p_temp = -255
End If

PS. Dzięki za odzew.

Gdy Pozycja_docelowa = 0, to zmiana = 0, tak?

Jakiego typu jest zmienna V_l_temp i Tp?

If Black >= 0 Then 
 Pwm1a = V_l_temp                                          'Pwm1a => lewy 
 Pwm1b = V_p_temp                                          'Pwm1b => prawy 
End If 

Powinno być po:

'lewy 
If V_l_temp > 255 Then 
  V_l_temp = 255 
Elseif V_l_temp < -255 Then 
  V_l_temp = -255 
End If 

'prawy 
If V_p_temp > 255 Then 
  V_p_temp = 255 
Elseif V_p_temp < -255 Then 
  V_p_temp = -255 
End If 
Gdy Pozycja_docelowa = 0, to zmiana = 0, tak?

Mam zadeklarowane na początku kodu (przed pętlą "Do"), że "Const Pozycja_docelowa = 0" i "Zmiana = 0".

Jakiego typu jest zmienna V_l_temp i Tp?

V_l_temp jako "Integer", to samo z V_p_temp.

Tp jako "Byte".

Jak chodzi o warunek "Black >= 0" to już go poprawiłem.

Tylko sprawdzałem, czy moja "Aktualna_pozycja = 0" (wynik z działania Suma/Black) i jeżeli środkowymi czujnikami bot stał na linii to diody (dwie - czerwona i niebieska) zapalamy się, jeżeli ustawiłem bota na innych czujnikach niż środkowe, to gasły. Dodam jeszcze, że jak zdjąłem bota z linii i położyłem go na białym podłożu to też diody świeciły. Zmiany nie sprawdzałem.

Można zrobić warunek kiedy "Zmiana" jest równa 0, np.

If Zmiana = 0 Then
    Led_red = 1
Else
    Led_red = 0
End If

Wpisałem ten warunek do kodu i jak środkowymi czujnikami bot stoi na linii to dioda świeci, warunek spełniony, a jak ustawię bo inaczej (tzn. na innych czujnikach niż śr.) to dioda gaśnie. Jak stoi na białym podłożu dioda świeci.

Czyli błąd musi być tutaj:

V_l_temp = Tp + Zmiana                                      'lewy 
V_p_temp = Tp - Zmiana    

To musi być coś "Bascomowego", spróbuj może:

V_l_temp = 127 + Zmiana                                      'lewy 
V_p_temp = 127 - Zmiana    

A czy robot jedzie jeśli ustawisz mu PWM na silnikach 127? Może to zbyt małe wypełnienie?

Sprawdź jaką wartość mają te prędkości po wykonaniu:

V_l_temp = Tp + Zmiana                                      'lewy 
V_p_temp = Tp - Zmiana  

Gdy robot stoi na środku powinny mieć wartość 127.

A czy robot jedzie jeśli ustawisz mu PWM na silnikach 127? Może to zbyt małe wypełnienie?

Teraz wgrałem kod, aby to właśnie sprawdzić i przy wypełnieniu 127 na każdy PWM silniki słyszalnie "piszczą" i nie ruszają do przodu (czeka 3 sec.) i w drugą stronę i znowu piszczą i czasem ruszy jakiś silnik (teraz ruszył lewy) (czeka 3 sec. i stoi przez 3 sec.)

A jak na obecnym algorytmie bot stał nad linią śr. czujnikami to one nie piszczały tylko się od razu wyłączały.

Zrobiłem warunek dla "V_l_temp" i dla "V_p_temp"

If V_l_temp = 127 Then
    Led_red = 1
Else
    Led_red = 0
End If
If V_l_temp = 127 Then
    Led_red = 1
Else
    Led_red = 0
End If

Dla warunku "V_l_temp" dioda się nie zapala, gdy bot jest śr. czujnikami na linii i w ogóle, gdy nim ruszam, podnoszę itp. dioda się nie zapala.

To samo dla warunku "V_p_temp".

Czyli prawidłowo

Czyli prawidłowe jest to,że dioda się nie zapala (warunek nie jest spełniony), gdy środkowe czujniki są na linii?

Zmiana Tp nic nowego nie wprowadziła, nadal tak samo jak było Tp = 127.

No dobra, to źle rozumiałem. Teraz musisz sprawdzić jaka jest wartość V_l_temp = Tp + Zmiana, gdy robot jest na środku linii. Może jakiś LCD lub UART? albo chociaż if'ami sprawdź mniej więcej jaka jest wartość.

Zastanawia mnie jeszcze jedno:

'lewy 
If V_l_temp > 255 Then 
  V_l_temp = 255 
Elseif V_l_temp < -255 Then 
  V_l_temp = -255 
End If 

'prawy 
If V_p_temp > 255 Then 
  V_p_temp = 255 
Elseif V_p_temp < -255 Then 
  V_p_temp = -255 
End If

Następnie podajesz to do PWM:

If Black >= 0 Then 
 Pwm1a = V_l_temp                                          'Pwm1a => lewy 
 Pwm1b = V_p_temp                                          'Pwm1b => prawy 
End If

Nie możesz tak robić, przecież czasami możesz wpisywać tam wartości ujemne. Jeśli wyliczona prędkość jest ujemna to powinieneś odwrócić obroty na mostku, a jako PWM podać zanegowaną wartość wyliczonej prędkości. Dla testu zmień w tych warunkach wcześniej, że gdy V_l_temp

Teraz musisz sprawdzić jaka jest wartość V_l_temp = Tp + Zmiana, gdy robot jest na środku linii. Może jakiś LCD lub UART? albo chociaż if'ami sprawdź mniej więcej jaka jest wartość.

Nie mam niestety LCD'ka, UART nigdy się jeszcze z tym nie bawiłem 😃 (ale czeka moduł BT do zrobienia i konwerter stanów logicznych na MAX232 😃 )

Nie możesz tak robić, przecież czasami możesz wpisywać tam wartości ujemne.

Kurcze teraz to dopiero zauważyłem :/ No tak, jeżeli wyliczona prędkość V_l_temp, czy V_p_temp jest ujemna to muszę odwrócić stany na mostku tylko nie wiem dokładnie jak to zrobić ale mam pewną myśl:

'lewy 
If V_l_temp > 255 Then 
  V_l_temp = 255
     Set Silnik_lewy_a
     Reset Silnik_lewy_b
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
Elseif V_l_temp < -255 Then 
  V_l_temp = -255
     Reset Silnik_lewy_a
     Set Silnik_lewy_b
     Reset Silnik_prawy_a
     Reset Silnik_prawy_b
End If 

'prawy 
If V_p_temp > 255 Then 
  V_p_temp = 255
     Set Silnik_prawy_a
     Reset Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
Elseif V_p_temp < -255 Then 
  V_p_temp = -255
     Reset Silnik_prawy_a
     Set Silnik_prawy_b
     Reset Silnik_lewy_a
     Reset Silnik_lewy_b
End If
a jako PWM podać zanegowaną wartość wyliczonej prędkości

Jak mam to zrobić?

Dla testu zmień w tych warunkach wcześniej, że gdy V_l_temp < 0, to V_l_temp = 0. Podobnie dla prawej.

Który dokładnie warunek? Ten? --> If V_l_temp < - 255 mam zamienić na V_l_temp = 0? Tak pytam, bo teraz nie rozumiem.

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