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.