Ratón Bluetooth Controlado por Smartphone: Crea tu Propio Joystick Virtual
Componentes y suministros
| Componente | Cantidad |
|---|---|
| Arduino UNO | 1 |
| Módulo Bluetooth HC-05 | 1 |
| Cables jumper (genéricos) | 1 set |
Aplicaciones y servicios en línea
- Arduino IDE
- IDLE (Python GUI)
- MIT App Inventor – Bluetooth Mouse Control
Sobre este proyecto
Este proyecto es similar a un trabajo anterior donde usé un joystick físico para controlar el cursor del PC. La diferencia clave es que aquí he creado una aplicación para smartphone con dos joysticks virtuales que mueven el cursor, hacen scroll y realizan clic izquierdo y derecho, igual que un trackpad convencional.
Funcionamiento
La aplicación en el smartphone envía por Bluetooth (HC-05) los datos de los ejes X e Y de los joysticks, estado de scroll y de clics izquierdo/derecho al Arduino UNO. El Arduino procesa estos datos para calcular la nueva posición del cursor. El resultado, junto con el estado de botones y scroll, se envía por puerto serie a un script Python que ejecuta las acciones del ratón usando la librería mouse.

Sobre la aplicación
La app se creó con MIT App Inventor. La pantalla principal muestra dos joysticks virtuales y botones para clics y scroll.

Protocolo de envío de datos (cada 20 ms):
- Enviar byte
255(inicio de trama) - Enviar 1 byte: valor eje X del joystick
- Enviar 1 byte: valor eje Y del joystick
- Enviar 1 byte: estado de clic izquierdo, clic derecho y scroll
Lado Arduino
El Arduino recibe los bytes vía HC-05. Mantiene las coordenadas actuales del cursor (X: 0–1279, Y: 0–799, obtenidas con mouse.get_position() en Python). Según los datos del joystick, actualiza la posición sumando/restando los valores recibidos. Luego imprime por puerto serie la secuencia:
Ancho:Alto:Clics

Esta secuencia es leída por el programa Python para ejecutar las acciones. Se requieren los módulos mouse y pyserial (ver instalación abajo).
Programación en Python
Requisitos: Python 3 instalado (python.org).
Pasos en Windows (Símbolo del sistema):
cd <ruta_donde_está_python>py -m pip install --upgrade pippy -m pip install mousepy -m pip install pyserial
El módulo mouse ejecuta acciones de ratón; pyserial gestiona la comunicación serie con Arduino.



Ejecución
- Instala la app Bluetooth Mouse Control en tu smartphone.
- Sube el sketch a Arduino UNO y cablea según el esquemático.
- Lado Python:
- Copia el código Python en un bloc de notas, cambia el puerto COM al de tu Arduino UNO y guárdalo como
.py. - Abre el archivo en IDLE de Python.
- Ejecuta el script (F5).
- Copia el código Python en un bloc de notas, cambia el puerto COM al de tu Arduino UNO y guárdalo como



Código
Código Arduino
int datareceived[5] = {0,0,0,0,0};
int in_byte = 0;
int array_index = 0;
int l_prev = 0, r_prev = 0;
void setup() {
Serial.begin(9600);
}
int height = 0, width = 0;
void loop() {
int clicks = 0;
int sensitivity = 20; // Ajusta sensibilidad
int xpos = 0, ypos = 0;
if (Serial.available() > 0) {
in_byte = Serial.read();
if (in_byte == 255) array_index = 0;
datareceived[array_index] = in_byte;
array_index++;
// Mapeo joystick X (valores aprox 1-255)
if (datareceived[1] >= 110) xpos = map(datareceived[1], 110, 172, 0, sensitivity); // Derecha
if (datareceived[1] <= 70) xpos = map(datareceived[1], 60, 1, 0, -sensitivity); // Izquierda
// Mapeo joystick Y
if (datareceived[2] >= 110) ypos = map(datareceived[2], 110, 255, 0, sensitivity); // Abajo
if (datareceived[2] <= 60) ypos = map(datareceived[2], 70, 1, 0, -sensitivity); // Arriba
// Detección flancos botones (byte 3: 1=izq, 2=der, 3=scroll down, 4=scroll up)
if (datareceived[3] == 1 && l_prev == 0) clicks = 1;
else if (datareceived[3] == 2 && r_prev == 0) clicks = 2;
else if (datareceived[3] == 3 || datareceived[3] == 4) clicks = datareceived[3];
l_prev = datareceived[3];
r_prev = datareceived[3];
if (xpos != 0 || ypos != 0 || clicks != 0) {
height += ypos;
width += xpos;
height = constrain(height, 0, 799);
width = constrain(width, 0, 1279);
Serial.print(width);
Serial.print(":");
Serial.print(height);
Serial.print(":");
Serial.println(clicks);
clicks = 0;
}
}
}
Código Python
import mouse, sys, time, serial
mouse.FAILSAFE = False
ArduinoSerial = serial.Serial('COM3', 9600) # Cambia COM3 a tu puerto
time.sleep(1)
while True:
data = str(ArduinoSerial.readline().decode('ascii')).strip()
if not data: continue
x, y, z = data.split(":")
x, y = int(x), int(y)
mouse.move(x, y)
if '1' in z: mouse.click(button="left")
elif '2' in z: mouse.click(button="right")
elif '3' in z: mouse.wheel(delta=-1) # Scroll down
elif '4' in z: mouse.wheel(delta=1) # Scroll up
Esquemáticos

Proceso de manufactura
- Construya un robot Raspberry Pi controlado por Bluetooth con retroalimentación de audio
- Lámpara de mesa RGB controlada por gestos – Iluminación interactiva y sin manos
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Controla LEDs con Alexa mediante Raspberry Pi – Guía paso a paso fácil
- Transforma un viejo coche RC en un vehículo controlado por joystick con Arduino
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Brazo Robótico de 6 Grados de Libertad Controlado por Nunchuk con Arduino
- Construye un robot controlado por voz con Arduino Nano
- MobBob: Robot Arduino Impreso en 3D, Controlado por Smartphone Android
- Electrodomésticos activados por voz: Control Bluetooth con Google Assistant
- PiBot: Robot Pianista con Arduino para Interpretación Musical de Precisión