Satura rādītājs:

Izpratne par kanālu sajaukšanu: 4 soļi (ar attēliem)
Izpratne par kanālu sajaukšanu: 4 soļi (ar attēliem)

Video: Izpratne par kanālu sajaukšanu: 4 soļi (ar attēliem)

Video: Izpratne par kanālu sajaukšanu: 4 soļi (ar attēliem)
Video: Mani aprēķināja. Pastaigas lietū. Makšķerēšana zemnīcā. Cīņa. Lantern KillNex. 2024, Novembris
Anonim
Image
Image
Sajaukšanas metode »Nav
Sajaukšanas metode »Nav

Ja esat kādreiz vadījis tālvadības šasiju, pastāv liela iespēja, ka esat izmantojis sajaukšanu, pat ja to nezinājāt. Konkrēti, ja esat izmantojis vienu kursorsviru vai triecienu, lai kontrolētu transportlīdzekli, kas izmanto bīdāmo stūri vai diferenciālo stūrēšanu, jūs esat izmantojis sajaukšanu.

Sajaukšana ir vienkārši veids, kā jūsu kursorsviras dati tiek izmantoti, lai noteiktu, cik daudz enerģijas jāpiegādā katrai šasijas pusei.

Ja atverat kursorsviru, parasti iekšpusē redzēsit divus potenciometrus. Viens, lai izmērītu jūsu pašreizējo atrašanās vietu gar Y asi (uz augšu un uz leju), un otrs, lai izmērītu jūsu atrašanās vietu gar X asi (no vienas puses uz otru).

Lai gan man nav oficiālas apmācības par šo tēmu, man jau iepriekš bija jāveic koda sajaukšana, un nesen es vēlējos nedaudz ienirt šajā tēmā.

Vispirms es gribu atzīmēt, ka lielākajai daļai RC raidītāju ir sajaukšanas iespēja, tāpat kā daudziem motora kontrolieriem. Šī informācija būs visnoderīgākā, ja kodā būs jāmaisa pašam. Piemēram, ja izmantojat Arduino, lai lasītu nesajauktus datus no RC uztvērēja, vai lasāt analogos datus no podiem kursorsvirā, vai arī lasāt koordinātas no digitālās kursorsviras mobilajā lietotnē.

Apskatīsim dažas dažādas sajaukšanas pieejas.

1. darbība: sajaukšanas metode »Nav

Vispirms apskatīsim, kas notiek, ja miksēšanu neizmantojat vispār. Ja jūs vienkārši nosūtāt datus no vienas ass uz vienu šasijas pusi un otru asi uz otru pusi, jūsu transportlīdzeklis nereaģētu tā, kā vēlaties.

Piemēram, ja jūs virzāt kursorsviru līdz galam uz priekšu, Y ass ir ar pilnu jaudu un X ass ir 0. Tātad jūs brauktu pa apli, nevis taisni.

2. darbība. Metodes metode »Pagriezt

Metode Metode »Pagriezt
Metode Metode »Pagriezt

Kāds darbabiedrs man reiz norādīja, ka ar šķipsnu jūs varat pagriezt raidītāju par 45 grādiem, lai iegūtu nabadzīga cilvēka maisījumu. Ja jūs domājat, ka kursorsviras divu potenciometru vērtības ir x x y ass režģī (abām asīm aptverot no -100 līdz +100), tam ir liela nozīme, jo jūs gatavojaties +100 uz abām asīm. virzot kursorsviru uz augšu un pa labi. Tātad, ja tas tiek piesaistīts tieši jūsu diviem šasijas kanāliem (jūsu robota kreisajā un labajā pusē), tas liks jūsu robotam iet uz priekšu.

Tātad pirmā sajaukšanas metode, ko es jebkad izmēģināju, bija matemātiski pagriezt x un y koordinātas par 45 grādiem ap režģa centru.

Tas darbojas labi, tomēr es nevaru iet uz priekšu ar 100% jaudu, jo, rotējot, kopējā kustība ir ierobežota līdz aplim režģī, kas nozīmē, ka jūs nekad nevarat īsti nokļūt augšējā labajā stūrī.

Tas arī noved pie tā, ka režģa stūri netiek izmantoti. Tā nav problēma, ja izmantojat kursorsviru/triecienu, kas ierobežo jūsu kustību, lai šīs zonas nekad netiktu sasniegtas, bet pretējā gadījumā jūs vēlaties, lai šī režģa daļa kaut ko darītu, lai jūsu kustības justos pilnīgi proporcionālas.

Ja jūs esat vizuāli apguvis kā es, šo jēdzienu varētu būt vieglāk uztvert, noskatoties videoklipu šīs pamācības sākumā.

Apskatīsim dažus koda piemērus.

PIEZĪMES PAR MANU KODU PIEMĒRIEM: Es neatstāju informāciju par to, kā iegūt joystick_x un joystick_y vērtības, jo tas mainīsies atkarībā no jūsu projekta. Arī es būšu kartēšana/ierobežošana līdz ± 100, bet jums, iespējams, vajadzēs kartēt līdz 1000 - 2000 PWM vai 0 - 255 analogai izejai utt. Es vienmēr ierobežoju … tikai gadījumā.

Arduino piemērs:

// matemātiski pagriezt

dubultā rad = -45*M_PI/180; int leftThrottle = kursorsviru_x * cos (rad) - kursorsviru_y * sin (rad); int rightThrottle = kursorsviru_y * cos (rad) + kursorsviru_x * sin (rad); // ierobežot leftThrottle = ierobežot (leftThrottle, -100, 100); rightThrottle = ierobežot (rightThrottle, -100, 100);

JavaScript piemērs:

// matemātiski rotatevar rad = -45*Math. PI/180; leftThrottle = kursorsviru_x * Math.cos (rad) - kursorsviru_y * Math.sin (rad); rightThrottle = kursorsvira_y * Math.cos (rad) + kursorsviru_x * Math.sin (rad); // constrainleftThrottle = ierobežot (leftThrottle, -100, 100); rightThrottle = ierobežot (rightThrottle, -100, 100); // palīgs functionvar ierobežot = funkcija (skaits, min, maks.) {atgriezties Matemātiskā min (Matemātiskā maks. (skaitlis, min), maks.); };

3. darbība: metodes metode »Vienkārša

Metode Metode »Vienkārša
Metode Metode »Vienkārša

Tālāk mums ir ļoti vienkāršs vienādojums, kuru es vispirms paņēmu no viena no Šona Hīmela piedzīvojumiem Science SparkFun videoklipos, kur viņš nejauši strādāja ļoti līdzīgā projektā, pie kura es strādāju.

Šis vienādojums ļauj sasniegt pilnu ātrumu, virzoties uz priekšu, taču, līdzīgi kā pagriešanas metode, tas neņem vērā režģa stūra laukumus. Tas ir tāpēc, ka dažos gadījumos maksimālais ir 100 un dažos gadījumos maksimālais ir 200. Tātad jūs izmantotu ierobežošanas funkciju, lai neņemtu vērā neko pēc 100.

Un, starp citu, es nesaucu šo vienkāršo nicinoši … vienkāršībā ir skaistums.

Arduino piemērs:

int leftThrottle = kursorsviru_y + kursorsviru_x;

int rightThrottle = kursorsviru_y - kursorsviru_x; // ierobežot leftThrottle = ierobežot (leftThrottle, -100, 100); rightThrottle = ierobežot (rightThrottle, -100, 100);

JavaScript piemērs:

var leftChannel = kursorsvira_y + kursorsvira_x;

var rightChannel = kursorsviru_y - kursorsviru_x; // ierobežot pa kreisiChannel = ierobežot (leftChannel, -100, 100); rightChannel = ierobežot (rightChannel, -100, 100); // palīgs functionvar constrain = funkcija (skaits, min, maks.) {atgriezties Matemātiskā min (Matemātiskā maks. (skaitlis, min), maks.); };

4. solis: metodes metode »Proporcionāls

Metode Metode »Proporcionāls
Metode Metode »Proporcionāls

Es atteicos no vienkāršās metodes, cerot iegūt labāko no abu pasauļu vienādojuma. Ideja šeit ir būt pilnīgi proporcionālai visos virzienos, pat pa diagonāli, neskatoties uz to, ka, pārvietojoties lielāku attālumu, tam ir tāds pats diapazons kā pārvietojoties vertikāli, kas ir mazāks attālums.

Visbeidzot, manos piemēros jūs iegūstat skalu no -200 līdz +200 visos virzienos. Es to uzskatu līdz ± 100, jo tas atspoguļo jaudas procentuālo daudzumu katram kanālam - tomēr jūs vēlaties to kartēt atbilstoši tam, kas jums noder - jūsu motora kontroliera korpuss. Piemēram, ja sūtāt PWM signālu, varat to kartēt līdz 1000 līdz 2000 vai, ja sūtāt analogo signālu, varat to kartēt līdz 0-255 un iestatīt virzienu kā Būla utt.

Arduino piemērs:

int leftThrottle = kursorsviru_y + kursorsviru_x;

int rightThrottle = kursorsviru_y - kursorsviru_x; // dažos gadījumos maksimums ir 100, dažos gadījumos tas ir 200 // ņemsim vērā atšķirību, lai maksimums vienmēr būtu 200int dif = abs (abs (joystick_y) - abs (kursorsviru_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftTrottle + diff; rightThrottle = rightTrottle <0? rightThrottle - diferenciālis: rightThrottle + diff; // Karte no ± 200 līdz ± 100 vai jebkurš diapazons, kurā jūs adatasThrottle = karte (leftThrottle, 0, 200, -100, 100); rightThrottle = karte (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = ierobežot (leftThrottle, -100, 100); rightThrottle = ierobežot (rightThrottle, -100, 100);

JavaScript piemērs:

var leftThrottle = kursorsviru_y + kursorsviru_x; var pa labi Math.abs (kursorsviru_y) - Math.abs (kursorsviru_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftTrottle + diff; rightThrottle = rightTrottle <0? rightThrottle -diff: rightTrottle + diff; // Karte no ± 200 atpakaļ uz leju līdz ± 100 vai jebkurš cits, ko jūs adatā Throttle = karte (leftThrottle, -200, 200, -100, 100); rightThrottle = karte (rightThrottle, -200, 200, -100, 100); // ierobežot leftThrottle = ierobežot (leftThrottle, -100, 100); rightThrottle = ierobežot (rightThrottle, -100, 100); // dažas palīgfunkcijasvar ierobežot = funkcija (num, min, max) {return Math.min (Math. maks (min, min), max); }; var karte = funkcija (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, kartēts; inMin = inMin + inMax; num = numurs + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (num/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); kartēts = outSpan*(p/100) - (outMax/2); atgriešanās kartēta;};

Ieteicams: