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:
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 ?
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
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é
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
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
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"
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
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
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)