Estoy buscando información sobre cómo implementar una mezcla adecuada de 2 señales analógicas de joystick (eje X e Y) para controlar un motor de doble diferencial (unidad tipo "tanque") usando un uC (ATMega328p en mi caso, pero lo mismo debería aplicarse a cualquier uC con entradas ADC y salidas PWM):
Tengo un stick analógico, que da 2 valores analógicos:
(dirección) X: 0 a 1023
(acelerador) Y: 0 a 1023
La posición de reposo es (dirección y acelerador neutral) 512,512
Acelerador adelante / dirección izquierda es 0,0
Completo adelante-completo derecho es 1023,0
etc.
Los motores están controlados por 2 controladores de puente H, 2 pines PWM para cada uno (hacia adelante, hacia atrás), así:
Motor izquierdo: -255 a 255
Motor derecho: -255 a 255
(los valores positivos permiten el pin PWM hacia adelante, el negativo hacia atrás Pin PWM, 0 desactiva ambos)
El objetivo es mezclar señales analógicas de joystick para lograr la siguiente respuesta:
a) Acelerador hacia adelante, dirección neutral = vehículo moviéndose hacia adelante
b) Acelerador hacia adelante, dirección izquierda = vehículo moviéndose hacia adelante y girando hacia la izquierda
c) Acelerador neutral, dirección hacia la izquierda = vehículo girando hacia la izquierda EN LUGAR que es el motor derecho completamente adelante, el motor izquierdo completamente atrás
... y de manera similar para otras combinaciones. Por supuesto, la salida debe ser "analógica", es decir, debe permitir una transición gradual de, por ejemplo, de la opción a) a b) a c).
El concepto es:
Respuestas:
La mezcla "adecuada" está abierta a debate :-).
Un problema es que tienes que tomar decisiones sobre qué tan rápido se mueve una pista bajo señales puras de un solo bote y qué hacer cuando se incluyen las señales del otro bote. Por ejemplo, si empuja el potenciómetro FB (Forward-Backward pot) completamente hacia adelante, y si ambos motores funcionan a toda velocidad hacia adelante, ¿cómo lidia con la adición de una pequeña cantidad de potenciómetro LR (izquierda-derecha) que se agrega. para obtener la rotación, debe tener una pista que vaya más rápido que la otra. Por lo tanto, si ya está corriendo a la máxima velocidad de avance en ambos motores, debe disminuir una u otra velocidad de la pista para poder girar. Pero, si hubiera estado parado, usted habría acelerado una u otra pista para lograr el mismo resultado.
Entonces, todo lo dicho, aquí hay una solución de partida simple y descabellada que parece un buen comienzo.
Si las macetas son mecánicamente independientes, ambas pueden estar al 100% simultáneamente.
Si ambos están en una disposición de tipo joystick, si Yaxis = 100% y Xaxis = 0%, entonces agregar algo de B generalmente reducirá A. Se podría construir un joystick donde lo anterior no es cierto, pero estos son inusuales.
Suponga que el joystick es del tipo que aumenta Y% cuando X = 100% reducirá X. Se pueden hacer otras suposiciones.
FB = olla frontal-posterior. Centro cero, + Ve para el movimiento hacia adelante de la olla
LR = olla derecha izquierda. Centro cero + Ve por la olla a la derecha.
K es un factor de escala inicialmente 1.
Si algún resultado excede el 100%, ajuste K para que el resultado = 100% y use el mismo valor K para otro motor también.
Como 125 x 0.8 = 100, establezca K = 0.8. Entonces.
Izquierda = 125 x 0.8 = 100%. Derecha = 80 x 0.8 = 64%.
Entonces:
Motor izquierdo = K x (Front_Back + Left_Right)
Motor derecho = K x (Frente_Atrás - Izquierda_Derecha)
Controles de cordura:
LR = 0 (centrado), FB = full fwd -> Ambos motores funcionan completamente hacia adelante.
LR = totalmente a la izquierda, FB = 0 ->
El motor izquierdo funciona completamente hacia atrás, el
motor derecho funciona completamente hacia adelante.
El vehículo gira en sentido antihorario.
FB fue 100%, Lr = 0%. Añadir 10% de LR a la derecha.
L = FB + LR = 100% - + 10% R = FB-LR = 100% - - 10%
Si el eje más grande <100%, escala hasta = 100%.
Luego escale otro eje en la misma cantidad.
fuente
Aquí hay una solución que no requiere complicadas cadenas if / else, no reduce la potencia cuando se mueve completamente hacia adelante o gira en su lugar, y permite curvas suaves y transiciones de movimiento a giro.
La idea es simple. Suponga que los valores del joystick (x, y) son coordenadas cartesianas en un plano cuadrado. Ahora imagine un plano cuadrado más pequeño girado 45º dentro de él.
Las coordenadas del joystick le dan un punto en el cuadrado más grande, y el mismo punto superpuesto en el cuadrado más pequeño le da los valores del motor. Solo necesita convertir las coordenadas de un cuadrado a otro, limitando los nuevos valores (x, y) a los lados del cuadrado más pequeño.
Hay muchas formas de hacer la conversión. Mi método favorito es:
Esto supone que las coordenadas iniciales (x, y) están en el rango -1.0 / + 1.0. El lado del cuadrado interior siempre será igual a
l * sqrt(2)/2
, por lo que el paso 4 consiste en multiplicar los valores porsqrt(2)
.Aquí hay un ejemplo de implementación de Python.
La idea original de este método, con un método de transformación mucho más complicado, surgió de este artículo .
fuente
A continuación se muestra un ejemplo de implementación del algoritmo de mezcla como se describe en la respuesta de Russel McMahon:
http://www.youtube.com/watch?v=sGpgWDIVsoE
fuente