Joystick utilisé comme flèche de commande

Salut à tous,

J'ai récupérer un vieux joystick composé de 4 switch qui s'enclenche lorsque je déplace le joystick.
J'ai donc une info UP , une info DOWN, une info LEFT et une RIGHT.
Ma question est simple j'aimerais avec ce joystick pilotés les flèches directionnels de mon ordi.
Pour ça j'ai une carte teensy LC pour pouvoir communiquer avec l'ordi.
J'aimerais simplement que quelqu'un m'éclaire un peu concernant le code, je ne suis pas très calé en arduino et je suis sur que c'est une action de base que je veux faire et que l'un d'entre vous pourra m'apporter la soulte en deux secondes.

Merci d'avance

Jérémy

Bonsoir

Et vous avez pris quelques secondes our faire une recherche google? Voilà une des premières réponses

attention quand votre Arduino devient un clavier qui envoie automatiquement des touches à prévoir un moyen de sortir de ce mode

Désolé,
C'est vrai que j'aurais trouvé facilement si j'avais cherché un peu.
J'ai donc pu configurer comme je voulais mon joystick par contre maintenant je bloque et j'ai beau cherché je ne trouve pas.
Mon ordinateur reçoit bien l'info KEY_UP mais une seule fois lorsque je pousse le joystick même si je laisse enfoncé il n'y a qu'une info alors que je voudrais que l'info soit envoyé en continu avec une certaine vitesse.

Comment faire ?

Merci d'avance

Vous avez un bug ligne 42 et Le fil rouge n'est pas bien branché.... :frowning:

Bonjour,

Pardon je ne comprends pas. c'est une blague ?

jerry0301:
Pardon je ne comprends pas. c'est une blague ?

Bonjour,

Oui et non...

Comment voulez vous qu'on vous aide à trouver votre bug si vous ne postez pas votre code...

que l'un d'entre vous pourra m'apporter la soulte en deux secondes

cela me rappelle un divorce douloureux :sob: mais depuis les procédures se sont drôlement accélérées :slight_smile:

Désolé effectivement j'aurais du vous le transmettre, sinon impossible de m'aider.

Alors le voici, merci d'avance :

#include <Bounce.h>

Bounce button0 = Bounce(0, 10);
Bounce button1 = Bounce(1, 10);  

void setup() {

  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);

}

void loop() {

  button0.update();
  button1.update();

  if (button0.fallingEdge()) {
    Keyboard.press(KEY_RIGHT);
    Keyboard.release(KEY_RIGHT);
  }
  if (button1.fallingEdge()) {
    Keyboard.press(KEY_LEFT);
    Keyboard.release(KEY_LEFT);
  }

}

corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)


Votre bout de code  if (button0.fallingEdge()) {est vrai qu'au moment où le bouton est enfoncé (passe de HIGH à LOW), une fois qu'il est enfoncé il reste de LOW à LOW donc c'est normal que vous n'envoyez pas plusieurs fois l'action si vous tenez la touche appuyée

Ce que votre code doit faire c'est qu'une fois qu'il a détecté un fallingEdge, il doit émettre la séquence Keyboard.press() et Keyboard.release() à intervalle régulier. Inspirez vous du code de "blink without delay" pour voir comment traiter cela avec la fonction millis()

une fois que vous recevez le risingEdge() vous savez que vous avez relâché le bouton et vous pouvez arrêter d'envoyer la touche.

vous pouvez voir le code source de la librairie Bounce2 ici et la doc est là.

Vous pourrez voir qu'il y a aussi une fonction read() qui retourne l'état du bouton et que vous pourriez utiliser au lieu du fallingEdge() et tant que le bouton est LOW (plutôt que sur la transition HIGH LOW) émettre (à intervalle régulier, pas plus de quelques dizaines de fois par secondes) l'appui sur la touche

J'ai corrigé le code de mon ancien post merci du conseil.
Désolé mais je ne m'en sors pas du tout avec ce code j'ai testé plein de trucs mais je crois que je ne comprends pas bien la logique du codage avec Arduino.

J'ai testé ça

#include <Bounce.h>

Bounce button0 = Bounce(0, 10);
Bounce button1 = Bounce(1, 10);  

unsigned long previousMillis = 0;       

const long interval = 1000;  

void setup() {

  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);

}

void loop() {

  button0.update();
  button1.update();
  
unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {

    previousMillis = currentMillis;
    
  if (button0.read()) {
    Keyboard.press(KEY_RIGHT);
    Keyboard.release(KEY_RIGHT);
  }
  if (button1.read()) {
    Keyboard.press(KEY_LEFT);
    Keyboard.release(KEY_LEFT);
  }

}
}

J'ai certainement fait n'importe quoi ^^la honte mais je vois pas du tout là.

Merci d'avance de bien vouloir me guider encore un peu.

Jérémy

J'ai testé ça

J'ai certainement fait n'importe quoi

Bonjour,
si tu commentes chaque ligne, tu pourras voir ce que tu as fait et le cas échéant te rendre compte plus facilement si tu as oublié quelque chose

Bonjour,

J'essaie et j'essaie encore mais je n'y arrive pas j'ai donc suivi les conseil de trimarco et annoté mes lignes depuis la premiere version du code que je comprends.

#include <Bounce.h>

