İçindekiler:

Kanal Karıştırmayı Anlama: 4 Adım (Resimlerle)
Kanal Karıştırmayı Anlama: 4 Adım (Resimlerle)

Video: Kanal Karıştırmayı Anlama: 4 Adım (Resimlerle)

Video: Kanal Karıştırmayı Anlama: 4 Adım (Resimlerle)
Video: Kanal Tedavisi Nasıl Yapılır? Nelere Dikkat Edilir? 2024, Temmuz
Anonim
Image
Image
Karıştırma Yöntemi » Yok
Karıştırma Yöntemi » Yok

Daha önce uzaktan kumandalı bir şasi kullandıysanız, bilmeseniz bile karıştırmayı kullanmış olma ihtimaliniz yüksektir. Spesifik olarak, skid direksiyon veya diferansiyel direksiyon kullanan bir aracı kontrol etmek için tek bir joystick veya yalpa kullandıysanız, karıştırmayı kullanmışsınızdır.

Karıştırma, kasanın her iki tarafına ne kadar güç sağlanması gerektiğini belirlemek için joystick'inizden gelen verilerin nasıl kullanıldığıdır.

Bir joystick'i açarsanız, genellikle içinde iki potansiyometre görürsünüz. Biri Y ekseni (yukarı ve aşağı) boyunca mevcut konumunuzu ölçmek için, diğeri ise X ekseni boyunca (yan yana) nerede olduğunuzu ölçmek için.

Konuyla ilgili resmi bir eğitimim olmamasına rağmen daha önce kod miksajı yapmak zorunda kaldım ve son zamanlarda konuya biraz daha derine dalmak istedim.

Öncelikle, çoğu RC vericisinin, birçok motor kontrol cihazında olduğu gibi karıştırma özelliğine sahip olduğunu belirtmek isterim. Kodunuzda karıştırma işlemini kendiniz yapmanız gerekiyorsa, bu bilgi en yararlı olacaktır. Örneğin, bir RC alıcısından karıştırılmamış verileri okumak için bir Arduino kullanıyorsanız veya bir joystick'teki kaplardan analog verileri okuyorsanız veya bir mobil uygulamadaki dijital bir joystick'ten koordinatları okuyorsanız, söyleyin.

Bazı farklı karıştırma yaklaşımlarına bir göz atalım.

Adım 1: Karıştırma Yöntemi » Yok

İlk önce, karıştırmayı hiç kullanmazsanız ne olduğuna bir bakalım. Verileri sadece bir eksenden şasinin bir tarafına ve diğer ekseni diğer tarafa gönderirseniz, aracınız istediğiniz şekilde tepki vermez.

Örneğin, joystick'i dümdüz ileri iterseniz, Y ekseni tam gazda ve X ekseni 0'da. Yani düz gitmek yerine daireler çiziyor olacaksınız.

Adım 2: Yöntem Yöntemi » Döndür

Yöntem Yöntem » Döndür
Yöntem Yöntem » Döndür

Bir iş arkadaşım bir keresinde bana, fakir bir adamın karışımı için vericinizi 45 derece döndürebileceğinizi söylemişti. Bir joystick'teki iki potansiyometreden gelen değerleri bir ızgaradaki x herhangi bir y ekseni olarak düşünürseniz (her iki eksen -100 ila +100 arasında değişir) bu çok mantıklı çünkü her iki eksende de +100'e gidiyorsunuz joystick'i yukarı ve sağa doğru ittiğinizde. Dolayısıyla bu, doğrudan iki şasi kanalınızla (robotunuzun sol ve sağ tarafları) eşleşirse, robotunuzun ilerlemesini sağlar.

Bu yüzden denediğim ilk karıştırma yöntemi, x ve y koordinatlarını ızgaranın merkez noktası etrafında 45 derece matematiksel olarak döndürmek oldu.

Bu işe yarıyor, ancak %100 güçle ilerleyemiyorum çünkü dönerken, genel hareket ızgara içindeki bir daireyle sınırlandırılıyor, bu da o sağ üst köşeye asla gerçekten giremeyeceğiniz anlamına geliyor.

Bu aynı zamanda ızgaranın köşelerinin kullanılmamasına da neden olur. Hareketinizi sınırlayan ve böylece bu alanlara asla ulaşılmayacak şekilde bir joystick/gimple kullanıyorsanız bu bir sorun değildir, ancak aksi takdirde hareketlerinizin tamamen orantılı hissetmesi için ızgaranın o kısmının bir şeyler yapmasını isteyeceksiniz.

Benim gibi görsel bir öğreniciyseniz, bu talimatın başındaki videoyu izleyerek bu kavramı anlamak daha kolay olabilir.

Bazı kod örneklerine bakalım.

KOD ÖRNEKLERİMLE İLGİLİ NOTLAR: joystick_x ve joystick_y değerlerini nasıl alacağınızı projenize göre değişeceği için burada bırakıyorum. Ayrıca ±100 ile eşleştirme/kısıtlama yapacağım ama muhtemelen PWM için 1000 - 2000 veya analog çıkış vb. için 0 - 255 eşleştirmeniz gerekebilir. Her ihtimale karşı her zaman kısıtlarım.

Arduino Örneği:

// matematiksel olarak döndür

çift 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); //sol kısıtlaTrottle = constrain(leftThrottle, -100, 100); rightThrottle = kısıtlama(sağTrottle, -100, 100);

JavaScript Örneği:

//matematiksel olarak döndürvar 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 = constrain(leftThrottle, -100, 100);rightThrottle = constrain(rightThrottle, -100, 100); //helper functionvar constrain = function(sayı, min, maks){ return Math.min(Math.maks(sayı, min), maks); };

Adım 3: Yöntem Yöntemi » Basit

Yöntem Yöntem » Basit
Yöntem Yöntem » Basit

Sırada, benim üzerinde çalıştığım projeye çok benzer bir proje üzerinde çalıştığı Shawn Hymel'in Maceraları Bilim SparkFun videolarından birinden aldığım çok basit bir denklemimiz var.

Bu denklem, ileri giderken tam hıza ulaşmanızı sağlar, ancak döndürme yöntemine çok benzer şekilde, ızgaranın köşe alanlarını göz ardı eder. Bunun nedeni, bazı durumlarda maksimumun 100 ve bazı durumlarda maksimumun 200 olmasıdır. Bu nedenle, 100'den sonra herhangi bir şeyi göz ardı etmek için bir kısıtlama işlevi kullanırsınız.

Ve bu arada ben buna basite küçümseyici demiyorum… Sadelikte bir güzellik var.

Arduino Örneği:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; //sol kısıtlaTrottle = constrain(leftThrottle, -100, 100); rightThrottle = kısıtlama(sağTrottle, -100, 100);

JavaScript Örneği:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x;//constrain leftChannel = constrain(leftChannel, -100, 100); rightChannel = kısıtla(rightChannel, -100, 100); //helper functionvar constrain = function(sayı, min, maks){ return Math.min(Math.maks(sayı, min), maks); };

Adım 4: Yöntem Yöntemi » Orantılı

Yöntem Yöntem » Orantılı
Yöntem Yöntem » Orantılı

Her iki dünyanın denkleminden de en iyi şekilde yararlanmayı umarak basit yöntemden sıçradım. Buradaki fikir, daha büyük bir mesafe hareket ediyor olsanız da, dikey olarak hareket ettiğinizde olduğu gibi aynı aralığa sahip olmasına rağmen, çapraz olarak bile tüm yönlerde tam orantılı olmaktır, bu daha küçük bir mesafedir.

Örneklerimde tüm yönlerde -200 ila +200 arasında bir ölçek elde edersiniz, bunu ±100 olarak eşliyorum çünkü her kanala giden gücün yüzdesini temsil ediyor - ancak bunu kullanımınızda işe yarayan her şeye eşlemek isteyeceksiniz- Motor kontrol cihazınız için durum. Örneğin, bir PWM sinyali gönderiyorsanız, bunu 1000 ila 2000'e eşleyebilirsiniz veya bir analog sinyal gönderiyorsanız, onu 0-255'e eşleyebilir ve yönü boole vb.

Arduino Örneği:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x;// bazı durumlarda maks 100'dür, bazı durumlarda 200'dür// hadi farkı çarpanlarına alalım, böylece maks her zaman 200int diff = abs(abs(joystick_y) - abs(joystick_x));leftGaz = solGaz < 0 ? leftTrottle - diff: leftThrottle + diff;rightGaz Gazı = sağGaz Gazı < 0 ? sağGaz - fark: sağGaz + fark; // ±200'den ± 100'e kadar harita veya hangi aralıkta iğne yaparsanız yapınGaz Gazı = map(leftThrottle, 0, 200, -100, 100);rightThrottle = map(rightthrottle, 0, 200, -100, 100); //constrainleftThrottle = constrain(leftThrottle, -100, 100);rightThrottle = constrain(rightThrottle, -100, 100);

JavaScript Örneği:

var leftThrottle = joystick_y + joystick_x;var rightThrottle = joystick_y - joystick_x;// bazı durumlarda maksimum 100, bazı durumlarda 200, // farkı çarpanlarına ayıralım, böylece maksimum her zaman 200var diff = Math.abs(Math.abs(joystick_y) - Math.abs(joystick_x));leftThrottle = leftThrottle < 0 ? leftTrottle - diff: leftThrottle + diff;rightGaz Gazı = sağGaz Gazı < 0 ? rightThrottle - diff: rightThrottle + diff;// ±200'den ±100'e veya neye ihtiyacınız olursa olsun harita -100, 100); //constrain leftThrottle = constrain(leftThrottle, -100, 100);rightThrottle = constrain(rightThrottle, -100, 100);//bazı yardımcı işlevlervar constrain = function(num, min, max){ return Math.min(Math. maks(sayı, min), maks); }; var map = function(num, inMin, inMax, outMin, outMax){ var p, inSpan, outSpan, mapped; inMin = inMin + inMax; sayı = sayı + inMax; inMax = inMax + inMax; inSpan = Math.abs(inMax-inMin); p = (sayı/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs(outMax - outMin); mapped = outSpan*(p/100) - (outMax/2); eşlenen dönüş;};

Önerilen: