Mündəricat:

Kanal Qarışıqlığını Anlamaq: 4 Adım (Şəkillərlə)
Kanal Qarışıqlığını Anlamaq: 4 Adım (Şəkillərlə)

Video: Kanal Qarışıqlığını Anlamaq: 4 Adım (Şəkillərlə)

Video: Kanal Qarışıqlığını Anlamaq: 4 Adım (Şəkillərlə)
Video: S.Ə.S: "Cındır Adamlar" (2-ci bölüm) 2024, Iyul
Anonim
Image
Image
Qarışdırma Metodu »Yoxdur
Qarışdırma Metodu »Yoxdur

Heç bir uzaqdan idarə şassisini idarə etmisinizsə, bilməsəniz də qarışdırmaqdan istifadə etmək şansınız çoxdur. Xüsusilə, sürüşmə sükanı və ya diferensial sükanı istifadə edən bir avtomobili idarə etmək üçün tək bir joystick və ya gimble istifadə etmisinizsə, qarışdırmaqdan istifadə etmisiniz.

Qarışdırmaq, şassinin hər tərəfinə nə qədər güc veriləcəyini təyin etmək üçün joystickinizdəki məlumatların necə istifadə edildiyini göstərir.

Bir joystick açsanız, ümumiyyətlə içərisində iki potansiyometr görəcəksiniz. Biri Y oxu boyunca (yuxarı və aşağı), digəri isə X oxu boyunca (yan -yana) harada olduğunuzu ölçmək üçün.

Mövzu ilə bağlı rəsmi bir təhsilim olmasa da əvvəllər kod qarışdırmaq məcburiyyətində qaldım və bu yaxınlarda mövzuya bir az daha dərindən girmək istədim.

Əvvəlcə qeyd etmək istəyirəm ki, əksər RC ötürücüləri bir çox motor nəzarətçiləri kimi qarışdırma qabiliyyətinə malikdir. Kodunuzu özünüz qarışdırmaq məcburiyyətindəsinizsə bu məlumatlar ən faydalı olacaq. Məsələn, bir RC qəbuledicisindən qarışdırılmamış məlumatları oxumaq üçün bir Arduino istifadə edirsinizsə və ya qablardan analoq məlumatları joystickdə oxuyursunuzsa və ya mobil tətbiqdə rəqəmsal joystickdən koordinatları oxuyursunuzsa deyin.

Fərqli qarışdırma yanaşmalarına nəzər salaq.

Addım 1: Qarışdırma Metodu »Yoxdur

Əvvəlcə qarışdırmağı ümumiyyətlə istifadə etməsəniz nə olacağını nəzərdən keçirək. Veriləri yalnız bir oxdan şassinin bir tərəfinə, digər oxu digər tərəfə göndərsəniz, avtomobiliniz istədiyiniz şəkildə cavab verməz.

Məsələn, joysticki düz bir şəkildə irəli itələsəniz, Y oxu tam qazdadır və X oxu 0 -dadır. Deməli, düz getmək əvəzinə dairələrdə sürmək olardı.

Addım 2: Metod Metodu »Döndür

Metod Metod »Döndür
Metod Metod »Döndür

Bir dəfə bir iş yoldaşı mənə dedi ki, yoxsul bir adamın qarışığı üçün vericinizi 45 dərəcə döndərə bilərsiniz. Bir joystickdəki iki potensiometrdən alınan dəyərləri bir şəbəkədəki x y y oxu olaraq düşünürsünüzsə (hər iki oxda -100 ilə +100 aralığında), bu çox məntiqlidir, çünki hər iki oxda +100 -ə gedirsiniz. joysticki yuxarı və sağa itələyərkən. Beləliklə, bu, iki şassi kanalınıza (robotunuzun sol və sağ tərəfləri) birbaşa uyğun gəlirsə, bu, robotunuzun irəli getməsini təmin edər.

Buna görə sınadığım ilk qarışdırma üsulu, x və y koordinatlarını ızgaranın mərkəz nöqtəsi ətrafında 45 dərəcə riyazi olaraq döndərmək idi.

Bu yaxşı işləyir, amma 100% güclə irəliyə gedə bilmərəm, çünki dönərkən ümumi hərəkət ızgara içərisindəki bir dairə ilə məhdudlaşır, yəni heç vaxt o sağ küncün içinə girə bilməzsən.

Bu da şəbəkənin künclərindən istifadə edilməməsi ilə nəticələnir. Hərəkətinizi məhdudlaşdıran bir joystick/gimple istifadə edirsinizsə, bu heç bir yerə çatmır, amma əks halda hərəkətlərinizin tamamilə mütənasib hiss etməsi üçün ızgaranın o hissəsinin bir şey etməsini istəyəcəksinizsə bu problem deyil.

Əgər mənim kimi bir vizual öyrənən olsanız, bu təlimatın əvvəlindəki videoya baxaraq bu anlayışı öyrənmək daha asan ola bilər.

Bəzi kod nümunələrinə baxaq.

