Réaliser une radiocommande avec ARDUINO, manette PS2 et nRF24L01
L’objectif de cet article est de vous montrer comment réaliser une radiocommande à l’aide de deux ARDUINO, d’une manette PS2 et de deux transmetteurs nRF24L01. L’ergonomie et le super design d’une manette de PS2 est extrêmement plaisant, d’autant plus que le temps qu’on a passé à jouer avec différents jeux, la rend incontournable pour un tel projet. C’est carrément une extension de la main pour certain. Sa maniabilité n’est plus à démontrer. Autre avantage de ce projet, c’est le coût. En effet, les transmetteurs coûtent moins de 4€ la paire, la manette PS2 en occasion est à moins de 10€. Cet article sera un support pour la réalisation d’un DRONE. L’objectif étant de réaliser une radiocommande DIY en 2.4GHZ afin de piloter un drone.
Liste des matériels :
ARDUINO (Amazon) x2 (Dans mon exemple, j’utilise un ARDUINO UNO et NANO)
Pour cette étape, je vous redirige vers un précédent article expliquant en détail la marche à suivre. N’oubliez pas de revenir ici pour suivre l’étape 2.
Un problème se pose désormais, le transmetteur nRF24L01 utilise les mêmes pins que celles utilisées dans l’article/tuto que vous venez de faire. Pour corriger ce problème, vous allez changer les pins pour la manette comme suit :
Ça prendra quelques minutes de votre précieux temps, mais ça peut vous en faire gagner beaucoup en recherche de panne à l’étape de test.
Étape 5 : Télécharger les librairies
Pour cela, il faut deux librairies, l’une vous l’avez déjà en théorie. Étant donné que vous avez suivi ce Tutorial, précédemment cité. Et la librairie concernant la communication des nRF24L01 c’est MIRF.
//CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
error = ps2x.config_gamepad(7,6,5,3, true, true); //setup pins and settings: GamePad(clock=bleu , command=orange, attention=jaune, data=b run, Pressures?, Rumble?) check for error //The numbers he reported success with is as follow:
//5V = 180 ohm, voltage drop of 1.85V (3.15v to the controller) //ATT = 5.6K ohm, voltage drop of 1.08V (3.92 to the controller) //CLK = 5.6K ohm, voltage drop of 1.15V (3.85 to the controller) //CMD = 860K ohm, voltage drop of 1.39V (3.61 to the controller) //so you can give that a try as well. Though really, ignore the resistor on 5V and just connect the red power wire to 3.3V. 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."); Serial.println("Go to www.billporter.info for updates and to report bugs."); }
else if(error == 1) Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit 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 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; }
Mirf.cePin = 9; // CE sur D9 Mirf.csnPin = 10; // CSN sur D10 Mirf.spi = &MirfHardwareSpi; Mirf.init();
/* 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;
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) {
int numero1=512; int numero2=512; int numero3=512; int numero4=512; int numero8=512; byte numero; int pairimpair; byte data[Mirf.payload]; // Tableau de byte qui va stocker le message recu
Maintenant que vous avez câblé, vos deux Arduino avec les deux nRF04L01 ainsi que la manette. Vous pouvez :
Câbler une led ou un petit moteur CC sur la pin 5 pour le voir varier en luminosité/vitesse lorsque vous bougerez le joystick/pad.
Aussi, vous pouvez brancher un SERVO moteur sur la pin 4 pour le voir varier d’angle, en jouant avec la manette. Sans cela, vous pouvez quand même vérifier si votre montage fonctionne en ouvrant le SERIAL MONITOR de l’Arduino récepteur et ainsi constater que les valeurs varient en fonction de la manette.
Transférer dans l’Arduino qui a la manette branchée dessus, le code Émission.
Transférer dans l’Arduino qui a uniquement le NRF24l01, le code Réception.
Brancher vos Arduino aux ports USB.
Ouvrir le Serial Monitor de l’Arduino Réception en sélectionnant le bon port.
Vidéo d’illustration de cet exemple :
Voilà, si vous avez des questions n’hésitez pas à utiliser les commentaires…