Utilisation de la bibliothèque PS2X_lib.
Parfois la télécommande est capricieuse, il faut l'éteindre et la rallumer, vous assurer que le voyant vert sur l'unité de réception ne clignote plus et rebooter l'arduino. la librairie ne sait pas se reconnecter si elle perd la manette (donc ne commandez pas un avion avec ça... juste des petits truc qui roulent pas loin et pas vite ou des petits servos pour un robot etc)...
Appuiyer sur "Start" pour faire vibrer la manette
![]() |
![]() |
![]() |
#include <PS2X_lib.h> /* PS2 Controller Library http://www.billporter.info/2010/06/05/playstation-2-controller-arduino-library-v1-0/ */
PS2X ps2x; /* on crée l'instance du controleur */
// information http://www.rhydolabz.com/wiki/?p=12663
// Connecter de gauche à droite en regardant le connecteur
// ----------------------
// Data --> pin 12
// Command --> pin 11
// NC
// ----------------------
// GND --> GND
// Power --> 3.3V
// Attention --> Pin 10
// ----------------------
// Clock --> pin 13
// NC
// NC
// ----------------------
const byte dataPin = 12;
const byte commandPin = 11;
const byte attentionPin = 10;
const byte clockPin = 13;
byte type = 0;
int error = 0;
byte vibrate = 0;
void setup() {
Serial.begin(115200);
/* config_gamepad(clock, command, attention, data, Pressures?, Rumble?) */
error = ps2x.config_gamepad(clockPin, commandPin, attentionPin, dataPin, true, true); // gardez true, true à la fin même si pas de moteurs
switch(error) {
case 0:
Serial.println("Found Controller, configured successful");
Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
Serial.println("holding L1 or R1 will print out the analog stick values.");
break;
case 1:
Serial.println("No controller found, check wiring...");
break;
case 2:
Serial.println("Controller found but not accepting commands...");
break;
case 3:
Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
break;
default:
Serial.print("Unknown error ");
Serial.print(error);
Serial.println(".");
}
type = ps2x.readType();
switch(type) {
case 0:
Serial.println("Unknown Controller type");
break;
case 1:
Serial.println("DualShock Controller Found");
break;
case 2:
Serial.println("GuitarHero Controller Found");
break;
}
ps2x.read_gamepad(); // initialisation des valeurs
delay(50);
ps2x.read_gamepad(); /* initialise les états */
}
void loop() {
static uint32_t chrono = 0;
const uint32_t periode = 20ul; // la manette est assez sensible, il ne faut pas lui demander les infos trop souvent. 15ms ou 20ms ça fonctionne pour moi
if (millis() - chrono >= periode) {
int RX = 0, RY = 0, LX = 0, LY = 0;
static int PRX = 127, PRY = 128, PLX = 127, PLY = 128;
chrono += periode;
ps2x.read_gamepad(false, vibrate); /* on lit l'état de la manette */
LX = ps2x.Analog(PSS_LX); /* joystick de gauche X*/
LY = ps2x.Analog(PSS_LY); /* joystick de gauche Y */
RX = ps2x.Analog(PSS_RX); /* joystick de droite X */
RY = ps2x.Analog(PSS_RY); /* joystick de droite Y */
// si une des coordonnées des joystick a changé alors on imprime les nouvelles coordonnées
if ((LX != PLX) || (LY != PLY) || (RX != PRX) || (RY != PRY)) {
PLX = LX;
PLY = LY;
PRX = RX;
PRY = RY;
Serial.print(LX); Serial.print(F(" ,"));
Serial.print(LY); Serial.print(F(" ,"));
Serial.print(RX); Serial.print(F(" ,"));
Serial.println(RY);
}
if (ps2x.ButtonPressed(PSB_START)) { Serial.println(F("START APPUI")); vibrate = 255; }
if (ps2x.ButtonPressed(PSB_SELECT)) Serial.println(F("SELECT APPUI"));
if (ps2x.ButtonPressed(PSB_PAD_UP)) Serial.println(F("HAUT APPUI"));
if (ps2x.ButtonPressed(PSB_PAD_RIGHT)) Serial.println(F("DROIT APPUI"));
if (ps2x.ButtonPressed(PSB_PAD_LEFT)) Serial.println(F("GAUCHE APPUI"));
if (ps2x.ButtonPressed(PSB_PAD_DOWN)) Serial.println(F("BAS APPUI"));
if (ps2x.ButtonPressed(PSB_L1)) Serial.println(F("GAUCHE 1 APPUI"));
if (ps2x.ButtonPressed(PSB_R1)) Serial.println(F("DROITE 1 APPUI"));
if (ps2x.ButtonPressed(PSB_L2)) Serial.println(F("GAUCHE 2 APPUI"));
if (ps2x.ButtonPressed(PSB_R2)) Serial.println(F("DROITE 2 APPUI"));
if (ps2x.ButtonPressed(PSB_L3)) Serial.println(F("ANALOG GAUCHE APPUI"));
if (ps2x.ButtonPressed(PSB_R3)) Serial.println(F("ANALOG DROITE APPUI"));
if (ps2x.ButtonPressed(PSB_GREEN)) Serial.println(F("Triangle APPUI"));
if (ps2x.ButtonPressed(PSB_BLUE)) Serial.println(F("X APPUI"));
if (ps2x.ButtonPressed(PSB_RED)) Serial.println(F("Cercle APPUI"));
if (ps2x.ButtonPressed(PSB_PINK)) Serial.println(F("Carre APPUI"));
if (ps2x.Button(PSB_START)) Serial.println(F("START"));
if (ps2x.Button(PSB_SELECT)) Serial.println(F("SELECT"));
if (ps2x.Button(PSB_PAD_UP)) Serial.println(F("HAUT"));
if (ps2x.Button(PSB_PAD_RIGHT)) Serial.println(F("DROITE"));
if (ps2x.Button(PSB_PAD_LEFT)) Serial.println(F("GAUCHE"));
if (ps2x.Button(PSB_PAD_DOWN)) Serial.println(F("BAS"));
if (ps2x.Button(PSB_L1)) Serial.println(F("GAUCHE 1"));
if (ps2x.Button(PSB_R1)) Serial.println(F("DROITE 1"));
if (ps2x.Button(PSB_L2)) Serial.println(F("GAUCHE 2"));
if (ps2x.Button(PSB_R2)) Serial.println(F("DROITE 2"));
if (ps2x.Button(PSB_L3)) Serial.println(F("ANALOG GAUCHE"));
if (ps2x.Button(PSB_R3)) Serial.println(F("ANALOG DROITE"));
if (ps2x.Button(PSB_GREEN)) Serial.println(F("Triangle"));
if (ps2x.Button(PSB_BLUE)) Serial.println(F("X"));
if (ps2x.Button(PSB_RED)) Serial.println(F("Cercle"));
if (ps2x.Button(PSB_PINK)) Serial.println(F("Carre"));
if (ps2x.ButtonReleased(PSB_START)) { Serial.println(F("START RELACHE")); vibrate = 0; }
if (ps2x.ButtonReleased(PSB_SELECT)) Serial.println(F("SELECT RELACHE"));
if (ps2x.ButtonReleased(PSB_PAD_UP)) Serial.println(F("HAUT RELACHE"));
if (ps2x.ButtonReleased(PSB_PAD_RIGHT)) Serial.println(F("DROITE RELACHE"));
if (ps2x.ButtonReleased(PSB_PAD_LEFT)) Serial.println(F("GAUCHE RELACHE"));
if (ps2x.ButtonReleased(PSB_PAD_DOWN)) Serial.println(F("BAS RELACHE"));
if (ps2x.ButtonReleased(PSB_L1)) Serial.println(F("GAUCHE 1 RELACHE"));
if (ps2x.ButtonReleased(PSB_R1)) Serial.println(F("DROITE 1 RELACHE"));
if (ps2x.ButtonReleased(PSB_L2)) Serial.println(F("GAUCHE 2 RELACHE"));
if (ps2x.ButtonReleased(PSB_R2)) Serial.println(F("DROITE 2 RELACHE"));
if (ps2x.ButtonReleased(PSB_L3)) Serial.println(F("ANALOG GAUCHE RELACHE"));
if (ps2x.ButtonReleased(PSB_R3)) Serial.println(F("ANALOG DROITE RELACHE"));
if (ps2x.ButtonReleased(PSB_GREEN)) Serial.println(F("Triangle RELACHE"));
if (ps2x.ButtonReleased(PSB_BLUE)) Serial.println(F("X RELACHE"));
if (ps2x.ButtonReleased(PSB_RED)) Serial.println(F("Cercle RELACHE"));
if (ps2x.ButtonReleased(PSB_PINK)) Serial.println(F("Carre RELACHE"));
}
}
Utilisation de la bibliothèque PS2X_lib