Cómo manejar tres ruedas con dos joysticks V2

En este Tip vamos a implementar un algoritmo usando dos joysticks para mover un chasis de tres motores con ruedas omniwheels. Para este ejemplo se está empleando los joysticks de una Steam Deck en los que se ha mapeado cada eje de 0 a 511 para luego aplicar velocidad PWM.
Cómo funciona: se divide cada joystick en 9 áreas cardinales para determinar qué dirección, velocidad y cuáles motores mover. Como siempre va a ver un punto del mismo joystick nunca se va a ver más de un punto cardinal. En el caso del joystick izquierdo se dividirá en tres zonas (izquierda, centro y derecha) y en tres nuevamente para meter diagonales y tener 8 direcciones, y para el derecho tan sólo cogeremos el eje RX para girar en movimiento o rotar si estamos parados.
Se pueden incluir más movimientos pero lo esencial aquí es que el robot se mueva en todas las direcciones mirando hacia un lado o rotando sobre sí mismo.
Código para adaptar al tuyo:
Definimos las variables necesarias de velocidad (Left, Right, Central), dirección (0 = parado, 1 = horario, 2 = antihorario), los ejes X e Y de cada joystick y un booleano para saber si se está moviendo fuera del origen:
byte velL, velR, velC;
byte direL, direR, direC;
byte byteL, byteR, byteC;
unsigned int joyLX = 255;
unsigned int joyLY = 255;
unsigned int joyRX = 255;
unsigned int joyRY = 255;
bool mover = false;
Un punto muerto para no estar todo el rato moviéndose en estático:
byte puntoMuerto = 50;
Creamos las variables locales que serán la velocidad corregida puesto que el joystick con el que se prueba el rango es 0-511 y el PWM es 255, además que desde el centro para afuera el número disminuye y deceleraría (Ajustar a valores de tu joystick):
unsigned int velochiLX = 0;
unsigned int velochiLY = 0;
unsigned int velochiRX = 0;
if (joyLX > 255) velochiLX = 255-(511-joyLX);
else velochiLX = 255-joyLX;
…
Límite seguro para un arranque suave (ajustar PWM mínimo de tus motores):
if (velochiLX < 25) velochiLX = 25;
if (velochiLY < 25) velochiLY = 25;
if (velochiRX < 25) velochiRX = 25;
Ahora formamos la lógica de en qué punto cardinal estoy y modificar los parámetros de velocidad y dirección:
if (joyLX >= 255-puntoMuerto && joyLX <= 255+puntoMuerto) { // CENTRO DEL JOYSTICK
if (joyLY >= 255-puntoMuerto && joyLY <= 255+puntoMuerto) { // Punto muerto
velL = 0; velR = 0; velC = 0; direL = 0; direR = 0; direC = 0; mover = false;
} else if (joyLY > 255+puntoMuerto && joyLY <= 511) { // Trasera
velL = velochiLY; velR = velochiLY; velC = 0; direL = 1; direR = 2; direC = 0; mover = true;
…
Para el joystick derecho, si es ha salido del punto muerto sobreescribimos los valores de los tres motores si está parado para poder rotar o girar como un auto si estamos en movimiento mediante el booleano “mover”:
if (joyRX >= 0 && joyRX < 255-puntoMuerto) { // Rotar derecha
if (mover == false) {
velL = velochiRX; velR = velochiRX; velC = velochiRX; direL = 1; direR = 1; direC = 1;
} else {
velC = velochiRX; direC = 1;
}
…
Después deberás adaptarlo a tu código basándose en direL, velR, etc para mover a tu void de movimientos.
Como todo dependiendo de qué valores de joysticks se estén empleando y qué motores es necesario modificar este código.
Notas
- No requiere de librerías.