Tartalomjegyzék:

A csatorna keverés megértése: 4 lépés (képekkel)
A csatorna keverés megértése: 4 lépés (képekkel)

Videó: A csatorna keverés megértése: 4 lépés (képekkel)

Videó: A csatorna keverés megértése: 4 lépés (képekkel)
Videó: Kicsomi - 🦄Kiki 🦄: 🎁 Slime készítés 😆 2024, Július
Anonim
Image
Image
Keverési módszer »Nincs
Keverési módszer »Nincs

Ha valaha távirányítós alvázat vezetett, akkor jó eséllyel használta a keverést, még akkor is, ha nem tudta. Pontosabban, ha egyetlen joystickot vagy kardántengelyt használt a csúszó- vagy differenciál -kormányzást használó jármű vezérléséhez, akkor a keverést használta.

A keverés egyszerűen a joystick adatait használja fel annak meghatározására, hogy mennyi áramot kell biztosítani a ház mindkét oldalán.

Ha kinyit egy joystickot, általában két potenciométert fog látni. Az egyik az Y tengely mentén (fel és le), míg a másik az X tengely mentén (oldalról oldalra) mérni.

Bár nincs hivatalos képzésem a témában, korábban kódolást kellett végeznem, és a közelmúltban szerettem volna egy kicsit mélyebbre merülni a témában.

Először is szeretném megjegyezni, hogy a legtöbb RC távadó keverési képességgel rendelkezik, mint sok motorvezérlő. Ez az információ akkor lesz a leghasznosabb, ha magának kell a keverést elvégeznie a kódban. Tegyük fel például, hogy ha egy Arduino -t használ a nem kevert adatok olvasásához egy RC -vevőegységből, vagy analóg adatokat olvas az edényekből egy joystickban, vagy ha a koordinátákat egy digitális joystickról olvassa egy mobilalkalmazásban.

Nézzünk néhány különböző keverési módszert.

1. lépés: Keverési módszer »Nincs

Először nézzük meg, mi történik, ha egyáltalán nem használunk keverést. Ha csak elküldi az adatokat az egyik tengelyről az alváz egyik oldalára, a másik tengelyt pedig a másik oldalra, akkor a jármű nem úgy reagál, ahogy szeretné.

Például, ha teljesen egyenesen előre tolja a joystickot, akkor az Y tengely teljes gázzal, az X tengely pedig 0. Ezzel tehát körökben vezetne, nem pedig egyenesen.

2. lépés: Módszer Módszer »Forgatás

Módszer Módszer »Forgatás
Módszer Módszer »Forgatás

Egy munkatársam egyszer rámutatott nekem, hogy egy csipetnyi fordulattal 45 fokkal elforgathatja az adót szegény ember keverékéért. Ha úgy gondolja, hogy a joystickban lévő két potenciométer értékei x x y tengelyek a rácson (mindkét tengely -100 és +100 között van), akkor sok értelme van, mert mindkét tengelyen +100 lesz ahogy felfelé és jobbra tolja a joystickot. Tehát ha ez közvetlenül a két alvázcsatornához (a robot bal és jobb oldala) kapcsolódik, akkor a robot előre megy.

Tehát az első keverési módszer, amit valaha is kipróbáltam, az volt, hogy matematikailag elforgattam az x és y koordinátákat 45 fokkal a rács középpontja körül.

Ez rendben működik, azonban nem tudok 100% -os erővel továbblépni, mert amikor forog, a teljes mozgás egy körre korlátozódik a rácson belül, ami azt jelenti, hogy soha nem juthat be a jobb felső sarokba.

Ez azt is eredményezi, hogy a rács sarkait nem használják ki. Ez nem jelent problémát, ha olyan joystickot használ, amely korlátozza a mozgását, így azok a területek soha nem érhetők el, de ellenkező esetben azt akarja, hogy a rács ezen része tegyen valamit, hogy mozdulatai teljesen arányosak legyenek.

Ha Ön olyan vizuális tanuló, mint én, akkor ezt a koncepciót könnyebb lenne felkavarni, ha megnézi az útmutató elején található videót.

Nézzünk néhány példát a kódokra.

MEGJEGYZÉSEK A KÓDPÉLDÁKRÓL: Elhagyom a joystick_x és joystick_y értékek megszerzésének módját, mivel ez a projekttől függően változhat. Szintén leképezés/korlátozás lesz ± 100 -ra, de valószínűleg 1000 - 2000 -re kell leképeznie PWM esetén, vagy 0 - 255 -re analóg kimenetnél stb. Mindig kényszerítem …

Arduino példa:

// matematikai forgatás

kettős 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); // korlátozás leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

JavaScript példa:

// matematikailag 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); // helper functionvar constrain = függvény (szám, min, max) {return Math.min (Math.max (szám, min), max); };

3. lépés: Módszer módszer »Egyszerű

Módszer Módszer »Egyszerű
Módszer Módszer »Egyszerű

Következzen egy nagyon egyszerű egyenletünk, amelyet először Shawn Hymel kalandjai közül a Science SparkFun videóiból vettem fel, ahol történetesen nagyon hasonló projekten dolgozott, mint amin dolgoztam.

Ez az egyenlet lehetővé teszi a teljes sebesség elérését, ha előre megy, de hasonlóan a forgatási módszerhez, figyelmen kívül hagyja a rács sarokterületeit. Ennek az az oka, hogy bizonyos esetekben a maximum 100, egyes esetekben a maximum 200. Tehát a kényszerítő függvény használatával 100 után bármit figyelmen kívül hagyhat.

És egyébként nem nevezem ezt egyszerűnek lekicsinylően … az egyszerűségben van egy szépség.

Arduino példa:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // korlátozás leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

JavaScript példa:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // constrain leftChannel = korlátozás (leftChannel, -100, 100); rightChannel = korlátozás (rightChannel, -100, 100); // helper functionvar constrain = függvény (szám, min, max) {return Math.min (Math.max (szám, min), max); };

4. lépés: Módszer módszer »Arányos

Módszer Módszer »Arányos
Módszer Módszer »Arányos

Rájöttem az egyszerű módszerre, remélve, hogy mindkét világ egyenletét a lehető legjobban kihasználom. Az ötlet itt az, hogy teljesen arányos legyen minden irányban, még átlósan is, annak ellenére, hogy nagyobb távolságot mozog, ugyanolyan tartományban van, mint amikor függőlegesen mozog, ami kisebb távolság.

A példáimban minden irányban -200 és +200 közötti skálát kapsz, amelyet ± 100 -ra képezek le, mert ez az egyes csatornákra jutó teljesítmény százalékos arányát jelenti - azonban azt szeretnéd leképezni, amire csak használsz. a motorvezérlő tokja. Például, ha PWM jelet küld, akkor azt 1000-től 2000-ig leképezheti, vagy ha analóg jelet küld, akkor 0-255-re, és az irányt logikai értékre állíthatja be.

Arduino példa:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // bizonyos esetekben a max 100, egyes esetekben 200 // vegyük figyelembe a különbséget, így a max mindig 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Térkép ± 200 -tól ± 100 -ig, vagy bármilyen tartományban, amit tűvelThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

JavaScript példa:

var leftThrottle = joystick_y + joystick_x; var jobb Math.abs (joystick_y) - Math.abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle -diff: rightThrottle + diff; // Térkép ± 200 -tól lefelé ± 100 -ig, vagy bármihez, amit tűz Ttrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // egyes segédfunkciókvar constrain = function (szám, min, max) {return Math.min (Math. max (szám, perc), max); }; var map = function (szám, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, mapped; inMin = inMin + inMax; szám = szám + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (szám/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); leképezett = outSpan*(p/100) - (outMax/2); visszatérés feltérképezve;};

Ajánlott: