Tabla de contenido:

Comprensión de la mezcla de canales: 4 pasos (con imágenes)
Comprensión de la mezcla de canales: 4 pasos (con imágenes)

Video: Comprensión de la mezcla de canales: 4 pasos (con imágenes)

Video: Comprensión de la mezcla de canales: 4 pasos (con imágenes)
Video: Cuando eres demasiado alta #Shorts🥰✨ 2024, Noviembre
Anonim
Image
Image
Método de mezcla »Ninguno
Método de mezcla »Ninguno

Si alguna vez ha conducido un chasis de control remoto, es muy probable que haya utilizado la mezcla, incluso si no lo sabía. Específicamente, si ha usado un solo joystick o gimble para controlar un vehículo que usa dirección deslizante o dirección diferencial, ha usado la mezcla.

La mezcla es simplemente cómo se utilizan los datos de su joystick para determinar cuánta energía se debe suministrar a cada lado del chasis.

Si abre un joystick, generalmente verá dos potenciómetros adentro. Uno para medir su posición actual a lo largo del eje Y (arriba y abajo), y el otro para medir dónde se encuentra a lo largo del eje X (de lado a lado).

Aunque no tengo una formación formal sobre el tema, he tenido que mezclar código antes y recientemente quería profundizar un poco más en el tema.

Primero, quiero señalar que la mayoría de los transmisores RC tienen capacidad de mezcla, al igual que muchos controladores de motor. Esta información será muy útil si tiene que hacer la mezcla usted mismo en su código. Digamos, por ejemplo, si está utilizando un Arduino para leer datos sin mezclar de un receptor RC, o está leyendo datos analógicos de las ollas en un joystick, o si está leyendo las coordenadas de un joystick digital en una aplicación móvil.

Echemos un vistazo a algunos enfoques de mezcla diferentes.

Paso 1: Método de mezcla »Ninguno

Primero, echemos un vistazo a lo que sucede si no usa la mezcla en absoluto. Si simplemente envía los datos de un eje a un lado del chasis y el otro eje al otro lado, su vehículo no respondería de la manera que desea.

Por ejemplo, si empuja el joystick completamente hacia adelante, el eje Y está a toda velocidad y el eje X está en 0. Por lo tanto, estaría conduciendo en círculos en lugar de ir en línea recta.

Paso 2: Método Método »Rotar

Método Método »Rotar
Método Método »Rotar

Un compañero de trabajo me señaló una vez que, en caso de apuro, puede girar el transmisor 45 grados para obtener una mezcla de pobre. Si piensa que los valores de los dos potenciómetros en un joystick son el eje xy y en una cuadrícula (con ambos ejes que abarcan -100 a +100), esto tiene mucho sentido porque va a +100 en ambos ejes mientras empuja el joystick hacia arriba y hacia la derecha. Entonces, si esto se asigna directamente a los dos canales de su chasis (los lados izquierdo y derecho de su robot), haría que su robot avanzara.

Entonces, el primer método de mezcla que probé fue rotar matemáticamente las coordenadas xey 45 grados alrededor del punto central de la cuadrícula.

Esto funciona bien, sin embargo, no puedo avanzar con el 100% de potencia porque cuando estás girando, el movimiento general está restringido a un círculo dentro de la cuadrícula, lo que significa que nunca puedes entrar realmente en la esquina superior derecha.

Esto también da como resultado que las esquinas de la cuadrícula no se utilicen. Esto no es un problema si está usando un joystick / gimple que limita su movimiento para que esas áreas nunca se alcancen de todos modos, pero de lo contrario, querrá que esa parte de la cuadrícula haga algo para que sus movimientos se sientan completamente proporcionales.

Si eres un aprendiz visual como yo, este concepto podría ser más fácil de asimilar viendo el video al comienzo de este instructivo.

Veamos algunos ejemplos de código.

NOTAS SOBRE LOS EJEMPLOS DE MIS CÓDIGOS: Dejo de lado cómo obtiene los valores de joystick_x y joystick_y, ya que cambiarían dependiendo de su proyecto. También estaré mapeando / restringiendo a ± 100 pero es posible que necesite mapear a 1000 - 2000 para PWM o 0 - 255 para salida analógica, etc. Siempre restrinjo… por si acaso.

Ejemplo de Arduino:

// rotar matemáticamente

doble 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); // restringir el acelerador izquierdo = restringir (el acelerador izquierdo, -100, 100); rightThrottle = restringir (rightThrottle, -100, 100);

Ejemplo de JavaScript:

// matemáticamente 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); // restringirleftThrottle = restringir (leftThrottle, -100, 100); rightThrottle = restringir (rightThrottle, -100, 100); // ayudante functionvar restricin = function (num, min, max) {return Math.min (Math.max (num, min), max); };

Paso 3: Método Método »Simple

Método Método »Simple
Método Método »Simple

A continuación, tenemos una ecuación muy simple que recogí por primera vez de uno de los videos de Shawn Hymel's Adventures in Science SparkFun, donde resultó que estaba trabajando en un proyecto muy similar al que yo estaba trabajando.

Esta ecuación le permite alcanzar la máxima velocidad cuando avanza, pero al igual que el método de rotación, ignora las áreas de las esquinas de la cuadrícula. Esto se debe a que, en algunos casos, el máximo es 100 y, en algunos casos, el máximo es 200. Por lo tanto, usaría una función de restricción para ignorar cualquier cosa después de 100.

Y, por cierto, no llamo a esto simple de manera despectiva … hay una belleza en la simplicidad.

Ejemplo de Arduino:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // restringir el acelerador izquierdo = restringir (el acelerador izquierdo, -100, 100); rightThrottle = restringir (rightThrottle, -100, 100);

Ejemplo de JavaScript:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // restringir leftChannel = restringir (leftChannel, -100, 100); rightChannel = restringir (rightChannel, -100, 100); // ayudante functionvar restricin = function (num, min, max) {return Math.min (Math.max (num, min), max); };

Paso 4: Método Método »Proporcional

Método Método »Proporcional
Método Método »Proporcional

Salí del método simple con la esperanza de sacar lo mejor de la ecuación de ambos mundos. La idea aquí es ser completamente proporcional en todas las direcciones, incluso en diagonal, a pesar de que, aunque se está moviendo una distancia mayor, tiene el mismo rango que cuando se mueve verticalmente, que es una distancia menor.

Termina con una escala de -200 a +200 en todas las direcciones en mis ejemplos, lo mapeo a ± 100 porque representa el porcentaje de potencia que va a cada canal; sin embargo, querrá asignarlo a lo que sea que funcione en su uso. estuche para su controlador de motor. Por ejemplo, si está enviando una señal PWM, puede asignarla de 1000 a 2000 o si está enviando una señal analógica, puede asignarla a 0-255 y establecer la dirección como booleana, etc.

Ejemplo de Arduino:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // en algunos casos el máximo es 100, en algunos casos es 200 // factoricemos la diferencia para que el máximo sea siempre 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Mapa de ± 200 a ± 100 o cualquier rango que se ajuste. // Restringir Acelerador izquierdo = Restringir (Acelerador izquierdo, -100, 100); Acelerador derecho = Restringir (Acelerador derecho, -100, 100);

Ejemplo de JavaScript:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // en algunos casos el máximo es 100, en algunos casos es 200, // vamos a factorizar la diferencia para que el máximo sea siempre 200 var diff = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Mapa desde ± 200 hacia abajo a ± 100 o lo que sea que se te pida. -100, 100); // Restringir el acelerador izquierdo = restringir (el acelerador izquierdo, -100, 100); el acelerador derecho = restringir (el acelerador derecho, -100, 100); // algunas funciones auxiliares var restricción = función (num, min, max) {return Math.min (Math. max (num, min), max); }; var map = function (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, mapeado; 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); mapeado = outSpan * (p / 100) - (outMax / 2); retorno mapeado;};

Recomendado: