Skocz do zawartości

[BASCOM] Sterowanie LF'em przez BTM


Pomocna odpowiedź

Napisano

Witam Wszystkich

Mam Line-Followera, stworzonego oczywiście na podstawie przepisu Nawyka. Wzbogaciłem go o moduł BTM. Chciałbym nim sterować poprzez aplikację stworzoną w AppInventorze [poradnik Naelektryzowanego] i tu pojawia się problem - skorzystałem z funkcji InKey w Bascomie, aby odbierać znaki wysyłane przez komórkę, jednak robot nie reaguje właściwie.

Odbiera sygnały - dla 1 rusza, a dla 0 zatrzymuje się.

Problemem jest jednak to, że jeśli już ruszy to nie podąża za linią, tylko kręci lekkie kółko, nie bacząc na czujniki. [Jedzie na podstawie PWM'ów dla stanów czujnika 000, które można zobaczyć w kodzie]

Oczywiście jeśli usunę opcję zczytywania InKey to robot porusza się prawidłowo jak Line-Follower.

Miał ktoś do czynienia z podobna sytuacją?

Lub realizował sterowanie LF'em przez BTM'a w inny sposób i mógłby podsunąć wskazówkę?

Funkcja Inkey oddaje kod znaku gdy coś przyszło, ale gdy UART procesora nic nie odebrał, oddaje 0. Nie znak "0" tylko wartość zero. To powoduje, że żaden z if-ów Twojego programu się nie wykonuje i robot nie odczytuje czujników. Zrób albo sprawdzanie czy zaszła taka sytuacja albo wcześniej testuj UART funkcją IsCharWaiting() dającą informację, że w ogóle coś przyszło. Dopiero wtedy wczytuj znak przez Inkey() a jeśli nic nie ma, rób to co zleciłeś ostatnim wysłanym znakiem.

  • Lubię! 1
Funkcja Inkey oddaje kod znaku gdy coś przyszło, ale gdy UART procesora nic nie odebrał, oddaje 0. Nie znak "0" tylko wartość zero. To powoduje, że żaden z if-ów Twojego programu się nie wykonuje i robot nie odczytuje czujników. Zrób albo sprawdzanie czy zaszła taka sytuacja albo [...] .

W jaki sposób mogę tego sprawdzenia dokonać?

Z funkcją IsCharWaiting już się zetknąłem i zapewne jej użyję, ale jestem bardzo ciekawy tego drugiego rozwiązania "Sprawdź czy zaszła taka sytuacja".

Nocny update postu:

Skorzystałem z IsCharWaiting i niestety bez zmian w działaniu robota.

Do
S = Ischarwaiting()
If S <> 0 Then
Kod = Inkey()
If Zmienna = "1" Then
      Silnik_left= 255
      Silnik_right = 255
Elseif Zmienna = "2" Then
Gosub Wczytaj_czujniki
          If Czuj_lewy < Granica And Czuj_srodk < Granica And Czuj_prawy > Granica Then       ' Stan 001
             Silnik_left = 20
             Silnik_right = 255
           Elseif 
           [...]
           End If
End If
End If
Loop
End

Czy nie należy dodać jeszcze jakichś 'configów' do programu?

W configi nie wnikam. Zastanów się co Twój program robi (w tej czy poprzedniej wersji) gdy jednokrotnie otrzyma znak "włącz silniki" a potem przez długi czas nic nie odbiera (tj zarówno funkcja Inkey jak i IsCharWaiting oddają zero). Który if wtedy się wykonuje i czy to oznacza poprawne odczytywanie czujników i sterowanie napędami. Najlepiej gdybyś sobie algorytm działania narysował na kartce i spokojnie prześledził jego wykonanie bez pomocy komputera.

Wskazówka: Nie możesz reagować wyłącznie na znaki otrzymywane z UARTa, ale musisz gdzieś trzymać aktualny stan programu. Potrzebujesz zmiennej w której będziesz pamiętał co ostatnio przyszło i w zależności od tego wykonywał odpowiednie akcje. Przychodzące znaki powinny tylko ten stan modyfikować.

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