Este artículo detalla un proyecto práctico y educativo de electrónica que explora la interacción entre un módulo joystick KY-023, una placa Arduino Uno y un conjunto de cinco LEDs. El objetivo principal es visualizar el estado y la dirección del joystick mediante la activación de los LEDs, proporcionando una interfaz sencilla y didáctica para entender cómo se leen entradas analógicas y digitales de un periférico de juego.
El módulo joystick KY-023 es una interfaz de entrada popular y de bajo costo, comúnmente utilizada en proyectos de robótica y juegos, que simula el funcionamiento de un joystick de control de videojuegos clásico. Este proyecto no solo te enseñará a leer sus valores, sino también a traducirlos en señales visuales, reforzando conceptos fundamentales de programación y electrónica.
🔩Funcionamiento
Implementar un circuito que permita controlar el brillo de 4 LEDs mediante un joystick KY-023 conectado a una placa Arduino. El brillo de cada LED variará en función de la dirección en la que se mueva el joystick. Adicionalmente, un quinto LED se encenderá al presionar el botón del joystick.
El Módulo Joystick KY-023
El módulo joystick KY-023 (o similar, como el que usa un potenciómetro en X y otro en Y) es esencialmente una combinación de dos potenciómetros de 10K Ohm y un pulsador momentáneo.
- Potenciómetros (Ejes X e Y):
- Cada potenciómetro varía su resistencia según la posición del joystick en su respectivo eje (horizontal para X, vertical para Y).
- Al conectarse a una entrada analógica del Arduino, se lee un valor entre 0 y 1023 (para un ADC de 10 bits), que representa la posición del joystick en ese eje.
- Cuando el joystick está en reposo (centro), ambos ejes reportan un valor cercano a la mitad del rango (aproximadamente 512).
- Moverlo a un extremo (ej. arriba o derecha) incrementa el valor hacia 1023; moverlo al otro extremo (ej. abajo o izquierda) lo disminuye hacia 0.
- Pulsador (SW):
- Ubicado debajo del vástago del joystick, se activa cuando se presiona el joystick hacia abajo.
- Funciona como un interruptor normalmente abierto; al pulsarlo, cierra el circuito y cambia su estado (generalmente de HIGH a LOW cuando se usa con
INPUT_PULLUP).
- Pines de Conexión:
| PIN | Función |
|---|---|
| VCC | Alimentación positiva (5V). |
| GND | Tierra (masa). |
| VRx | Salida analógica para el eje X. |
| VRy | Salida analógica para el eje Y. |
| SW | Salida digital para el pulsador. |
Los LEDs (Diodos Emisores de Luz)
Los LEDs son componentes electrónicos que emiten luz cuando una corriente eléctrica pasa a través de ellos en la dirección correcta (ánodo a cátodo).
- Polaridad: Tienen polaridad. La pata más larga es el ánodo (+) y la pata más corta es el cátodo (-).
- Resistencia de Protección: Siempre se debe conectar una resistencia en serie con un LED para limitar la corriente y protegerlo de daños. Un valor común para LEDs estándar con 5V es 220ohms.
- Funcionamiento: En este proyecto, cada LED se encenderá o apagará mediante un pin digital del Arduino configurado como
OUTPUT, que se pondrá enHIGH(encender) oLOW(apagar).
🔨Componentes
| Componente | Cantidad | Especificación | Función |
|---|---|---|---|
| Placa Arduino | 1 | Arduino Uno, Nano, etc. | Control de componentes(cerebro) |
| Joystick | 1 | KY-023 | Encender cada led |
| LED | 5 | rojo, verde, amarillo, morado, blanco | Iluminar |
| Resistencia | 5 | 220 ohms | limitar corriente |
| Cables de conexión | n | Unir componentes |
🔌Conexiones
Conecta los pines del joystick:
- VCC a 5V de Arduino.
- GND a GND de Arduino.
- VRx a A0 (para eje X).
- VRy a A1 (para eje Y).
- SW a pin digital 2 (para el botón).
Conecta cada LED con su resistencia de 220 ohms a los pines PWM:
- LED 1: Pin digital 6.
- LED 2: Pin digital 5.
- LED 3: Pin digital 4.
- LED 4: Pin digital 3.
- LED 5 (botón): Pin digital 7.
0️⃣Código
El código debe leer los valores analógicos de los ejes X e Y, y el estado digital del pulsador. Luego, basándose en rangos de valores para los ejes y el estado del pulsador, encenderá el LED correspondiente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #include <Arduino.h> // Pines del joystick const int VRx = A0; const int VRy = A1; const int SW = 2; // Pines de LEDs const int LED_UP = 3; const int LED_DOWN = 4; const int LED_LEFT = 5; const int LED_RIGHT = 6; const int LED_PRESS = 7; void setup() { // Configuración de pines pinMode(SW, INPUT_PULLUP); // Botón del joystick pinMode(LED_UP, OUTPUT); pinMode(LED_DOWN, OUTPUT); pinMode(LED_LEFT, OUTPUT); pinMode(LED_RIGHT, OUTPUT); pinMode(LED_PRESS, OUTPUT); Serial.begin(9600); // Para depuración opcional } void loop() { // Leer valores analógicos del joystick int x = analogRead(VRx); // Eje X int y = analogRead(VRy); // Eje Y int swState = digitalRead(SW); // Botón Serial.print("x: "); Serial.print(x); Serial.print(" y: "); Serial.println(y); // Mapear valores de 0-1023 a 0-255 para intensidad PWM int brightnessUp = map(y, 512, 1023, 0, 255); int brightnessDown = map(y, 512, 0, 0, 255); int brightnessLeft = map(x, 512, 0, 0, 255); int brightnessRight = map(x, 512, 1023, 0, 255); // Controlar LEDs según dirección analogWrite(LED_UP, (y > 512) ? brightnessUp : 0); analogWrite(LED_DOWN, (y < 512) ? brightnessDown : 0); analogWrite(LED_LEFT, (x < 512) ? brightnessLeft : 0); analogWrite(LED_RIGHT, (x > 512) ? brightnessRight : 0); // Encender LED si se presiona el botón if (swState == LOW) { digitalWrite(LED_PRESS, HIGH); } else { digitalWrite(LED_PRESS, LOW); } // Pequeño retraso para mayor estabilidad delay(50); } |
Notas:
- Los valores de mapeo y sensibilidad pueden ajustarse según tu joystick.
- Asegúrate de que las conexiones sean sólidas para evitar errores.
🖌️Diseños

🎬Videos
📑Conclusión
El proyecto de control visual de LEDs mediante el módulo Joystick KY-023 y Arduino Uno ha demostrado ser un ejercicio fundamental en la lectura de entradas analógicas y digitales para la creación de una interfaz sencilla de Interacción Humano-Máquina (HMI).
| Componente | Rol central en la conclusión |
|---|---|
| Joystick KY-023 | Actuó como un codificador de movimiento, traduciendo las coordenadas físicas (X e Y) en valores numéricos (0-1023) y la presión en un estado binario (pulsado/no pulsado). |
| Código Arduino | Sirvió como el “cerebro decisorio”, aplicando la lógica de umbrales (400 y 600) para interpretar si el valor analógico correspondía a un movimiento extremo (dirección) o a la posición de reposo (centro). |
| LEDs | Funcionaron como los indicadores de estado en tiempo real, ofreciendo una respuesta visual inmediata y clara al usuario sobre la posición y acción del joystick. |
El éxito reside en la capacidad del microcontrolador para digitalizar el movimiento analógico. Al definir rangos de umbral, se simplificó la complejidad de las lecturas analógicas continuas en cuatro estados direccionales discretos. Este proyecto sienta una base sólida para el desarrollo de controles de navegación para robots móviles, juegos interactivos o interfaces de usuario en cualquier sistema electrónico donde se requiera un mando direccional de fácil implementación. Se concluye que el joystick es una herramienta sumamente versátil para proyectos que demandan una entrada precisa y multifuncional.

