Joystick analógico: cómo leer los ejes X e Y y el botón
Cómo funciona el módulo de joystick con dos potenciómetros y un botón, los rangos de lectura en el Arduino Nano y en el ESP32, por qué calibrar el centro y usar una zona muerta, y cómo conectar el botón sin resistencia.

El módulo de joystick de los kits de robótica es, por dentro, muy simple: dos potenciómetros y un botón. Un potenciómetro mide el movimiento hacia los lados (eje X) y el otro, hacia adelante y hacia atrás (eje Y). Al presionar la palanca hacia abajo se cierra el botón.
Los cinco pines
- GND y VCC (alimentación).
- VRx y VRy: las salidas analógicas de los dos ejes.
- SW: el botón.
Cada potenciómetro funciona como un divisor de tensión. Con la palanca en un extremo, la salida queda cerca de 0 V; en el otro, cerca de la tensión de alimentación; en el medio, más o menos en la mitad.
Lo que lee la placa
| Placa | Resolución | Rango de lectura |
|---|---|---|
| Arduino Nano | 10 bits | 0 a 1023 |
| ESP32 | 12 bits | 0 a 4095 |
En el Nano, el joystick se alimenta con 5 V y los ejes van a las entradas analógicas, de A0 a A7. A6 y A7 son una buena opción para los ejes, porque solo sirven para lectura analógica y dejan libres los demás pines.
En el ESP32, alimente el joystick con 3,3 V, nunca con 5 V: la salida del eje no puede superar la tensión del pin. Y use los pines del ADC1 (GPIO 32 a 39), porque el ADC2 no funciona con el Wi-Fi encendido. En MicroPython, la atenuación de 11 dB permite leer el rango completo. El conversor del ESP32 es menos lineal cerca de los extremos: para un joystick eso no molesta, pero no espere la precisión de un instrumento de medición.
El centro nunca es exactamente la mitad
Con la palanca suelta, el Nano rara vez lee 512. Lee 498, 521, 507, y el valor cambia de un joystick a otro. Si el programa trata "distinto de 512" como movimiento, el brazo se mueve solo.
Dos medidas lo resuelven:
- Calibrar el centro al encender. En los primeros instantes, con la palanca suelta, el programa lee el eje algunas veces y guarda el promedio como el centro de ese joystick.
- Zona muerta. Cualquier lectura a menos de cierto margen del centro (por ejemplo, 40 unidades en el Nano) cuenta como "quieto".
Las tarjetas de joystick del IDE de bloques ya hacen las dos cosas.
El botón sin resistencia
El botón del módulo conecta el pin SW a GND cuando se presiona. Suelto, queda desconectado, y un pin de entrada "flotante" lee valores aleatorios. La solución es el pull-up interno de la placa:
- En Arduino, el modo INPUT_PULLUP.
- En MicroPython, Pin.PULL_UP.
Con el pull-up, el pin lee 1 con el botón suelto y 0 con el botón presionado: la lógica es invertida, y el código tiene que tenerlo en cuenta.
En el ESP32, cuidado: los GPIO 34 a 39 no tienen pull-up interno. El botón va en otro pin.
Rebote
Un botón mecánico no se cierra de una sola vez: el contacto "rebota" durante algunos milisegundos y la placa puede leer varias pulsaciones. Esperar de 20 ms a 50 ms después del primer cambio y confirmar la lectura evita que una sola pulsación grabe tres posiciones en el brazo.
En el IDE de bloques
En el IDE de bloques, la tarjeta de joystick pide los pines de X, Y y del botón y entrega el eje ya centrado, de -100 a 100. Para saber qué hacer con ese valor en el brazo, vea las dos formas de control en brazo robótico con cuatro mini servos.