Spisu treści:

Zrozumienie miksowania kanałów: 4 kroki (ze zdjęciami)
Zrozumienie miksowania kanałów: 4 kroki (ze zdjęciami)

Wideo: Zrozumienie miksowania kanałów: 4 kroki (ze zdjęciami)

Wideo: Zrozumienie miksowania kanałów: 4 kroki (ze zdjęciami)
Wideo: ILU POLICJANTÓW POTRZEBA ABY OBEZWŁADNIĆ OJCA BEZ SPRZĘTU 2024, Listopad
Anonim
Image
Image
Metoda mieszania » Brak
Metoda mieszania » Brak

Jeśli kiedykolwiek jeździłeś na podwoziu zdalnego sterowania, istnieje duża szansa, że używałeś miksera, nawet jeśli o tym nie wiedziałeś. W szczególności, jeśli używałeś jednego joysticka lub gimbala do sterowania pojazdem, który wykorzystuje kierowanie poślizgowe lub kierowanie różnicowe, użyłeś miksera.

Miksowanie to po prostu sposób, w jaki dane z joysticka są wykorzystywane do określenia, ile mocy należy dostarczyć do każdej strony obudowy.

Jeśli otworzysz joystick, zazwyczaj zobaczysz w środku dwa potencjometry. Jeden do pomiaru aktualnej pozycji wzdłuż osi Y (w górę iw dół), a drugi do pomiaru położenia wzdłuż osi X (z boku na bok).

Chociaż nie mam formalnego szkolenia na ten temat, musiałem wcześniej mieszać w kodzie, a ostatnio chciałem zagłębić się w ten temat.

Po pierwsze, chcę zauważyć, że większość nadajników RC ma możliwość miksowania, podobnie jak wiele sterowników silników. Te informacje będą najbardziej przydatne, jeśli będziesz musiał samodzielnie mieszać w swoim kodzie. Powiedzmy na przykład, czy używasz Arduino do odczytu niezmieszanych danych z odbiornika RC, czy odczytujesz dane analogowe z potencjometrów w joysticku, lub jeśli odczytujesz współrzędne z cyfrowego joysticka w aplikacji mobilnej.

Przyjrzyjmy się różnym podejściom do mieszania.

Krok 1: Metoda mieszania »Brak

Najpierw spójrzmy, co się stanie, jeśli w ogóle nie użyjesz miksowania. Jeśli po prostu wyślesz dane z jednej osi do jednej strony podwozia, a drugiej do drugiej, Twój pojazd nie zareaguje tak, jak chcesz.

Na przykład, jeśli przesuniesz joystick całkowicie do przodu, oś Y jest na pełnym gazie, a oś X na 0. Więc jechałbyś w kółko, zamiast jechać prosto.

Krok 2: Metoda Metoda »Obróć

Metoda Metoda »Obróć
Metoda Metoda »Obróć

Współpracownik zwrócił mi kiedyś uwagę, że w mgnieniu oka można obrócić nadajnik o 45 stopni, aby uzyskać miks dla biednego człowieka. Jeśli myślisz o wartościach z dwóch potencjometrów w joysticku jako o osi x i y na siatce (z obiema osiami rozciągającymi się od -100 do +100) ma to sens, ponieważ zamierzasz do +100 na obu osiach przesuwając joystick w górę iw prawo. Jeśli więc mapuje się to bezpośrednio do dwóch kanałów podwozia (lewej i prawej strony robota), robot będzie szedł do przodu.

Tak więc pierwszą metodą mieszania, jaką kiedykolwiek próbowałem, było matematyczne obrócenie współrzędnych xiy o 45 stopni wokół punktu środkowego siatki.

To działa dobrze, ale nie mogę iść naprzód ze 100% mocą, ponieważ podczas obracania się, ogólny ruch jest ograniczony do okręgu w siatce, co oznacza, że nigdy nie możesz dostać się do tego prawego górnego rogu.

Powoduje to również, że rogi siatki nie są wykorzystywane. Nie stanowi to problemu, jeśli używasz joysticka/gimple, który ogranicza twój ruch, więc te obszary i tak nigdy nie są osiągane, ale w przeciwnym razie będziesz chciał, aby ta część siatki zrobiła coś, aby twoje ruchy były całkowicie proporcjonalne.

Jeśli jesteś wzrokowcem, takim jak ja, ta koncepcja może być łatwiejsza do zrozumienia, oglądając wideo na początku tej instrukcji.

Spójrzmy na kilka przykładów kodu.

UWAGI DOTYCZĄCE PRZYKŁADÓW MOJEGO KODU: Pomijam sposób uzyskiwania wartości joystick_x i joystick_y, ponieważ zmieniałyby się one w zależności od projektu. Będę też mapował/ograniczał do ± 100, ale prawdopodobnie będziesz musiał mapować do 1000 - 2000 dla PWM lub 0 - 255 dla wyjścia analogowego itp. Zawsze ograniczam… na wszelki wypadek.

Przykład Arduino:

//obróć matematycznie

podwójny rad = -45*M_PI/180; int leftThrottle = joystick_x * cos(rad) - joystick_y * sin(rad); int rightThrottle = joystick_y * cos(rad) + joystick_x * sin(rad); //ogranicz leftThrottle = constrain(leftThrottle, -100, 100); rightThrottle = Constrain(rightThrottle, -100, 100);

Przykład JavaScript:

//matematycznie obrócona zmienna rad = -45*Math. PI/180; leftThrottle = joystick_x * Math.cos(rad) - joystick_y * Math.sin(rad); rightThrottle = joystick_y * Math.cos(rad) + joystick_x * Math.sin(rad);//constrainleftThrottle = constrain(leftThrottle, -100, 100);rightThrottle = constrain(rightThrottle, -100, 100); //pomocnik functionvar ograniczenie = function(num, min, max){ return Math.min(Math.max(num, min), max); };

Krok 3: Metoda Metoda »Prosta

Metoda Metoda » Prosta
Metoda Metoda » Prosta

Następnie mamy bardzo proste równanie, które po raz pierwszy wybrałem z jednego z filmów Shawn Hymel's Adventures in Science SparkFun, w którym akurat pracował nad bardzo podobnym projektem do tego, nad którym pracowałem.

To równanie pozwala uzyskać pełną prędkość podczas jazdy do przodu, ale podobnie jak metoda obracania, pomija narożne obszary siatki. Dzieje się tak dlatego, że w niektórych przypadkach maksimum wynosi 100, a w niektórych maksimum to 200. Więc użyjesz funkcji ograniczenia, aby zignorować wszystko po 100.

A tak przy okazji, nie nazywam tego prostym obraźliwie… w prostocie jest piękno.

Przykład Arduino:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; //ogranicz leftThrottle = constrain(leftThrottle, -100, 100); rightThrottle = Constrain(rightThrottle, -100, 100);

Przykład JavaScript:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x;//constrain leftChannel = constrain(leftChannel, -100, 100); rightChannel = Constrain(rightChannel, -100, 100); //funkcja pomocnicza zmienna ograniczenie = function(num, min, max){ return Math.min(Math.max(num, min), max); };

Krok 4: Metoda Metoda »Proporcjonalna

Metoda Metoda »Proporcjonalna
Metoda Metoda »Proporcjonalna

Odskoczyłem od prostej metody, mając nadzieję, że najlepiej wykorzystam równanie obu światów. Chodzi o to, aby być w pełni proporcjonalnym we wszystkich kierunkach, nawet po przekątnej, mimo że poruszanie się na większą odległość ma taki sam zasięg, jak podczas poruszania się w pionie, co jest mniejszą odległością.

Skończysz ze skalą od -200 do +200 we wszystkich kierunkach w moich przykładach mapuję to na ±100, ponieważ reprezentuje ona procent mocy trafiającej do każdego kanału – jednak będziesz chciał zmapować to na wszystko, co działa w twoim użyciu- obudowa do sterownika silnika. Na przykład, jeśli wysyłasz sygnał PWM, możesz zmapować go na 1000 do 2000 lub jeśli wysyłasz sygnał analogowy, możesz zmapować go na 0-255 i ustawić kierunek jako logiczny itp.

Przykład Arduino:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x;// w niektórych przypadkach max to 100, w innych 200// uwzględnijmy różnicę, więc max to zawsze 200int diff = abs(abs(joystick_y) - abs(joystick_x));leftThrottle = leftThrottle < 0 ? leftThrottle - diff: leftThrottle + diff;rightThrottle = rightThrottle < 0 ? rightThrottle - diff: rightThrottle + diff; //Mapuj od ±200 do ± 100 lub w jakimkolwiek zakresie, który igłowyftThrottle = map(leftThrottle, 0, 200, -100, 100);rightThrottle = map(rightThrottle, 0, 200, -100, 100); //constrainleftThrottle = constrain(leftThrottle, -100, 100);rightThrottle = constrain(rightThrottle, -100, 100);

Przykład JavaScript:

var leftThrottle = joystick_y + joystick_x;var rightThrottle = joystick_y - joystick_x;// w niektórych przypadkach maksymalna wartość to 100, w niektórych przypadkach jest to 200, // uwzględnijmy różnicę, aby zawsze była równa 200var diff = Math.abs(Math.abs(joystick_y) - Math.abs(joystick_x));leftThrottle = leftThrottle < 0 ? leftThrottle - diff: leftThrottle + diff;rightThrottle = rightThrottle < 0 ? rightThrottle - diff: rightThrottle + diff;//Mapa od ±200 z powrotem w dół do ±100 lub cokolwiek wygniataszftThrottle = map(leftThrottle, -200, 200, -100, 100);rightThrottle = map(rightThrottle, -200, 200, -100, 100); //constrain leftThrottle = constrain(leftThrottle, -100, 100);rightThrottle = constrain(rightThrottle, -100, 100);//niektóre funkcje pomocniczevar constrain = function(num, min, max){ return Math.min(Math. maks(liczba, min), maks); }; var map = function(num, inMin, inMax, outMin, outMax){ var p, inSpan, outSpan, mapped; inMin = inMin + inMax; liczba = liczba + inMaks; inMax = inMax + inMax; inSpan = Math.abs(inMax-inMin); p = (liczba/rozpiętość)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs(outMax - outMin); mapowane = outSpan*(p/100) - (outMax/2); powrót zmapowany;};

Zalecana: