Interface de Contrôle PS2 sur ESP32 : Acquisition et Affichage des Données via le Moniteur Série
Description :
Ce projet consiste à créer une passerelle de communication entre une manette de jeu Sony PlayStation 2 (DualShock 2) et un microcontrôleur ESP32. L’objectif est de transformer une manette de console classique en une interface de commande polyvalente pour piloter des systèmes électroniques (robots, bras articulés, domotique).
Le système interprète en temps réel l’état des entrées numériques (boutons) et analogiques (joysticks et pression des touches) pour les traduire en données exploitables envoyées vers le moniteur série de l’ordinateur.
Prérequis :
- 1 x Carte ESP32
- 1 x Manette de jeu PS2 avec récepteur sans fil
- 1 x Breadboard
Version IDE :
- Arduino IDE 2.3.5
Bibliothèque :
- PS2X_lib.h ( version: 1.8 par Bill Porter)
Vidéo de démonstration :
NA
Schéma de câblage :


Code :
#include <PS2X_lib.h> // Inclusion de la bibliothèque pour la manette PS2
// Définition des broches de connexion (à adapter selon votre câblage)
#define PS2_DAT 4 // Data
#define PS2_COM 13 // Command
#define PS2_ATT 14 // Attention (CS)
#define PS2_CLK 15 // Clock
// Paramètres de configuration
#define pressures false // Lecture de la pression des boutons (souvent inutile et gourmand)
#define rumble false // Activation des vibrations (vibreurs internes)
PS2X ps2x; // Création de l'instance de l'objet manette
// Variables de contrôle
int error = -1; // Stocke le code erreur lors de l'initialisation
byte type = 0; // Type de manette détectée
byte vibrate = 0; // Intensité de la vibration
int tryNum = 1; // Compteur de tentatives de connexion
void setup(){
// Initialisation du moniteur série pour le débogage
Serial.begin(115200);
// Boucle de tentative de connexion : tourne tant que la manette n'est pas détectée (error != 0)
while (error != 0) {
delay(1000); // Attente d'une seconde entre chaque essai
// Configuration de la manette avec les broches et paramètres définis plus haut
error = ps2x.config_gamepad(PS2_CLK, PS2_COM, PS2_ATT, PS2_DAT, pressures, rumble);
Serial.print("#try config ");
Serial.println(tryNum);
tryNum ++;
}
// Vérification du type de manette connectée
type = ps2x.readType();
switch(type) {
case 0:
Serial.println(" Unknown Controller type found ");
break;
case 1:
Serial.println(" DualShock Controller found "); // Manette PS2 standard
break;
case 2:
Serial.println(" GuitarHero Controller found "); // Guitare PS2
break;
case 3:
Serial.println(" Wireless Sony DualShock Controller found "); // Manette sans fil
break;
}
}
void loop() {
// On ne traite les entrées que si une manette DualShock est bien connectée (type 1)
if(type == 1){
// Lecture de l'état de la manette (vibrate indique si elle doit vibrer)
ps2x.read_gamepad(false, vibrate);
// Vérification des boutons START et SELECT
if(ps2x.Button(PSB_START))
Serial.println("Start is being held");
if(ps2x.Button(PSB_SELECT))
Serial.println("Select is being held");
// Lecture de la croix directionnelle (D-Pad)
if(ps2x.Button(PSB_PAD_UP)) {
Serial.print("Up held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC); // Affiche la force d'appui si activé
}
if(ps2x.Button(PSB_PAD_RIGHT)){
Serial.print("Right held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
}
if(ps2x.Button(PSB_PAD_LEFT)){
Serial.print("LEFT held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
}
if(ps2x.Button(PSB_PAD_DOWN)){
Serial.print("DOWN held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
}
// Gestion de la vibration : ici, elle est indexée sur la pression du bouton CROIX
vibrate = ps2x.Analog(PSAB_CROSS);
// NewButtonState() vérifie si l'état d'un bouton a changé depuis la dernière boucle
if (ps2x.NewButtonState()) {
if(ps2x.Button(PSB_L3))
Serial.println("L3 pressed");
if(ps2x.Button(PSB_R3))
Serial.println("R3 pressed");
if(ps2x.Button(PSB_L2))
Serial.println("L2 pressed");
if(ps2x.Button(PSB_R2))
Serial.println("R2 pressed");
if(ps2x.Button(PSB_TRIANGLE))
Serial.println("△ pressed");
}
// Exemples de détection d'états spécifiques :
if(ps2x.ButtonPressed(PSB_CIRCLE)) // Vrai uniquement à l'instant où on appuie
Serial.println("○ just pressed");
if(ps2x.NewButtonState(PSB_CROSS)) // Vrai si le bouton change (appui ou relâchement)
Serial.println("× just changed");
if(ps2x.ButtonReleased(PSB_SQUARE)) // Vrai uniquement à l'instant où on relâche
Serial.println("□ just released");
// Lecture des joysticks analogiques (si L1 ou R1 est maintenu)
if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) {
Serial.print("Stick Values:");
Serial.print(ps2x.Analog(PSS_LY)); // Stick Gauche Axe Y (0-255)
Serial.print(",");
Serial.print(ps2x.Analog(PSS_LX), DEC); // Stick Gauche Axe X
Serial.print(",");
Serial.print(ps2x.Analog(PSS_RY), DEC); // Stick Droit Axe Y
Serial.print(",");
Serial.println(ps2x.Analog(PSS_RX), DEC); // Stick Droit Axe X
}
}
delay(50); // Petite pause pour ne pas saturer le processeur
}
