Problème avec un joystick arduino

Bonjours je suis nouveau dans l'arduino et donc sur ce forum.

J'ai pour projet de diriger un robot a l'aide d'un joystick, donc je commance par tester le joystic.

J'utilise donc ce programme qui me donne la valeur de X, Y et du bouton (le joystick utilisé est un thumb joystick) mais au lieu d'avoir une valeur de 512 quand le joystick est innactif elle est de 24 est quand je bouge le joystick elle varie de 22 a 28.

Après plusieurs recherche je ne comprend toujours pas.
Merci de vos futur réponse

int xPin = A1;
int yPin = A0;
int buttonPin = 2;

int xPosition = 0;
int yPosition = 0;
int buttonState = 0;

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

pinMode(xPin, INPUT);
pinMode(yPin, INPUT);

pinMode(buttonPin, INPUT_PULLUP);

}

void loop() {
xPosition = analogRead(xPin);
yPosition = analogRead(yPin);
buttonState = digitalRead(buttonPin);

Serial.print("X: ");
Serial.print(xPosition);
Serial.print(" | Y: ");
Serial.print(yPosition);
Serial.print(" | Button: ");
Serial.println(buttonState);

delay(100);
}

DTS15:
J'utilise donc ce programme qui me donne la valeur de X, Y et du bouton (le joystick utilisé est un thumb joystick) mais au lieu d'avoir une valeur de 512 quand le joystick est innactif elle est de 24 est quand je bouge le joystick elle varie de 22 a 28.

bonjour
comment a tu cablé les potentiometres ?

j'ai donc relié:

Joystick => Arduino
GND => GND
VCC => 5V
X => A1
Y => A0

lien sur votre joystick? c’est quoi comme modèle?

sinon lire de manière très rapproché 2 pins analogiques peut donner un résultat erroné à cause du temps de charge du condensateur lié à convertisseur numérique. pas plus mal de lire 2 fois pour être sûr surtout si les valeurs peuvent être très différentes et en fonction de l’impédance associée

 xPosition = analogRead(xPin);xPosition = analogRead(xPin);
 yPosition = analogRead(yPin);yPosition = analogRead(yPin);

Voila mon joystick: http://www.lextronic.fr/P28783-module-grove---joystick.html

OK votre code de base devrait fonctionner. Votre arduino est bien un UNO ou un arduino "de base"? vous n'avez rien de branché sur la pin AREF ??

Certains joystick ont de bien piètres caractéristiques dynamique et mécanique

Généralement un potentiomètre rotatif utilise une course d'environ 3/4 de tour, soit 270°

Sur ce genre de joystick, le montage mécanique ne permet pas d'utiliser la totalité de la course du potentiomètre.

A partir de la position centrale du joystick, un mouvement a fond vers +X ou à fond vers -X ne représente qu'environ +- 10°

Donc il est impossible, avec analogRead, d'obtenir des valeurs proche de 1023 ou 0

Il faut faire un calibrage en lisant la valeur max quand le joystick est a fond d'un côté, de même pour la valeur min quand il est a fond de l'autre côté.
C'est à partir de ces valeurs min et max que tu pourras déterminer la position du joystick

A faire, evidemment pour l'axe X et Y

Mais certains joysticks sont équipés avec des potentiomètres logarithmiques, de ce fait, la mesure n'est pas linéaire en fonction de la course.
Ce qui rend le calcul de position un peu plus complexe

Merci de vos réponses je demanderais a mon professeur demain si c'est "normale"

Avec JUSTE LE joystick connecté sur votre arduino (sans le reste du robot, aucun autres fils), testez avec ce code:

const byte xPin = A1;
const byte yPin = A0;
const byte buttonPin = 2;

int xPosition = 0;
int yPosition = 0;
byte buttonState = HIGH;

void setup() {
  Serial.begin(115200);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  xPosition = analogRead(xPin); xPosition = analogRead(xPin);
  yPosition = analogRead(yPin); yPosition = analogRead(yPin);
  buttonState = digitalRead(buttonPin);

  Serial.print("X: ");
  Serial.print(xPosition);
  Serial.print(" | Y: ");
  Serial.print(yPosition);
  Serial.print(" | Button: ");
  Serial.println(buttonState == HIGH ? "REPOS" : "APPUI");
  delay(50);
}

mettez la console à 115200 (pas la peine de vous limiter à 9600 votre ordinateur et arduino sont rapides)

bougez le joystick à gauche, droite en haut et en bas et appuyez sur le bouton et regardez ce que ça affiche.

Alors apres le test j'en est déduis que c'est le motor Shield qui me le mettais a 24.
Maintenant sans le motor Shield quand le joystick est "neutre" la valeur est la bonne mais quand je bouge le joystick il ne va pas jusqu'à 0 ou 1023 mais jusqu'à 220 et 750.
Demain je demanderais a mon professeur et je vous tiendrais au courant

Maintenant sans le motor Shield quand le joystick est "neutre" la valeur est la bonne mais quand je bouge le joystick il ne va pas jusqu'à 0 ou 1023 mais jusqu'à 220 et 750.

OK ça paraît bcp plus réaliste.

Si vous avez un Motor Shield de branché sur votre Arduino UNO, alors ce shield utiles les pins D3, D8, D9, D11, D12, D13 et A0 et A1 ---> Vous ne pouvez donc pas utiliser ces 2 pins analogiques pour votre joystick! il faut les brancher ailleurs, par exemple A2 et A3

De plus si vous lisez la doc

On each channel will be a voltage proportional to the measured current, which can be read as a normal analog input, through the function analogRead() on the analog input A0 and A1. For your convenience it is calibrated to be 3.3V when the channel is delivering its maximum possible current, that is 2A.

ils disent donc que l'info envoyée est sur ces pins (pour mesurer le courant consommé par le shield) sera entre 0 et 3.3V

Coucou,
Avec les enfants du club, nous pilotons tous les ans le robot avec un joystick Arduino et cela fonctionne très bien.
On utilise une carte uno, une shield moteur adafruit et un joystick
pour le programme : La Fabrique : Joystick Arduino