Sadržaj:

Razumijevanje miješanja kanala: 4 koraka (sa slikama)
Razumijevanje miješanja kanala: 4 koraka (sa slikama)

Video: Razumijevanje miješanja kanala: 4 koraka (sa slikama)

Video: Razumijevanje miješanja kanala: 4 koraka (sa slikama)
Video: 4 STUPA LJUBAVI - PUT POVRATKA SEBI / ŽELJKO ĐORĐEVIĆ PODCAST 2024, Studeni
Anonim
Image
Image
Metoda miješanja »Nema
Metoda miješanja »Nema

Ako ste ikada vozili šasiju s daljinskim upravljačem, velika je vjerojatnost da ste koristili miješanje, čak i ako to niste znali. Konkretno, ako ste koristili jedan joystick ili gimble za upravljanje vozilom koje koristi klizno ili diferencijalno upravljanje, koristili ste miješanje.

Miješanje je jednostavno način na koji se podaci s upravljačke palice koriste za određivanje količine energije koja treba biti isporučena sa svake strane šasije.

Ako otvorite joystick, općenito ćete unutra vidjeti dva potenciometra. Jedan za mjerenje vašeg trenutnog položaja duž osi Y (gore i dolje), a drugi za mjerenje vašeg položaja duž osi X (od strane do strane).

Iako nemam formalnu obuku na tu temu, već sam se morao miješati u kodu, a nedavno sam želio zaroniti malo dublje u tu temu.

Prvo želim napomenuti da većina RC odašiljača ima mogućnost miješanja kao i mnogi motorni kontroleri. Ove će informacije biti najkorisnije ako se sami morate miješati u svom kodu. Na primjer, recite ako koristite Arduino za čitanje nepomiješanih podataka s RC prijemnika ili čitate analogne podatke iz lonaca na upravljačkoj palici ili čitate koordinate s digitalne upravljačke palice u mobilnoj aplikaciji.

Pogledajmo neke različite pristupe miješanju.

Korak 1: Metoda miješanja »Nema

Prvo pogledajmo što će se dogoditi ako uopće ne koristite miješanje. Ako samo pošaljete podatke s jedne osi na jednu stranu šasije, a drugu os na drugu stranu, vaše vozilo neće reagirati onako kako želite.

Na primjer, ako gurnete joystick do kraja ravno, os Y je pri punom gasu, a os X na 0. Dakle, umjesto da idete ravno, vozili biste u krug.

Korak 2: Metoda metode »Rotirajte

Metoda Metoda »Rotiraj
Metoda Metoda »Rotiraj

Suradnica mi je jednom prilikom naglasila da, za malo, možete okrenuti odašiljač za 45 stupnjeva radi miješanja siromaha. Ako smatrate da su vrijednosti s dva potenciometra na upravljačkoj palici osi x y y na mreži (s obje osi koje se protežu od -100 do +100), to ima puno smisla jer idete na +100 na obje osi dok gurate joystick gore i udesno. Dakle, ako se ovo preslikava izravno na vaša dva kanala šasije (lijevu i desnu stranu vašeg robota), to bi učinilo da vaš robot krene naprijed.

Dakle, prva metoda miješanja koju sam ikada pokušao bila je matematičko zakretanje koordinata x i y za 45 stupnjeva oko središnje točke rešetke.

Ovo radi u redu, međutim ne mogu ići naprijed sa 100% snage jer kada rotirate, cjelokupno kretanje je ograničeno na krug unutar rešetke, što znači da zapravo nikada ne možete ući u gornji desni kut.

To također dovodi do toga da se uglovi rešetke ne koriste. To nije problem ako koristite joystick/gimple koji ograničava vaše kretanje pa se do tih područja ionako nikada ne dolazi, ali u protivnom ćete htjeti da taj dio mreže učini nešto tako da vaši pokreti budu potpuno proporcionalni.

Ako ste vizualni učenik poput mene, ovaj bi se koncept mogao lakše snaći gledajući video na početku ovog uputstva.

Pogledajmo neke primjere koda.

BILJEŠKE O PRIMJERIMA KODA: Izostavljam način na koji dobivate vrijednosti joystick_x i joystick_y jer bi se one mijenjale ovisno o vašem projektu. Također ću mapirati/ograničiti na ± 100, ali ćete vjerojatno morati preslikati na 1000 - 2000 za PWM ili 0 - 255 za analogni izlaz itd. Uvijek ograničavam … za svaki slučaj.

Primjer Arduina:

// matematički rotirati

dvostruki 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); // ograničiti leftThrottle = ograničiti (leftThrottle, -100, 100); rightThrottle = ograničiti (rightThrottle, -100, 100);

JavaScript primjer:

// matematički 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 = ograničenje (rightThrottle, -100, 100); // pomoćna funkcijavarvar ograničenje = funkcija (num, min, max) {return Math.min (Math.max (num, min), max); };

Korak 3: Metoda metode »Jednostavno

Metoda Metoda »Jednostavna
Metoda Metoda »Jednostavna

Sljedeće imamo vrlo jednostavnu jednadžbu koju sam prvi put pokupio iz jednog od videa Shawn Hymela Adventures in Science SparkFun gdje je slučajno radio na vrlo sličnom projektu na onom na kojem sam radio.

Ova vam jednadžba omogućuje da postignete punu brzinu kada idete naprijed, ali slično kao i metoda rotacije, zanemaruje kutna područja rešetke. To je zato što je u nekim slučajevima maksimum 100, a u nekim slučajevima maksimum 200. Stoga biste koristili funkciju ograničenja da zanemarite bilo što nakon 100.

Usput, ne nazivam ovo jednostavno pogrdno … ljepota je u jednostavnosti.

Primjer Arduina:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // ograničiti leftThrottle = ograničiti (leftThrottle, -100, 100); rightThrottle = ograničiti (rightThrottle, -100, 100);

JavaScript primjer:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // ograničiti leftChannel = ograničiti (leftChannel, -100, 100); rightChannel = ograničenje (rightChannel, -100, 100); // pomoćna funkcijavarvar ograničenje = funkcija (num, min, max) {return Math.min (Math.max (num, min), max); };

Korak 4: Metoda metode »Proporcionalna

Metoda Metoda »Proporcionalna
Metoda Metoda »Proporcionalna

Iskoristio sam jednostavnu metodu nadajući se da ću najbolje iskoristiti jednadžbu oba svijeta. Ideja je ovdje biti potpuno proporcionalan u svim smjerovima, čak i dijagonalno, unatoč činjenici da se krećete na većoj udaljenosti, ali ima isti raspon kao kada se krećete okomito, što je manja udaljenost.

Na kraju dobijete ljestvicu od -200 do +200 u svim smjerovima u mojim primjerima, preslikavam to na ± 100 jer predstavlja postotak snage koja ide na svaki kanal - međutim, htjet ćete ga preslikati u ono što vam radi - kućište za vaš motorni kontroler. Na primjer, ako šaljete PWM signal, to možete preslikati na 1000 do 2000 ili ako šaljete analogni signal, možete ga preslikati na 0-255 i postaviti smjer kao boolean itd.

Primjer Arduina:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // u nekim slučajevima max je 100, u nekim slučajevima 200 // uzmimo u obzir razliku tako da je max uvijek 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Karta od ± 200 do ± 100 ili bilo koji raspon od kojeg ste izašliThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = ograničenje (leftThrottle, -100, 100); rightThrottle = ograničenje (rightThrottle, -100, 100);

JavaScript primjer:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // u nekim slučajevima max je 100, u nekim slučajevima 200, // uzmimo razliku tako da je max uvijek 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; // Karta od ± 200 natrag do ± 100 ili što god da igrom ostaviteThrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // neke pomoćne funkcijevar constrain = function (num, min, max) {return Math.min (Math. max (broj, min), max); }; var map = funkcija (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, preslikano; inMin = inMin + inMax; broj = broj + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (broj/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); preslikano = outSpan*(p/100) - (outMax/2); return mapiran;};

Preporučeni: