Skocz do zawartości

Problem z mapowaniem wartości


Grinrabbit

Pomocna odpowiedź

Witam, mam mały problem z funkcją map(). Steruje serwomechanizmem sygnałem w milisekundach w przedziale (1540;2300) i chciałem wyświetlać wartości tak aby w przedziale <1540;1800) podawać wartości (30;0), a w przedziale (1800;2300) podawać wartości (0;-30)

I zastosowałem taki warunek:

if(1540 <= sg < 1800)
 {
   sg = map(sg,1540,1800,30,0);
 }
 else
 {
   sg = map(sg,1800,2300,0,-30);
 }

Ale niestety otrzymuje wartości które przekraczają przedział (0;-30) i nie wiem dlaczego tak się dzieje. Proszę o fachową pomoc 😃

Załączam też plik z odczytami, ostatnie dwie kolumny to odczyt wartości przeskalowanej i sygnał w milisekundach. Wartości ujemne przyjmują aż -57 a powinny maksymalnie -30

Wychylenie_serwo.txt

Link do komentarza
Share on other sites

W Twoim kodzie zawsze wykonuje się tylko pierwsze mapowanie. Dlatego pierwszy zakres sg daje poprawne wyniki a drugi wygląda dziwnie. Przyjrzyj się temu co wstawiłeś w nawiasach po if. To jest poprawne składniowo wyrażenie w C, ale niestety nie znaczy tego czego oczekujesz. Żeby sprawdzić zakres musisz użyć operatorów logicznych, np:

if ((1540 <= sg) && (sg < 1800))

A teraz dla sportu sprawdź wynik swojego oryginalnego wyrażenia z if-a, możesz go wypisywać:

Serial.println(1540 <= sg < 1800);

dla różnych wartości sg i co ważniejsze zastanów się dlaczego dostajesz takie wartości.

Link do komentarza
Share on other sites

Skoro mój "przedział" nie działa to wyskalowałem wartości tylko pomiędzy 1540 a 1800. Tylko, że pomiędzy 1540 a 1800 jest 260 milisekund co daje podziałkę co 8,6 milisekundy. A pomiędzy 1800 a 2300 jest milisekund 500 więc podziałka powinna być co 16,6 milisekundy. Stąd te dziwne wartości 😃

Link do komentarza
Share on other sites

W sumie to nieważne dlaczego zrobiłeś taką łamaną funkcję - widocznie gdzieś tam mierzysz sygnał przychodzący z odbiornika RC i potrzebujesz coś tam na jego podstawie wysterować. Miło byłoby dowiedzieć się co to będzie, ale dużo ważniejszy jest Twój sposób rozumienia składni C, a w szczególności wyrażeń logicznych. Poczytaj o tym, bo kompilator takich kwiatków nie wyłapie jako błąd i będziesz patrzył na kod nie rozumiejąc jak on naprawdę działa. A problem jest w niedziałaniu if-a, różne mapowanie na dwóch przedziałach zmiennej jest przecież OK.

Dla pewności warto byłoby obsłużyć przypadek gdy zmienna nie należy do żadnego z interesujących przedziałów:

if (pierwszy_przedział)
 mapowanie1...;
else
 if (drugi_przedział)
   mapowanie2...;
 else
   tutaj_coś_poszło_źle;
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

Serwo porusza ster motorówki, orczyk jest z lewej strony steru dlatego na maksymalne wychylenie w lewo jest potrzebny mi mniejszy kąt wychylenia orczyka niż na maksymalne wychylenie w prawo. Dziękuję za zwrócenie uwagi i biorę się do odrobienia tej lekcji 🙂

Link do komentarza
Share on other sites

No ale przecież to samo możesz zrobić w nadajniku - ustawiasz niesymetryczne EPA. Dokładnie tak samo programujesz przecież np. wychylenia lotek w samolocie: od neutrum w górę jest inaczej a w dół inaczej. Po co Ci do tego procesor po stronie odbiorczej?

No i coś z generacją tego PWM wyjściowego jest marnie, bo tracisz dokładność. Dostajesz zakresy rzędu kilkuset a mapujesz to na marne 0..30 😥 Nie możesz tego timera popędzić szybciej?

Ja bym zaczął od poprawienia mechaniki i przestawienia orczyka steru tak, by wychylenia serwa mogły być symetryczne, lub od obrotu orczyka na serwie by był w tym samym kącie i długości co orczyk steru - wtedy także masz przełożenie 1:1.

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.