Мазмұны:

Арналарды араластыруды түсіну: 4 қадам (суреттермен)
Арналарды араластыруды түсіну: 4 қадам (суреттермен)

Бейне: Арналарды араластыруды түсіну: 4 қадам (суреттермен)

Бейне: Арналарды араластыруды түсіну: 4 қадам (суреттермен)
Бейне: Бұл видеоны көрсеніз сіз өз атың ұмытып қаласын 2024, Шілде
Anonim
Image
Image
Араластыру әдісі »Жоқ
Араластыру әдісі »Жоқ

Егер сіз қашықтан басқару пультінің шассиін басқарған болсаңыз, сіз оны білмесеңіз де, араластыруды қолданудың жақсы мүмкіндігі бар. Атап айтқанда, егер сіз рульдік рульді немесе дифференциалды рульді басқаратын көлікті басқару үшін бір джойстик немесе гимбл қолдансаңыз, сіз араластыруды қолдандыңыз.

Араластыру - бұл шассидің әр жағына қанша қуат беру керектігін анықтау үшін джойстиктен алынған мәліметтер.

Егер сіз джойстикті ашсаңыз, онда сіз әдетте екі потенциометрді көресіз. Біреуі Y осінің бойымен (жоғары және төмен) ағымдағы орныңызды өлшеу үшін, екіншісі - X осінің бойында орналасқан жерді өлшеу үшін (бүйірден бүйірге).

Менде бұл тақырып бойынша ресми дайындық болмаса да, мен бұрын кодты араластыруға мәжбүр болдым және жақында мен тақырыпқа сәл тереңірек енгім келді.

Біріншіден, RC таратқыштарының көпшілігінде көптеген мотор контроллері сияқты араластыру мүмкіндігі бар екенін атап өткім келеді. Егер сіз өзіңіздің кодыңызға араластыру қажет болса, бұл ақпарат ең пайдалы болады. Мысалы, егер сіз Arduino -ны RC қабылдағыштан алынбаған деректерді оқу үшін қолдансаңыз немесе джойстиктен кастрюльдегі аналогты деректерді оқып жатсаңыз немесе мобильді қосымшадағы сандық джойстиктен координаттарды оқып жатсаңыз.

Әр түрлі араластыру тәсілдерін қарастырайық.

1 -қадам: араластыру әдісі »Жоқ

Алдымен араластыруды мүлде қолданбасаңыз не болатынын қарастырайық. Егер сіз деректерді бір осьтен шассидің бір жағына, ал екінші осьті екінші жағына жіберсеңіз, сіздің көлігіңіз сіз қалағандай жауап бермейді.

Мысалы, егер сіз джойстикті тура алға қарай итерсеңіз, Y осі толық дроссельде, ал X осі 0 -де. Демек, сіз тікелей жүрудің орнына шеңбермен жүретін едіңіз.

2 -қадам: Әдіс әдісі »Айналдыру

Әдіс әдісі »Айналдыру
Әдіс әдісі »Айналдыру

Бірде менің әріптесім кедейлердің қоспасы үшін таратқышты 45 градусқа бұруға болатынын айтты. Егер сіз джойстиктегі екі потенциометрдің мәндерін тордағы x осі осі деп ойласаңыз (екі осі -100 -ден +100 -ге дейін), бұл өте мағыналы, себебі сіз екі осьте +100 -ге барасыз. джойстикті жоғары және оңға итергенде. Егер бұл сіздің екі шасси арнасына (роботтың сол және оң жақтарына) тікелей сәйкес келсе, бұл сіздің роботыңызды алға жылжытады.

Мен араластырып көрудің бірінші әдісі - тордың орталық нүктесі бойынша x және y координатасын 45 градусқа математикалық түрде айналдыру болды.

Бұл жақсы жұмыс істейді, бірақ мен 100% қуатпен алға жылжи алмаймын, себебі сіз айналған кезде жалпы қозғалыс тордағы шеңбермен шектеледі, яғни сіз ешқашан сол оң жақ бұрышқа кіре алмайсыз.

Бұл сонымен қатар тордың бұрыштарының пайдаланылмауына әкеледі. Егер сіз қозғалысыңызды шектейтін джойстик/гимплді қолдансаңыз, бұл проблема емес, сондықтан бұл аймақтарға ешқашан қол жеткізе алмайсыз, бірақ әйтпесе сіз тордың сол бөлігі сіздің қозғалыстарыңыз толықтай пропорционалды болып көрінуі үшін бірдеңе жасағанын қалайсыз.

Егер сіз мен сияқты көрнекі түрде оқитын болсаңыз, осы нұсқаулықтың басындағы бейнені қарау арқылы бұл ұғымды оңай түсінуге болады.

Кейбір код мысалдарын қарастырайық.

МЕНІҢ КОДТЫҢ МЫСАЛДАРЫ ТУРАЛЫ ЕСКЕРТПЕЛЕР: Мен сіздің жобаңызға байланысты өзгеретіндіктен, joystick_x және joystick_y мәндерін қалай алуға болатынын айтпаймын. Сондай -ақ, мен ± 100 -ге карта қоямын/шектеймін, бірақ сізге PWM үшін 1000 - 2000 немесе аналогтық шығыс үшін 0 - 255 және т.б.мен салыстыру қажет болуы мүмкін, мен әрқашан шектеймін.

Arduino мысалы:

// математикалық айналдыру

қос рад = -45*M_PI/180; int leftThrottle = joystick_x * cos (rad) - joystick_y * sin (рад); int rightThrottle = joystick_y * cos (rad) + joystick_x * sin (рад); // шектеу leftThrottle = шектеу (leftThrottle, -100, 100); rightThrottle = шектеу (rightThrottle, -100, 100);

JavaScript мысалы:

// математикалық 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 = шектеу (leftThrottle, -100, 100); rightThrottle = шектеу (rightThrottle, -100, 100); // helper functionvar constrain = функция (сан, мин, максимум) {қайтару Math.min (Math.max (сан, мин), максимум); };

3 -қадам: Әдіс әдісі »Қарапайым

Әдіс »Қарапайым
Әдіс »Қарапайым

Келесіде бізде өте қарапайым теңдеу бар, мен оны Шон Химельдің Science SparkFun -дағы шытырман оқиғалы видеоларының бірінен таңдадым, онда ол мен жұмыс істегенге ұқсас жобамен жұмыс жасады.

Бұл теңдеу алға жылжу кезінде толық жылдамдыққа жетуге мүмкіндік береді, бірақ айналдыру әдісі сияқты, ол тордың бұрыштық аудандарын елемейді. Себебі, кейбір жағдайларда максимум 100, ал кейбір жағдайларда максимум 200 болады. Сондықтан 100 -ден кейін ештеңені елемеу үшін constrain функциясын қолданасыз.

Айтпақшы, мен мұны қарапайым деп айтпаймын … қарапайымдылықта сұлулық бар.

Arduino мысалы:

int leftThrottle = джойстик_y + джойстик_x;

int rightThrottle = joystick_y - джойстик_x; // шектеу leftThrottle = шектеу (leftThrottle, -100, 100); rightThrottle = шектеу (rightThrottle, -100, 100);

JavaScript мысалы:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // leftChannel = шектеу (leftChannel, -100, 100); rightChannel = шектеу (rightChannel, -100, 100); // helper functionvar constrain = функция (сан, мин, максимум) {қайтару Math.min (Math.max (сан, мин), максимум); };

4 -қадам: Әдіс әдісі »Пропорционалды

Әдіс әдісі »Пропорционалды
Әдіс әдісі »Пропорционалды

Мен екі әлемнің теңдеулерін жақсы жасаймын деп үміттенетін қарапайым әдісті қолдандым. Мұндағы идея барлық бағыттар бойынша диагональ бойынша толық пропорционалды болу, дегенмен сіз үлкен қашықтықты жылжытсаңыз да, ол кіші қашықтықта тігінен қозғалатын кездегі диапазонға ие.

Сіз менің мысалдарымда барлық бағыттар бойынша -200 -ден +200 -ге дейінгі шкаламен аяқтаймын, мен оны ± 100 -ге теңестіремін, себебі ол әр арнаға түсетін қуаттың пайызын көрсетеді, бірақ сіз оны қолданатын кез келген нәрсемен салыстырғыңыз келеді. мотор контроллері үшін корпус. Мысалы, егер сіз PWM сигналын жіберсеңіз, оны 1000-нан 2000-ге дейін салыстыра аласыз немесе аналогты сигналды жіберсеңіз, оны 0-255-ке салыстырып, бағытты логикалық және т.б.

Arduino мысалы:

int leftThrottle = джойстик_y + джойстик_x;

int rightThrottle = joystick_y - joystick_x; // кейбір жағдайларда максимум 100, кейбір жағдайларда ол 200 // айырмашылықты ескерейік, сондықтан максимум әрқашан 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - айырмасы: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - айырмашылық: rightThrottle + diff; // Карта ± 200 -ден ± 100 -ге дейін немесе сіз кез келген диапазонда ignftThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = шектеу (leftThrottle, -100, 100); rightThrottle = шектеу (rightThrottle, -100, 100);

JavaScript мысалы:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // кейбір жағдайларда максимум 100, кейбір жағдайларда 200, // айырмашылықты ескерейік, сондықтан максимум әрқашан 200var diff = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - айырмасы: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle -диффуз: rightThrottle + diff; // Карта ± 200 -ден ± 100 -ге дейін немесе инеTThrottle = map (leftThrottle, -200, 200, -100, 100); -100, 100); // шектеу leftThrottle = шектеу (leftThrottle, -100, 100); rightThrottle = шектеулер (rightThrottle, -100, 100); // кейбір көмекші функцияларvar constrain = функция (сан, мин, максимум) {қайтару Math.min (Math. максимум (сан, мин), максимум); }; var map = функция (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, салыстырылды; 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); қайтару картасы;};

Ұсынылған: