Bonjour à tous, et merci d'être là pour aider les bizus de mon genre qui ont des projets plein la tête mais pas le niveau pour les réaliser.
Le projet final est de contrôler le model réduit d'une excavatrice,(7 moteurs au total)
à l'aide d'une manette de PS2 via nrf24l01. Aujourd'hui je cherche déjà à faire fonctionner en mode "filaire".
Aucun suspense tout est dans le titre.
Alors voilà la manette et la lecture des boutons et joysticks fonctionne sans problème (visuel sur moniteur série)
mais lorsque je veux faire fonctionner les commandes via les joysticks rien ne se passe.
il s'agit très probablement d'un problème de code (je suis loin d'être un expert), si quelqu'un peut me guider pour trouvé mon erreur (ou mes erreurs).
Voici le code avec lequel je fais mes test : c'est un code produit par Jml que j'ai adapté à mes besoin.
#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
// ---------------------- Mega Uno
#define chenilleGenB 2 // 3 pmw
#define chenilleGin3 24 // 2
#define chenilleGin4 22 // 4
const byte dataPin = 14;
const byte commandPin = 15;
const byte attentionPin = 16;
const byte clockPin = 17;
static int PRX = 127, PRY = 128, PLX = 127, PLY = 128;
int RX , RY , LX , LY ;
int valLY;
void avanceChenilleGauche(){
digitalWrite(chenilleGin3, 0);
digitalWrite(chenilleGin4, 1);
analogWrite(chenilleGenB,1024);
}
void reculChenilleGauche(){
digitalWrite(chenilleGin3, 1);
digitalWrite(chenilleGin4, 0);
analogWrite(chenilleGenB,1024);
}
void setup() {
pinMode(chenilleGenB, OUTPUT); //pmw
pinMode(chenilleGin3, OUTPUT);
pinMode(chenilleGin4, OUTPUT);
digitalWrite(chenilleGin3, 0);
digitalWrite(chenilleGin4, 0);
Serial.begin(115200);
/* config_gamepad(clock, command, attention, data, Pressures?, Rumble?) */
ps2x.config_gamepad(clockPin, commandPin, attentionPin, dataPin, true, true); // gardez true, true à la fin même si pas de moteurs
if (ps2x.readType() == 1) Serial.println(F("DualShock"));
else {
Serial.print(F("Manette Absente - code "));
Serial.println(ps2x.readType());
while (true); // on meurt ici, éventuellement enlever si vous avez un autre code manette
}
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) {
chrono += periode;
ps2x.read_gamepad(); /* 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);
LY = map(valLY,0,255,0,1024); //je mets la valeur du potentiometre aux proportions la sortie pmw
if(valLY>140)
{
avanceChenilleGauche();
}
else
{
digitalWrite(chenilleGin4, 0);
}
if(valLY<113)
{
reculChenilleGauche();
}
else
{
digitalWrite(chenilleGin3, 0);
}
/*
// if (ps2x.NewButtonState()) {} /* vrai s'il y a un changement d'état, si on ne veut pas lire l'état à la main
// ButtonPressed(unsigned int) vrai si le bouton VIENT d'être appuyé (depuis la dernière lecture de config)
if (ps2x.ButtonPressed(PSB_START)) Serial.println(F("START APPUI"));
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_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"));
// Button(uint16_t); vrai si le bouton est tenu enfoncé
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_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"));
// ButtonReleased(unsigned int) vrai si le bouton VIENT d'être relâché (depuis la dernière lecture de config)
if (ps2x.ButtonReleased(PSB_START)) Serial.println(F("START RELACHE"));
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_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"));*/
}
}




