Controle de 3 joysticks sur arduino leonardo

bonjour, j'ai comme projet de me creer un kerbal controller ( un clavier avec des joysticks ) sur arduino leonardo mon clavier est équipé de 3 joysticks. sur le code je n'arrive pas a faire reconnaitre les 3 joysticks en même temps voici mon code qui permet de reconnaitre 1 seul joystick et les autres boutons. Pouvez vous me le modifier pour que ca reconnaisse 3 joystick a 2 axes (x et y) merci d'avance :

#include <Joystick.h>
#include <Keyboard.h>




// Configuration des broches pour le joystick
const int pinX = A0;
const int pinY = A1;




// Crée une instance de la classe Joystick
Joystick_ Joystick;
const int boutonPin0 = 0; // Remplacez par le numéro de broche de votre bouton
const int boutonPin1 = 1; // Remplacez par le numéro de broche de votre bouton
const int boutonPin2 = 2; // Remplacez par le numéro de broche de votre bouton
const int boutonPin3 = 3; // Remplacez par le numéro de broche de votre bouton
const int boutonPin4 = 4; // Remplacez par le numéro de broche de votre bouton
const int boutonPin5 = 5; // Remplacez par le numéro de broche de votre bouton
const int boutonPin6 = 6; // Remplacez par le numéro de broche de votre bouton
const int boutonPin7 = 7; // Remplacez par le numéro de broche de votre bouton
const int boutonPin8 = 8; // Remplacez par le numéro de broche de votre bouton
const int boutonPin9 = 9; // Remplacez par le numéro de broche de votre bouton

void setup() {
  Joystick.begin(); 


 
   Keyboard.begin();
   pinMode(boutonPin0, INPUT_PULLUP); // Configure la broche du bouton en entrée avec résistance de pull-up
   pinMode(boutonPin1, INPUT_PULLUP); // Configure la broche du bouton en entrée avec résistance de pull-up
   pinMode(boutonPin2, INPUT_PULLUP); // Configure la broche du bouton en entrée avec résistance de pull-up
   pinMode(boutonPin3, INPUT_PULLUP); // Configure la broche du bouton en entrée avec résistance de pull-up
   pinMode(boutonPin4, INPUT_PULLUP); // Configure la broche du bouton en entrée avec résistance de pull-up
   pinMode(boutonPin5, INPUT_PULLUP); // Configure la broche du bouton en entrée avec résistance de pull-up
   pinMode(boutonPin6, INPUT_PULLUP); // Configure la broche du bouton en entrée avec résistance de pull-up
   pinMode(boutonPin7, INPUT_PULLUP); // Configure la broche du bouton en entrée avec résistance de pull-up
   pinMode(boutonPin8, INPUT_PULLUP); // Configure la broche du bouton en entrée avec résistance de pull-up
   pinMode(boutonPin9, INPUT_PULLUP); // Configure la broche du bouton en entrée avec résistance de pull-up
      

  
}

