Go Down

Topic: Compter les tours d'un motoreducteur avec encoder. (Read 363 times) previous topic - next topic

R3mi

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 :


Code: [Select]
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  :) 


bearcorrupted

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

ça donne quelque choses du genre
Code: [Select]
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++;
    }
}

Artouste

...
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

Go Up