Inhoudsopgave:

Kanaalmixen begrijpen: 4 stappen (met afbeeldingen)
Kanaalmixen begrijpen: 4 stappen (met afbeeldingen)

Video: Kanaalmixen begrijpen: 4 stappen (met afbeeldingen)

Video: Kanaalmixen begrijpen: 4 stappen (met afbeeldingen)
Video: Wacht tot je Ziet hoe de Mooiste Tweeling ter Wereld er NU Uitziet! 2024, Juli-
Anonim
Image
Image
Mengmethode » Geen
Mengmethode » Geen

Als je ooit een chassis met afstandsbediening hebt bestuurd, is de kans groot dat je mixen hebt gebruikt, zelfs als je het niet wist. In het bijzonder, als je een enkele joystick of gimble hebt gebruikt om een voertuig te besturen dat gebruik maakt van slipbesturing of differentieelbesturing, heb je mixen gebruikt.

Mixen is gewoon hoe de gegevens van uw joystick worden gebruikt om te bepalen hoeveel vermogen aan elke kant van het chassis moet worden geleverd.

Als je een joystick opent, zie je over het algemeen twee potentiometers erin. Een om uw huidige positie langs de Y-as te meten (omhoog en omlaag), en de andere om te meten waar u zich bevindt langs de X-as (van links naar rechts).

Hoewel ik geen formele opleiding over dit onderwerp heb, heb ik al eerder code moeten mixen en onlangs wilde ik wat dieper in het onderwerp duiken.

Ten eerste wil ik opmerken dat de meeste RC-zenders mengmogelijkheden hebben, net als veel motorcontrollers. Deze informatie zal het nuttigst zijn als u zelf het mixen in uw code moet doen. Zeg bijvoorbeeld of u een Arduino gebruikt om ongemengde gegevens van een RC-ontvanger te lezen, of u leest analoge gegevens uit de potten in een joystick, of als u de coördinaten leest van een digitale joystick op een mobiele app.

Laten we eens kijken naar enkele verschillende mengmethoden.

Stap 1: Mengmethode » Geen

Laten we eerst eens kijken wat er gebeurt als je helemaal niet mixt. Als u alleen de gegevens van de ene as naar de ene kant van het chassis stuurt en de andere as naar de andere kant, zou uw voertuig niet reageren zoals u dat wilt.

Als u bijvoorbeeld de joystick helemaal recht naar voren duwt, staat de Y-as op vol gas en de X-as op 0. U rijdt dus in cirkels in plaats van rechtdoor.

Stap 2: Methode Methode » Roteren

Methode Methode » Roteren
Methode Methode » Roteren

Een collega wees me er ooit op dat je in een mum van tijd je zender 45 graden kunt draaien voor een armzalige mix. Als je de waarden van de twee potentiometers in een joystick beschouwt als de x en y-as op een raster (met beide assen die zich uitstrekken over -100 tot +100), is dit heel logisch omdat je op beide assen naar +100 gaat terwijl u de joystick omhoog en naar rechts duwt. Dus als dit rechtstreeks wordt toegewezen aan uw twee chassiskanalen (de linker- en rechterkant van uw robot), zou uw robot vooruit gaan.

Dus de eerste mengmethode die ik ooit heb geprobeerd, was om de x- en y-coördinaat wiskundig 45 graden rond het middelpunt van het raster te draaien.

Dit werkt goed, maar ik kan niet met 100% kracht vooruit gaan, want als je draait, is de algehele beweging beperkt tot een cirkel binnen het raster, wat betekent dat je nooit echt in die rechterbovenhoek kunt komen.

Hierdoor worden ook de hoeken van het raster niet benut. Dit is geen probleem als je een joystick/gimple gebruikt die je beweging beperkt, zodat die gebieden sowieso nooit worden bereikt, maar anders wil je dat dat deel van het raster iets doet zodat je bewegingen volledig proportioneel aanvoelen.

Als je een visuele leerling bent zoals ik, is dit concept misschien gemakkelijker te begrijpen door de video aan het begin van dit instructable te bekijken.

Laten we eens kijken naar enkele codevoorbeelden.

OPMERKINGEN OVER MIJN CODEVOORBEELDEN: Ik laat weg hoe u de joystick_x- en joystick_y-waarden krijgt, aangezien dit zou veranderen afhankelijk van uw project. Ik zal ook in kaart brengen / beperken tot ± 100, maar je moet waarschijnlijk toewijzen aan 1000 - 2000 voor PWM of 0 - 255 voor analoge uitvoer enz. Ik beperk altijd … voor het geval dat.

Arduino-voorbeeld:

//wiskundig roteren

dubbele 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 = beperken (rightThrottle, -100, 100);

JavaScript-voorbeeld:

//wiskundig roterendevar 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 = function (num, min, max) {return Math.min (Math.max (num, min), max); };

Stap 3: Methode Methode » Eenvoudig

Methode Methode » Eenvoudig
Methode Methode » Eenvoudig

Vervolgens hebben we een heel eenvoudige vergelijking die ik voor het eerst heb opgepikt uit een van Shawn Hymel's Adventures in Science SparkFun-video's waar hij toevallig aan een zeer vergelijkbaar project werkte als waar ik aan werkte.

Met deze vergelijking kun je op volle snelheid komen als je vooruit gaat, maar net als bij de rotatiemethode worden de hoekgebieden van het raster buiten beschouwing gelaten. Dit komt omdat in sommige gevallen het maximum 100 is en in sommige gevallen het maximum 200. U zou dus een beperkingsfunctie gebruiken om iets na 100 te negeren.

En tussen haakjes, ik noem dit niet denigrerend eenvoudig… er zit schoonheid in eenvoud.

Arduino-voorbeeld:

int leftThrottle = joystick_y + joystick_x;

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

JavaScript-voorbeeld:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x;//constrain leftChannel = constrain(leftChannel, -100, 100); rightChannel = beperken (rightChannel, -100, 100); //helper functionvar constrain = function (num, min, max) {return Math.min (Math.max (num, min), max); };

Stap 4: Methode Methode » Proportioneel

Methode Methode » Proportioneel
Methode Methode » Proportioneel

Ik sprong van de eenvoudige methode af in de hoop een vergelijking van het beste van beide werelden te maken. Het idee hier is om in alle richtingen volledig proportioneel te zijn, zelfs diagonaal, ondanks het feit dat, hoewel je een grotere afstand aflegt, het hetzelfde bereik heeft als wanneer je verticaal beweegt, wat een kleinere afstand is.

Je krijgt uiteindelijk een schaal van -200 tot +200 in alle richtingen in mijn voorbeelden. Ik breng dat in kaart op ± 100 omdat het het percentage vermogen vertegenwoordigt dat naar elk kanaal gaat - maar je zult het willen toewijzen aan wat werkt in je gebruik- koffer voor uw motorcontroller. Als u bijvoorbeeld een PWM-signaal verzendt, kunt u dat toewijzen aan 1000 tot 2000 of als u een analoog signaal verzendt, kunt u het toewijzen aan 0-255 en de richting instellen als boolean enz.

Arduino-voorbeeld:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x;// in sommige gevallen is het maximum 100, in sommige gevallen is het 200// laten we het verschil in rekening brengen, zodat het maximum altijd 200int is diff = abs(abs(joystick_y) - abs(joystick_x));leftThrottle = leftThrottle < 0 ? leftThrottle - diff: leftThrottle + diff;rightThrottle = rechtsThrottle < 0 ? rightThrottle - diff: rightThrottle + diff; // Kaart van ±200 tot ± 100 of welk bereik je ook nodig hebtleftThrottle = map(leftThrottle, 0, 200, -100, 100);rightThrottle = map(rightThrottle, 0, 200, -100, 100); //constrainleftThrottle = constrain(leftThrottle, -100, 100);rightThrottle = constrain(rightThrottle, -100, 100);

JavaScript-voorbeeld:

var leftThrottle = joystick_y + joystick_x;var rightThrottle = joystick_y - joystick_x;// in sommige gevallen is het maximum 100, in sommige gevallen 200, // laten we het verschil incalculeren, zodat het maximum altijd 200 is var diff = Math.abs(Math.abs(joystick_y) - Math.abs(joystick_x));leftThrottle = leftThrottle < 0 ? leftThrottle - diff: leftThrottle + diff;rightThrottle = rechtsThrottle < 0 ? rightThrottle - diff: rightThrottle + diff;//Kaart van ±200 terug naar ±100 of wat je ook nodig hebtleftThrottle = map(leftThrottle, -200, 200, -100, 100);rightThrottle = map(rightThrottle, -200, 200, -100, 100); //constrain leftThrottle = constrain(leftThrottle, -100, 100);rightThrottle = constrain(rightThrottle, -100, 100);//sommige helperfunctiesvar constrain = function(num, min, max){ return Math.min(Math. max(aantal, min), max); }; var map = function(num, inMin, inMax, outMin, outMax){ var p, inSpan, outSpan, in kaart gebracht; inMin = inMin + inMax; aantal = aantal + inMax; inMax = inMax + inMax; inSpan = Math.abs(inMax-inMin); p = (getal/inSpan)*100; uitMin = uitMin + uitMax; uitMax = uitMax + uitMax; outSpan = Math.abs(outMax - outMin); toegewezen = outSpan*(p/100) - (outMax/2); terug in kaart gebracht;};

Aanbevolen: