Souris Bluetooth pilotée par smartphone : construisez votre propre joystick virtuel
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Module Bluetooth HC-05 | 1 |
| Fils de câblage (jumper wires) | 1 lot |
Applications et services en ligne
- Arduino IDE
- IDLE (Python GUI)
- MIT App Inventor – Application « Bluetooth Mouse Control »
À propos de ce projet
Ce projet ressemble à mon précédent travail où j'utilisais un joystick physique pour contrôler le curseur de la souris. La différence clé : j'ai créé une application smartphone avec deux joysticks virtuels pour déplacer le curseur, faire défiler l'écran, et effectuer clic gauche/droit comme un trackpad classique.
Fonctionnement
L'application smartphone envoie via Bluetooth (vers l'Arduino Uno + module HC-05) :
- Les valeurs X et Y des deux joysticks
- L'état du clic gauche, clic droit, et de la molette de défilement
L'Arduino reçoit ces données, calcule la nouvelle position du curseur (coordonnées X 0–1279, Y 0–799, obtenues via mouse.get_position() en Python), et renvoie sur le port série : position X, position Y, code d'action (clic/scroll). Un script Python lit ce flux série et exécute les actions souris via le module mouse.
L'application smartphone
Créée avec MIT App Inventor (inspiré du tutoriel Tabletop Robotics). L'écran principal affiche deux zones de joystick virtuel et des boutons pour clics/scroll.
Protocole de transmission (toutes les 20 ms) :
- Octet de départ :
255 - 1 octet : valeur X joystick
- 1 octet : valeur Y joystick
- 1 octet : état boutons (clic gauche, clic droit, scroll)
Côté Arduino
L'Arduino reçoit les octets via le HC-05. Il maintient les coordonnées actuelles du curseur. Selon les valeurs reçues (seuils ~70 et ~110 pour détecter le mouvement), il incrémente/décrémente X et Y avec une sensibilité réglable (par défaut 20). Les clics sont détectés sur front montant (évite les répétitions). Le résultat est envoyé sur le port série au format : X:Y:action (ex: 640:400:1).
Programmation Python
Prérequis : Python 3 installé (python.org).
Sous Windows :
- Ouvrez l'invite de commandes (cmd)
cd <chemin_vers_python>py -m pip install --upgrade pippy -m pip install mousepy -m pip install pyserial
Le module mouse pilote la souris, pyserial gère la communication série avec l'Arduino.
Exécution
- Installez l'application « Bluetooth Mouse Control » sur votre smartphone.
- Téléversez le sketch Arduino sur l'Uno, câblez selon le schéma.
- Côté Python :
- Copiez le code Python dans un fichier
.py, modifiez le port COM (ex:COM3). - Ouvrez le fichier dans IDLE (Python GUI) et exécutez (F5).
- Copiez le code Python dans un fichier
- Lancez l'application smartphone, connectez-vous au module HC-05. Le curseur bouge selon les joysticks virtuels.
Code source
Code 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;
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++;
if (datareceived[1] >= 110) xpos = map(datareceived[1], 110, 172, 0, sensitivity);
if (datareceived[1] <= 70) xpos = map(datareceived[1], 60, 1, 0, -sensitivity);
if (datareceived[2] >= 110) ypos = map(datareceived[2], 110, 255, 0, sensitivity);
if (datareceived[2] <= 60) ypos = map(datareceived[2], 70, 1, 0, -sensitivity);
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;
}
}
}
Code Python
import mouse, sys
import time
import serial
mouse.FAILSAFE = False
ArduinoSerial = serial.Serial('COM3', 9600) # Adapter le port COM
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)
elif '4' in z: mouse.wheel(delta=1)
Schéma de câblage
Schéma fourni en image : Arduino Uno ↔ HC-05 (VCC→5V, GND→GND, TX→RX0, RX→TX1 via diviseur de tension).
Processus de fabrication
- Construire un robot Raspberry Pi piloté par Bluetooth avec retour audio
- Lampe de table RGB à commande gestuelle – Éclairage interactif, mains libres
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Contrôler des LED avec Alexa via Raspberry Pi – Guide Pas à Pas
- Transformez une vieille voiture RC en véhicule piloté au joystick avec Arduino
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- Bras robotique 6 DoF piloté par Nunchuk Wii – Kit Arduino Mega
- Robot commandé par la voix avec Arduino Nano et Bluetooth
- MobBob : Construisez votre propre robot Arduino, contrôlé via smartphone Android