Control de ratón con joystick Arduino: Navegación precisa del cursor
Componentes y suministros
| Arduino UNO | × | 1 |
| Joystick de doble eje | × | 1 |
Aplicaciones y servicios en línea
- Arduino IDE
- IDLE (Python GUI)
Sobre este proyecto
Como alternativa al ratón o trackpad para controlar el cursor del ordenador, he desarrollado esta aplicación utilizando un joystick. El joystick permite mover el cursor en cualquier dirección (ejes X e Y) y también realiza la función de clic mediante el interruptor integrado en el joystick.
Conceptos básicos
Un joystick consta esencialmente de dos potenciómetros alineados en las direcciones X e Y. El Arduino lee valores analógicos del joystick en un rango de 0 a 1023. Cuando el joystick está en su posición central (reposo), el valor analógico se sitúa cerca de 500 (entre 0 y 1023).
El sketch de Arduino está programado para que, cuando el joystick se mueve desde el centro, imprima valores en un rango de -sensibilidad a +sensibilidad (valor por defecto 10) según la posición. Así, al mover el joystick a un extremo se imprime 10 y al moverlo al extremo opuesto se imprime -10.
Para separar los valores de los ejes X e Y, se utiliza el carácter ":" entre ambos. Ejemplo:
El estado del botón del joystick (SW) se imprime (1/0) en el monitor serial después de los valores X e Y.
Para que el ordenador reconozca estos valores, necesitaremos el módulo mouse de Python (anteriormente se usaba pyautogui, actualizado el 11/12/2020).
Programación en Python
El usuario debe tener Python 3 instalado en su ordenador. Puede descargarse desde python.org.
Tras la instalación, copie la ruta de la ubicación del archivo de Python.
Los siguientes pasos se realizan en la línea de comandos (cmd):
cd <pegue la ruta del archivo de Python>py –m pip install –-upgrade pippy –m pip install mousepy -m pip install pyserial
El módulo mouse se usa para realizar acciones del ratón y pyserial para enviar/recibir datos del Arduino.
El programa en Python lee los datos que imprime el Arduino y reconoce los valores de dirección X e Y así como el estado del interruptor (SW).
Las coordenadas actuales del cursor se obtienen con la función mouse.get_position(), que devuelve la posición X e Y en píxeles.
Al mover el joystick, los valores analógicos del Arduino se suman a la posición actual del cursor para moverlo en la dirección deseada.
Para mover el cursor, la función mouse.move(X+x, Y+y) cumple este propósito, donde X e Y son la posición actual y x, y son los incrementos/decrementos que proporciona el Arduino.
Ejemplo: mouse.moveTo(100,150) mueve el cursor a 100 píxeles en el eje X y 150 en el eje Y.
Para realizar la operación de clic según el estado de SW, se usa mouse.click(button="left").
Ejecución final
- Suba el sketch de Arduino (más abajo) a su Arduino UNO y conecte el joystick a los pines según el esquemático.
- Verifique que los módulos
mouseypyserialestén instalados. - Copie el código de Python en un archivo de bloc de notas. Especifique el puerto COM correcto del Arduino (visible en el Administrador de dispositivos). Guarde el archivo con extensión
.py.
- Abra IDLE (Python GUI) y abra el archivo .py desde allí.
- Ejecute el módulo (F5 o Run → Run Module).
Volverá a la pantalla del paso 4. Si aparecen errores, reinicie IDLE y verifique que el puerto COM sea correcto.
Si no hay errores, mueva el joystick y verá el movimiento del cursor en pantalla.
Código
Código Arduino
//////////////////////////////////
// Joystick controlled mouse
/// by Shubham Santosh
/////////////////////////////
void setup() {
Serial.begin(9600);
pinMode(9, INPUT); // Pin SW
digitalWrite(9, HIGH);
}
int prev_state = 0; // Estado previo del interruptor
void loop() {
int z = 0, xpos = 0, ypos = 0;
int x = analogRead(A0);
int y = analogRead(A1);
int sensitivity = 10; // Ajuste la sensibilidad según comodidad
if (x >= 550) // Hacia arriba
xpos = map(x, 550, 1023, 0, sensitivity);
if (x <= 450) // Hacia abajo
xpos = map(x, 450, 0, 0, -sensitivity);
if (y >= 550) // Hacia derecha
ypos = map(y, 550, 1023, 0, sensitivity);
if (y <= 450) // Hacia izquierda
ypos = map(y, 450, 0, 0, -sensitivity);
int curr_state = digitalRead(9);
if (curr_state == 1 && prev_state == 0) // SW pulsado
z = 1;
else
z = 0;
if (xpos != 0 || ypos != 0 || z == 1) { // Imprime solo si hay movimiento
Serial.print(xpos);
Serial.print(":");
Serial.print(ypos);
Serial.print(":");
Serial.println(z);
}
prev_state = curr_state;
delay(10); // Para operación normal
}
Código Python
# Joystick controlled mouse
# By Shubham Santosh
# Última edición 11/12/2020
import mouse, sys
import time
import serial
mouse.FAILSAFE = False
ArduinoSerial = serial.Serial('com3', 9600) # Especifique el puerto COM correcto
time.sleep(1) # Retraso de 1 segundo
while True:
data = str(ArduinoSerial.readline().decode('ascii')) # Leer datos
(x, y, z) = data.split(":") # Asignar a x, y y z
(X, Y) = mouse.get_position() # Leer posición actual del cursor
(x, y) = (int(x), int(y)) # Convertir a enteros
mouse.move(X + x, Y - y) # Mover cursor a posición deseada
if '1' in z: # Leer estado de SW
mouse.click(button="left") # Clic izquierdo
Esquemáticos
Proceso de manufactura
- La evolución del ratón de computadora: Diseño, fabricación y tendencias futuras
- Ventilador controlado por temperatura: sistema DIY con relé para refrigeración de muebles multimedia
- Sistema de acuaponía controlado por Raspberry Pi: guía de construcción y código
- Botón IoT AWS Controlado por Movimiento con Raspberry Pi, Sensor PIR y MQTT
- Construya un robot Raspberry Pi controlado por Bluetooth con retroalimentación de audio
- Construye un Robot Raspberry Pi Controlado por Wi‑Fi con Python – Guía Paso a Paso
- Demo ARDrone 2.0 Controlado por Alexa: Dron Activado por Voz con Raspberry Pi y Hologram Nova
- Transforma un viejo coche RC en un vehículo controlado por joystick con Arduino
- Juego interactivo con joystick analógico y LEDs en Arduino
- Brazo Robótico de 6 Grados de Libertad Controlado por Nunchuk con Arduino
- Aleación FeNi42: Baja expansión térmica para sellos de precisión