Compter les tours d'un motoreducteur avec encoder.

Bonjour,

J’ai un petit projet simple et pourtant je bloque déjà…

Je voudrais simplement compter les tours d’un motoréducteur avec encodeur comme celui ci :

J’utilise aussi pour le contrôler une carte L9110S comme celle ci :

Dans un second temps le but serai d’arrêter le moteur précisément à un certain nombre de tours choisis avant. (le but final est de créer une bobineuse)

Donc pour l’instant je procède par étape et la première est donc d’arriver à compter précisément le nombre de tour du moteur.

Je me suis aidé des infos ici http://playground.arduino.cc/Main/RotaryEncoders

Et j’ai fait ça qui arête le moteur au bout de 4 tours environ :

const int BIA = 11; // (pwm) pin 10 connected to pin B-IA
const int BIB = 12;  // (pwm) pin 6 connected to pin B-IB

int val;
int encoder0PinA = 2;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;

void setup() {
  pinMode (encoder0PinA, INPUT);
  pinMode (encoder0PinB, INPUT);
  Serial.begin (9600);
  pinMode(BIA, OUTPUT);
  pinMode(BIB, OUTPUT);
}

void loop() {
  n = digitalRead(encoder0PinA);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      encoder0Pos--;
    } else {
      encoder0Pos++;
    }
    Serial.print (encoder0Pos);
    Serial.print ("/");
  }
  encoder0PinALast = n;

  if (encoder0Pos <= 720) {
    analogWrite(BIA, 255);
    analogWrite(BIB, 0);
  }
  else {
    analogWrite(BIA, 0);
    analogWrite(BIB, 0);
  }
}

Mais bon le résultat est vraiment aléatoire je ne pense pas partir sur la bonne méthode ?
Des idées pour me débloquer ?

Merci :slight_smile:

Salut, tu peux utiliser une interruption en mode rising, pour détecter les fronts montants

ça donne quelque choses du genre

const byte encoder0PinA  = 2;
const byte encoder0PinB = 4;
volatile int count = 0;

void setup() {

  attachInterrupt(digitalPinToInterrupt(encoder0PinA), counter, RISING);
}

void loop() {
   //tu fais ce que tu veux ici, tu a acces à ton nombre de tour count
}

void counter() {
  if (digitalRead(encoder0PinB) == LOW) {
      count--;
    } else {
      count++;
    }
}

R3mi: ... Mais bon le résultat est vraiment aléatoire je ne pense pas partir sur la bonne méthode ? Des idées pour me débloquer ?

Bonsoir pour bien jouer avec de l'encodeur en quadrature , AMHA une bonne approche est d'utiliser la lib encoder de PJRC elle est bien versatile