Мазмуну:

Каналдын аралашуусун түшүнүү: 4 кадам (сүрөттөр менен)
Каналдын аралашуусун түшүнүү: 4 кадам (сүрөттөр менен)

Video: Каналдын аралашуусун түшүнүү: 4 кадам (сүрөттөр менен)

Video: Каналдын аралашуусун түшүнүү: 4 кадам (сүрөттөр менен)
Video: 9 декабря 2017 г. 2024, Июль
Anonim
Image
Image
Аралаштыруу ыкмасы »Жок
Аралаштыруу ыкмасы »Жок

Эгерде сиз качандыр бир убакта алыстан башкаруучу шассини башкарып жүрсөңүз, сиз муну билбесеңиз да, аралаштырууну колдонгон жакшы мүмкүнчүлүк бар. Тактап айтканда, эгер сиз тайгалак же дифференциалдуу рулду колдонгон унааны башкаруу үчүн бир джойстикти же гимблди колдонгон болсоңуз, анда сиз аралаштырууну колдонгон болосуз.

Аралаштыруу - бул сиздин джойстиктен алынган маалыматтар шассинин ар бир тарабына канча күч берилиши керек экенин аныктоо үчүн колдонулат.

Эгер джойстикти ачсаңыз, жалпысынан ичинде эки потенциометрди көрөсүз. Бири Y огу боюнча (өйдө жана ылдый) учурдагы абалыңызды өлчөө үчүн, экинчиси X огунун боюнда жүргөнүңүздү өлчөө үчүн (капталдан бери).

Бул темада расмий даярдыгым жок болсо да, буга чейин кодду аралаштырууга туура келген жана жакында мен темага бир аз тереңирээк киргим келген.

Биринчиден, көпчүлүк RC өткөргүчтөрү көптөгөн мотор контроллерлери сыяктуу аралаштыруу мүмкүнчүлүгүнө ээ экенин белгилегим келет. Эгерде сиз өзүңүздү кодуңузга аралаштырууңуз керек болсо, бул маалымат эң пайдалуу болот. Мисалы, эгер сиз RC ресиверинен аралашпаган маалыматтарды окуу үчүн Arduino колдонуп жатсаңыз же джойстиктен казандардагы аналогдук маалыматтарды окуп жатсаңыз же мобилдик тиркемеде санариптик джойстиктен координаттарды окуп жатсаңыз.

Келгиле, ар кандай аралаштыруу ыкмаларын карап көрөлү.

1 -кадам: аралаштыруу ыкмасы »Жок

Адегенде аралаштырууну таптакыр колдонбосоңуз эмне болорун карап көрөлү. Эгер сиз маалыматты бир огтон шассинин бир жагына, экинчи огуна экинчи жагына жөнөтсөңүз, унааңыз сиз каалагандай жооп бербейт.

Мисалы, эгер сиз джойстикти түз эле алдыга түртсөңүз, Y огу толук газда, X огунда 0. Демек, сиз түз баруунун ордуна тегеректеп айдап баратасыз.

2 -кадам: Метод ыкмасы »Айлантуу

Метод Методу »Буруу
Метод Методу »Буруу

Кесиптешим бир жолу мага жакыр кишинин аралашмасы үчүн өткөргүчтү 45 градуска бурууга болорун айтты. Эгерде сиз джойстиктеги эки потенциометрдин маанилерин тордогу x o y огу деп ойлосоңуз (эки огу -100дөн +100гө чейин), бул абдан мааниге ээ, анткени сиз эки огунда +100гө барасыз. джойстикти өйдө жана оңго түрткөндө. Демек, бул сиздин эки шасси каналыңызга (роботтун сол жана оң капталдарына) түздөн -түз карта түзсө, анда бул сиздин роботту алдыга жылдырат.

Ошентип, мен аралаштыруунун биринчи ыкмасы x жана y координаттарын тордун борбордук чекити боюнча 45 градуска математикалык түрдө айландыруу болгон.

Бул жакшы иштейт, бирок мен 100% күч менен алдыга жыла албайм, анткени сиз айланып жатканда, жалпы кыймыл тордун ичиндеги тегерек менен чектелген, демек сиз эч качан ошол оң бурчка кире албайсыз.

Бул ошондой эле тордун бурчтары колдонулбай калышына алып келет. Эгер сиз кыймылыңызды чектеген джойстикти/гимплди колдонуп жатсаңыз, анда бул көйгөй эмес, бирок антпесе сиз тордун ошол бөлүгү кыймылдарыңыздын толук пропорционалдуу болушу үчүн бир нерсе кылышын каалайсыз.

Эгерде сиз мен сыяктуу визуалдык окуучу болсоңуз, анда бул түшүнүктү видеонун башындагы видеону көрүү менен түшүнүү оңой болмок.

Келгиле, кээ бир коддордун мисалдарын карап көрөлү.

КОД МИСАЛДАРЫМ ЖӨНҮНДӨ ЭСКЕРТҮҮЛӨР: Мен джойстик_x жана джойстик_y баалуулуктарын кантип алууну таштап жатам, анткени бул сиздин долбоорго жараша өзгөрөт. Ошондой эле мен ± 100гө карта/чектөө коём, бирок, балким, PWM үчүн 1000 - 2000ге же аналогдук чыгаруу үчүн 0 - 255ке чейин картага түшүрүүңүз керек болот.

Arduino мисалы:

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

кош рад = -45*M_PI/180; int leftThrottle = joystick_x * cos (рад) - 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 (рад) - joystick_y * Math.sin (рад); rightThrottle = joystick_y * Math.cos (rad) + joystick_x * Math.sin (rad); // constrainleftThrottle = чектөө (leftThrottle, -100, 100); rightThrottle = чектөө (rightThrottle, -100, 100); // helper functionvar constrain = function (num, min, max) {return Math.min (Math.max (num, min), max); };

3 -кадам: Метод ыкмасы »Жөнөкөй

Метод ыкмасы »Жөнөкөй
Метод ыкмасы »Жөнөкөй

Кийинки бизде абдан жөнөкөй теңдеме бар, мен аны алгач Shawn Hymelдин Adventures of Science SparkFun видеолорунун биринен алдым, ал жерде мен иштеп жаткан проектке абдан окшош долбоор иштеп жатат.

Бул теңдеме алдыга бара жатканда толук ылдамдыкка жетүүгө мүмкүндүк берет, бирок айлануу ыкмасына окшоп, ал тордун бурчтук жерлерин эске албайт. Себеби, кээ бир учурларда максимум 100, кээ бир учурларда максимум 200. Демек, 100дөн кийин эч нерсени этибарга албоо үчүн сиз чектөө функциясын колдонмоксуз.

Баса, мен муну жөнөкөйлүк деп атабайм … жөнөкөйлүктө бир сулуулук бар.

Arduino мисалы:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_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 = function (num, min, max) {return Math.min (Math.max (num, min), max); };

4 -кадам: Метод ыкмасы »Пропорционалдуу

Метод ыкмасы »Пропорционалдуу
Метод ыкмасы »Пропорционалдуу

Мен эки дүйнөнүн теңдемесин эң жакшы кылам деген үмүт менен жөнөкөй методго отурдум. Бул жердеги идея бардык багыттар боюнча диагоналдуу түрдө толугу менен пропорционалдуу болуу, бирок сиз чоң аралыкты жылдырып жатсаңыз да, тигинен кичине аралыкта тигинен жылгандагыдай диапазонго ээ.

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

Arduino мисалы:

int leftThrottle = joystick_y + joystick_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 + айырма; // Карта ± 200дөн ± 100гө чейин же сиз каалаган диапазонду ignftThrottle = карта (leftThrottle, 0, 200, -100, 100); rightThrottle = карта (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гө чейин же эмне кылсаңызTftottle = карта (leftThrottle, -200, 200, -100, 100); rightThrottle = карта (rightThrottle, -200, 200, -100, 100); // чектөө leftThrottle = чектөө (leftThrottle, -100, 100); rightThrottle = чектөө (rightThrottle, -100, 100); // кээ бир жардамчы функциялар чектөө = функция (сан, мин, макс) {return Math.min (Math. максимум (сан, мин), максимум); }; var map = милдети (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, mapped; 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); кайтуу картасы;};

Сунушталууда: