Arduino leonardo 2 joysticks comme clavier branchement + programmation

Bonsoir,
j’aimerai savoir comment utiliser 2 sticks analogiques avec une carte microcontrôleur arduino leonardo, mon objectif étant de simuler des touches du clavier sur chaque direction de chaque joystick:

  1. Branchement:
    en suivant le même modèle que le branchement du 1er joystick, je parviens à retrouver:

** Vrx → A2*
** Vry → A3*
** GND → GND* (juste en dessous de celui occupé par le 1er joystick)
** SW → Digital(PMM) ~3* (sachant que SW de joystick 1 est sur Digital(PMM) 2

*Enfin le voltage +5V, du joystick 2, je ne sais pas où le brancher sur la carte Arduino. Le joystick 1 est naturellement sur 5V de la board. Est ce que je branche le +5V du joystick 2 sur 3.3V de la board ? Ou je la connecte juste pas ?

  1. programmation
    La première partie du code ci dessus correspond au programme pour le joystick 1 ,et elle marche,
    Par contre, en téléversant entièrement ce code (verification compilation validée), le clavier agissait comme si KEY_UP_ARROW restait maintenu en permanence.
    Cet upload dans la carte a fait buggé Arduino du coup, quand j’essaie de téléverser le code avec 1 seul joystick (qui marchait au départ), plus aucune fonction de Keyboard ne fonctionne.

Lorsque j’ai téléversé le programme double joystick, je n’ai branché le voltage 5V du joystick nulle part.

#include<Keyboard.h>

// Analog input of the horizontal joystick position
const int JoystickX = A0;
// Analog input of the vertical joystick position
const int JoystickY = A1;

//second joystick
const int JoystickX_right = A2;
const int JoystickY_right = A3;

void setup()
{

}

void loop()
{
  // Process horizontal joystick position
  int x = analogRead(JoystickX);
  if (1023 == x)
  {
    Keyboard.press('d');
  }
  else if (0 == x)
  {
    Keyboard.press('a');
  }
  else
  {
    Keyboard.release('d');
    Keyboard.release('a');
    delay(5);
  }

  // Process vertical joystick position
  int y = analogRead(JoystickY);
  if (0 == y)
  {
    Keyboard.press('w');
  }
  else if (1023 == y)
  {
    Keyboard.press('s');
  }
  else
  {
    Keyboard.release('w');
    Keyboard.release('s');
    delay(5);
  }
//tout ce qui est au dessus fonctionnait bien avec 1 joystick--------
  //second joystick----------------------------------------------------------
  int xR = analogRead(JoystickX_right);
  if(1023 == xR)
  {
   Keyboard.press(KEY_RIGHT_ARROW);
  }
  else if (0 == xR)
  {
    Keyboard.press(KEY_LEFT_ARROW);
  }
  else
  {
    Keyboard.release(KEY_RIGHT_ARROW);
    Keyboard.release(KEY_LEFT_ARROW);
    delay(10);
  }
  int yR = analogRead(JoystickY_right);
  if (0 == yR)
  {
    Keyboard.press(KEY_UP_ARROW);
  }
  else if (1023 == yR)
  {
    Keyboard.press(KEY_DOWN_ARROW);
  }
  else
  {
    Keyboard.release(KEY_UP_ARROW);
    Keyboard.release(KEY_DOWN_ARROW);
    delay(10);
  }
   
  
}

Quelqu’un peut-il m’aider ? Mes branchements sont -ils corrects, mon code fonctionne t-il bien ?

PS: en raison du bug je suis obligé de desinstaller / reinstaller Arduino IDE à chaque disfonctionnement d’un programme utilisant la librairie keyboard

Bonjour,

Vérifies le bon fonctionnement de tes joysticks en faisant un petit programme qui affiche leur valeurs sur le moniteur série.

Les fonctions keyboard ne fonctionnent juste plus (même après réinstallation).
Le hardware n’est pas défectueux :
1.avec Serial.print , j’ai bien un retour dans chaque direction dans le serial monitor.
2. Le code qui se trouve juste après

  else
  {
    Keyboard.release(KEY_RIGHT_ARROW);
    Keyboard.release(KEY_LEFT_ARROW);
    delay(10);
  }
  int yR = analogRead(JoystickY_right);

n’arrete pas de s’executer indépendemmant du if.
En l’occurence si je mets

 int yR = analogRead(JoystickY_right);
  if (0 == yR)
  {
    Keyboard.press(KEY_UP_ARROW);
     Serial.print("bug");
  }
  else if (1023 == yR)
  {
    Keyboard.press(KEY_DOWN_ARROW);
     Serial.print("54fsqf");
  }

j’obtiens bugbugbugbugbugbugbug… dans le serial monitor.
Et ce n’est pas le hardware joystick qui bug car si j’enleve le premier if et remplace le second else if par if , j’obitens 54fsqf54fsqf54fsqf54fsqf…

Bonsoir
Ce n’est pas vraiment un bug , c’est juste qu’à la fin du telechargement réussi il y a un reset du leonardo qui “œuvre” ensuite comme un clavier usb et se met frénétiquement à cracher des data .

il faut connecter le leonardo sur l’usb avant que le clavier soit énuméré

:warning: La fenetre de tir n’est pas trés longue

connectez le leonardo sur l’usb juste lorsque voyez apparaitre dans la console

Linking everything together…

et ensuite normalement un port pour l’upload va etre trouvé
exemple :
Le croquis utilise 3462 octets (12%) de l’espace de stockage de programmes. Le maximum est de 28672 octets.
Les variables globales utilisent 149 octets (5%) de mémoire dynamique, ce qui laisse 2411 octets pour les variables locales. Le maximum est de 2560 octets.
Redémarrage forcé en cours en 1200bps ouvert/fermé sur le port COM16
PORTS {COM1, COM3, COM6, COM16, } / {COM1, COM3, COM6, } => {}
PORTS {COM1, COM3, COM6, } / {COM1, COM3, COM6, COM17, } => {COM17, }
Found upload port: COM17

désolé, j’ai rien compris:
c’est une méthode de reset ? de televersement ?

il faut connecter le leonardo sur l’usb avant que le clavier soit énuméré

? où je trouve les énumérations (Arduino IDE, gestionnaire des périph ? De quel clavier il s’agit ? Comment activer cette énumération ?

C’est une methode pour uploader un nouveau programme dans le leonardo lorsque le programme precedemment uploadé utilise la lib keyboard.h ce qui conduit à une situation de blocage/brick

Donc ce que je dois faire c’est :

  1. garder le arduino board de coté (non branché)
  2. téléverser le code
    3 . brancher le arduino quand je vois Linking everything together dans la console ?

J’ai essayé mais à aucun moment j’ai eu linking everything together :

Arduino : 1.8.13 (Windows 10), Carte : "Arduino Leonardo"

Le croquis utilise 5488 octets (19%) de l'espace de stockage de programmes. Le maximum est de 28672 octets.

Les variables globales utilisent 230 octets (8%) de mémoire dynamique, ce qui laisse 2330 octets pour les variables locales. Le maximum est de 2560 octets.

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

PORTS {} / {} => {}

Impossible de trouver une carte sur le port sélectionné. Vérifiez que le port sélectionné est correct. Si c'est bien le cas, essayez d'appuyer sur le bouton de réinitialisation (reset) après le début du téléversement.



Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

verifier que ce soit bien coché dans les préférences pour compilation et televersement

oui au temps pour moi.
bon je suis entrain d’essayer de connecter au bon moment.
J’ai déjà tenté de connecter plusieurs fois de manière à ce que le jingle de detection de Windows 10 s’entende au moment où linking everything together apparait (donc en anticipant). Et le televersement se termine mais toujours pas de fonction keyboard operationnelle.
Là, j’ai plug juste au moment ou linking everything together passe, le televersement dure environ 5 min avant de m’envoyer une erreur:

Arduino : 1.8.13 (Windows 10), Carte : "Arduino Leonardo"

(...)
he_778479\core\core_arduino_avr_leonardo_0c812875ac70eb4a9b385d8fb077f54c.a

Linking everything together...

(...)

Le croquis utilise 5488 octets (19%) de l'espace de stockage de programmes. Le maximum est de 28672 octets.

Les variables globales utilisent 230 octets (8%) de mémoire dynamique, ce qui laisse 2330 octets pour les variables locales. Le maximum est de 2560 octets.

Une erreur est survenue lors du transfert du croquis


Je pense que cette méthode n’est pas vraiment viable pour moi, je suis à plus de 10 tentatives, et je suis sûr d’avoir branché sur chaque centisecondes du cous laps de temps du “linking everything together”

Est ce que quelqu’un a une solution du style reboot qui permettrait de nettoyer le arduino IDE, les ports utilisés par l’arduino ?

La désinstallation du logiciel Arduino ne fonctionne plus pour refaire fonctionner la bibliothèque keyboard

Bon le code de départ marche à nouveau, voici ce que j’ai fait:
*redémarrer Windows 10 pour le mettre à jour
*desinstaller arduino IDE

  • redemarrer windows 10
  • installer Arduino IDE

Par contre je n’ai toujours pas de réponse sur la manière de brancher 2 joysticks sur 1 microcontrolleur.
J’aimerais bien avoir un circuit propre et un algorithme propre avoir d’avoir un bug et devoir cette fois ci changer de disque dur pour réexecuter mon code de départ

et la fois d’après devoir changer de PC ? :thinking:

sérieusement : c’est une situation connue et qui arrive couramment lorsque l’on utilise la lib keyboard.h

Je viens de faire qq manips celle ci est la plus simple pour “debricker” le 32U4 (leonardo)

En mode keyboard le 32U4 va “cracher” dans la fenêtre notepad et n’empêchera pas un reset pour ensuite “attraper” un port com en upload

ok, comment je fais pour upload (téléverser) un programme si le arduino board n’est pas connecté ?

flasher par ISP avec un adaptateur (USBasp et compagnie) si aucun port série ne veut se montrer !!!

je ne suis aps certain de comprendre la question suivante :

Est ce que quelqu’un a une solution du style reboot qui permettrait de nettoyer le arduino IDE, les ports utilisés par l’arduino ?

S’agit-il de nettoyer Windows suite à une escalade de numéros ports COM , (visibles ou cachés) ?

Quand je nétais pas totalement fâché avec Windows il m’est arrivé de libérer un grand nombre de numéros de port en suivant les consignes de cette page d’Adafruit : https://learn.adafruit.com/how-to-find-hidden-com-ports/overview

Vous avez testé la manip ?

oui, depuis mon dernier restart window10, reinstall arduino il y a 40 min, les fonctions de keyboard marchent, et pour l’instant ça marche encore. J’ai pas encore fait plusieurs televersement pour que ça arrête de fonctionner.

Sinon avec la manip, au moment je rebranche le arduino, le curseur de bloc note s’est arreté de clignoter, mais le arduino marche encore. Faut que reessaye la manip quand les fonctions keyboard ne marchent plus

le 32U4 doit donc etre actuellement énuméré comme clavier USB : voir le gestionnaire de périphérique, mais il ne crache pas de caractères “intempestifs”

Sinon effectivement la manip doit etre faite seulement dans le cas d’un blocage apparent

Bonjour Al1
sous windows pour l’usb USBdeview est un utilitaire incontournable :man_mechanic:

j’ai reessayé la manip avec les fonctions qui deconnent et ça ne marche pas. J’ai essayé sans reset avant , puis reessayé avec un reset avant.

D’ailleurs, que ça marche ou pas windows 10 a toujours considéré la carte arduino comme un clavier du moment que le programme y est chargé.
Je le vois dans gestionnaire des periph et peripheriques et imprimantes et appareil bluetooth et autres (partout)