Comptage sur codeur et pas à pas

Bonjour à tous,

Je suis en train de bosser sur un petit projet incluant une carte UNO, un codeur incrémental, un moteur pas à pas et App inventor.
Mon arbre codeur et arbre moteur sont tous les deux reliés par une courroie.
La fonction à réaliser est simple:
J'ai deux boutons A et B sur mon programme app inventor.

  • Je déplace ma poulie moteur (moteur hors couple) d'un angle de rotation aléatoire.
  • J'appuie sur le bouton A de mon programme App inventor >> l'arduino mémorise la position A
  • Je déplace ma poulie moteur d'un angle de rotation aléatoire et j'appuie sur le bouton B >> l'arduino soustrait A à B et pilote mon moteur pour revenir en A.

Le problème étant que je ne sais pas comment utiliser les valeurs de ma variable codeur s'affichant sur mon serial pour effectuer la soustraction B-A.

Avec le code que j'utilise actuellement, quand j'appuie sur B, le moteur revient vers A mais tourne à l'infini, voici le code en question:

    #include <Encoder.h> //librairie encoder
    #include <A4988.h> //librairie driver stepper
    
    Encoder codeur(3,4); // définition pins codeurs
    #define MOTOR_STEPS 200 //nombre de pas du stepper
    #define DIR 7  //pin direction du driver
    #define STEP 6 //pin step du driver
    A4988 stepper(MOTOR_STEPS, DIR, STEP);

    String trame =""; // Lecture de la trame du téléphone

     long EncRotPulse;
     long EncNewRotPulse;
     long newRotPos;
     long RotPos = -999;

 
       
void setup() 
{
 
  Serial.begin(9600);
      stepper.begin(200, 1); // stepper (RPM; microstep à 1)
  }

void Counter () {
      EncRotPulse == 0;
      EncNewRotPulse = codeur.read();
      
      if (EncNewRotPulse != EncRotPulse) {
      Serial.print("Pulsecodeur = ");
      Serial.print(EncNewRotPulse);
      Serial.println();
      EncRotPulse = EncNewRotPulse;
      }
}
  
void loop() {
 
  delayMicroseconds(1);
  if(Serial.available() > 0) // Checks whether data is comming from the serial port
    trame = Serial.readString(); // Reads the data from the serial port
  {
  if (trame == "A"){ // J'appuie sur la touche A de mon téléphone
  Counter();}
 
  }
  if (trame == "B"){ // J'appuie sur la touche B de mon téléphone
        newRotPos = EncRotPulse;
       {stepper.rotate(-(newRotPos*14)); } //14=rapport pulse codeur/pas moteur
     
   }
    }

Toute aide étant la bienvenue !

J'ai remis à jour mon code en rajoutant deux variables EncRotA et EncRotB correspondant aux deux valeurs de mon codeur quand j'appuie sur A puis sur B, mais cette fois ci le moteur ne démarre même pas... je pense que c'est parce que EncRotB-EncRotA=0 car le code ne prend que la dernières valeur du codeur...

    #include <Encoder.h> //librairie encoder
    #include <A4988.h> //librairie driver stepper
    
    Encoder codeur(3,4); // définition pins codeurs
    #define MOTOR_STEPS 200 //nombre de pas du stepper
    #define DIR 7  //pin direction du driver
    #define STEP 6 //pin step du driver
    A4988 stepper(MOTOR_STEPS, DIR, STEP);

    String trame =""; // Lecture de la trame du téléphone

     long EncRotPulse;
     long EncNewRotPulse;
     long newRotPos;
     long RotPos = -999;
     long EncRotA;
     long EncRotB;
 
       
void setup() 
      {
      Serial.begin(9600);
      stepper.begin(200, 1); // stepper (RPM; microstep à 1)
      }
  
void loop() {
      //Fonction comptage du codeur
      {
      EncRotPulse = 0;
      EncNewRotPulse = codeur.read();}
      
      if (EncNewRotPulse != EncRotPulse) {
      Serial.print("Pulsecodeur = ");
      Serial.print(EncNewRotPulse);
      Serial.println();
      EncRotPulse = EncNewRotPulse;
      }
      //Fonction lecture depuis le BlueTooth
      delayMicroseconds(1);
      if(Serial.available() > 0) // Checks whether data is comming from the serial port
      trame = Serial.readString(); // Reads the data from the serial port
       {
      if (trame == "A"){ // J'appuie sur la touche A de mon téléphone
      EncRotA = EncRotPulse;
      }
      if (trame == "B"){ // J'appuie sur la touche B de mon téléphone
      EncRotB = EncRotPulse;
      stepper.rotate((EncRotB-EncRotA)*14);  //14=rapport pulse codeur/pas moteur
     
   }
    }
}

Je me demande donc si il est possible de fixer une valeur variable de codeur ?
Par exemple que j'appuie sur A: EncRotPulse=1200
Puis quand j'appuie sur B (après avoir déplacé mon codeur manuellement): EncRotPulse=1600

B-A=400, donc le moteur se déplace de 400 en arrière (j'omets la rapport pulse codeur et pas moteur).

Il faut réinitialiser trame="" juste après avoir fait tourner le moteur sinon la condition trame == "B" reste vraie et la rotation se répète.

Merci pour ta réponse Christian, désormais mon moteur s'arrête.

Cependant je ne trouve toujours pas le moyen de "mémoriser" la valeur de ma variable codeur quand je reçois A depuis App Inventor (codeur position A) et quand je reçois B (codeur position B).

J'utilise EncRotA = digitalRead(EncRotPulse) et EncRotB = digitalRead(EncRotPulse)... Est-ce que ça me permet bien de différencier les deux valeurs différentes d'une même variable ?