Joystick, néma 17 et A4988

Bonjour à tous,

Je continu mon apprentissage mais j’ai une grande incompréhension avec le joystick.

Le but pour l’instant piloter un moteur pas à pas via le shield A4988.
J’ai réussi via divers forum et divers tuto a piloter en partie le moteur mais je comprend pas une partie du code.
en particulier les valeurs de lecture analogique et comment les utiliser.

//test 5 
//suppression et optimisation des "while"
//le moteur tourne sur l'axe x (positif ou négatif) sans arret


  int VRx = A0;
  int VRy = A1;
  int SW = A2;
  #define step_pin 3 // pin STEP de la carte A4988 sur la digital 3 arduino 
  #define dir_pin 2 // pin DIR de la carte A4988 sur la digital 2 arduino 
  #define MS1 5 // pin MS1 de la carte A4988 sur la digital 5 arduino 
  #define MS2 4 // pin MS2 de la carte A4988 sur la digital 4 arduino 
  #define SLEEP 7 // pin SLEEP de la carte A4988 sur la digital 7 arduino avec la pin RST de la carte A4988 sur la digital 7 arduino 
  #define X_pin A0 // pin VRx du joystick sur la pin A0 arduino
//Pin GND de la carte A4988 sur une pin GND arduino 
//pin VDD de la carte A4988 sur le 5V arduino

//définition des variables
  int direction; // appelé pour la direction moteur 
  int steps = 0; // ?????????????????????
  int xPosition = 0;
  int yPosition = 0;
  int SW_state = 0;
  int mapX = 0;
  int mapY = 0;


void setup() {
  Serial.begin(9600); 
  
//partie moteur 
// Sélection des deux pin en sortie
  pinMode(step_pin, OUTPUT);
  pinMode(dir_pin, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(SLEEP, OUTPUT);
  pinMode(VRx, INPUT);
  pinMode(VRy, INPUT);
  pinMode(SW, INPUT_PULLUP); 
  digitalWrite(SLEEP, HIGH); // réveille la fonction "dormir" de la carte A4988
  delay(5); // délai d'attente en µs pour le réveille de la carte A4988


// Définition des type de mesures sur la carte A4988: 
// MS1 MS2 
// LOW LOW = 1 pas// 
// HIGH LOW = 1/2 pas // 
// HIGH LOW = 1/4 de pas / / 
// HIGH HIGH 1/8 de pas // 

  digitalWrite(MS1, LOW); // configure le pas MS1 en  pas complet
  digitalWrite(MS2, LOW); // configure le pas MS2 en  pas complet
}

void loop() {
  xPosition = analogRead(VRx);
  yPosition = analogRead(VRy);
  SW_state = digitalRead(SW);
  mapX = map(xPosition, 0, 1023, -512, 512);
  mapY = map(yPosition, 0, 1023, -512, 512);[/color]

  
  Serial.print("X: ");
  Serial.print(mapX);
  Serial.print(" | Y: ");
  Serial.print(mapY);
  Serial.print(" | Button: ");
  Serial.println(SW_state);
  delay(100);

  while (analogRead(X_pin) >= 0 && analogRead(X_pin) <= 100) {[/color]
{
  digitalWrite(dir_pin, HIGH); // (HIGH = anti-clockwise / LOW = clockwise)
  digitalWrite(step_pin, HIGH);
  delay(1);
  digitalWrite(step_pin, LOW);
  delay(1);
  steps++;
}
}

  while (analogRead(X_pin) > 512 && analogRead(X_pin) <= 1023) {[/color]
{
  digitalWrite(dir_pin, LOW);
  digitalWrite(step_pin, HIGH);
  delay(1);
  digitalWrite(step_pin, LOW);
  delay(1);
  steps++;
}
}
}

pour résumer avec ces lignes:

mapX = map(xPosition, 0, 1023, -512, 512);
mapY = map(yPosition, 0, 1023, -512, 512);

while (analogRead(X_pin) >= 0 && analogRead(X_pin) <= 100) {
while (analogRead(X_pin) > 512 && analogRead(X_pin) <= 1023) {

le moteur tourne bien sans arret dans un sens ou dans l’autre (ce que je souhaite en partie) mais je remarque que dans un sens il tourne des que j’appuye sur le joytick (soit a environ 5 dans la lecture de la console) et dans l’autre sens il démarre à 400 soit a la moitié de la course du joystick.

Je pense que cela provient des données ci dessus mais je parviens pas à comprendre le fonctionnement.
Pouvez vous m’aider s’il vous plait?

Une autre question au passage, est t-il possible avec un pas à pas de faire varier la vitesse suivant la position du joystick? (si vous me dites oui je vais d’abord chercher a apprendre :wink: )

Merci à tous,
Raph

delay(1) permet ici de régler la temporisation entre les pas, on peut faire varier la vitesse de rotation du moteur pas à pas en changeant le timing entre les steps.