Innholdsfortegnelse:

Forstå kanalblanding: 4 trinn (med bilder)
Forstå kanalblanding: 4 trinn (med bilder)

Video: Forstå kanalblanding: 4 trinn (med bilder)

Video: Forstå kanalblanding: 4 trinn (med bilder)
Video: Как определить профиль целевого клиента 2024, Juli
Anonim
Image
Image
Blandingsmetode »Ingen
Blandingsmetode »Ingen

Hvis du noen gang har kjørt et fjernkontrollchassis, er det en god sjanse for at du har brukt miksing, selv om du ikke visste det. Spesielt hvis du har brukt en enkelt joystick eller gimble for å kontrollere et kjøretøy som bruker skidstyring eller differensialstyring, har du brukt miksing.

Blanding er ganske enkelt hvordan dataene fra joysticken din brukes til å bestemme hvor mye strøm som skal leveres til hver side av kabinettet.

Hvis du åpner en joystick, vil du vanligvis se to potensiometre inni. Den ene for å måle din nåværende posisjon langs Y -aksen (opp og ned), og den andre for å måle hvor du er langs X -aksen (side til side).

Selv om jeg ikke har noen formell opplæring om emnet, har jeg måttet blande inn kode før, og nylig ønsket jeg å dykke litt dypere inn i emnet.

Først vil jeg merke til at de fleste RC -sendere har blandingsevne, som mange motorstyringer. Denne informasjonen kommer til å være mest nyttig hvis du må blande deg selv i koden din. Si for eksempel hvis du bruker en Arduino til å lese ublandet data fra en RC -mottaker, eller hvis du leser analoge data fra pottene i en joystick, eller hvis du leser koordinatene fra en digital joystick i en mobilapp.

La oss ta en titt på noen forskjellige blandingsmetoder.

Trinn 1: Blandingsmetode »Ingen

La oss først se på hva som skjer hvis du ikke bruker miksing i det hele tatt. Hvis du bare sender dataene fra den ene aksen til den ene siden av chassiset og den andre aksen til den andre siden, ville ikke bilen din reagert slik du vil ha den.

For eksempel hvis du skyver joysticken helt rett frem, er Y -aksen på full gass og X -aksen er på 0. Så du ville kjøre i sirkler i stedet for å gå rett.

Trinn 2: Metode Metode »Roter

Metode Metode »Roter
Metode Metode »Roter

En medarbeider påpekte meg en gang at du i en klype kan rotere senderen 45 grader for en fattigmannsblanding. Hvis du tenker på verdiene fra de to potensiometrene i en joystick som x og y -aksen på et rutenett (med begge aksene som strekker seg -100 til +100), gir dette mye mening fordi du går til +100 på begge aksene mens du skyver joysticken opp og til høyre. Så hvis dette kartlegges direkte til de to chassis -kanalene dine (venstre og høyre side av roboten din) ville det få roboten til å gå fremover.

Så den første metoden for å blande jeg noen gang har prøvd var å matematisk rotere x- og y -koordinaten 45 grader omtrent midtpunktet i rutenettet.

Dette fungerer ok, men jeg kan ikke gå fremover med 100% kraft, for når du roterer, er den totale bevegelsen begrenset til en sirkel i rutenettet, noe som betyr at du aldri kan komme inn i det øverste høyre hjørnet.

Dette resulterer også i at hjørnene på nettet ikke blir utnyttet. Dette er ikke et problem hvis du bruker en joystick/gimple som begrenser bevegelsen, slik at disse områdene aldri nås, men ellers vil du at den delen av rutenettet skal gjøre noe slik at bevegelsene dine føles helt proporsjonale.

Hvis du er en visuell elev som meg selv, kan dette konseptet være lettere å grok ved å se videoen i begynnelsen av denne instruksjonsfulle.

La oss se på noen kodeeksempler.

MERKNADER OM KODEKSEMPLENE: Jeg utelater hvordan du får joystick_x og joystick_y -verdiene ettersom det ville endres avhengig av prosjektet ditt. Jeg vil også kartlegge/begrense til ± 100, men du må sannsynligvis kartlegge til 1000 - 2000 for PWM eller 0 - 255 for analog utgang osv. Jeg begrenser alltid … bare i tilfelle.

Arduino eksempel:

// rotere matematisk

dobbel 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 = begrensning (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); // hjelperfunksjonvarvarbegrensning = funksjon (num, min, maks) {return Math.min (Math.max (num, min), max); };

Trinn 3: Metode Metode »Enkel

Metode Metode »Enkel
Metode Metode »Enkel

Neste gang har vi en veldig enkel ligning som jeg først hentet fra en av Shawn Hymels eventyr i Science SparkFun -videoer der han tilfeldigvis jobbet med et prosjekt som lignet veldig på det jeg jobbet med.

Denne ligningen lar deg komme til full fart når du går fremover, men omtrent som rotasjonsmetoden ignorerer den hjørneområdene i rutenettet. Dette er fordi i noen tilfeller maksimum er 100 og i noen tilfeller maksimum er 200. Så du vil bruke en begrensningsfunksjon for å se bort fra alt etter 100.

Og forresten kaller jeg ikke dette for nedsettende … det er en skjønnhet i enkelheten.

Arduino eksempel:

int leftThrottle = joystick_y + joystick_x;

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

JavaScript -eksempel:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // constrain leftChannel = constrain (leftChannel, -100, 100); rightChannel = begrensning (rightChannel, -100, 100); // hjelperfunksjonvarvarbegrensning = funksjon (num, min, maks) {return Math.min (Math.max (num, min), max); };

Trinn 4: Metode Metode »Proporsjonal

Metode Metode »Proporsjonal
Metode Metode »Proporsjonal

Jeg sprang av den enkle metoden i håp om å gjøre det beste ut av begge verdens ligninger. Tanken her er å være fullt proporsjonal i alle retninger selv diagonalt til tross for at selv om du beveger deg en større avstand, har den samme rekkevidde som når du beveger deg vertikalt, som er en mindre avstand.

Du ender opp med en skala fra -200 til +200 i alle retninger i eksemplene mine. Jeg kartlegger det til ± 100 fordi det representerer prosentandelen av strøm til hver kanal - men du vil kartlegge det til det som fungerer i din bruk- etui til motorstyringen din. For eksempel hvis du sender et PWM-signal, kan du kartlegge det til 1000 til 2000 eller hvis du sender et analogt signal, kan du kartlegge det til 0-255 og angi retningen som boolsk etc.

Arduino eksempel:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // i noen tilfeller er maks 100, i noen tilfeller er det 200 // la oss faktorere forskjellen, så maks er alltid 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Kart fra ± 200 til ± 100 eller hvilket område du trenger leftThrottle = 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 noen tilfeller er maks 100, i noen tilfeller er det 200, // la oss ta med forskjellen, så maks er alltid 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; // Kart fra ± 200 tilbake til ± 100 eller hva du trenger leftThrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // noen hjelperfunksjonervar constrain = function (num, min, max) {return Math.min (Math. maks (antall, min), maks); }; var map = function (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); kartlagt = outSpan*(p/100) - (outMax/2); retur kartlagt;};

Anbefalt: