Problème sur une boucle while

Bonjour,

Je cherche à asservir un moteur en position. Pour cela j'utilise deux potentiomètres rotatif, l'un qui sert de commande angulaire, l'autre qui est là pour obtenir la position angulaire du moteur. Le but étant d'arrêter le moteur lorsque la position voulue est atteinte.

J'utilise le code ci-dessous, cependant il reste indéfiniment dans la boucle while. J'ai utilisé les commandes Serial.print() pour voir où était le problème, or il se trouve que lorsque la condition et vérifiée il ne sort pas de la boucle.

#include <Servo.h> // On importe la bibliothèque

int pin1Moteur1=12;   // cmd 1 du moteur 1
int pin2Moteur1=8;    // cmd 2 du moteur 1
int pinPMoteur1=11;   // PMM du moteur 1

int pinPotar1=A0; // On définit le pin de lecture du potentiomètre "maitre"
int pinPotar2=A1; // On définit le pin de lecture du potentiomètre "esclave"

void setup() {
  Serial.begin(9600); //initialise la communication série
  pinMode(pin1Moteur1,OUTPUT);
  pinMode(pin2Moteur1,OUTPUT);
  pinMode(pinPMoteur1,OUTPUT);
}

void loop() {
  Serial.print( "loop" );
  int valeurPotar1=analogRead(pinPotar1); // Lecture du potentiomètre 1
  int valeurPotar2=analogRead(pinPotar2); // Lecture du potentiomètre 2
  int angle1=map(valeurPotar1,0,527,0,305); // Transformation en angle
  int angle2=map(valeurPotar2,0,521,0,305);
  
  if (angle1-5 < angle2 && angle2 < angle1+5){
    actionMoteur(1,0,0);

    // Vérification de boucle
    Serial.print(" valeur angle 1 : ");
    Serial.print(angle1);
    Serial.print(" valeur angle 2 : ");
    Serial.print(angle2);
  }

  
  else if (angle1 > angle2){
    while((angle1 > angle2)==1){
      actionMoteur(1,1,50);
      int valeurPotar1=analogRead(pinPotar1); // Lecture du potentiomètre 1
      int valeurPotar2=analogRead(pinPotar2); // Lecture du potentiomètre 2
      int angle1=map(valeurPotar1,0,527,0,305); // Transformation en angle
      int angle2=map(valeurPotar2,0,521,0,305);

      //Vérification boucle
      Serial.print(" boucle1 : ");
      Serial.print((angle1 > angle2)==1);
      Serial.print(" valeur angle 1 : ");
      Serial.print(angle1);
      Serial.print(" valeur angle 2 : ");
      Serial.print(angle2);
    }
    actionMoteur(1,0,0);
  }
  else if (angle1 < angle2){
    while((angle1 < angle2)==1){
      actionMoteur(1,-1,50);
      int valeurPotar1=analogRead(pinPotar1); // Lecture du potentiomètre 1
      int valeurPotar2=analogRead(pinPotar2); // Lecture du potentiomètre 2
      int angle1=map(valeurPotar1,0,527,0,305); // Transformation en angle
      int angle2=map(valeurPotar2,0,521,0,305);

      //Vérification de boucle
      Serial.print((angle1 < angle2)==1);
      Serial.print(" boucle2 : ");
      Serial.print(" valeur angle 1 : ");
      Serial.print(angle1);
      Serial.print(" valeur angle 2 : ");
      Serial.print(angle2);
    }
    actionMoteur(1,0,0);
  }
  delay(2000);
}

void actionMoteur(int moteur,int sens,int pourcentage){
  int pin1,etat1,pin2,etat2,ENA,puissance; //variable de la fonction
  pin1=pin1Moteur1;
  pin2=pin2Moteur1;
  ENA=pinPMoteur1;
  }
  //test sens du moteur 1,-1 (sens contrainre) ou tout autre valeur (stoppe le moteur)
  if (sens==1){
    etat1=1;
    etat2=0;
  }
  else if (sens==-1){
    etat1=0;
    etat2=1;
  }
  else {
    etat1=0;
    etat2=0;
  }
  puissance=map(pourcentage,0,100,0,255);
  analogWrite(ENA,puissance);
  digitalWrite(pin1,etat1);
  digitalWrite(pin2,etat2);
}

Pouvez vous m'aider à comprendre pourquoi ? Merci d'avance.

un problème de portée de vos variables (que vous redéfinissez en local dans la boucle while)

    while((angle1 > angle2)[color=purple]==1[/color]){
      actionMoteur(1,1,50);
      [color=red]int[/color] valeurPotar1=analogRead(pinPotar1); // Lecture du potentiomètre 1
      [color=red]int[/color] valeurPotar2=analogRead(pinPotar2); // Lecture du potentiomètre 2
      [color=red]int[/color] angle1=map(valeurPotar1,0,527,0,305); // Transformation en angle
      [color=red]int[/color] angle2=map(valeurPotar2,0,521,0,305);
...

Le [color=purple]==1[/color] ne sert à rien, et si vous voulez faire un test alors utilisez au minium true pour la cohérence de type

Effectivement, le programme fonctionne maintenant.
Merci beaucoup J-M-L !!

:slight_smile: