Obsah:

Pochopenie miešania kanálov: 4 kroky (s obrázkami)
Pochopenie miešania kanálov: 4 kroky (s obrázkami)

Video: Pochopenie miešania kanálov: 4 kroky (s obrázkami)

Video: Pochopenie miešania kanálov: 4 kroky (s obrázkami)
Video: Полный курс по Next js - Изучи Nextjs за 2 часа! | React SSR +таймкоды 2024, November
Anonim
Image
Image
Metóda mixovania »Žiadna
Metóda mixovania »Žiadna

Ak ste niekedy jazdili na podvozku s diaľkovým ovládaním, je veľká šanca, že ste použili mixovanie, aj keď ste to nevedeli. Konkrétne, ak ste na ovládanie vozidla, ktoré používa šmykové alebo diferenciálne riadenie, použili jediný joystick alebo ovládač, použili ste mixovanie.

Miešanie je jednoducho to, ako sa údaje z vášho joysticku používajú na určenie toho, koľko energie by malo byť dodávané na každú stranu podvozku.

Ak otvoríte joystick, vo vnútri uvidíte spravidla dva potenciometre. Jeden na meranie vašej aktuálnej polohy pozdĺž osi Y (hore a dole) a druhý na meranie toho, kde sa nachádzate, pozdĺž osi X (zo strany na stranu).

Napriek tomu, že nemám žiadne formálne školenie na túto tému, musel som sa predtým venovať miešaniu kódu a nedávno som sa chcel ponoriť trochu hlbšie do predmetu.

Najprv chcem poznamenať, že väčšina RC vysielačov má schopnosť miešania, rovnako ako mnoho motorových ovládačov. Tieto informácie budú najužitočnejšie, ak sa vo svojom kóde musíte mixovať sami. Povedzme napríklad, že používate Arduino na čítanie nezmiešaných údajov z RC prijímača, alebo čítate analógové údaje z hrncov na joysticku, alebo ak čítate súradnice z digitálneho joysticku v mobilnej aplikácii.

Pozrime sa na niekoľko rôznych prístupov k mixovaniu.

Krok 1: Metóda mixovania »Žiadna

Najprv sa pozrime na to, čo sa stane, ak miešanie vôbec nepoužívate. Ak by ste len odoslali údaje z jednej osi na jednu stranu podvozku a druhú os na druhú stranu, vaše vozidlo by nereagovalo tak, ako by ste chceli.

Ak napríklad zatlačíte joystick úplne dopredu, os Y bude na plný plyn a os X na 0. Takže by ste namiesto rovnej jazdy jazdili v kruhoch.

Krok 2: Metóda Metóda »Otočiť

Metóda Metóda »Otočiť
Metóda Metóda »Otočiť

Jeden spolupracovník ma raz upozornil, že v núdzi môžete otočiť vysielač o 45 stupňov, aby ste získali mix chudobných. Ak uvažujete o hodnotách z dvoch potenciometrov na joysticku ako o x x osi y na mriežke (s oboma osami v rozpätí -100 až +100), dáva to veľký zmysel, pretože idete na +100 na oboch osiach keď tlačíte joystick nahor a doprava. Ak by sa to teda mapovalo priamo na vaše dva kanály podvozku (ľavá a pravá strana robota), váš robot by sa vydal dopredu.

Prvý spôsob miešania, ktorý som kedy vyskúšal, bolo matematicky otočiť súradnicu x a y o 45 stupňov okolo stredového bodu mriežky.

To funguje dobre, ale nemôžem ísť dopredu so 100% výkonom, pretože keď sa otáčate, celkový pohyb je obmedzený na kruh v mriežke, čo znamená, že sa nikdy nemôžete dostať do pravého horného rohu.

Výsledkom je tiež to, že rohy mriežky sa nevyužívajú. To nie je problém, ak používate joystick/záves, ktorý obmedzuje váš pohyb, takže sa do týchto oblastí nikdy nedostanete, ale inak budete chcieť, aby táto časť mriežky urobila niečo, aby sa vaše pohyby cítili úplne proporcionálne.

Ak ste vizuálny študent ako ja, tento koncept by bolo možno jednoduchšie pochopiť, keby ste si pozreli video na začiatku tohto návodu.

Pozrime sa na niekoľko príkladov kódu.

POZNÁMKY K PRÍKLADOM MÉHO KÓDU: Vynechávam, ako získate hodnoty joystick_x a joystick_y, pretože by sa menili v závislosti od vášho projektu. Tiež budem mapovať/obmedzovať na ± 100, ale pravdepodobne budete musieť namapovať na 1 000 - 2 000 pre PWM alebo 0 - 255 pre analógový výstup atď. Vždy obmedzujem … len pre prípad.

Príklad Arduina:

// matematicky otočiť

dvojitý 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); // obmedzenie leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

Príklad JavaScriptu:

// 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á funkcia varvar obmedzenie = funkcia (počet, min, max) {návrat Math.min (Math.max (počet, min), max); };

Krok 3: Metóda Metóda »Jednoduchá

Metóda Metóda »Jednoduchá
Metóda Metóda »Jednoduchá

Ďalej tu máme veľmi jednoduchú rovnicu, ktorú som najskôr zachytil z jedného z videí Shawn Hymel’s Adventures in Science SparkFun, kde náhodou pracoval na veľmi podobnom projekte, na akom som pracoval ja.

Táto rovnica vám umožní dosiahnuť plnú rýchlosť pri jazde vpred, ale podobne ako metóda otáčania ignoruje rohové oblasti mriežky. Dôvodom je, že v niektorých prípadoch je maximum 100 a v niektorých prípadoch maximum 200. Takže by ste použili funkciu obmedzenia, aby ste ignorovali čokoľvek po 100.

A mimochodom, nenazývam to jednoducho hanlivo … v jednoduchosti je krása.

Príklad Arduina:

int leftThrottle = joystick_y + joystick_x;

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

Príklad JavaScriptu:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // obmedzenie leftChannel = constrain (leftChannel, -100, 100); rightChannel = obmedzenie (rightChannel, -100, 100); // pomocná funkcia varvar obmedzenie = funkcia (počet, min, max) {návrat Math.min (Math.max (počet, min), max); };

Krok 4: Metóda Metóda »Proporcionálne

Metóda Metóda »Proporcionálne
Metóda Metóda »Proporcionálne

Začal som jednoduchou metódou dúfať, že urobím to najlepšie z rovnice oboch svetov. Ide o to, byť úplne proporcionálny vo všetkých smeroch aj diagonálne, napriek tomu, že sa pohybujete na väčšiu vzdialenosť, má rovnaký rozsah, ako keď sa pohybujete vertikálne, čo je menšia vzdialenosť.

V mojich príkladoch skončíte so stupnicou od -200 do +200 vo všetkých smeroch. Mapujem to na ± 100, pretože to predstavuje percento energie prechádzajúcej do každého kanála - budete ho však chcieť mapovať na čokoľvek, čo funguje pri vašom použití - puzdro pre váš regulátor motora. Napríklad, ak odosielate signál PWM, môžete ho namapovať na 1 000 až 2 000 alebo ak odosielate analógový signál, môžete ho namapovať na 0-255 a smer nastaviť ako booleovský atď.

Príklad Arduina:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // v niektorých prípadoch je maximum 100, v niektorých prípadoch je 200 // zohľadnime rozdiel, takže maximum je vždy 200int rozdiel = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - rozdiel: rightThrottle + diff; // Mapa od ± 200 do ± 100 alebo v ľubovoľnom rozsahu, ktorý použijete // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

Príklad JavaScriptu:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // v niektorých prípadoch je maximum 100, v niektorých prípadoch je 200, // zohľadníme rozdiel, takže maximum je vždy 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 späť nadol na ± 100 alebo čokoľvek, čo ste vyftovaliThrottle = 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 = funkcia (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); mapované = outSpan*(p/100) - (outMax/2); návrat zmapovaný;};

Odporúča: