Obsah:

Pochopení míchání kanálů: 4 kroky (s obrázky)
Pochopení míchání kanálů: 4 kroky (s obrázky)

Video: Pochopení míchání kanálů: 4 kroky (s obrázky)

Video: Pochopení míchání kanálů: 4 kroky (s obrázky)
Video: Jak může mít 11 prstů? 😳 2024, Listopad
Anonim
Image
Image
Metoda míchání »Žádná
Metoda míchání »Žádná

Pokud jste někdy řídili podvozek s dálkovým ovládáním, je velká šance, že jste použili míchání, i když jste to nevěděli. Konkrétně, pokud jste použili jediný joystick nebo ovladač k ovládání vozidla, které používá smykové řízení nebo diferenciální řízení, použili jste mixování.

Míchání je jednoduše to, jak se data z vašeho joysticku používají k určení, kolik energie by mělo být dodáno na každou stranu podvozku.

Pokud otevřete joystick, uvidíte uvnitř obvykle dva potenciometry. Jeden měří vaši aktuální polohu podél osy Y (nahoru a dolů) a druhý měří, kde jste, podél osy X (ze strany na stranu).

Ačkoli nemám žádné formální školení na toto téma, musel jsem předtím dělat míchání kódu a nedávno jsem se chtěl ponořit trochu hlouběji do předmětu.

Nejprve chci poznamenat, že většina RC vysílačů má schopnost míchání, stejně jako mnoho motorových ovladačů. Tyto informace budou nejužitečnější, pokud se budete muset v kódu míchat sami. Řekněme například, že používáte Arduino ke čtení nesmíchaných dat z RC přijímače, nebo čtete analogová data z potenciometrů na joysticku, nebo pokud čtete souřadnice z digitálního joysticku v mobilní aplikaci.

Podívejme se na několik různých přístupů k míchání.

Krok 1: Metoda mixování »Žádná

Nejprve se podívejme na to, co se stane, pokud míchání vůbec nepoužíváte. Pokud odešlete data pouze z jedné osy na jednu stranu podvozku a druhou osu na druhou stranu, vaše vozidlo by nereagovalo tak, jak byste chtěli.

Pokud například zatlačíte joystick úplně dopředu, osa Y bude na plný plyn a osa X na 0. Takže byste místo rovně jeli v kruzích.

Krok 2: Metoda Metoda »Otočit

Metoda Metoda »Otočit
Metoda Metoda »Otočit

Jeden spolupracovník mě jednou upozornil, že ve špetce můžete otočit vysílač o 45 stupňů pro mix chudých. Pokud uvažujete o hodnotách ze dvou potenciometrů v joysticku jako ose x an y na mřížce (s oběma osami v rozsahu -100 až +100), dává to velký smysl, protože se chystáte na +100 na obou osách když zatlačíte joystick nahoru a doprava. Pokud by se to tedy mapovalo přímo na vaše dva kanály podvozku (levou a pravou stranu vašeho robota), přimělo by to vašeho robota jít vpřed.

První způsob míchání, který jsem kdy zkoušel, bylo matematicky otočit souřadnici x a y o 45 stupňů kolem středového bodu mřížky.

To funguje dobře, ale nemohu jít vpřed se 100% výkonem, protože když se otáčíte, celkový pohyb je omezen na kruh v mřížce, což znamená, že se nikdy nemůžete dostat do pravého horního rohu.

To také má za následek, že rohy mřížky nejsou využívány. To není problém, pokud používáte joystick/závěs, který omezuje váš pohyb, takže se do těchto oblastí nikdy nedostanete, ale jinak budete chtít, aby tato část mřížky udělala něco, aby vaše pohyby byly zcela proporcionální.

Pokud jste vizuální žák jako já, může být tento koncept jednodušší sledovat sledováním videa na začátku tohoto pokynu.

Podívejme se na několik příkladů kódu.

POZNÁMKY K PŘÍKLADŮM MÉHO KÓDU: Vynechávám, jak získáte hodnoty joystick_x a joystick_y, protože by se to měnilo v závislosti na vašem projektu. Také budu mapovat/omezovat na ± 100, ale pravděpodobně budete muset namapovat na 1000 - 2000 pro PWM nebo 0 - 255 pro analogový výstup atd. Vždy omezuji … jen pro případ.

Příklad Arduina:

// matematicky otočit

double 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); // omezit leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

JavaScript příklad:

// matematicky rotatevar 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); // pomocná funkce varvar omezení = funkce (num, min, max) {return Math.min (Math.max (num, min), max); };

Krok 3: Metoda Metoda »Jednoduchá

Metoda Metoda »Jednoduchá
Metoda Metoda »Jednoduchá

Dále tu máme velmi jednoduchou rovnici, kterou jsem poprvé zachytil z jednoho z videí Shawn Hymel’s Adventures in Science SparkFun, kde náhodou pracoval na velmi podobném projektu, na jakém jsem pracoval já.

Tato rovnice vám umožní dostat se na plnou rychlost, když jdete vpřed, ale podobně jako metoda rotace ignoruje rohové oblasti mřížky. Důvodem je, že v některých případech je maximum 100 a v některých případech maximum 200. Takže byste použili funkci omezení k ignorování čehokoli po 100.

A mimochodem, neříkám to jednoduše hanlivě … v jednoduchosti je krása.

Příklad Arduina:

int leftThrottle = joystick_y + joystick_x;

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

Příklad JavaScriptu:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // constrain leftChannel = constrain (leftChannel, -100, 100); rightChannel = omezení (rightChannel, -100, 100); // pomocná funkce varvar omezení = funkce (num, min, max) {return Math.min (Math.max (num, min), max); };

Krok 4: Metoda Metoda »Proporcionální

Metoda Metoda »Proporcionální
Metoda Metoda »Proporcionální

Odskočil jsem od jednoduché metody v naději, že vytvořím to nejlepší z obou světových rovnic. Jde o to, být plně proporcionální ve všech směrech i diagonálně, přestože se pohybujete na větší vzdálenost, má stejný rozsah, jako když se pohybujete svisle, což je menší vzdálenost.

V mých příkladech skončíte se stupnicí od -200 do +200 ve všech směrech. Mapuji to na ± 100, protože to představuje procento energie procházející každým kanálem - jakkoli to budete chtít namapovat na cokoli, co funguje při vašem použití - pouzdro pro váš ovladač motoru. Pokud například odesíláte signál PWM, můžete jej namapovat na 1000 až 2000 nebo pokud odesíláte analogový signál, můžete jej namapovat na 0-255 a nastavit směr jako booleovský atd.

Příklad Arduina:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // v některých případech je maximum 100, v některých případech je 200 // zohledníme rozdíl, takže maximum je vždy 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - rozdíl: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - rozdíl: rightThrottle + diff; // Mapa od ± 200 do ± 100 nebo jakýkoli rozsah, který jehlaftThrottle = mapa (leftThrottle, 0, 200, -100, 100); rightThrottle = mapa (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

Příklad JavaScriptu:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // v některých případech je maximum 100, v některých případech je 200, // zohledníme rozdíl, takže maximum je vždy 200var diff = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - rozdíl: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle -diff: rightThrottle + diff; // Mapa od ± 200 zpět dolů na ± 100 nebo cokoli, co si jehlouftThrottle = mapa (leftThrottle, -200, 200, -100, 100); rightThrottle = mapa (rightThrottle, -200, 200, -100, 100); // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // some helper functionsvar constrain = function (num, min, max) {return Math.min (Math. max (počet, min), max); }; var mapa = funkce (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, mapped; inMin = inMin + inMax; num = num + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (num/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); mapováno = outSpan*(p/100) - (outMax/2); návrat zmapován;};

Doporučuje: