[Conseil] Besoin d'aide - Contrôleur Joystick

Bonjour, j'ai besoin d'aide .
Je cherche a réaliser ce projet , mais je n'y arrive pas.

J'ai pris le code qu'il donne dans l'exemple ci-dessu mais il est pour une carte teensy et il me sort plusieurs erreurs que je n'arrive pas a corriger.

J'ai acheter la carte Micro Genuino
J'ai essayé différents branchement de fils, ainsi que différent code.
Je ne connais que très peu la programmation mais j'essai d'apprendre, j'ai essayé de prendre d'autres exemples mais il ne fonctionne pas.
Est-ce que quelqu'un peut m'aider.

Je n'ai pas tous mis du projet, seulement 5 switch on/off (toggle) et 2 on/off bouton pressoir.
pas de potentiomètre ni de led.
Le but est de construire un panel pour jouer avec un simulateur d'avion.

Voici le code qu'il suggère :

#include <Joystick.h>

Joystick_ Joystick;
/*

  This code is for a teensy 3.1 used in my green russian control board
  You must select the teensy board in Tools and change USB Type to Joystick

*/


//How many buttons I'm using, must equal amount of values in following array
#define NUM_BUTTONS 14  
//Which pins I have attached to my buttons
int buttonList[NUM_BUTTONS] = {2,3,4,5,6,7,8,9,10,11,12,14,15,16};

//Led intensity, so super bright LEDS aren't shining in our eyes
#define INTENSITY 200


void setup() {

  
  //Declare button pins as input with the internal pullup resistor on
  for (int i = 0; i < NUM_BUTTONS; i++)  {
    pinMode(buttonList[i], INPUT_PULLUP);
  }
  
  //Declare our LED pins as outputs
  pinMode(17, OUTPUT);
  pinMode(18, OUTPUT);
  pinMode(19, OUTPUT);
  pinMode(20, OUTPUT);
}


void loop() {
  //Read our analogue pots
  //Remember that the analogue pin numbers are different than the digital ones!

  
  //Read our button states
  for (int i = 0; i < NUM_BUTTONS; i++) {
    if (digitalRead(buttonList[i]) == HIGH) {  //Check to see if pin is HIGH
      Joystick.button(i + 1, 0);  //If pin is HIGH, button isn't pressed, so send 0
    } else {
      Joystick.button(i + 1, 1);  //If pin is LOW, button is pressed, so send 1
    }
  }
  
  
  //Special case for LED status lights
  //Check status of button and change LED accordingly
  
  if (digitalRead(12) == LOW)  //Check if button is pressed/switch flipped
    analogWrite(17, INTENSITY);  //Set corresponding LED pin to intensity level  
    else 
    analogWrite(17, 0);  //Otherwise turn off
  
  if (digitalRead(7) == LOW)  //Same for other pins
    analogWrite(18, INTENSITY);
    else
    analogWrite(18, 0);
  
  if (digitalRead(9) == LOW) 
    analogWrite(19, INTENSITY);
    else
    analogWrite(19, 0);
  
  if (digitalRead(11) == LOW) 
    analogWrite(20, INTENSITY);
    else
    analogWrite(20, 0);
  
  Joystick.send_now();  //Send control states
  Joystick.sendState()
  delay(5);  //Slow things down a bit
}

Qu’est-ce qui vous a fait croire que le code d’un teensy aurait la moindre de chance de fonctionner sur une Arduino de base? Fallait acheter un teensy...

Il vous faut (comme mentionné dans le tuto) un arduino qui supporte le HID (la possibilité d’être reconnu comme un périphérique de contrôle par votre PC) - c’est le cas du teensy mais pas des arduino de base

Le vendeur au magasin d'électronique.... et le fait que je ne connaisse pas cela vraiment.
Cependant je ne cherche qu'a apprendre.

En essayant différents code j'ai réussi à faire comprendre à l'ordinateur que je voulais qu'il soit
détecter comme un joystick.

J'ai réussi a faire détecter lorsqu'une switch au pc était a ON.
Les bouton pressoir fonctionne très bien et tandis que les switch toggle il faut que je la mette a on puis a off pour faire comme si j'avais allumer(ce qui ne me dérange pas vraiment).

Cependant lorsque je connecte plusieurs switch et que je tente des les utiliser, l'ordinateur ne réponds pas correctement il détecte des switch qui ne devrai pas être allumer.
Je me suis dis que c'était un problème de programmation dans le loop plutôt qu'un problème de HID
puisque la connexion fonctionne.

Vous me dites que ce n'est donc pas possible avec cette carte et devrai me commander une teensy pour arriver a mes fins?

merci de votre aide

voici le code que j'ai utiliser dans mes différente tentative.

// Simple example application that shows how to read four Arduino
// digital pins and map them to the USB Joystick library.
//
// Ground digital pins 9, 10, 11, and 12 to press the joystick 
// buttons 0, 1, 2, and 3.
//
// NOTE: This sketch file is for use with Arduino Leonardo and
//       Arduino Micro only.
//
// by Matthew Heironimus
// 2015-11-20
//--------------------------------------------------------------------

#include <Joystick.h>

Joystick_ Joystick;

void setup() {
  // Initialize Button Pins
  pinMode(7, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 9;

// Last state of the button
int lastButtonState[4] = {0,0,0,0};

void loop() {

  // Read pin values
  for (int index = 0; index < 4; index++)
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }

  delay(50);
}

Euh j’ai dit n’importe quoi ci dessus - lu trop vite votre post et pensé à un arduino de base

le Micro ou micro pro utilise le chip ATMega32u4 et donc offre le HID

pinMode(7, INPUT_PULLUP); ça ne devrait pas être 7 mais 9 —> les 4 pins boutons sont 9,10,11 et 12 d’après le code et doivent être en input pullup

Le câblage doit être le suivant

Pin <—-> bouton <—-> GND

Est ce bien ce que vous avez fait?

Un sujet qui peut t'intéresser ici.

Merci pour le lien je vais regarder, sinon concernant les input_pullup et le filage c'est beau.
Je savais pour la pin 7 vs 9... je l'avais changer mais sur la carte elle était bien installer.
les 7 switchs sont grounder ensemble puis un seul fil rejoint la pin du ground.
Un peu comme le guide que j'ai tenté de suivre était fait.

Sur le 2ème code que j'ai mis, j'ai la ligne de code suivante qui semble avoir un impact lorsque je change les chiffres mais je ne comprends pas l'impact réel qu'il sert.
est-ce que ça peut avoir un lien?

int lastButtonState[4] = {0,0,0,0};

merci de votre aide encore une fois

ohh je viens de trouver :slight_smile:

voici le code que je vais finalement utiliser.

Mes 7 pin fonctionnes et communiques sans bordel à l'ordinateur.
il ne me reste qu'à apprendre le principe des switch toggle (High/Low) et tout fonctionnera
Merci de votre aide... et si quelqu'un a la réponse n'hésiter pas.
ce sont pour les pin # 6 à #10

#include <Joystick.h>

Joystick_ Joystick;

void setup() {
  // Initialize Button Pins
  
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
      
  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 6;

// Last state of the button
int lastButtonState[7] = {0,0,0,0,0,0,0};

void loop() {

  // Read pin values
  for (int index = 0; index < 7; index++)
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }

  delay(50);
}

Je n'ai jamais eu aucun problème avec ce tuto : https://www.instructables.com/id/Arduino-LeonardoMicro-as-Game-ControllerJoystick/

Donc me voilà de retour, après tout ce temps a avoir essayer de trouver.
J'ai beaucoup appris mais apparemment pas encore suffisamment pour corriger mon problème qui est le suivant:

Dans le code ci-dessous, j'ai plusieurs pin, de 1 à 8 ce sont des bouton pressoir (j'appuie et je relâche) et elle fonctionne bien avec le code, cependant j'ai de 9 à 12 qui sont les "toggle" switch, lorsque je met a ON elle y reste mais agisse comme si je laissai appuyer mon doigt sur la touche et j'aimerai corriger cela.
J'ai compris que je devais utiliser le principe du HIGH / LOW, mais je n'arrive pas a l'intégrer dans mon code afin que l'ordinateur ne détecte le signal qu'une fois.
Le but étant de construire un switch panel , pour un simulateur de vol.

  • je tiens a mentionner que le code si dessous fonctionne, lorsque je l'utilise présentement dans le simulateur
    j'allume et j'éteint(mes toggles switchs) donc j'ai mon effet malgré tout, mais j'aimerai plus de réalisme et du coup comprendre comment réglé mon problème. *

**a titre d'info toute mes switchs sont branchés ainsi pin->button>ground , mais pour les toggles faudrait t'il plutôt 5v->button>pin ? et de les inscrire en digital write?

Merci de l'aide

// Simple example application that shows how to read four Arduino
// digital pins and map them to the USB Joystick library.
//
// Ground digital pins 9, 10, 11, and 12 to press the joystick 
// buttons 0, 1, 2, and 3.
//
// NOTE: This sketch file is for use with Arduino Leonardo and
//       Arduino Micro only.
//
// by Matthew Heironimus
// 2015-11-20
//--------------------------------------------------------------------

#include <Joystick.h>

Joystick_ Joystick;

void setup() {
  // Initialize Button Pins
  
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);    
  
  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 2;

// Last state of the button
int lastButtonState[11] = {0,0,0,0,0,0,0,0,0,0,0};

void loop() {

  // Read pin values
  for (int index = 0; index < 11; index++)
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])

    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
    
  }

  delay(50);
}

cependant j'ai de 9 à 12 qui sont les "toggle" switch, lorsque je met a ON elle y reste mais agisse comme si je laissai appuyer mon doigt sur la touche et j'aimerai corriger cela.

Sinon il faut pour chacun de ces interrupteurs il faut mémoriser la bascule et la prochaine fois tester LOW au lieu de HIGH puis HIGH au lieu de LOW... donc une variable d’état de plus par bouton (et une bonne gestion des rebonds)

La solution la plus simple c’est de remplacer ces switchs par des boutons momentanés puisque c’est la fonction que vous souhaitez et réserver les switchs pour l’usage prévu.

Effectivement, le plus simple serait de mettre des boutons pressoir mais au final je n'aurai pas le résultat escompté.

Et est-ce que je pourrai avoir un exemple de comment je devrai intégrer la bascule avec le low et high
Disons sans nécessairement tout faire le code mais juste afin pour que j'essai de l'intégrer au code.
Et bon disons que si ça intéresse quelqu'un de le faire au complet je ne dirais pas non :wink: :smiley: :smiley:

Merci encore, j'apprécie beaucoup votre aide

** voici une image du projet final que j'aimerai réaliser, un jour j'intégrerai peut-être le potentiomètre,
mais je vais commencer par la base

sinon j'ai trouver ce code qui fonctionne en mode clavier et non en mode joystick.
J'essai de l'adapter a mon code pour que tout fonctionne bien mais c'est pas encore cela , est-ce que je suis sur la bonne voie?
Code trouvé :

// For Arduino Leonardo or Arduino Micro only
const byte SwitchPin = 7;
void setup() {
    pinMode(SwitchPin, INPUT_PULLUP);
}
void loop() {
    static byte lastSwitchState = LOW;
    static unsigned long lastSwitchStateTime = millis();

    byte currentSwitchState = digitalRead(SwitchPin);
    unsigned long currentTime = millis();


    // Looks for state change while filtering out contact bounces
    if (currentSwitchState != lastSwitchState && currentTime - lastSwitchStateTime > 10UL) {
        lastSwitchState = currentSwitchState;
        lastSwitchStateTime = currentTime;
        Keyboard.write(currentSwitchState ? 'n' : 'f');
    }
}

Donc une fois mis avec le miens cela me donne ceci comme code, que lorsque je test fais vérifier avec Arduino, il ne détecte pas d'erreur(c'est déjà ça de gagner) , il détecte les switchs 5-12 comme étant des bouton poussoir(c'est parfait) mais les fameuse toggle switch elle ne sont pas détecter du tout par l'ordinateur.

  • à noté que les # de pin ne sont pas exactement comme j'ai mentionner dans le post plus haut, l'idée est juste de tester.
// Simple example application that shows how to read four Arduino
// digital pins and map them to the USB Joystick library.
//
// Ground digital pins 9, 10, 11, and 12 to press the joystick 
// buttons 0, 1, 2, and 3.
//
// NOTE: This sketch file is for use with Arduino Leonardo and
//       Arduino Micro only.
//
// by Matthew Heironimus
// 2015-11-20
//--------------------------------------------------------------------

#include <Joystick.h>

Joystick_ Joystick;
const byte SwitchPin2 = 2;
const byte SwitchPin3 = 3;
const byte SwitchPin4 = 4;

void setup() {
  // Initialize Button Pins
  
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);    
  
  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 2;

// Last state of the button
int lastButtonState[11] = {0,0,0,0,0,0,0,0,0,0,0};

void loop() {

  // Read pin values
  for (int index = 5; index < 11; index++)

  
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])

    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
}

  for (int index = 2; index < 4; index++)
{
    static byte lastSwitchState = LOW;
    static unsigned long lastSwitchStateTime = millis();
    byte currentSwitchState = digitalRead(index);
    unsigned long currentTime = millis();
  
  
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentSwitchState != lastSwitchState && currentTime - lastSwitchStateTime > 10UL)
    {
      lastButtonState[index] = currentButtonState;
      lastSwitchStateTime = currentTime;
      Joystick.setButton(index, currentButtonState);
    } 
  }
}
  delay(50);
}