Controle de la souris avec un joystick

Bonjour,j'ai un projet pour contrôler la souris de mon ordinateur avec un joystick (j'utilise arduino Leonardo) et lorsque j'entre mon code dans l'IDE et le téléverse,la souris devient incontrôlable et va vers le bas droit de l'écran systématiquement.
Voici mon code:

#include <Mouse.h>

#define VRX_PIN  A0 // Arduino pin connected to VRX pin
#define VRY_PIN  A1 // Arduino pin connected to VRY pin
int xValue = 0; // To store value of the X axis
int yValue = 0; // To store value of the Y axis

void setup() {
  Serial.begin(9600) ;
}

void loop() {
  Mouse.begin();
  xValue = analogRead(VRX_PIN);
  yValue = analogRead(VRY_PIN);
  if(xValue>1023){
    Mouse.move(10,0,0);

  }
  if(yValue>100){
    Mouse.move(0,10,0);

  } 

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

le probleme est dans le code. dans la boucle

la broche analogique ne retournera la valeur 1023 que si le joystick est a fond a droite. et pas plus car le convertisseur analogique vers digital d'une carte leonardo ne vas que de 0 a 1023.

et dans la boucle

la souris n'ira que vers le bas car le millieu du joystick est au alentours de 511.

D'accord,merci pour vos conseils,j'ai fait un nouveau code maiscela me fait toujours la même chose:

#include <Mouse.h>

#define VRX_PIN  A0 // Arduino pin connected to VRX pin
#define VRY_PIN  A1 // Arduino pin connected to VRY pin
int xValue = 0; // To store value of the X axis
int yValue = 0; // To store value of the Y axis

void setup() {
  Serial.begin(9600) ;
}

void loop() {
  Mouse.begin();
  xValue = analogRead(VRX_PIN);
  yValue = analogRead(VRY_PIN);
  if(xValue>530){
    Mouse.move(10,0,0);

  }
  if(yValue>530){
    Mouse.move(0,10,0);

  } 
}

pour le fait que la carte prend le contrôle total de la souris c'est du au fait que la carte envoie des informations de mouvement de la souris près de 16000 milliards fois par seconde donc le pc ne s'occupe que des informations de la carte.

Oui,ce n'est pas un problème (je ne compte pas utiliser la souris pendant l'utilisation du joystick) mais comment contrôler la souris avec le joystick de manière contrôlée ?

Il faut que tu affiches les valeurs renvoyées par le joystick lorsqu'il est au repos : tu verras dans quelle gamme de valeurs tu dois tester. Par exemple, il est possible que le joystick au repos renvoie des valeurs entre 500 et 530. Dans ce cas, tu dois adapter ton test.

Profites-en pour afficher les valeurs renvoyées lorsque tu déplaces ton joystick, dans chaque direction : ça ter permettra d'encore mieux écrire tes tests.

Si par exemple les valeurs renvoyées lorsque le joystick est en haut à gauche sont entre 0 et 50, tu sais écrire ton test pur aller en haut à gauche.

Bonjour,

  • Ta souris ne se déplace que dans un sens
  • Ta souris se déplace trop vite

Il faut

  • traiter le sens inverse
  • mettre un délai
#include <Mouse.h>

#define VRX_PIN A0  // Arduino pin connected to VRX pin
#define VRY_PIN A1  // Arduino pin connected to VRY pin
int xValue = 0;     // To store value of the X axis
int yValue = 0;     // To store value of the Y axis

void setup() {
  Serial.begin(9600);
  Mouse.begin();
}

void loop() {
  xValue = analogRead(VRX_PIN);
  yValue = analogRead(VRY_PIN);

  if (xValue > 600)
    Mouse.move(10, 0, 0);
  else if (xValue < 450)
    Mouse.move(-10, 0, 0);

  if (yValue > 600)
    Mouse.move(0, 10, 0);
  else if (yValue < 450)
    Mouse.move(0, -10, 0);

  delay(50);
}

Mouse.begin() ne doit être appelé qu'une seule fois.

Tenir aussi compte des remarques de @lesept : au repos ton joystick n'est pas forcément à 512.

void move(int x, int y, signed char wheel = 0);

Je pense qu'il faut profiter du fait que le la méthode move permet d'aller à la fois en x et en y

  if (xValue > 600)
    dx = 10;
  else if (xValue < 450)
    dx = -10

Puis pareil en y. Et à la fin :

Mouse.move(dx, dy, 0);
dx = 0;
dy = 0;

Ensuite, tu peux faire varier la vitesse selon la valeur renvoyée par le joystick. Si la valeur est entre 0 et 100, dx peut valoir -50 au lieu de -10.

D'accord,donc pour commencer,j'ai utilisé ce code:

#include <Mouse.h>

#define VRX_PIN A0  // Arduino pin connected to VRX pin
#define VRY_PIN A1  // Arduino pin connected to VRY pin
int xValue = 0;     // To store value of the X axis
int yValue = 0;     // To store value of the Y axis

void setup() {
  Serial.begin(9600);
  Mouse.begin();
}

void loop() {
  xValue = analogRead(VRX_PIN);
  yValue = analogRead(VRY_PIN);
  Serial.println(xValue);
  delay(100);
  Serial.println(yValue);
}

Mais le résultat que j'obtient au repos est celui là:
Capture1

Et même en allant à fond sur les axes du joystick,j'ai ce résultat (cela passe parfois à 1022)

Le score ne change que lorsque le bouton du joystick est enfoncé (et ce sans bouger l'axe)
Capture1

Donc ton joystick est mal connecté.
La valeur lue sur les entrées analogiques ne doit pas bouger si tu enfonces le bouton (éventuellement quelques pas si tu n'enfonces pas le bouton bien droit).


Source: Utilisation d'un Joystick avec Arduino • AranaCorp

Attention: tous les joysticks n'ont pas le même ordre des pins


Source: Analog JoyStick with Arduino - Tutorials

Oui, je suis d'accord avec @kamill, tu dois avoir un problème de connexion ou branchement. Pour ton affichage, je te conseille :

  Serial.print(xValue);Serial.print('\t'); Serial.println(yValue);
  delay(100);

Ca t'affichera les valeurs x et y sur la même ligne, plus facile à lire.

D'accord,j'ai essayé avec ce branchement et ce code et cela m'affiche des résultats normaux (535 à l'arrêt et 1023 ou 0 au bout)

Donc le hard fonctionne. Essaie le programme que je te propose au post #8