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: ОШИБКИ В САНТЕХНИКЕ! | Как нельзя делать монтаж канализации своими руками 2024, Juli
Anonim
Image
Image
Metoda miješanja »Nema
Metoda miješanja »Nema

Ako ste ikada vozili šasiju s daljinskim upravljačem, velika je šansa 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 morao raditi miješanje koda, a nedavno sam želio zaroniti malo dublje u temu.

Prvo želim napomenuti da većina RC odašiljača ima mogućnost miješanja kao i mnogi motorni kontroleri. Ove informacije će vam biti od najveće koristi 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 ako čitate koordinate s digitalnog joysticka na mobilnoj aplikaciji.

Pogledajmo neke različite pristupe miješanju.

Korak 1: Metoda miješanja »Ništa

Prvo pogledajmo što će se dogoditi ako uopće ne koristite miješanje. Ako samo š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, vi biste se vozili u krug umjesto da idete ravno.

Korak 2: Metoda metode »Rotiraj

Metoda Metoda »Rotiraj
Metoda Metoda »Rotiraj

Suradnica mi je jednom prilikom naglasila da, za malo, možete okrenuti svoj odašiljač za 45 stepeni radi miješanja siromaha. Ako smatrate da su vrijednosti s dva potenciometra u upravljačkoj palici x x y os 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 džojstik gore i udesno. Dakle, ako se ovo preslikava direktno 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 rotiranje koordinata x i y za 45 stepeni oko središnje tačke mreže.

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 nikada ne možete zaista ući u gornji desni kut.

To također dovodi do toga da se uglovi mreže 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.

NAPOMENE 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.

Arduino primjer:

// 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čenje (rightThrottle, -100, 100);

JavaScript primjer:

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

Korak 3: Metoda metode »Jednostavna

Metoda Metoda »Jednostavna
Metoda Metoda »Jednostavna

Slijedi nam vrlo jednostavna jednadžba 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 jednadžba vam omogućuje da postignete punu brzinu pri kretanju naprijed, ali slično kao i metoda rotacije, zanemaruje ugaona područja mreže. To je zato što je u nekim slučajevima maksimum 100, a u nekim slučajevima maksimum 200. Tako biste koristili funkciju ograničenja da zanemarite bilo šta nakon 100.

Usput, ne nazivam to jednostavno pogrdno … ljepota postoji u jednostavnosti.

Arduino primjer:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // ograničiti leftThrottle = ograničiti (leftThrottle, -100, 100); rightThrottle = ograničenje (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 jednačinu 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 to preslikati u sve š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.

Arduino primjer:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // u nekim slučajevima maksimum 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; // Mapa od ± 200 do ± 100 ili bilo koji raspon koji želite napustitiThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = constrain (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 u obzir 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; // Mapa od ± 200 nazad do ± 100 ili šta god da pomeriteThrottle = 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 mapped;};

Preporučuje se: