Cuprins:

Înțelegerea mixării canalelor: 4 pași (cu imagini)
Înțelegerea mixării canalelor: 4 pași (cu imagini)

Video: Înțelegerea mixării canalelor: 4 pași (cu imagini)

Video: Înțelegerea mixării canalelor: 4 pași (cu imagini)
Video: Top 70 Muzica Romaneasca 2023 🤩 Cele Mai Bune Hituri Românești 2023 🤩 Colaj Muzica Romaneasca 2023 2024, Iulie
Anonim
Image
Image
Metoda de amestecare »Niciuna
Metoda de amestecare »Niciuna

Dacă ați condus vreodată un șasiu cu telecomandă, există șanse mari să utilizați mixajul, chiar dacă nu l-ați știut. Mai exact, dacă ați folosit un singur joystick sau un buton pentru a controla un vehicul care utilizează direcția de derapare sau direcția diferențială, ați folosit amestecarea.

Amestecarea este pur și simplu modul în care datele de pe joystick-ul dvs. sunt utilizate pentru a determina cât de multă energie ar trebui să fie furnizată fiecărei părți a șasiului.

Dacă deschideți un joystick, în general veți vedea două potențiometre în interior. Una pentru a vă măsura poziția curentă de-a lungul axei Y (în sus și în jos), iar cealaltă pentru a măsura unde vă aflați de-a lungul axei X (de la o parte la alta).

Deși nu am o pregătire formală pe acest subiect, a trebuit să fac amestecuri în cod înainte și recent am vrut să mă scufund mai puțin în subiect.

Mai întâi vreau să menționez că majoritatea transmițătoarelor RC au capacitatea de amestecare, la fel ca multe controlere de motor. Aceste informații vor fi cele mai utile dacă trebuie să faceți amestecarea dvs. în codul dvs. Spuneți, de exemplu, dacă utilizați un Arduino pentru a citi date neamestecate de la un receptor RC sau dacă citiți date analogice din poturile dintr-un joystick sau dacă citiți coordonatele dintr-un joystick digital într-o aplicație mobilă.

Să aruncăm o privire la câteva abordări de amestecare diferite.

Pasul 1: Metoda de amestecare »Niciuna

Mai întâi să aruncăm o privire la ce se întâmplă dacă nu folosiți deloc amestecarea. Dacă trimiteți doar datele de pe o axă pe o parte a șasiului și cealaltă axă pe cealaltă parte, vehiculul dvs. nu va răspunde așa cum doriți.

De exemplu, dacă împingeți joystick-ul până la capăt, axa Y este la maxim și axa X este la 0. Deci, veți conduce în cercuri în loc să mergeți drept.

Pasul 2: Metodă metodă »Rotire

Metodă Metodă »Rotire
Metodă Metodă »Rotire

Un coleg de muncă mi-a subliniat odată că, într-o ciupire, poți roti transmițătorul cu 45 de grade pentru un mix al unui om sărac. Dacă vă gândiți la valorile celor două potențiometre dintr-un joystick ca fiind axa x a y pe o grilă (cu ambele axe cuprinse între -100 și +100), acest lucru are mult sens, deoarece veți merge la +100 pe ambele axe în timp ce împingeți joystick-ul în sus și în dreapta. Deci, dacă aceasta se mapează direct la cele două canale ale șasiului (partea stângă și dreapta a robotului), robotul dvs. va merge mai departe.

Așadar, prima metodă de amestecare pe care am încercat-o vreodată a fost să rotesc matematic coordonatele x și y la 45 de grade în jurul punctului central al grilei.

Acest lucru funcționează bine, cu toate acestea nu pot merge înainte cu o putere de 100%, deoarece atunci când rotiți, mișcarea generală este limitată la un cerc din grilă, ceea ce înseamnă că nu puteți intra niciodată cu adevărat în colțul din dreapta sus.

Acest lucru are ca rezultat și colțurile grilei să nu fie utilizate. Aceasta nu este o problemă dacă utilizați un joystick / gimple care vă limitează mișcarea, astfel încât acele zone să nu fie niciodată atinse, dar altfel veți dori ca acea porțiune a grilei să facă ceva, astfel încât mișcările dvs. să se simtă complet proporționale.

Dacă sunteți un elev vizual ca mine, acest concept ar putea fi mai ușor de urmărit vizionând videoclipul de la începutul acestui instructiv.

Să vedem câteva exemple de cod.

NOTE DESPRE CODUL MEU EXEMPLE: Am lăsat deoparte cum obțineți valorile joystick_x și joystick_y, deoarece s-ar schimba în funcție de proiectul dvs. De asemenea, voi fi cartografiere / constrângere la ± 100, dar este posibil să aveți nevoie să faceți mape la 1000 - 2000 pentru PWM sau 0 - 255 pentru ieșire analogică etc. Mă constrâng întotdeauna … pentru orice eventualitate.

Exemplu Arduino:

// roti matematic

rad dublu = -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 = constrângere (rightThrottle, -100, 100);

Exemplu JavaScript:

// matematic 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); };

Pasul 3: Metodă metodă »Simplu

Metoda Metoda »Simplu
Metoda Metoda »Simplu

În continuare, avem o ecuație foarte simplă pe care am preluat-o pentru prima dată dintr-unul dintre videoclipurile lui Shawn Hymel Adventures in Science SparkFun, unde se întâmpla că lucrează la un proiect foarte similar cu cel la care lucram.

Această ecuație vă permite să ajungeți la viteza maximă atunci când mergeți înainte, dar la fel ca metoda de rotire, nu ține cont de zonele de colț ale grilei. Acest lucru se datorează faptului că, în unele cazuri, maximul este 100 și, în unele cazuri, maximul este 200. Deci, veți utiliza o funcție de constrângere pentru a ignora orice după 100.

Și apropo, nu numesc acest lucru în mod disprețuitor … există o frumusețe în simplitate.

Exemplu Arduino:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrângere (rightThrottle, -100, 100);

Exemplu JavaScript:

var leftChannel = joystick_y + joystick_x;

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

Pasul 4: Metoda Metodei »Proporțională

Metoda Metoda »Proporțională
Metoda Metoda »Proporțională

M-am apropiat de metoda simplă sperând să fac cea mai bună ecuație a ambelor lumi. Ideea de aici este de a fi pe deplin proporțională în toate direcțiile, chiar în diagonală, în ciuda faptului că vă deplasați la o distanță mai mare, are aceeași rază ca atunci când vă deplasați vertical, ceea ce este o distanță mai mică.

Veți ajunge cu o scară de la -200 la +200 în toate direcțiile, în exemplele mele, o mapez la ± 100, deoarece reprezintă procentul de putere care se îndreaptă către fiecare canal - cu toate acestea, veți dori să o mapați la orice funcționează în utilizarea dvs. carcasă pentru controlerul motorului. De exemplu, dacă trimiteți un semnal PWM, s-ar putea să o mapați la 1000 până la 2000 sau dacă trimiteți un semnal analogic, îl puteți mapa la 0-255 și setați direcția ca booleană etc.

Exemplu Arduino:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // în unele cazuri max este 100, în unele cazuri este 200 // hai să facem diferența, astfel încât max este întotdeauna 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Hartă de la ± 200 la ± 100 sau oricare alt domeniu pe care îl acționați Throttle = hartă (leftThrottle, 0, 200, -100, 100); rightThrottle = hartă (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

Exemplu JavaScript:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // în unele cazuri max este 100, în unele cazuri este 200, // hai să facem diferența, astfel încât max este întotdeauna 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; // Hartă de la ± 200 înapoi în jos până la ± 100 sau orice altceva acțiune Throttle = hartă (leftThrottle, -200, 200, -100, 100); rightThrottle = hartă (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. max (num, min), max); }; var map = function (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, maped; 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); mapped = outSpan * (p / 100) - (outMax / 2); retur mapat;};

Recomandat: