codeur incremental et moteur dc

Bonjour,
je réfléchis à la création d'un programme d'asservissement
Pour l'instant voila où j'en suis :
arduino uno + carte groove shield1.3b +moteur nxt (moteu avec codeur incrémental)

Programme simple pour vérifier le pilotage du moteur :

#include "Grove_I2C_Motor_Driver.h"

// default I2C address is 0x0f
#define I2C_ADDRESS 0x0f

void setup() {
  Motor.begin(I2C_ADDRESS);
}

void loop() {
  // Set speed of MOTOR1, Clockwise, speed: -100~100 
  Motor.speed(MOTOR1, 17);

  delay(3000);
  Motor.stop(MOTOR1);
  delay(2000);
  Motor.speed(MOTOR1, -17);

  delay(3000);
  Motor.stop(MOTOR1);
  delay(2000);
}

marche impeccable

programme de comptage du codeur :

int pinA = 2;   // Le port D2 est associé à l'interruption 0
int pinB = 4;
volatile int pos = 0;  // Position (en nombre de pas) du codeur
 
void setup()  {
   Serial.begin(115200);
   Serial.println("Codeur incremental");
   pinMode(pinB, INPUT);
   attachInterrupt(0, front, FALLING);  // Détection des fronts descendants
}
 
void loop()   {
   delay(10);
}
 
void front()   {
   int s = digitalRead(pinB);
   if (s == LOW)   {
      ++pos;
   }
   else   {
      --pos;
   }
   Serial.println(pos);   // Ligne à supprimer après les tests, car elle ralenti le dispositif
}

marche impeccable
cependant quand je mêle les deux plus rien ne fonctionne :

#include "Grove_I2C_Motor_Driver.h"

// default I2C address is 0x0f
#define I2C_ADDRESS 0x0f
  
int pinA = 2;   // Le port D2 est associé à l'interruption 0
int pinB = 4;
volatile int pos = 0;  // Position (en nombre de pas) du codeur
 
void setup()  {
   
  Motor.begin(0x0f);
   Serial.println("Codeur incremental");
   pinMode(pinB, INPUT);
   attachInterrupt(0, front, CHANGE);  // Détection des deux types de fronts

     
   
}
 
void loop()   {

 Motor.stop(MOTOR1);
  delay(2000);
  Motor.speed(MOTOR1, -17);
  delay(750);
    Motor.stop(MOTOR1);
  delay(2000);
  Motor.speed(MOTOR1, 17);
  delay(750);


}



 
void front()   {
   int sA = digitalRead(pinA);
   int sB = digitalRead(pinB);
   if (sA == sB)   {
      ++pos;
   }
   else   {
      --pos;
   } Serial.begin(115200);
   Serial.println(pos); 
   Serial.end();// Ligne à supprimer après les tests, car elle ralenti le dispositif
}

:confused:

en effet, j'ouvre et je ferme l'envoie de donnée sur le port série afin de récupérer la position du codeur dans la procédure front car si je laisse serial.begin(115200) dans le setup rien ne s'affiche
cependant cette solution ne semble pas etre convenable car mon codeur me renvoie des valeurs qui se décalent au cours des cycles de rotation du moteur

Bonjour,

C'est dans la loop qu'il faut faire les Serial.print. Dans l'interruption, il faut avoir l'exécution la plus courte possible.
Du coup ça ne sert à rien de faire un Serial.end().

Merci pour l’aide
effectivement ça fonctionne bien mieux comme ça