void loop() {
  // Lire les valeurs des axes et boutons simulés
  
       if (digitalRead(boutonPin0) == LOW) { // Si le bouton est enfoncé
   Keyboard.press('0'); // Émule l'appui de la touche "A"
 delay(100); // Attends 1 seconde
    Keyboard.release('0'); // Relâche la touche "A"
    delay(500); // Attends 1 seconde
}
       if (digitalRead(boutonPin1) == LOW) { // Si le bouton est enfoncé
    Keyboard.press('1'); // Émule l'appui de la touche "A"
  delay(100); // Attends 1 seconde
    Keyboard.release('1'); // Relâche la touche "A"
}
       if (digitalRead(boutonPin2) == LOW) { // Si le bouton est enfoncé
    Keyboard.press('2'); // Émule l'appui de la touche "A"
  delay(100); // Attends 1 seconde
    Keyboard.release('2'); // Relâche la touche "A"
}
       if (digitalRead(boutonPin3) == LOW) { 
    Keyboard.press('3'); // Émule l'appui de la touche "A"
  delay(100); // Attends 1 seconde
    Keyboard.release('3'); // Relâche la touche "A"
     delay(500); // Attends 1 seconde
 }
       if (digitalRead(boutonPin4) == LOW) { 
    Keyboard.press('4'); // Émule l'appui de la touche "A"
  delay(100); // Attends 1 seconde
    Keyboard.release('4'); // Relâche la touche "A"
    delay(500); // Attends 1 seconde
 }
       if (digitalRead(boutonPin5) == LOW) { 
    Keyboard.press('5'); // Émule l'appui de la touche "A"
  delay(100); // Attends 1 seconde
    Keyboard.release('5'); // Relâche la touche "A"
    delay(500); // Attends 1 seconde
 }
       if (digitalRead(boutonPin6) == LOW) { 
    Keyboard.press('6'); // Émule l'appui de la touche "A"
  delay(100); // Attends 1 seconde
    Keyboard.release('6'); // Relâche la touche "A"
 }
       if (digitalRead(boutonPin7) == LOW) { 
    Keyboard.press('7'); // Émule l'appui de la touche "A"
  delay(100); // Attends 1 seconde
    Keyboard.release('7'); // Relâche la touche "A"
    delay(500); // Attends 1 seconde
 }
      if (digitalRead(boutonPin8) == LOW) { 
    Keyboard.press('8'); // Émule l'appui de la touche "A"
  delay(100); // Attends 1 seconde
    Keyboard.release('8'); // Relâche la touche "A"
    delay(500); // Attends 1 seconde
 }
    if (digitalRead(boutonPin9) == LOW) { 
    Keyboard.press('9'); // Émule l'appui de la touche "A"
  delay(100); // Attends 1 seconde
    Keyboard.release('9'); // Relâche la touche "A"
     delay(500); // Attends 1 seconde
 


}
  // Lit les valeurs analogiques du joystick
  int xValue = analogRead(pinX);
  int yValue = analogRead(pinY);



  // Envoie les valeurs au PC via l'émulation de joystick
  Joystick.setXAxis(xValue);
  Joystick.setYAxis(yValue);  
 


  // Affiche les valeurs dans le moniteur série



  // Attends un court instant
  delay(10);
 


}

s'il vous plait c'est urgent

De la même façon que tu as fait du "Copier-Coller" pour les boutons, tu fais du "Copier-Coller" pour les joysticks (avec une petite amélioration)
Code non testé !

 // Configuration des broches pour le joystick
const int joy1_pinX = A0;
const int joy1_pinY = A1;

const int joy2_pinX = A2; // ou numéro de pin différent selon ton câblage
const int joy2_pinY = A3; // ou numéro de pin différent selon ton câblage

const int joy3_pinX = A4; // ou numéro de pin différent selon ton câblage
const int joy3_pinY = A5; // ou numéro de pin différent selon ton câblage

puis, dans loop() :

  • en haut :
  static int Joy1_xValue_Old = 0;
  static int Joy1_yValue_Old = 0;

  static int Joy2_xValue_Old = 0;
  static int Joy2_yValue_Old = 0;

  static int Joy3_xValue_Old = 0;
  static int Joy3_yValue_Old = 0;
  • et plus bas :
  // Lit les valeurs analogiques du joystick 1
  int Joy1_xValue = analogRead(Joy1_pinX);
  int Joy1_yValue = analogRead(Joy1_pinY);

  if (Joy1_xValue - Joy1_xValue_Old != 0) { // n’appeler Joystick.setXAxis() que si la valeur a changé
    // Envoie les valeurs au PC via l'émulation du joystick
    Joystick.setXAxis(Joy1_xValue);
    Joy1_xValue_Old = Joy1_xValue; // Mémoriser la nouvelle "ancienne valeur"
  }

  if (Joy1_yValue - Joy1_yValue_Old != 0) { // n’appeler Joystick.setYAxis() que si la valeur a changé
    // Envoie les valeurs au PC via l'émulation du joystick
    Joystick.setYAxis(Joy1_yValue);
    Joy1_yValue_Old = Joy1_yValue; // Mémoriser la nouvelle "ancienne valeur"
  }

  // Lit les valeurs analogiques du joystick 2
  int Joy2_xValue = analogRead(Joy2_pinX);
  int Joy2_yValue = analogRead(Joy2_pinY);

  if (Joy2_xValue - Joy2_xValue_Old != 0) { // n’appeler Joystick.setRxAxis() que si la valeur a changé
    // Envoie les valeurs au PC via l'émulation du joystick
    Joystick.setRxAxis(Joy2_xValue);
    Joy2_xValue_Old = Joy2_xValue; // Mémoriser la nouvelle "ancienne valeur"
  }

  if (Joy2_yValue - Joy2_yValue_Old != 0) { // n’appeler Joystick.setRyAxis() que si la valeur a changé
    // Envoie les valeurs au PC via l'émulation du joystick
    Joystick.setRyAxis(Joy2_yValue);
    Joy2_yValue_Old = Joy2_yValue; // Mémoriser la nouvelle "ancienne valeur"
  }

  // Lit les valeurs analogiques du joystick 3
  int Joy3_xValue = analogRead(Joy3_pinX);
  int Joy3_yValue = analogRead(Joy3_pinY);

  if (Joy3_xValue - Joy3_xValue_Old != 0) { // n’appeler Joystick.setRudder() que si la valeur a changé
    // Envoie les valeurs au PC via l'émulation du joystick
    Joystick.setRudder(Joy3_xValue);
    Joy3_xValue_Old = Joy3_xValue; // Mémoriser la nouvelle "ancienne valeur"
  }

  if (Joy3_yValue - Joy3_yValue_Old != 0) { // n’appeler Joystick.setThrottle() que si la valeur a changé
    // Envoie les valeurs au PC via l'émulation du joystick
    Joystick.setThrottle(Joy3_yValue);
    Joy3_yValue_Old = Joy3_yValue; // Mémoriser la nouvelle "ancienne valeur"
  }

J'ai arbitrairement choisi les axes "rotation" pour le joystick 2 et "Rudder" (gouvernail) "Throttle" (gaz) pour le joystick 3, à toi de corriger grâce à la doc de la "library"

Par contre ce genre de code (que je viens de ré-indenter pour plus de lisibilité) est bloquant à cause de l’instruction delay()
Tu devrais le réécrire en t'inspirant de ça :

  // Last state of the button
  static int lastButtonState = 0;

  // Read pin values
  int currentButtonState = !digitalRead(pinToButtonMap);
  if (currentButtonState != lastButtonState) {
    Joystick.setButton(0, currentButtonState);
    lastButtonState = currentButtonState;
  }

et aussi de l'incontournable Blink without Delay pour ce qui est de l'autofire !

merci beaucoup pour le code et les conseils, j'ai essayé de ce pas pour les joysticks mais malheureusement ça me met le même message d'erreur que mes dernières tentatives
le message d'erreur en question :

C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino: In function 'void loop()':
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:128:32: error: 'Joy1_pinX' was not declared in this scope
   int Joy1_xValue = analogRead(Joy1_pinX);
                                ^~~~~~~~~
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:128:32: note: suggested alternative: 'joy1_pinX'
   int Joy1_xValue = analogRead(Joy1_pinX);
                                ^~~~~~~~~
                                joy1_pinX
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:129:32: error: 'Joy1_pinY' was not declared in this scope
   int Joy1_yValue = analogRead(Joy1_pinY);
                                ^~~~~~~~~
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:129:32: note: suggested alternative: 'joy1_pinY'
   int Joy1_yValue = analogRead(Joy1_pinY);
                                ^~~~~~~~~
                                joy1_pinY
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:144:32: error: 'Joy2_pinX' was not declared in this scope
   int Joy2_xValue = analogRead(Joy2_pinX);
                                ^~~~~~~~~
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:144:32: note: suggested alternative: 'joy2_pinX'
   int Joy2_xValue = analogRead(Joy2_pinX);
                                ^~~~~~~~~
                                joy2_pinX
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:145:32: error: 'Joy2_pinY' was not declared in this scope
   int Joy2_yValue = analogRead(Joy2_pinY);
                                ^~~~~~~~~
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:145:32: note: suggested alternative: 'joy2_pinY'
   int Joy2_yValue = analogRead(Joy2_pinY);
                                ^~~~~~~~~
                                joy2_pinY
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:160:32: error: 'Joy3_pinX' was not declared in this scope
   int Joy3_xValue = analogRead(Joy3_pinX);
                                ^~~~~~~~~
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:160:32: note: suggested alternative: 'joy3_pinX'
   int Joy3_xValue = analogRead(Joy3_pinX);
                                ^~~~~~~~~
                                joy3_pinX
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:161:32: error: 'Joy3_pinY' was not declared in this scope
   int Joy3_yValue = analogRead(Joy3_pinY);
                                ^~~~~~~~~
C:\Users\laure\AppData\Local\Temp\.arduinoIDE-unsaved2024615-12720-1waz9iu.3y8j\sketch_jul15a\sketch_jul15a.ino:161:32: note: suggested alternative: 'joy3_pinY'
   int Joy3_yValue = analogRead(Joy3_pinY);
                                ^~~~~~~~~
                                joy3_pinY
Plusieurs bibliothèque trouvées pour "Joystick.h"
  Utilisé: C:\Users\laure\OneDrive\Documents\Arduino\libraries\Joystick
  Non utilisé: C:\Users\laure\OneDrive\Documents\Arduino\libraries\AxisJoystick
Plusieurs bibliothèque trouvées pour "Keyboard.h"
  Utilisé: C:\Users\laure\OneDrive\Documents\Arduino\libraries\Keyboard
  Non utilisé: C:\Users\laure\AppData\Local\Arduino15\libraries\Keyboard
exit status 1

Compilation error: 'Joy1_pinX' was not declared in this scope

Le compilateur dit qu'il hésite entre plusieurs bibliothèques et que Joy1_pinX n'est pas correctement déclaré.

Peux-tu poster la totalité de ton code ici ? (correctement indenté SVP, Arduino IDE fait ça en "un seul clic" : Ctrl+T puis Ctrl+A pour tout sélectionner et Ctrl+Maj+C pour copier "prêt à coller sur le forum")

C'est juste parce que joy1_, Joy2_ et joy3_ s'écrit avec une minuscule, pas une majuscule !

Pour changer "en bloc", sélectionne seulement les 5 premières lettres (Joy1_) puis fait Ctrl+F2 (Change All Occurences) puis flèche gauche pour venir au début de la sélection puis suppr ("Del" sur certains claviers) pour effacer le J majuscule puis 'j' minuscule. Clique ailleurs pour valider le changement global.

Idem pour Joy2_ et Joy3_

Si tu ne sélectionnes que Joy, ça modifiera aussi Joystick.setXAxis() ce qui est à éviter...

Parfait mais tu devrais vite te rendre compte que, lorsqu'un bouton est (et reste) appuyé, les joysticks ne sont plus aussi réactif (à cause de la gestion des boutons par un code bloquant dont j'a parlé plus haut).

Par ailleurs, le PC reçoit des "Keyboard.press(); Keyboard.release()" en rafale chaque fois qu'un bouton reste appuyé. Cet autofire est utile avec certains jeux mais est-ce, ici, voulu/utile/désirable ?

sur ce jeu c'est plutot utile