servomoteur + joysticks

bonjour je souhaite commander mon servomoteur avec un joysticks mais le probleme c'est que je ne connais pas la fonction pour donner la valeur de la position du joystick.Quelqu'un pourrait me la donner s'il vous plait

Bonjour

Où est la réference du joystick ?
Genre de donnée qui doit impérativement figurer dans la demande sans qu'il soit besoin de la réclamer .....

Idéalement il faut fournir les références, il y a toutes sortes de joysticks...

Pour un joystick "classique" de ce genre

vous sortez x sur A0 par exemple et y sur A1 et vous lisez une valeur par analogRead()

Quand le joystick est au milieu vous aurez environ 512, tout à gauche ou en bas vous aurez une valeur proche de 0 et tout à droite ou en haut, une valeur proche de 1023 (ou l'inverse suivant comment vous tenez le joystick bien sûr).

Un calibrage de test peut être utile pour voir les valeurs réelles, certains sont de mauvaise qualité et seront loin du cas théorique.

la fonction map() peut rendre des services si vous ne voulez pas gérer 512 comme point milieu mais avoir une valeur entre -100 et +100 par exemple.

oui J-M-L c’est bien celui la de joystick mais ce que je voudrai faire c’est que quand par exemple le joystick va vers la gauche le servo va sur la gauche . mais je crois que sur mon code je suis mal parti

#include <Servo.h>
#define NUM_JOY 3
#define MIN_VAL 0
#define MAX_VAL 1023

Servo monServo;

void setup() {
  monServo.attach(2);
}

void loop() {
  if (Serial.available() > 0)
  {

  if ()
  {
    monServo.write(-180);
  } 
  if ()
  {
    monServo.write(180);
  }
   
  }
  
}

et j’ai fait un test de calibrage et ca marche

if (Serial.available() > 0)

Le servo va à droite ou a gauche en fonction du joystick (analogWrite(NUM_JOY)) et pas si un caractère est arrivé de la console (Serial.avilable)
Il faut remplacer la ligne par

if (analogWrite(NUM_JOY) > (MIN_VAL + MAX_VAL) / 2) // Joystick pus grand que le milieu

D’autre part, le joystick doit être sur une entrée analogique/(numérique) et pas sur une numérique seulement. Au lieu de 3
#define NUM_JOY 3 prendre n’importe quoi entre A0 et A5

euh... :o je ne sais pas ce que je dois regarder dans ce code...

que vient faire le

 if (Serial.available() > 0)

par exemple? vous avez une entrée sur le port série en attente ?

définissez mieux le cahier des charges.

quand par exemple le joystick va vers la gauche le servo va sur la gauche

est-ce que vous voulez dire que la position du servo reflète la position du joystick ou alors que dès que vous bougez un peu à gauche vous allez à fond à gauche sur le Servo et y restez tant que le joystick n'est pas revenu au milieu (?) et vous partez à fond à droite si vous dépassez le milieu ?

Laissez votre servo de côté pour le moment et apprivoisez votre joystick.

Essayez déjà ce code en connectant les pins VRx à A0 et VRy à A1 ainsi que GND à GND et Vcc au 5V de votre arduino

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

void setup() {
  Serial.begin(115200); // PENSEZ A METTRE LA CONSOLE A 115200 BAUDS
}

void loop() {
  static int prevX = -1, prevY = -1;
  int x, y;
  x = analogRead(xPin), analogRead(xPin); // double lecture pour laisser le temps à l'ADC de se stabiliser
  y = analogRead(yPin), analogRead(yPin); // double lecture pour laisser le temps à l'ADC de se stabiliser
  if ((x != prevX) || (y != prevY)) {
    Serial.print(F("X="));
    Serial.print(x);
    Serial.print(F(", Y="));
    Serial.println(y);
    prevX = x;
    prevY = y;
  }
}

que voyez vous dans la console ouverte à 115200 bauds ?

le branchement du joystick
gnd->gnd
+5v->5v
vrx->A0
vry->A1
sw->pin3

ah oui J-M-L c'est parce que j'avais fait un code qui utilisait la voie serie pour controler le servomoteur et il y ades choses que j'ai oublié d'enlever

sur le code ca me mets ça en bougeant un peu partout :

X=1023, Y=499
X=1023, Y=501
X=1023, Y=502
X=1023, Y=503
X=963, Y=503
X=922, Y=504
X=891, Y=504
X=844, Y=504
X=789, Y=505
X=759, Y=505
X=716, Y=504
X=638, Y=504
X=609, Y=504
X=574, Y=505
X=504, Y=504
X=491, Y=504
X=491, Y=505
X=491, Y=504
X=490, Y=504
X=491, Y=504
X=490, Y=504
X=491, Y=504
X=491, Y=505
X=491, Y=504
X=490, Y=504
X=484, Y=504
X=456, Y=504
X=438, Y=504
X=426, Y=504
X=413, Y=504
X=398, Y=504
X=386, Y=504
X=374, Y=504
X=363, Y=504
X=348, Y=504
X=333, Y=504
X=319, Y=504
X=295, Y=504
X=278, Y=504
X=257, Y=504
X=226, Y=504
X=210, Y=504
X=190, Y=504
X=167, Y=504
X=134, Y=504
X=116, Y=504
X=80, Y=504
X=0, Y=504
X=68, Y=504
X=96, Y=504
X=107, Y=504
X=143, Y=504
X=161, Y=504
X=177, Y=504
X=206, Y=504
X=230, Y=504
X=247, Y=505
X=264, Y=504

Essayez de comprendre ce que ça fait

les valeurs changent en fonction de la position du joystick

et donc ?

et pour cette ligne :

 if (analogWrite(NUM_JOY) > (MIN_VAL + MAX_VAL)

ça me mets cette erreur :

too few arguments to function 'void analogWrite(uint8_t, int)'

que voulez vous faire avec analogWrite ? pour lire, c'est Read...

donc vous savez lire maintenant des valeurs; vous pouvez voir quelles sont les valeurs quand vous êtes à peu prêt au centre, quand vous allez à gauche ou à droite, en haut ou en bas.

vous voulez associer la position du servo, soit un angle entre 0° et 180°

si le joystick est au milieu => 90°
si le joystick est à fond à gauche => 0°
si le joystick est à fond à droite => 180°

la fonction map() vous permet de définir une correspondance.

J'ai fait un truc similaire il y a quelques années, ne pas oublier d'integrer la dead zone centrale ^^

ok et pour l'erreur vous voyez de quoi ça vient

oui Ninnin j'ai vu ton post ce n'était pas toi qui cherchait un code et que quelqu'un t'as donné un code pour un robot ?

Alors oui possible, mais c'était pour un bras robotisé de tri managé par caméra et code couleur. mais je ne me rappelle pas avoir posté ici pour ça lol

dragonard:
ok et pour l'erreur vous voyez de quoi ça vient

cf mon commentaire en #13

que voulez vous faire avec analogWrite ? pour lire, c'est Read...

C’est moi qui ai fait l’erreur! Mea culpa