Skocz do zawartości

[ Bascom] Sterowanie IR Problem!


Pomocna odpowiedź

Witam serdecznie..

Jako, że jest to mój pierwszy post na forum pragne się z wami przywitać, mam na imię Łukasz i dopiero zaczynam przygode z Bascom'em.

Oczywiście przyszła pora nie pierwszy problem, mianowicie chciałbym posterować pojazdem gąsienicowym poprzez podczerwień. Program napisałem jednak nie jestem zadowolony z jego działania, problem tkwi w "braku podtrzymania", chciałbym aby pojazd jechał tylko wtedy gdy trzymam wciśniety przycisk. Teraz jak widać w kodzie (podprogram przód) przekaźnik na wyjściu klepie podczas trzymania przycisku na pilocie innego pomysłu nie mam. Może ktoś wie jaki sposób przeskoczyć ten problem?! Normalnie brak mi pomysłów, a że jestem początkującym to nie mam ich za wiele..... 😋😋

Bardzo dziekuje za zainteresowanie tematem.

Oto fragment kodu (Jazda do przodu)


Do                                                          'poczatek programu

Getrc5(adres , Command)                                     'pobierz adres i komende z pilota

  Command = Command And &B01111111                         'Wyświetlanie komend na LCD


  Cls
  Lcd "adres: " ; Adres                                    'wyświetl adres
  Lowerline
  Lcd "komenda: " ; Command                                'wyświetl komendę


Waitms 50
                        'warunki i odwołania do podprogramów

  If Command = 32 Then
     Gosub Przod
  End If

  If Command = 33 Then
     Gosub Tyl
  End If

  If Command = 17 Then
     Gosub Lewo
  End If

  If Command = 16 Then
     Gosub Prawo
  End If



 Loop                                                      'koniec pętli

End                                                         '---------------------------------------------------

                                                          'podprogramy:

Przod:
Do


   Waitms 50
   ' gasienica prawa
   Set Portd.0
   ' gasienica lewa
   Set Portb.2
   Waitms 5
   Reset Portd.0
   Reset Portb.2


  If Command = 32 Then Return

Loop
End

Link to post
Share on other sites

To raczej przez to, że w podprogramie jazdy do przod masz pętlę do...loop. Jeśli zrobisz tak:

przod:
Waitms 50
   ' gasienica prawa
   Set Portd.0
   ' gasienica lewa
   Set Portb.2
   Waitms 5
   Reset Portd.0
   Reset Portb.2 
return

to raczej bardziej zadziała. Albo for...next.

  • Pomogłeś! 1
Link to post
Share on other sites

Niestety nadal to samo.. Ale już wpadłem na inny pomysł, w zasadzie dzieki Tobie BoBBy bo po przeczytaniu twojego postu przyszedł mi do głowy. 🤣

Mianowicie gdy nie naciskamy nic na pilocie procesor nie odbiera sygnału z nadajnika i wyświetla komende 127, no i ja to wykorzystałem... 🤣

Ten fragment na początku programu głownego pomógł!! 😎😎

  If Command = 127 Then Reset Portd.0
  If Command = 127 Then Reset Portb.2

Tyczy się to oczywiście jazdy na wprost.

Kolejne kierunki to już pikuś. 😎

Dzieki wielkie za pomoć!

Myśle że temat może się komuś jeszcze przydać... 😅

Pozdrawiam

Link to post
Share on other sites

To dobrze, że rozwiązałeś problem, ale następnym razem, jak będziesz pytał o problem wrzucając kod, postaraj się do niego wrzucić komentarze, będzie łatwiej pomóc.

Link to post
Share on other sites

witam

To jest fragment kodu mojego autorstwa, z mojej stronki, z tematu o czołgu http://bascomania.pl/index.php?page=8 ( w dobrym tonie byłoby podać źródło a nie podawać się za autora!) Wystarczyło zapytać u źródła a dostałbyś odpowiedź.

Pisząc oryginalny kod zakładałem, że jeśli puszczasz przycisk to nie chcesz jechać. Wtedy to wracasz to głównej pętli i odebrana komenda=127, a zatem PWM=0 i Twoje silniki stoją (założenie wymaga uzycia mostka H)

 If Command = 127 Then Pwm1a = 0                           
         If Command = 127 Then Pwm1b = 0

Efekt jest taki, że gdy trzymasz przycisk- jedziesz, gdy puszczasz stajesz.

Kocisko

Link to post
Share on other sites

Problem jest już rozwiązany, lecz ja dopiszę jeszcze coś od siebie.

Nie wiem czy słyszeliście o komendzie Else 🙂 ja u siebie obsługę podczerwieni rozwiązałem w ten sposób:

Do
  Getrc5(adres , Cmd)
  Cmd = Cmd And &B01111111

  If Cmd = 80 Then
     Gosub Przod

     Elseif Cmd = 81 Then
        Gosub Tyl

     Elseif Cmd = 85 Then
        Gosub Lewa

     Elseif Cmd = 86 Then
        Gosub Prawa

     Else
        Gosub Stoj

  End If
Loop

Sposób z komendą 127 jest nieelegancki, choć w miarę poprawny, to jednak lepiej użyć Else, choćby dlatego, że gdy od razu po wydaniu komendy naciśniemy inny przycisk, robot będzie dalej wykonywał poprzednią komendę.

Link to post
Share on other sites

Prawdę mówiąc z praktyki motyw z else trochę kiepsko wypada,ale możesz mieć przeciwne doświadczenia. Jakoś dziwnie mi to działało. Nie rozwiązywało to tez problemu, który przy okazji poruszyłeś. Mianowicie wykonywania poprzedniej komendy. Tym niemniej sprawdzę to jeszcze raz, bo mam kilka wersji tego programu i mogłem coś pomieszać 🙂

Doszedłem do wniosku, że w sytuacji gdzie dla każdej możliwości jest osobny warunek, program chodzi najlepiej.

Link to post
Share on other sites

Bascoma nie znam, ale instrukcja Else działa poprawnie we wszystkich znanych mi językach.

Program nie powinien wielokrotnie wykonywać tego samego testu, może to powodować wiele nieprzyjemnych błędów. Daje wolniejszy i dłuższy program, łatwo jest się pomylić wprowadzając zmiany. Jeśli program będzie wielowątkowy lub użyjesz przerwań łatwo można uzyskać błąd, gdzie dwa identyczne warunki w if dają różne wyniki (jeśli wartość zmiennej, czy wejścia ulegnie zmianie między instrukcjami).

W praktyce o wiele lepiej działają programy z Else. Trzeba tylko nauczyć się je pisać.

Link to post
Share on other sites

Jezeli przy IR jestesmy to...

w jaki sposob sterujecie tandemem dioda nadawcza + TSOP1736? Bo ostatnimi czasy mnie to dobija. Mam program napisany w ten sposob:

$regfile = "m8def.dat"                                      'deklaracja pliku z opisem rejestrów procesora
$crystal = 8000000                                          'deklaracja częstotliwości kwarcu

Ddrb = &B00111111                                           'deklaracje portów
Portb = &B00000000
Ddrc = &B0000100
Portc = &B1111100
Ddrd = &B11100011
Portd = &B00011100

Inputh_2 Alias Portb.0                                      'deklaracje aliasów
Led3 Alias Portb.4
Led4 Alias Portb.5
Buzzer Alias Portc.2
Prawyir Alias Pinc.3
Srodkowyir Alias Pinc.4
Lewyir Alias Pinc.5
Led1 Alias Portd.0
Led2 Alias Portd.1
Zderzak Alias Pind.2
S1 Alias Pind.3
S2 Alias Pind.4
Inputh_4 Alias Portd.5
Inputh_3 Alias Portd.6
Inputh_1 Alias Portd.7

Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Declare Sub Silniki(byval V_prawa As Integer , Byval V_lewa As Integer)       'deklaracja procedura obsługi silników
Config Timer2 = Timer , Prescale = 8 , Compare = Toggle , Clear Timer = 1
Dim Count As Byte , Akcja As Bit
Dim Prawy As Integer , Lewy As Integer , Prawyout As Integer , Lewyout As Integer
Ocr2 = 7                                                    'Wartość 27 (wzgl. 28) dla najwyższej czułości. Wpisać niższą dla zminiejszenia zasięgu

Do
                                                           'PROCEDURA OBSŁUGI RADARÓW PODCZERWIENI:
  Incr Count                                               'zwiększanie zawartości licznika
  If Count = 250 Then Count = 0                            'obsługa przepełnienia licznika
  If Count = 109 Then                                      '
     Start Timer2                                          'włączanie Timera2 na czas, gdy w liczniku jest wartość 40
     Akcja = 1                                             'zezwalanie na wykonanie algorytmu detekcji przeszkód
  Else                                                     '
     Stop Timer2                                           'wyłączanie na cały pozostały czas
     Akcja = 0                                             'brak zezwolenia na detekcję przeszkód
  End If                                                   '
  Waitms 1                                                 '

  If Akcja = 1 Then
     Led1 = Lewyir                                         'sygnalizacja stanu czujników
     Led2 = Srodkowyir
     Led3 = Srodkowyir
     Led4 = Prawyir

     If Prawyir = 1 Then                                   'ustawianie zmiennej prawego czujnika
        Prawy = 200
     Else
        Prawy = -200
     End If

     If Lewyir = 1 Then                                    'ustawianie zmiennej lewego czujnika
        Lewy = 200
     Else
        Lewy = -200
     End If

     Prawyout = Lewy * Zderzak
     Lewyout = Prawy * Zderzak
     Call Silniki(prawyout , Lewyout)                      'wywołanie procedury obsługi silników na podstawie wyliczonych parametrów

  Else                                                     'tutaj można wpisać polecenia, wykonywane podczas, gdy nie są sprawdzane przeszkody
     '
  End If
  Loop
End

Sub Silniki(byval V_prawa As Integer , Byval V_lewa As Integer)       'procedura obsługi silników
  V_prawa = V_prawa + 0                                    'korygujemy prawy silnik
  If V_prawa > 0 Then
     Pwm1a = V_prawa
     Inputh_1 = 1
     Inputh_2 = 0
  Else
     Pwm1a = -1 * V_prawa
     Inputh_1 = 0
     Inputh_2 = 1
  End If

  V_lewa = V_lewa + 0                                      'korygujemy lewy silnik
  If V_lewa > 0 Then
     Pwm1b = V_lewa
     Inputh_3 = 1
     Inputh_4 = 0
  Else
     Pwm1b = -1 * V_lewa
     Inputh_3 = 0
     Inputh_4 = 1
  End If
End Sub

i cuda - czujniki lapia jakies smieci, zgodnie z artem w EP w moim konkretnym zastosowaniu wartosc rejestru OCR2 powinna byc w granicach 27-28 - u mnie przy takich wartosciach czuniki zupelnie nic nie lapia, dopiero po zejsciu do 7 jest jakas odpowiedz na to co dzieje sie w otoczeniu - ale juz np przy wartosc 6 caly czas pokazuja, ze jest wiazka IR czyli przeszkoda.

Diody i odbiorniki osloniete odpowiednio.

Jakies pomysly?

Link to post
Share on other sites

chodki, tak jestem autorem większej części zaprezentowanego przez Ciebie kodu. Ba nawet komentarzy. Następnym razem doceniaj czyjąś pracę.

lukpep, Aliasy Inputh oznaczają pin do którego podłączasz Tsopy?

Link to post
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

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.