INHOUDSOPGAWE:

Kanaalmenging verstaan: 4 stappe (met foto's)
Kanaalmenging verstaan: 4 stappe (met foto's)

Video: Kanaalmenging verstaan: 4 stappe (met foto's)

Video: Kanaalmenging verstaan: 4 stappe (met foto's)
Video: Как спрятать данные в ячейках Excel? 2024, Julie
Anonim
Image
Image
Mengmetode »Geen
Mengmetode »Geen

As u al ooit met 'n afstandbeheer -onderstel gery het, is die kans goed dat u vermenging gebruik het, selfs al weet u dit nie. Spesifiek, as u 'n enkele joystick of gimble gebruik het om 'n voertuig te bestuur wat glybaan of differensiële stuur gebruik, het u gemeng.

Meng is eenvoudig hoe die data van u joystick gebruik word om te bepaal hoeveel krag aan elke kant van die onderstel verskaf moet word.

As u 'n joystick oopmaak, sien u gewoonlik twee potensiometers binne. Een om u huidige posisie langs die Y -as (op en af) te meet, en die ander om te meet waar u langs die X -as (van kant tot kant) is.

Alhoewel ek geen formele opleiding oor die onderwerp gehad het nie, moes ek kode voorheen meng, en ek wou onlangs 'n bietjie dieper in die onderwerp ingaan.

Eerstens wil ek daarop let dat die meeste RC -senders mengvermoë het, net soos baie motorbeheerders. Hierdie inligting sal die nuttigste wees as u self in u kode moet meng. Sê byvoorbeeld as u 'n Arduino gebruik om ongemengde data van 'n RC -ontvanger te lees, of as u analoog data uit die potte in 'n joystick lees, of as u die koördinate van 'n digitale joystick op 'n mobiele app lees.

Kom ons kyk na 'n paar verskillende mengbenaderings.

Stap 1: Mengmetode »Geen

Kom ons kyk eers na wat gebeur as u glad nie meng nie. As u net die data van die een as na die een kant van die onderstel en die ander as na die ander kant stuur, reageer u voertuig nie soos u wil nie.

As u byvoorbeeld die joystick reguit vorentoe druk, is die Y -as vol gas en die X -as op 0. As u in sirkels ry, in plaas daarvan om reguit te gaan.

Stap 2: Metode Metode »Draai

Metode Metode »Draai
Metode Metode »Draai

'N Medewerker het my eenkeer daarop gewys dat u u sender in 'n knippie 45 grade kan draai vir 'n arm man se mengsel. As u aan die waardes van die twee potensiometers in 'n joystick dink as die x en y -as op 'n rooster (met beide as -100 tot +100), is dit baie sinvol, want u gaan na +100 op beide as terwyl u die joystick na bo en na regs stoot. As dit dus direk na u twee onderstelkanale (die linker- en regterkant van u robot) kaarte, sou dit u robot vorentoe laat beweeg.

Die eerste mengmetode wat ek ooit probeer het, was om die x en y 45 grade om die middelpunt van die rooster wiskundig te draai.

Dit werk goed, maar ek kan nie voortgaan met 100% krag nie, want as u draai, is die algehele beweging beperk tot 'n sirkel binne die rooster, wat beteken dat u nooit regtig in die regter boonste hoek kan kom nie.

Dit het ook tot gevolg dat die hoeke van die rooster nie gebruik word nie. Dit is geen probleem as u 'n joystick/gimpel gebruik wat u beweging beperk, sodat die gebiede nooit bereik kan word nie, maar anders wil u hê dat die gedeelte van die rooster iets moet doen sodat u bewegings heeltemal eweredig voel.

As u 'n visuele leerder soos ek is, is dit makliker om te konsepteer deur na die video aan die begin van hierdie instruksies te kyk.

Kom ons kyk na 'n paar kode voorbeelde.

AANTEKENINGE OOR MY KODE VOORBEELDE: Ek laat uit hoe u die waardes vir joystick_x en joystick_y kan kry, aangesien dit sou verander na gelang van u projek. Ek sal ook kartering/beperk tot ± 100, maar u moet waarskynlik na 1000 - 2000 vir PWM of 0 - 255 vir analoog uitset, ens. Ek beperk altyd … net ingeval.

Arduino Voorbeeld:

// wiskundig draai

dubbel 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 = beperking (rightThrottle, -100, 100);

Voorbeeld van JavaScript:

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

Stap 3: Metode Metode »Eenvoudig

Metode Metode »Eenvoudig
Metode Metode »Eenvoudig

Vervolgens het ons 'n baie eenvoudige vergelyking wat ek eers opgetel het uit een van Shawn Hymel se Adventures in Science SparkFun -video's, waar hy toevallig 'n baie soortgelyke projek aan die werk gehad het waaraan ek gewerk het.

Met hierdie vergelyking kan u op volle snelheid kom terwyl u vorentoe gaan, maar net soos die draai -metode, ignoreer dit die hoekareas van die rooster. Dit is omdat die maksimum in sommige gevalle 100 is en in sommige gevalle die maksimum 200. U sou dus 'n beperkingsfunksie gebruik om enigiets na 100 te ignoreer.

En terloops, ek noem dit nie eenvoudig neerhalend nie … daar is 'n skoonheid in eenvoud.

Arduino Voorbeeld:

int leftThrottle = joystick_y + joystick_x;

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

Voorbeeld van JavaScript:

var leftChannel = joystick_y + joystick_x;

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

Stap 4: Metode Metode »Proporsioneel

Metode Metode »Proporsioneel
Metode Metode »Proporsioneel

Ek het van die eenvoudige metode ontslae geraak, met die hoop dat ek die beste van albei wêrelde kan maak. Die idee hier is om selfs in 'n diagonale verhouding eweredig in alle rigtings te wees, alhoewel u 'n groter afstand beweeg, het dit dieselfde omvang as wanneer u vertikaal beweeg, 'n kleiner afstand.

U eindig met 'n skaal van -200 tot +200 in alle rigtings in my voorbeelde. Ek karteer dit tot ± 100 omdat dit die persentasie krag na elke kanaal verteenwoordig - maar u sal dit wil toewys na wat ook al u gebruik - tas vir u motorbeheerder. As u byvoorbeeld 'n PWM-sein stuur, kan u dit na 1000 tot 2000 toewys, of as u 'n analoog sein stuur, kan u dit na 0-255 toewys en die rigting as boolean, ens.

Arduino Voorbeeld:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // in sommige gevalle is die maksimum 100, in sommige gevalle is dit 200 // laat ons die verskil inskakel, sodat die maksimum altyd 200int diff = abs (abs (joystick_y) - abs (joystick_x) is); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Kaart van ± 200 tot ± 100 of watter reeks ook al u benodig leftThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

Voorbeeld van JavaScript:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // in sommige gevalle is die maksimum 100, in sommige gevalle is dit 200, // laat ons die verskil inreken, sodat die maksimum altyd 200var diff is = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle -diff: rightThrottle + diff; // Kaart van ± 200 terug af na ± 100 of wat u ook al benodig 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); // some helper functionsvar constrain = function (num, min, max) {return Math.min (Math. maks (nom, 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); gekarteer = outSpan*(p/100) - (outMax/2); terugkeer gekarteer;};

Aanbeveel: