Mundarija:

Kanallarni aralashtirishni tushunish: 4 qadam (rasmlar bilan)
Kanallarni aralashtirishni tushunish: 4 qadam (rasmlar bilan)

Video: Kanallarni aralashtirishni tushunish: 4 qadam (rasmlar bilan)

Video: Kanallarni aralashtirishni tushunish: 4 qadam (rasmlar bilan)
Video: “Atom” innovatsion ta’lim markazida kimyoviy tajriba. “Qo’lda olov yoqish” 2024, Iyul
Anonim
Image
Image
Aralashtirish usuli »Yo'q
Aralashtirish usuli »Yo'q

Agar siz hech qachon masofadan boshqarish pultining shassisini boshqargan bo'lsangiz, aralashtirishni ishlatgan bo'lishingiz mumkin, garchi siz buni bilmagan bo'lsangiz ham. Xususan, agar siz rulni boshqaruvchi yoki differentsial ruldan foydalanadigan transport vositasini boshqarish uchun bitta joystick yoki gimble ishlatgan bo'lsangiz, siz aralashtirishdan foydalangan bo'lasiz.

Aralashtirish - bu shassining har bir tomoniga qancha quvvat berish kerakligini aniqlash uchun joystikdan olingan ma'lumotlar.

Agar siz joystikni ochsangiz, odatda ikkita potentsiometrni ko'rasiz. Ulardan biri hozirgi o'qingizni Y o'qi bo'ylab (yuqoriga va pastga) o'lchash uchun, ikkinchisi X o'qi bo'ylab (yonma -yon) o'lchash uchun.

Menda bu mavzu bo'yicha rasmiy ta'lim bo'lmasa -da, men oldin kodni aralashtirishga majbur bo'ldim va yaqinda men bu mavzuga biroz chuqurroq kirib borishni xohladim.

Birinchidan, shuni ta'kidlashni istardimki, ko'pgina RC transmitterlari ko'plab motor boshqaruvchilari singari aralashtirish qobiliyatiga ega. Agar siz o'zingizni kodingizga aralashtirishingiz kerak bo'lsa, bu ma'lumot eng foydali bo'ladi. Aytaylik, agar siz Arduino -dan RC qabul qiluvchisidan aralashmagan ma'lumotlarni o'qish uchun foydalanayotgan bo'lsangiz yoki kostryulkalardan analog ma'lumotlarni joystikda o'qiyotgan bo'lsangiz yoki mobil ilovadagi raqamli joystikdan koordinatalarni o'qiyotgan bo'lsangiz.

Keling, har xil aralashtirish usullarini ko'rib chiqaylik.

1 -qadam: aralashtirish usuli »Yo'q

Avval aralashtirishni umuman ishlatmasangiz nima bo'lishini ko'rib chiqaylik. Agar siz ma'lumotni bitta o'qdan shassisning bir tomoniga va boshqa o'qdan boshqa tomonga yuborsangiz, sizning avtomobilingiz siz xohlagan tarzda javob bermaydi.

Masalan, agar siz joystikni to'liq oldinga siljitsangiz, Y o'qi to'liq gaz kelepchasida, X o'qi 0 da. Shunday qilib, siz to'g'ridan -to'g'ri emas, balki aylana bo'ylab haydagan bo'lar edingiz.

2 -qadam: Usul usuli »Aylantirish

Usul usuli »Aylantirish
Usul usuli »Aylantirish

Bir kuni hamkasbim menga kambag'al odam aralashmasi uchun uzatgichni 45 gradusga burish mumkinligini aytdi. Agar siz joystikdagi ikkita potentsiometrning qiymatlarini panjara bo'yicha x o'qi o'qi deb hisoblasangiz (ikkala o'qi -100 dan +100 gacha), bu juda mantiqiy, chunki siz ikkala o'qda +100 ga borasiz. siz joystikni yuqoriga va o'ngga surganingizda. Shunday qilib, agar bu sizning ikkita shassi kanalingizga (robotingizning chap va o'ng tomoniga) to'g'ri kelsa, bu sizning robotingizni oldinga siljishiga olib keladi.

Shunday qilib, men aralashtirgan birinchi usul, x va y koordinatalarini gridning markaziy nuqtasi atrofida 45 gradusga matematik ravishda aylantirish edi.

Bu yaxshi ishlaydi, lekin men 100% quvvat bilan oldinga siljiy olmayman, chunki siz aylanayotganda umumiy harakat panjara ichidagi aylana bilan cheklangan, demak siz hech qachon o'ng yuqori burchakka kira olmaysiz.

Bu ham tarmoqning burchaklari ishlatilmasligiga olib keladi. Agar siz harakatlanishingizni cheklaydigan joystick/gimple ishlatayotgan bo'lsangiz, bu muammo emas, aks holda siz tarmoqning bu qismi sizning harakatlaringiz to'liq mutanosib bo'lishi uchun biror narsa qilishini xohlaysiz.

Agar siz men kabi vizual o'rganuvchi bo'lsangiz, ushbu ko'rsatmaning boshidagi videoni tomosha qilib, ushbu kontseptsiyani tushunish osonroq bo'lishi mumkin.

Keling, ba'zi kod misollarini ko'rib chiqaylik.

MENING KOD MASALALARIM HAQIDA QAYDLAR: Men sizning loyihangizga qarab o'zgarishi mumkin bo'lgan joystick_x va joystick_y qiymatlarini qanday olishini ko'rsatmayman. Bundan tashqari, men ± 100 ni xaritalash/cheklash bilan shug'ullanaman, lekin siz PWM uchun 1000 - 2000 yoki analog chiqish uchun 0 - 255 va hokazolarni xaritalashingiz kerak bo'lishi mumkin.

Arduino misoli:

// matematik tarzda aylantirish

er -xotin 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); // cheklash chapThrottle = cheklash (leftThrottle, -100, 100); rightThrottle = cheklash (rightThrottle, -100, 100);

JavaScript misoli:

// matematik rotatevar rad = -45*Math. PI/180; leftThrottle = joystick_x * Math.cos (rad) - joystick_y * Math.sin (rad); o'ngThrottle = joystick_y * Math.cos (rad) + joystick_x * Math.sin (rad); // helper functionvar constrain = function (num, min, max) {return Math.min (Math.max (son, min), max); };

3 -qadam: Usul usuli »Oddiy

Usul usuli »Oddiy
Usul usuli »Oddiy

Keyingi navbatda bizda Shawn Hymelning Science SparkFun sarguzashtlari videolaridan birida u men ishlagan loyihaga juda o'xshash loyihada ishlagan.

Bu tenglama sizga oldinga siljishda to'liq tezlikka erishishga imkon beradi, lekin aylantirish usuliga o'xshab, u tarmoqning burchak maydonlarini inobatga olmaydi. Buning sababi shundaki, ba'zi hollarda maksimal 100, ba'zi hollarda maksimal 200 bo'ladi. Demak, siz 100dan keyin hech narsaga e'tibor bermaslik uchun cheklash funktsiyasidan foydalanasiz.

Aytgancha, men bu oddiy narsani kamsituvchi deb atamayman … soddaligida go'zallik bor.

Arduino misoli:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // cheklash chapThrottle = cheklash (leftThrottle, -100, 100); rightThrottle = cheklash (rightThrottle, -100, 100);

JavaScript misoli:

var leftChannel = joystick_y + joystick_x;

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

4 -qadam: Metod usuli »mutanosib

Usul usuli »mutanosib
Usul usuli »mutanosib

Men har ikki dunyo tenglamasini eng yaxshi qilishiga umid qilib, oddiy usulni tanladim. Bu erda fikr, diagonal bo'yicha, har tomonga to'liq mutanosib bo'lishdir, garchi siz katta masofani bosib o'tayotgan bo'lsangiz ham, u vertikal harakat qilganingizdagidek kichikroq masofaga ega.

Siz mening misolimda barcha yo'nalishlarda -200 dan +200 gacha bo'lgan shkala bilan yakun topaman, men buni ± 100 ga xaritada ko'rsataman, chunki u har bir kanalga ketadigan quvvatning foizini ifodalaydi - lekin siz uni ishlatayotgan narsangiz bilan taqqoslashni xohlaysiz. vosita boshqaruvchisi uchun sumka. Masalan, agar siz PWM signalini yuborayotgan bo'lsangiz, uni 1000 dan 2000 gacha xaritaga kiritishingiz mumkin yoki analog signalni yuborayotgan bo'lsangiz, uni 0-255 ga xaritada ko'rsatishingiz va yo'nalishni mantiqiy qilib belgilashingiz mumkin.

Arduino misoli:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // ba'zi hollarda maksimal 100, ba'zi hollarda 200 bo'ladi // farqni hisobga olamiz, shuning uchun maksimal har doim 200int diff = abs (abs (joystick_y) - abs (joystick_x)); chapThrottle = chapThrottle <0? leftThrottle - farq: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - farq: rightThrottle + farq; // Xaritalar ± 200 dan ± 100 gacha yoki siz xohlagan diapazonda ignaTThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = cheklash (leftThrottle, -100, 100); rightThrottle = cheklash (rightThrottle, -100, 100);

JavaScript misoli:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // ba'zi hollarda maksimal 100, ba'zi hollarda 200, // farqni hisobga olamiz, shuning uchun maksimal har doim 200var farq = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - farq: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle -farq: rightThrottle + diff; // Xaritada ± 200 dan ± 100 gacha yoki siz nima qilasizThrottle = map (chapThrottle, -200, 200, -100, 100); -100, 100); // leftThrottle = cheklash (leftThrottle, -100, 100); rightThrottle = cheklash (rightThrottle, -100, 100); // ba'zi yordamchi funktsiyalarvar constrain = function (son, min, max) {qaytish Math.min (Math. maksimal (son, min), maksimal); }; var map = funktsiyasi (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, xaritada; inMin = inMin + inMax; son = son + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (son/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); mapped = outSpan*(p/100) - (outMax/2); qaytish xaritada;};

Tavsiya: