Skocz do zawartości

[Bascom] Line Follower algorytm


aixI

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.

Link do komentarza
Share on other sites

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 
Link do komentarza
Share on other sites

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.

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

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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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    
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

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.