KOD NÜMUNƏLƏRİM HAQQINDA QEYDLƏR: Layihənizdən asılı olaraq dəyişəcəyi kimi joystick_x və joystick_y dəyərlərini necə əldə etdiyinizi yazmıram. Həm də ± 100 ilə eşleyeceğim/məhdudlaşdıracağam, amma ehtimal ki, PWM üçün 1000-2000 və ya analog çıxış üçün 0 - 255 və s. Mən həmişə məhdudlaşdırıram … hər halda.

Arduino nümunəsi:

// riyazi olaraq döndür

ikiqat 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); // məhdudlaşdırmaq solThrottle = məhdudlaşdırmaq (leftThrottle, -100, 100); rightThrottle = məhdudlaşdırmaq (rightThrottle, -100, 100);

JavaScript nümunəsi:

// riyazi 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 = məhdudlaşdır (solThrottle, -100, 100); rightThrottle = məhdudlaşdır (rightThrottle, -100, 100); // helper functionvar constrain = function (sayı, min, maksimum) {return Math.min (Math.max (sayı, min), maksimum); };

Addım 3: Metod Metodu »Sadə

Metod Metod »Sadə
Metod Metod »Sadə

Növbəti dəfə Shawn Hymel'in Science SparkFundakı macəralarından birini aldığım və üzərində işlədiyimə çox oxşar bir layihə üzərində işlədiyi çox sadə bir tənliyə sahibik.

Bu tənlik irəliləyərkən tam sürətə çatmağınıza imkan verir, ancaq fırlanma metodu kimi, ızgaranın künc sahələrini nəzərə almır. Bunun səbəbi, bəzi hallarda maksimum 100, bəzi hallarda maksimum 200 olmasıdır. Buna görə də 100 -dən sonra heç bir şeyi nəzərə almamaq üçün bir məhdudlaşdırma funksiyasından istifadə edərdiniz.

Yeri gəlmişkən, bu sadəliyi aşağılayıcı adlandırmıram … sadəliyin bir gözəlliyi var.

Arduino nümunəsi:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // məhdudlaşdırmaq solThrottle = məhdudlaşdırmaq (leftThrottle, -100, 100); rightThrottle = məhdudlaşdırmaq (rightThrottle, -100, 100);

JavaScript nümunəsi:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // leftChannel = constrain (leftChannel, -100, 100); rightChannel = məhdudlaşdırın (rightChannel, -100, 100); // helper functionvar constrain = function (sayı, min, maksimum) {return Math.min (Math.max (sayı, min), maksimum); };

Addım 4: Metod Metodu »Mütənasib

Metod Metod »Mütənasib
Metod Metod »Mütənasib

Hər iki dünya tənliyinin ən yaxşısını etmək ümidi ilə sadə bir üsulla yola çıxdım. Buradakı fikir, daha böyük bir məsafədə hərəkət etməyinizə baxmayaraq, hətta daha kiçik bir məsafədə, şaquli olaraq hərəkət edərkən eyni aralığa sahib olmasına baxmayaraq, çapraz olaraq bütün istiqamətlərdə tam mütənasib olmaqdır.

Nümunələrimdə bütün istiqamətlərdə -200 ilə +200 arasında bir miqyas alırsınız, bunu hər bir kanala gedən gücün faizini əks etdirdiyi üçün ± 100 olaraq göstərirəm - ancaq istifadə etdiyiniz işlə əlaqələndirmək istəyəcəksiniz. motor nəzarətçiniz üçün korpus. Məsələn, bir PWM siqnalı göndərirsinizsə, bunu 1000 ilə 2000 arasında müqayisə edə bilərsiniz və ya analoq siqnal göndərirsinizsə, onu 0-255-ə uyğunlaşdıra və istiqaməti boolean kimi təyin edə bilərsiniz.

Arduino nümunəsi:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // bəzi hallarda maksimum 100, bəzi hallarda 200 olur // fərqi nəzərə alaraq maksimum həmişə 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - fərq: leftThrottle + fərq; rightThrottle = rightThrottle <0? rightThrottle - fərq: rightThrottle + fərq; // ± 200 -dən ± 100 -ə qədər olan xəritələr və ya hər hansı bir aralığa ignftThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = məhdudlaşdırmaq (leftThrottle, -100, 100); rightThrottle = məhdudlaşdırmaq (rightThrottle, -100, 100);

JavaScript nümunəsi:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // bəzi hallarda maksimum 100 -dir, bəzi hallarda 200 -dir, // fərqi nəzərə alaq ki, maksimum həmişə 200var olsun = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - fərq: leftThrottle + fərq; rightThrottle = rightThrottle <0? rightThrottle -fərq: rightThrottle + diff; // ± 200 -dən ± 100 -ə qədər aşağıya və ya hər hansı bir şeyi iynə tutmaqThrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); // leftThrottle = məhdudlaşdırmaq (leftThrottle, -100, 100); rightThrottle = məhdudlaşdırmaq (rightThrottle, -100, 100); // bəzi köməkçi funksiyaların constrain = funksiyası (sayı, min, maksimum) {qayıt Math.min (Math. maksimum (sayı, min), maksimum); }; var map = funksiyası (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, eşlenen; inMin = inMin + inMax; sayı = sayı + 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); geri döndürüldü;};

Tövsiyə: