Contrôle de PC par gestes avec Arduino et Python – Utilisation mains libres
Composants et fournitures
![]() |
|
× | 1 | |||
![]() |
|
× | 2 | |||
![]() |
|
× | 1 |
Applications et services en ligne
![]() |
|
|||
|
||||
|
||||
|
À propos de ce projet
Dans ce projet, nous apprenons à construire un contrôle de PC par gestes. Basé sur la combinaison Arduino + Python.
Au lieu de clavier, souris ou joystick, nous utilisons des gestes de la main pour contrôler certaines fonctions : lecture/pause vidéo, navigation gauche/droite dans un diaporama, défilement haut/bas dans une page web, etc. J'ai choisi de contrôler VLC Media Player comme démonstration.
L'idée est simple : deux capteurs ultrasoniques HC-SR04 avec Arduino. Placés au-dessus de l'écran du portable, ils mesurent la distance entre la main et le capteur. Les informations d'Arduino sont envoyées à Python via le port série ; Python, en cours d'exécution sur l'ordinateur, effectue les actions correspondantes.
Composants matériels :
- Arduino
- Deux capteurs ultrasoniques HC-SR04
- Quelques fils
Applications logicielles :
- Arduino IDE
- Python IDLE
- Bibliothèque PySerial (communication série)
- Bibliothèque PyAutoGUI (exécution d'actions)
Je suppose que vous avez déjà installé Python et PySerial et réalisé quelques projets de base. Sinon, consultez mon tutoriel précédent (Programmer Arduino avec Python). Pour vous familiariser avec le capteur ultrasonique, voir ici.
Étape 1 : Regardez la vidéo pour plus de détails
Étape 2 : Objectif des gestes
Voici les 5 gestes programmés pour la démo :
- Premier geste : « Lecture/Pause » VLC en plaçant les deux mains devant les capteurs droit/gauche à une distance lointaine précise.
- Deuxième geste : « Reculer » (Rewind) en plaçant une main devant le capteur gauche à distance lointaine.
- Troisième geste : « Avancer » (Forward) en plaçant une main devant le capteur droit à distance lointaine.
- Quatrième geste : « Augmenter le volume » en plaçant une main devant le capteur gauche à distance lointaine et en l'éloignant du capteur.
- Cinquième geste : « Baisser le volume » en plaçant une main devant le capteur gauche à distance lointaine et en l'approchant du capteur.
Étape 3 : Schéma



Le schéma est simple, suivez les instructions. Chaque capteur a 4 broches :
- Vcc – connecté au 5 V.
- Trig – à définir dans le programme.
- Echo – à définir également.
- GND – connecté à la masse.
Étape 4 : Programmation Python



1. Installer Python IDLE
Passez cette étape si déjà installé. Sinon :
- Téléchargez Python sur python.org.
- Installez en gardant le répertoire par défaut.
NOTE : Même sur un OS 64 bits, utilisez Python 32 bits pour compatibilité avec les bibliothèques Arduino.
2. Installer la bibliothèque PySerial
PySerial est un module Python API pour lire/écrire des données série vers Arduino. Sur Windows :
- Téléchargez depuis la page de téléchargement PySerial.
- Installez avec les paramètres par défaut.
- Vérifiez : tapez
import serialdans Python. Si pas d'erreur, c'est bon.
3. Installer la bibliothèque PyAutoGUI
PyAutoGUI fournit un module multiplateforme d'automatisation GUI. Pour Windows (Python déjà installé) :
- Ouvrez l'invite de commande.
- Tapez :
cd C:\Python27 - Puis :
python –m pip install –upgrade pip - Enfin :
python –m pip install pyautogui
NOTE : Vérifiez avec import pyautogui. Si pas d'erreur, c'est bon.
Étape 5 : Code Arduino

Pour connecter Python à l'Arduino, identifiez le port COM (visible dans l'IDE Arduino).
const int trigger1 = 2; // Broche Trigger 1er capteur
const int echo1 = 3; // Broche Echo 1er capteur
const int trigger2 = 4; // Broche Trigger 2e capteur
const int echo2 = 5; // Broche Echo 2e capteur
long time_taken;
int dist, distL, distR;
void setup() {
Serial.begin(9600);
pinMode(trigger1, OUTPUT);
pinMode(echo1, INPUT);
pinMode(trigger2, OUTPUT);
pinMode(echo2, INPUT);
}
/*### Fonction calcul distance ###*/
void calculate_distance(int trigger, int echo) {
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
time_taken = pulseIn(echo, HIGH);
dist = time_taken * 0.034 / 2;
if (dist > 60) dist = 60;
}
void loop() {
calculate_distance(trigger1, echo1);
distL = dist; // distance capteur gauche
calculate_distance(trigger2, echo2);
distR = dist; // distance capteur droit
// Mode Pause – Détection deux mains
if ((distL > 40 && distR > 40) && (distL < 60 && distR < 60)) {
Serial.println("Play/Pause");
delay(500);
}
calculate_distance(trigger1, echo1);
distL = dist;
calculate_distance(trigger2, echo2);
distR = dist;
// Modes Contrôle
// Verrouillage Gauche
if (distL >= 13 && distL <= 17) {
delay(100); // Temps de maintien main
calculate_distance(trigger1, echo1);
distL = dist;
if (distL >= 13 && distL <= 17) {
Serial.println("Left Locked");
while (distL <= 40) {
calculate_distance(trigger1, echo1);
distL = dist;
if (distL < 10) { // Main poussée
Serial.println("Volume Increased");
delay(300);
}
if (distL > 20) { // Main tirée
Serial.println("Volume Decreased");
delay(300);
}
}
}
}
// Verrouillage Droit
if (distR >= 13 && distR <= 17) {
delay(100);
calculate_distance(trigger2, echo2);
distR = dist;
if (distR >= 13 && distR <= 17) {
Serial.println("Right Locked");
while (distR <= 40) {
calculate_distance(trigger2, echo2);
distR = dist;
if (distR < 10) { // Main droite poussée
Serial.println("Rewind");
delay(300);
}
if (distR > 20) { // Main droite tirée
Serial.println("Forward");
delay(300);
}
}
}
}
delay(200);
}
Le code Arduino envoie 5 commandes via le port série pour contrôler des fonctions clavier.
arduino_pythogui.ino
Étape 6 : Code Python

Programme simple pour lire le port série et déclencher les actions :
import serial
import time
import pyautogui
ArduinoSerial = serial.Serial('com15', 9600)
time.sleep(2) # attente établissement communication
while 1:
incoming = str(ArduinoSerial.readline())
print(incoming)
if 'Play/Pause' in incoming:
pyautogui.typewrite(['space'], 0.2)
if 'Rewind' in incoming:
pyautogui.hotkey('ctrl', 'left')
if 'Forward' in incoming:
pyautogui.hotkey('ctrl', 'right')
if 'Volume Increased' in incoming:
pyautogui.hotkey('ctrl', 'down')
if 'Volume Decreased' in incoming:
pyautogui.hotkey('ctrl', 'up')
incoming = ""
Code
- Extrait de code #5
- Extrait de code #6
Extrait de code #5 Texte brut
const int trigger1 = 2; //Trigger pin of 1st Sesnor const int echo1 = 3; //Echo pin of 1st Sesnor const int trigger2 = 4; //Trigger pin of 2nd Sesnor const int echo2 = 5;//Echo pin of 2nd Sesnor long time_taken; int dist,distL,distR; void setup() { Serial.begin(9600); pinMode(trigger1, OUTPUT); pinMode(echo1, INPUT); pinMode(trigger2, OUTPUT); pinMode(echo2, INPUT); } /*###Function to calculate distance###*/ void calculate_distance(int trigger, int echo) { digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); time_taken = pulseIn(echo, HIGH); dist= time_taken*0.034/2; if (dist>60) dist = 60; } void loop() { calculate_distance(trigger1,echo1); distL =dist; calculate_distance(trigger2,echo2); distR =dist; if ((distL >40 && distR>40) && (distL <60 && distR<60)) {Serial.println("Play/Pause"); delay (500);} calculate_distance(trigger1,echo1); distL =dist; calculate_distance(trigger2,echo2); distR =dist; if (distL>=13 && distL<=17) { delay(100); calculate_distance(trigger1,echo1); distL =dist; if (distL>=13 && distL<=17) { Serial.println("Left Locked"); while(distL<=40) { calculate_distance(trigger1,echo1); distL =dist; if (distL<10) {Serial.println ("Volume Increased"); delay (300);} if (distL>20) {Serial.println ("Volume Decreased"); delay (300);} } } } if (distR>=13 && distR<=17) { delay(100); calculate_distance(trigger2,echo2); distR =dist; if (distR>=13 && distR<=17) { Serial.println("Right Locked"); while(distR<=40) { calculate_distance(trigger2,echo2); distR =dist; if (distR<10) {Serial.println ("Rewind"); delay (300);} if (distR>20) {Serial.println ("Forward"); delay (300);} } } } delay(200); }
Extrait de code #6 Texte brut
import serial #Serial imported for Serial communication import time #Required to use delay functions import pyautogui #Required to to perform actions ArduinoSerial = serial.Serial('com15',9600) #Create Serial port object called arduinoSerialData time.sleep(2) #wait for 2 seconds for the communication to get established while 1: incoming = str (ArduinoSerial.readline()) #read the serial data and print it as line print incoming if 'Play/Pause' in incoming: pyautogui.typewrite(['space'], 0.2) if 'Rewind' in incoming: pyautogui.hotkey('ctrl', 'left') if 'Forward' in incoming: pyautogui.hotkey('ctrl', 'right') if 'Volume Incresaed' in incoming: pyautogui.hotkey('ctrl', 'down') if 'Volume Decreased' in incoming: pyautogui.hotkey('ctrl', 'up') incoming = "";
Processus de fabrication
- Créer un système Ambilight spectaculaire pour moniteur avec Arduino
- Construire une télécommande Android universelle avec Arduino, 1Sheeld et contrôle IR
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Contrôle IoT à Distance d'un Bras Robotique Personnalisé avec Arduino MKR1000
- Mesure Précise de Fréquence et Rapport Cyclique avec Arduino UNO
- Contrôlez un rover Arduino avec Firmata et une manette Xbox One
- Pistolet à eau intelligent à détection de mouvement avec Arduino Nano
- Contrôle fluide de la luminosité LED avec Bolt IoT et Arduino UNO
- Construisez un Bras Robotique Intelligent Contrôlé par Arduino : Tutoriel DIY Facile