// Mettre en bounce chaque bouton. Le bounce permet une detection des 
// changements plus simple.
Bounce button0 = Bounce(0, 10);
Bounce button1 = Bounce(1, 10);  
Bounce button2 = Bounce(2, 10);
Bounce button3 = Bounce(3, 10); 

void setup() {

// configuration des entrées en mode PULL UP. Quand le bouton est pressé
// La pin lis LOW parceque le bouton la relie à la terre. Quand le 
// bouton est relaché la pin lis HIGH. 
  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);  
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);

}

void loop() {

// update de tout les boutons
  button0.update();
  button1.update();
  button2.update();
  button3.update();

// la fonction falling edge permet : 
// High (bouton non pressé)
// Low (pressé - le bouton connecte la pin à la terre      
  if (button0.fallingEdge()) {
    Keyboard.press(KEY_RIGHT);
    Keyboard.release(KEY_RIGHT);
  }
  if (button1.fallingEdge()) {
    Keyboard.press(KEY_LEFT);
    Keyboard.release(KEY_LEFT);
  }
    if (button2.fallingEdge()) {
    Keyboard.press(KEY_UP);
    Keyboard.release(KEY_UP);
  }
  if (button3.fallingEdge()) {
    Keyboard.press(KEY_DOWN);
    Keyboard.release(KEY_DOWN);
  }

}

Mais je ne vois pas plus ce que je dois faire (rien compris à la fonction millis)
Rien à faire je commence vraiment à me dire que je n'arriverais pas à mettre en place une vulgaire commande de flèche comme sur un clavier. Quelqu'un peux t'il m'aider sur ce forum au moins concernant la fonction la plus simple à utilisé.

J'espère finir par y arriver
Merci

Salut à tous,
J'ai finalement trouvé un code qui me permet de faire ce que je veux mais je n'arrive pas à l'attribuer à plusieurs IN dés que je rajoute une autre IN je n'envoie plus qu'une info l'une après l'autre ma question est simple comment garder l'envoie continue de l'info avec deux IN différentes
.
Voici le code qui marche pour une seule info keyboard :

void setup() {
  // put your setup code here, to run once:
  pinMode(0, INPUT_PULLUP);

  // initialize control over the keyboard:
  Keyboard.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
 { while (digitalRead(0) == HIGH){
    // do nothing until pin 2 goes low
    delay(50);
  }
  
  delay(80);
  // new document:
  Keyboard.press(KEY_RIGHT);
  delay(100);
  Keyboard.release(KEY_RIGHT);
  // wait for new window to open:
   }

   }

Et voici ce que j'ai voulu faire et qui fait que je ne peux envoyer plus qu'une seule info l'une aprés l'autre :

void setup() {
  // put your setup code here, to run once:
  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);

  // initialize control over the keyboard:
  Keyboard.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
 { while (digitalRead(0) == HIGH){
    // do nothing until pin 2 goes low
    delay(50);
  }
  
  delay(80);
  // new document:
  Keyboard.press(KEY_RIGHT);
  delay(100);
  Keyboard.release(KEY_RIGHT);
  // wait for new window to open:
   }
   
 { while (digitalRead(1) == HIGH){
    // do nothing until pin 2 goes low
    delay(50);
  }
  
  delay(80);
  // new document:
  Keyboard.press(KEY_LEFT);
  delay(100);
  Keyboard.release(KEY_LEFT);
  // wait for new window to open:
   }

   }

Merci d'avance à tous j'espère être sur la bonne piste et que vous allez pouvoir me guider un peu plus.

Merci d'avance

Jérémy

Bonjour,

Il faut virer tes while qui bloquent le programme.

Ci dessous un programme ultra simple qui doit faire ce que tu veux, mais qui présente l'inconvénient d'avoir un retard pour l'envoi de la première touche (je te laisse améliorer ça si c'est génant).

const int pinBoutonD = 0;
const int pinBoutonG = 1;

void setup() {
  pinMode(pinBoutonD, INPUT_PULLUP);
  pinMode(pinBoutonG, INPUT_PULLUP);

  // initialize control over the keyboard:
  Keyboard.begin();
}

void loop() {
  if (digitalRead(pinBoutonD) == LOW)
  {
    Keyboard.press(KEY_RIGHT);
    Keyboard.release(KEY_RIGHT);
  }
  if (digitalRead(pinBoutonG) == LOW)
  {
    Keyboard.press(KEY_LEFT);
    Keyboard.release(KEY_LEFT);
  }

  delay(100);
}

Merci beaucoup ça marche parfaitement c'est ce que je voulais.
Super merci en plus j'ai compris l'intérêt de while et if grâce à vous. Et d'où venez mon blocage.
Je vous remercie c'est super.

Bonne soirée à vous je vais enfin finaliser mon programme

Salut à tous,
Me voici de nouveau toujours sur le meme sujet mon histoire de joystick à été résolu et marche parfaitement bien mais j'aimerais maintenant pouvoir déclencher avec ce joystick la touche shift en plus des flèches de commandes à chaque enclenchement.

Comment faire il me semble que je dois utiliser les fonctions Keyboard.set_modifier mais je n'arrive pas à m'en servir.

Merci d'avance, je pense que vous serez aussi efficace que la dernière fois.

Jérémy