Proyecto 30: Control de Movimiento con Joystick
Descripción
Este proyecto demuestra cómo usar un Arduino para leer las señales analógicas de un módulo joystick de doble eje y controlar manualmente la rotación de un motor paso a paso. Al mover el joystick, puedes controlar con precisión el motor paso a paso para que gire hacia adelante, hacia atrás o se detenga.
Este tipo de control es común en gimbals robóticos, enseñanza manual de las articulaciones de brazos robóticos, traslación de etapas de microscopios y otros dispositivos de automatización. Sirve como un excelente proyecto básico para entender el “control de interacción hombre-máquina”.
Hardware
Placa de desarrollo UNO R3 (CH340) × 1
Motor Paso a Paso 28BYJ-48 × 1
Placa Controladora de Motor Paso a Paso ULN2003 × 1
Módulo Joystick de Doble Eje × 1
Protoboard × 1
Cables Dupont/cables jumper × varios
Principio de Funcionamiento
El núcleo de este proyecto es convertir el voltaje de salida del joystick en comandos de movimiento para el motor paso a paso.
Salida Analógica del Joystick: El joystick contiene internamente dos potenciómetros (resistencias variables). Cuando empujas el joystick a lo largo del eje X, el pin
VRxemite un voltaje variable. Arduino lee este voltaje a través de un pin de entrada analógica (A0) y lo convierte en un valor entre0y1023.Posición Central y Umbrales: Cuando el joystick está naturalmente centrado, la lectura es aproximadamente
512. En el código, los umbrales se establecen de la siguiente manera:Si la lectura es menor que 300 (empujado hacia un lado), el motor paso a paso gira continuamente hacia adelante.
Si la lectura es mayor que 800 (empujado hacia el otro lado), el motor paso a paso gira continuamente en reversa.
Si la lectura está entre 300 y 800 (joystick centrado/liberado), el motor paso a paso deja de recibir energía y se mantiene detenido.
Diagrama de Conexiones
1. Módulo Joystick
(Nota: Este proyecto solo controla un motor paso a paso de un solo eje, por lo que solo se conecta el eje X. Los pines del eje Y VRy y el botón SW pueden dejarse sin conectar.)
VRx (salida analógica del eje X)➔ Conectar a Arduino A0VCC➔ Conectar a Arduino 5VGND➔ Conectar a Arduino GND
2. Motor Paso a Paso y Placa Controladora (ULN2003)
Inserta el conector blanco del motor paso a paso en el zócalo de la placa controladora ULN2003.
IN1➔ Conectar a Arduino D8IN2➔ Conectar a Arduino D10 (Nota la secuencia: para la librería Stepper incorporada de Arduino, el orden debe ser 8, 10, 9, 11)IN3➔ Conectar a Arduino D9IN4➔ Conectar a Arduino D11+ (VCC)➔ Conectar a Arduino 5V (o fuente de alimentación externa de 5V)- (GND)➔ Conectar a Arduino GND

Código de Ejemplo
Copia y sube el siguiente código a tu Arduino:
/*
Electronics Learning Starter Kit for Arduino
Project 30
Joystick Motion Control
Edit By Keyes
*/
#include <Stepper.h>
// Define the number of steps per revolution for the stepper motor (28BYJ-48 is usually 2048 steps)
const int stepsPerRevolution = 2048;
// Initialize the stepper motor object, note the pin order is 8, 10, 9, 11
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
void setup() {
// Set the stepper motor speed to 10 RPM (revolutions per minute)
myStepper.setSpeed(10);
// Initialize serial communication for monitoring joystick values
Serial.begin(9600);
}
void loop() {
// 1. Read the joystick X-axis analog value (range 0 - 1023)
int xValue = analogRead(A0);
// Print the current value to the serial monitor for debugging
Serial.print("Joystick X-axis value: ");
Serial.println(xValue);
// 2. Determine joystick direction and control the motor
if (xValue < 300) {
// Joystick pushed to one side: step motor forward
myStepper.step(10);
}
else if (xValue > 800) {
// Joystick pushed to the other side: step motor backward
myStepper.step(-10);
}
else {
// Joystick in neutral position (300 ~ 800)
// De-energize all coils to prevent the stepper motor from overheating while idle
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
}
Explicación del Código
Inclusión de Librería e Inicialización: La línea
#include <Stepper.h>importa la librería de control del motor paso a paso. La líneaStepper myStepper(stepsPerRevolution, 8, 10, 9, 11);define los pines de control. Importante: Al usar esta librería oficial con el motor 28BYJ-48, los dos pines centrales deben intercambiarse (es decir, 10, 9 en lugar de 9, 10) para asegurar una rotación suave del motor.Lectura del Valor Analógico:
analogRead(A0)detecta continuamente la inclinación del joystick, devolviendo un número entre 0 y 1023.Respuesta de Movimiento (
step): Cada iteración del bucle mueve el motor un pequeño paso (10o-10pasos). Como el bucle se ejecuta muy rápido, mantener el joystick en una dirección hará que el motor se mueva de forma continua y suave.Protección de Apagado (
digitalWrite(..., LOW)): Los motores paso a paso tienden a bloquear el eje cuando se detienen porque las bobinas permanecen energizadas. Para evitar esto y reducir el calor, cuando el joystick está centrado (liberado), los cuatro pines de control se ponen en LOW para cortar la corriente de las bobinas, protegiendo el motor y la placa controladora de sobrecalentamiento.
Resultado del Proyecto
Después de subir el código y alimentar el circuito:
Estado Neutral: Cuando el joystick no se toca, vuelve automáticamente al centro y el motor paso a paso permanece quieto sin calentarse.
Empujar a la Izquierda/Abajo: Mover el joystick hacia un lado (lectura < 300) hace que el motor paso a paso gire continuamente en sentido horario (o antihorario).
Empujar a la Derecha/Arriba: Mover el joystick hacia el lado opuesto (lectura > 800) invierte inmediatamente la dirección del motor para una rotación continua.
Respuesta en Tiempo Real: Cuando sueltas el joystick, este vuelve al centro y el motor frena y se detiene al instante. Abrir el monitor serial en tu computadora te permite ver los cambios de datos del joystick en tiempo real.
