Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Dziwnie działający kod - sterowanie Joystickiem

27 Mar 2017 15:12 1035 9
  • Poziom 4  
    Witam, posiadam kod z tego linku:
    https://majsterkowo.pl/robot-inspekcyjny-sterowany-przy-pomocy-modulow-nrf24l01/

    Borykam się z jednym problemem, a mianowicie nie działa pozycja zerowa void stopp . Gdy wychylę joystick do granic i szybko puszczę to wartość pwm(sspeed) zatrzymuje się na wartości ponad 240, a jeśli powoli zjadę do środka to zatrzyma się na 55(lub innej zależnie od kierunku) ale do 0 nigdy nie zejdzie pomimo, że jest if dla wartości środkowe (silniki, które działały w danym kierunku dalej działają z tym pwm) . Chciałbym się dowiedzieć czy to wina programu czy może któregoś z podzespołów. Dodam że sprawdziłem inne wartości i są poprawne oraz to, że na początku port szeregowy pokazuje 0 ale jak już raz wychyle to do 0 nie wróci.
  • Poziom 24  
    Ale ta metoda nie działa przy zerze!
    if ((msg[0] >=145 && msg[0] <=155)&&(msg[0] >=45 && msg[0] <=55)){data = msg[0]; stopp();
  • Poziom 4  
    Czyli co dokładniej powinienem zmienić tak aby działało poprawnie?
  • Poziom 24  
    DejmDaniel napisał:
    Czyli co dokładniej powinienem zmienić tak aby działało poprawnie?

    Według mnie nic nie zmieniać bo środek joystick'a wcale nie generuje wartości ZERO tylko wartość z połowy zakresu.
    Chyba, że coś zmieniałeś w kodzie. Ale w oryginale działa normalnie.

    Zakładając, że masz oryginalny program z wspomnianej strony to ja bym najpierw sprawdził jakie wartości schodzą z joystick'a do nadajnika. Potem serialem odczytał wartości wysyłane(i kiedy sa wysyłane) przez radio.
  • Poziom 4  
    Mój joystick nie generuje wartości 0, jak sprawdzałem co wysyła joystick to było to 51 i 148 czyli mieści się w przedziale jakim powinna działać funkcja void stop ale tak jednak się nie dzieje.
  • Poziom 24  
    DejmDaniel napisał:
    Mój joystick nie generuje wartości 0, jak sprawdzałem co wysyła joystick to było to 51 i 148 czyli mieści się w przedziale jakim powinna działać funkcja void stop ale tak jednak się nie dzieje.


    Warunek w oryginale jest taki:

    msg[0] >=145 i msg[0] <=155 i msg[0] >=45 i msg[0] <=55

    Jeśli nie ma błędu to ten warunek reprezentuje zbiór pusty. Nie ma możliwości aby ta sama zmienna jednocześnie miała wartość z dwóch niepokrywających się zakresów. Nie może być jednocześnie większa niż 144 i mniejsza niż 156 i jednocześnie spełniać warunek, że jest większa niż 44 i mniejsza niż 55.
  • Poziom 4  
    Teraz rozumiem, że tak nie może być ale w takim razie jak to zrobić poprawnie uwzględniając to, że w msg[0] są zawarte dane z 2 potencjometrów joysticka wysyłane bez przerwy między układami nadajnik-odbiornik? Chcę aby silnik zatrzymywał się w tych przedziałach.
  • Poziom 24  
    DejmDaniel napisał:
    Teraz rozumiem, że tak nie może być ale w takim razie jak to zrobić poprawnie uwzględniając to, że w msg[0] są zawarte dane z 2 potencjometrów joysticka wysyłane bez przerwy między układami nadajnik-odbiornik? Chcę aby silnik zatrzymywał się w tych przedziałach.

    Musisz porównywać różne informacje. Zauważ, że w warunku jest nieustannie porównywana ta sama wartość z msg[0]. Czy wiesz, gdzie jest zapisywany stan pierwszego a gdzie stan drugiego potencjometru? Jak będziesz znał odpowiedź to najpewniej sam natychmiast się zorientujesz gdzie i co trzeba zmienić.
  • Poziom 4  
    Niestety nie mam pojęcia co trzeba zrobić, nie jestem biegły w języku C próbowałem różnych metod i już nie mam sił zmieniłem jednak troche program ale nadal nie pasuje. Po wgraniu programu pokazuje 0 , ale jak raz wychyle i wróce do środka to wysyła wartości 0 oraz ostatnio zapisaną po wychyleniu np. 0,0,76,76,0,76,0,76,76 itp. a ja chciałbym by było tylko 0. Poniżej zamieszczam kod:

    Nadajnik:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Odbiornik:

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 24  
    Po pierwsze, ja bym sprawdził jak zachowuje się nadajnik jeszcze przed wysłaniem danych do odbiornika. Wystarczy czytać monitorem portu szeregowego, na który wyślesz dane o położeniu Joy'a. Ewentualnie podpiąć na szybko jakiś LCD i wypisywać położenie na ekranie.

    Po drugie sprawdziłbym jakie wartości schodzą z odbiornika, na żywo bez modyfikacji.
    Rozrysowałbym to sobie na kartce, rozpisał na nowo warunki regulacji i powinno działać.

    Jeśli sprzęt masz sprawny to musi zadziałać. Kwestia tylko warunków.