Interfacer une manette PS2 sans fil avec Arduino
Bonjour, dans ce tutoriel nous allons essayer d’interfacer un contrôleur sans fil PS2 avec la carte Arduino UNO, c’est très intéressant car tous les boutons du contrôleur seront des entrées pour la carte Arduino et sans fil, en utilisant le protocole de communication Radio Fréquence 2.4GHz, ce qui peut être très utile pour contrôler des robots, des véhicules, des servos…

J’ai acheté ce contrôleur avec une carte dédiée aux servos pour 30 USD, vous pouvez obtenir le contrôleur/récepteur beaucoup moins cher, mais n’oubliez pas que ces appareils bon marché ont quelques problèmes (vous pouvez le voir dans la vidéo), la sensibilité n’est pas si bonne en la comparant avec le contrôleur original, et vous pouvez également rencontrer des problèmes avec les boutons poussoirs…
Vous pouvez en apprendre plus sur ce contrôleur en visitant ce site web : billporter.info
Dans ce test on va aussi ajouter un afficheur LCD i2c, pour montrer les boutons et les entrées de la manette/contrôleur. Si vous voulez savoir comment utiliser l’afficheur LCD i2c veuillez visiter ce tuto.

Schémas de câblage


Les broches 3 et 8 n’ont pas de fils, la broche 9 n’est pas connectée.
Schéma 1: Branchement direct pour test

Schéma 2: Ajout d’un afficheur LCD i2c

Librairies
Voici les librairies que j’ai utilisé:
- Librairie pour le récepteur PS2X: PS2X Library, vous pouvez télécharger ici.
- Librairie pour l’afficheur LCD i2c: NewLiquidCrystal, vous pouvez télécharger ici.
Vous pouvez toujours chercher les librairies qui vous conviennent vous même soit sur le gestionnaire de librairies de l’IDE soit sur les moteurs de recherches. Juste veiller à ne pas avoir deux librairies portante le même nom.
L’utilisation de l’afficheur est optionnel !!
Codes
Vous pouvez copier les code ci-dessous ou bien les télécharger ici.
Code 1: Exemple de la librairie
Cet exemple permet de tester les entrées et les boutons du contrôleur, il détecte aussi le type de récepteur utilisé.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
#include <PS2X_lib.h> //for v1.6 PS2X ps2x; // create PS2 Controller Class //right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller. int error = 0; byte type = 0; byte vibrate = 0; void setup(){ Serial.begin(57600); //CHANGES for v1.6 HERE!!! **************PAY ATTENTION************* error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error if(error == 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."); } else if(error == 1) Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit http://www.billporter.info for troubleshooting tips"); else if(error == 2) Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit http://www.billporter.info for troubleshooting tips"); else if(error == 3) Serial.println("Controller refusing to enter Pressures mode, may not support it. "); //Serial.print(ps2x.Analog(1), HEX); 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; } } void loop(){ /* You must Read Gamepad to get new values Read GamePad and set vibration values ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255) if you don't enable the rumble, use ps2x.read_gamepad(); with no values you should call this at least once a second */ if(error == 1) //skip loop if no controller found return; if(type == 2){ //Guitar Hero Controller ps2x.read_gamepad(); //read controller if(ps2x.ButtonPressed(GREEN_FRET)) Serial.println("Green Fret Pressed"); if(ps2x.ButtonPressed(RED_FRET)) Serial.println("Red Fret Pressed"); if(ps2x.ButtonPressed(YELLOW_FRET)) Serial.println("Yellow Fret Pressed"); if(ps2x.ButtonPressed(BLUE_FRET)) Serial.println("Blue Fret Pressed"); if(ps2x.ButtonPressed(ORANGE_FRET)) Serial.println("Orange Fret Pressed"); if(ps2x.ButtonPressed(STAR_POWER)) Serial.println("Star Power Command"); if(ps2x.Button(UP_STRUM)) //will be TRUE as long as button is pressed Serial.println("Up Strum"); if(ps2x.Button(DOWN_STRUM)) Serial.println("DOWN Strum"); if(ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed Serial.println("Start is being held"); if(ps2x.Button(PSB_SELECT)) Serial.println("Select is being held"); if(ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE { Serial.print("Wammy Bar Position:"); Serial.println(ps2x.Analog(WHAMMY_BAR), DEC); } } else { //DualShock Controller ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed if(ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed Serial.println("Start is being held"); if(ps2x.Button(PSB_SELECT)) Serial.println("Select is being held"); if(ps2x.Button(PSB_PAD_UP)) { //will be TRUE as long as button is pressed Serial.print("Up held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC); } 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); } vibrate = ps2x.Analog(PSAB_BLUE); //this will set the large motor vibrate speed based on //how hard you press the blue (X) button if (ps2x.NewButtonState()) //will be TRUE if any button changes state (on to off, or off to on) { 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_GREEN)) Serial.println("Triangle pressed"); } if(ps2x.ButtonPressed(PSB_RED)) //will be TRUE if button was JUST pressed Serial.println("Circle just pressed"); if(ps2x.ButtonReleased(PSB_PINK)) //will be TRUE if button was JUST released Serial.println("Square just released"); if(ps2x.NewButtonState(PSB_BLUE)) //will be TRUE if button was JUST pressed OR released Serial.println("X just changed"); if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE { Serial.print("Stick Values:"); Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX Serial.print(","); Serial.print(ps2x.Analog(PSS_LX), DEC); Serial.print(","); Serial.print(ps2x.Analog(PSS_RY), DEC); Serial.print(","); Serial.println(ps2x.Analog(PSS_RX), DEC); } } delay(50); } |
Code 2: Test avec l’afficheur LCD i2c
Le deuxième code prend juste quelques fonctions et affiche la valeur ou les boutons qui sont pressés sur l’écran, ici je n’ai associé que “l’impression sur l’écran lcd” (lcd.print) pour chaque fonction, mais pour vous, vous pouvez contrôler des servos, des moteurs à courant continue, des LEDs… dans l’ensemble c’est juste un exemple pour le tutorial.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
/* Ceci est un code à utiliser avec une manette PS2X et son récepteur * Les boutons et les entrées sont affichés sur LCD * Veuillez visiter https://SurtrTech.com pour plus de détails */ #include <PS2X_lib.h> //Librairie #include <LiquidCrystal_I2C.h> #define I2C_ADDR 0x27 //Adresse LCD i2c, peut être (0x3F) #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 PS2X ps2x; //Instances PS2x et LCD LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); int error = 0; int i=0,j=0; byte type = 0; byte vibrate = 0; void setup(){ Serial.begin(9600); error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error type = ps2x.readType(); lcd.begin (16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); lcd.print(" PS2X Test"); lcd.setCursor(0,1); lcd.print(" SurtrTech"); delay(3000); lcd.clear(); } void loop(){ ps2x.read_gamepad(false, vibrate); if(ps2x.Button(PSB_START)){ lcd.clear(); lcd.print("Start Pressed"); } if(ps2x.Button(PSB_SELECT)){ lcd.clear(); lcd.print("Select Pressed"); } if(ps2x.Button(PSB_L2)) j=1; if(ps2x.Button(PSB_R2)) j=0; if (j==1){ if(ps2x.Button(PSB_PAD_UP)) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Up: "); lcd.setCursor(0,1); lcd.print(ps2x.Analog(PSAB_PAD_UP)); } if(ps2x.Button(PSB_PAD_RIGHT)){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Right: "); lcd.setCursor(0,1); lcd.print(ps2x.Analog(PSB_PAD_RIGHT)); } if(ps2x.Button(PSB_PAD_LEFT)){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Left: "); lcd.setCursor(0,1); lcd.print(ps2x.Analog(PSB_PAD_LEFT)); } if(ps2x.Button(PSB_PAD_DOWN)){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Down: "); lcd.setCursor(0,1); lcd.print(ps2x.Analog(PSB_PAD_DOWN)); } } vibrate = ps2x.Analog(PSAB_BLUE); if(ps2x.ButtonPressed(PSB_RED)){ lcd.clear(); lcd.print(" Circle"); } if(ps2x.ButtonPressed(PSB_PINK)){ lcd.clear(); lcd.print(" Square"); } if(ps2x.ButtonPressed(PSB_BLUE)){ lcd.clear(); lcd.print(" X"); } if(ps2x.ButtonPressed(PSB_GREEN)){ lcd.clear(); lcd.print(" Triangle"); } if(ps2x.Button(PSB_L1)) i = 1; if(ps2x.Button(PSB_R1)) i = 0; if(i==1){ lcd.clear(); lcd.setCursor(0,0); lcd.print("LY "); lcd.setCursor(3,0); lcd.print(ps2x.Analog(PSS_LY), DEC); lcd.setCursor(0,1); lcd.print("LX "); lcd.setCursor(3,1); lcd.print(ps2x.Analog(PSS_LX), DEC); lcd.setCursor(8,0); lcd.print("RY "); lcd.setCursor(11,0); lcd.print(ps2x.Analog(PSS_RY), DEC); lcd.setCursor(8,1); lcd.print("RX "); lcd.setCursor(11,1); lcd.println(ps2x.Analog(PSS_RX), DEC); } delay(50); } |
Categories
Yassine View All
Automation and Electrical Engineer, Electronics amateur trying to share my little projects.

One thought on “Interfacer une manette PS2 sans fil avec Arduino” Leave a comment ›