Indholdsfortegnelse:

Forståelse af kanalblanding: 4 trin (med billeder)
Forståelse af kanalblanding: 4 trin (med billeder)

Video: Forståelse af kanalblanding: 4 trin (med billeder)

Video: Forståelse af kanalblanding: 4 trin (med billeder)
Video: Min opgave er at observere skoven, og her sker noget mærkeligt. 2024, Juli
Anonim
Image
Image
Blandingsmetode »Ingen
Blandingsmetode »Ingen

Hvis du nogensinde har kørt et fjernbetjeningschassis, er der en god chance for, at du har brugt blanding, selvom du ikke vidste det. Specifikt, hvis du har brugt et enkelt joystick eller gimble til at styre et køretøj, der bruger skridstyring eller differentialestyring, har du brugt blanding.

Blanding er simpelthen, hvordan dataene fra dit joystick bruges til at bestemme, hvor meget strøm der skal leveres til hver side af chassiset.

Hvis du åbner et joystick, vil du generelt se to potentiometre indeni. Den ene til at måle din nuværende position langs Y -aksen (op og ned), og den anden til at måle, hvor du befinder dig langs X -aksen (side til side).

Selvom jeg ikke har nogen formel uddannelse i emnet, har jeg været nødt til at blande kode før og for nylig ville jeg dykke lidt dybere ned i emnet.

Først vil jeg bemærke, at de fleste RC -sendere har blandingsevne, ligesom mange motorstyringer. Disse oplysninger vil være mest nyttige, hvis du selv skal blande i din kode. Sig f.eks., Hvis du bruger en Arduino til at læse ublandet data fra en RC -modtager, eller du læser analoge data fra potterne i et joystick, eller hvis du læser koordinaterne fra et digitalt joystick i en mobilapp.

Lad os se på nogle forskellige blandingsmetoder.

Trin 1: Blandingsmetode »Ingen

Lad os først se på, hvad der sker, hvis du slet ikke bruger blanding. Hvis du bare sender dataene fra den ene akse til den ene side af chassiset og den anden akse til den anden side, reagerer dit køretøj ikke, som du vil have det.

For eksempel hvis du skubber joysticket helt fremad, er Y -aksen ved fuld gas og X -aksen er på 0. Så du ville køre i cirkler i stedet for at gå lige.

Trin 2: Metode Metode »Roter

Metode Metode »Roter
Metode Metode »Roter

En medarbejder påpegede mig engang, at du med en knivspids kan rotere din sender 45 grader for en fattigmandsblanding. Hvis du tænker på værdierne fra de to potentiometre i et joystick som værende x og y -aksen på et gitter (med begge akse spænder -100 til +100) giver det meget mening, fordi du går til +100 på begge akser mens du skubber joysticket op og til højre. Så hvis dette kortes direkte til dine to chassis -kanaler (venstre og højre side af din robot), ville det få din robot til at gå fremad.

Så den første blandingsmetode, jeg nogensinde har prøvet, var at matematisk rotere x og y koordinere 45 grader omkring gitterets midtpunkt.

Dette fungerer ok, men jeg kan ikke gå fremad med 100% strøm, for når du roterer, er den samlede bevægelse begrænset til en cirkel i nettet, hvilket betyder, at du aldrig rigtig kan komme ind i det øverste højre hjørne.

Dette resulterer også i, at hjørnerne af nettet ikke bliver udnyttet. Dette er ikke et problem, hvis du bruger et joystick/gimple, der begrænser din bevægelse, så disse områder aldrig nås, men ellers vil du have, at den del af gitteret gør noget, så dine bevægelser føles fuldstændig proportionelle.

Hvis du er en visuel lærer som mig selv, kan dette koncept være lettere at famle ved at se videoen i begyndelsen af denne instruerbare.

Lad os se på nogle kodeeksempler.

BEMÆRKNINGER OM MINE KODEKSEMPLER: Jeg udelader, hvordan du får joystick_x og joystick_y -værdierne, da det ville ændre sig afhængigt af dit projekt. Jeg vil også kortlægge/begrænse til ± 100, men du skal sandsynligvis kortlægge til 1000 - 2000 for PWM eller 0 - 255 for analog udgang osv. Jeg begrænser altid … bare i tilfælde.

Arduino Eksempel:

// rotere matematisk

dobbelt 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); // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = begrænsning (rightThrottle, -100, 100);

JavaScript -eksempel:

// matematisk 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); // hjælper functionvarvar begrænsning = funktion (num, min, max) {return Math.min (Math.max (num, min), max); };

Trin 3: Metode Metode »Enkel

Metode Metode »Enkel
Metode Metode »Enkel

Dernæst har vi en meget simpel ligning, som jeg først hentede fra en af Shawn Hymels eventyr i Science SparkFun -videoer, hvor han tilfældigvis arbejdede med et projekt, der lignede meget det, jeg arbejdede på.

Denne ligning giver dig mulighed for at komme til fuld hastighed, når du går fremad, men ligesom rotationsmetoden ignorerer den hjørneområderne af nettet. Dette skyldes, at maksimum i nogle tilfælde er 100, og i nogle tilfælde er maksimum 200. Så du ville bruge en begrænsningsfunktion til at se bort fra alt efter 100.

Og forresten kalder jeg det ikke for nedsættende … der er en skønhed i enkelheden.

Arduino Eksempel:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = begrænsning (rightThrottle, -100, 100);

JavaScript -eksempel:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // constrain leftChannel = constrain (leftChannel, -100, 100); rightChannel = begrænsning (rightChannel, -100, 100); // hjælper functionvarvar begrænsning = funktion (num, min, max) {return Math.min (Math.max (num, min), max); };

Trin 4: Metode Metode »Proportional

Metode Metode »Proportional
Metode Metode »Proportional

Jeg sprang ud af den enkle metode i håb om at få det bedste ud af begge verdeners ligning. Ideen her er at være fuldt proportional i alle retninger selv diagonalt på trods af, at selvom du bevæger dig en større afstand, har den samme rækkevidde, som når du bevæger dig lodret, hvilket er en mindre afstand.

Du ender med en skala fra -200 til +200 i alle retninger i mine eksempler, jeg kortlægger det til ± 100, fordi det repræsenterer procentdelen af strøm til hver kanal - men du vil gerne kortlægge det til det, der fungerer i din brug- etui til din motorstyring. For eksempel, hvis du sender et PWM-signal, kan du kortlægge det til 1000 til 2000, eller hvis du sender et analogt signal, kan du kortlægge det til 0-255 og indstille retningen som boolean osv.

Arduino Eksempel:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // i nogle tilfælde er max 100, i nogle tilfælde er det 200 // lad os indregne forskellen, så maks er altid 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Kort fra ± 200 til ± 100 eller hvilket område du har brug for venstreThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

JavaScript -eksempel:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // i nogle tilfælde er max 100, i nogle tilfælde er det 200, // lad os indregne forskellen, så maks er altid 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; // Kort fra ± 200 tilbage til ± 100 eller hvad du end har til venstreThrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // nogle hjælperfunktionervar constrain = function (num, min, max) {return Math.min (Math. max (num, min), max); }; var map = funktion (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, kortlagt; 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); kortlagt = outSpan*(p/100) - (outMax/2); return kortlagt;};

Anbefalede: