Codeur Rotatif

Bonjour, je m'apelle fabien.

J'ai besoin de votre aide car j'ai acheter des moteurs avec codeurs en quadrature, Mais je n'arrivent pas a m'en servir. J'ai essayé de lire les valeur renvoyé par les capteur Hall, mais j'ai que des 0 quand le moteur tourne ou pas . Pour info, ceci est pour mon 2e robot, j'aidonc deja travailler sur L'arduino UNO. (Accelerometre, capteur Ir, servo, moteur..) Je voudrai aussi savoir comment compter les impulsions. Mes moteur encodeur sont des cytron 103rpm. Je tien aussi a dire que j'ai passé toute la journée sur le net a chercher des infos...... Merci a tous .

Jesis: Bonjour, je m'apelle fabien.

J'ai besoin de votre aide car j'ai acheter des moteurs avec codeurs en quadrature, Mais je n'arrivent pas a m'en servir. J'ai essayé de lire les valeur renvoyé par les capteur Hall, mais j'ai que des 0 quand le moteur tourne ou pas .

bonsoir c'est +/- ça ? http://www.robotshop.com/content/ZIP/documentation-spg30e-30k.zip Vous n'avez pas oublié les R de pull-up en entrée d'arduino ? (voir FIG 3.0 en haut à droite du pdf encoder user manual )

J'ai active les pull up, (digitalWrite(pin, High)) .

Oui c'est bien c'est moteur.

Tien ça marche mieux, j'avais que des 0, maintenant, j'ai 4 zero et un 1. Voila le code qui me donne ce resultat :

while(1) {
analogWrite(vitesseMoteur1, vitesse); // génère une impulsion PWM sur la broche de vitesse du moteur
digitalWrite(sensMoteur1,AVANT); // Marche avant 
Hall_A = digitalRead (13);
Hall_B= digitalRead (12);
Serial.println(Hall_A, BIN);
delay(1);
Serial.println( Hall_B, BIN); 
delay(1);

Et ensuite ?

Jesis: J'ai active les pull up, (digitalWrite(pin, High)) .

Oui c'est bien c'est moteur.

Tien ça marche mieux, j'avais que des 0, maintenant, j'ai 4 zero et un 1. Voila le code qui me donne ce resultat :

while(1) {
analogWrite(vitesseMoteur1, vitesse); // génère une impulsion PWM sur la broche de vitesse du moteur
digitalWrite(sensMoteur1,AVANT); // Marche avant 
Hall_A = digitalRead (13);
Hall_B= digitalRead (12);
Serial.println(Hall_A, BIN);
delay(1);
Serial.println( Hall_B, BIN); 
delay(1);

Et ensuite ?

ensuite ? :grin: déjà pour voir désactivez le pull-up arduino et mettez des R pull-up externes de 1K

C'est fait . Maintenant j'ai 1110101 est ensuite que plusieur fois 01.

Personne pour m'aider ? SVP.

Jesis: Personne pour m'aider ? SVP.

bonsoir Votre probleme était de faire "parler" l'encodeur en quadrature pour que ses états LOW/HIGH soient correctement pris en compte par les entrées de l'arduino. maintenant que vous les avez , il faut les intégrer dans votre projet, je suppose que si vous avez acheté ce type de motoreducteur encodé, c'est que vous etes parti sur de l'existant ? .

est que vous etes parti sur de l’existant ? .

C’est a dire ? je ne comprend pas ce que vous vouler dire .

J’ai acheter les moteur avec encodeur pour qu’il aille d’un point A à B.
Mais il faut que je me familliarise avec eux avant.

Bonjour

Je voudrai aussi savoir comment compter les impulsions

Maintenant que les deux signaux en quadrature sont récupérés les deux programmes ci dessous permettent de réaliser et comprendre le comptage/décomptage. NB : Pour etre certain de ne pas 'louper' d'impulsions le programme avec interruptions est préférable. http://www.arduino.cc/playground/Main/RotaryEncoders le même 'in french.... by Google....' http://translate.google.fr/translate?hl=fr&langpair=en|fr&u=http://www.arduino.cc/playground/Main/RotaryEncoders

Merci, j'ai deja utilisé le code avec les 2 interuption mais apparrement ca va pas. Mes codeurs font 90tr/tour reducteur. J'ai comptais 242tour codeur en tourné l'axe reducteur d'un tour a la main.

Edit: j'ai essaye en faisant tourné le moteur plus lentement branche sur un petit accus, ca allere de corespondre, je re essaye.

Ca ne va pas, le code. doit etre incomplet. Il compte les tours seulement dans un sens, et je n'ai pas le bon nombre, je devrai avoir 90 trs et j'en ai toujours entre 80 et 86 aprés plusieur essais.

Bonjour

Je pense que (si c'est bien toi) nous en avons déjà parlé sur un autre forum. Sinon, si le modèle que tu as est bien le 90 impulsions tu ne dois pas obtenir 90 mais 360. En effet, ces codeurs travaillent en quadrature.

Voila une image de la doc assez parlante sur le décompte d'impulsions

Uploaded with ImageShack.us

Si ce n'est pas avec toi que nous avions eu cette discussion, désolé, mais les infos restent bonnes.

Cdlt Yves

Salut,

Si quelqu'un connait un endroit (lien) ou je peut trouver des codes pour encodeur, je suis preneur. Apparement sur le 'arduino playgnd' il ne vont pas car il utilise une faible et lente resolution. Mon codeur fait 90tr/tr reducteur. Merci.

Up! Merci

Bonjour Fabien, un arduino avec un Xtal de 16MHz est parfaitement capable de gerer tes impulsions par interruption pour autant que tu te montres raisonnable au niveau du code de la boucle principale. Pourrais-tu mettre a notre disposition ton code afin que l'on puisse voir ou est le probleme. Tu peux me le faire parvenir par message prive si tu ne veux pas le rendre public. A te lire Jacques

Salut, merci;

Voila le cdoe qui doit egtre doit mon µc

# define encoder0PinA 2 

# define encoder0PinB 3 


volatile unsigned int encoder0Pos = 0 ; 


void setup() { 

  pinMode(encoder0PinA, INPUT); 
  pinMode(encoder0PinB, INPUT); 

// encodeur épingler sur interruption 0 (broche 2) 

  attachInterrupt(0, doEncoderA, CHANGE);

// encodeur épingler sur interruption 1 (broche 3) 

  attachInterrupt(1, doEncoderB, CHANGE);  

  Serial.begin (9600);
} 


void loop() {} 


void doEncoderA() { 

  // look for a low-to-high on channel A
  if (digitalRead(encoder0PinA) == HIGH) { 

    // check channel B to see which way encoder is turning
    if (digitalRead(encoder0PinB) == LOW) {  
      encoder0Pos = encoder0Pos + 1;         // CW
    } 
    else {
      encoder0Pos = encoder0Pos - 1;         // CCW
    }
  }

  else   // must be a high-to-low edge on channel A                                       
  { 
    // check channel B to see which way encoder is turning  
    if (digitalRead(encoder0PinB) == HIGH) {   
      encoder0Pos = encoder0Pos + 1;          // CW
    } 
    else {
      encoder0Pos = encoder0Pos - 1;          // CCW
    }
  }
  Serial.println (encoder0Pos, DEC);          
  // use for debugging - remember to comment out
} 


void doEncoderB() { 

  // look for a low-to-high on channel B
  if (digitalRead(encoder0PinB) == HIGH) {   

   // check channel A to see which way encoder is turning
    if (digitalRead(encoder0PinA) == HIGH) {  
      encoder0Pos = encoder0Pos + 1;         // CW
    } 
    else {
      encoder0Pos = encoder0Pos - 1;         // CCW
    }
  }

  // Look for a high-to-low on channel B

  else { 
    // check channel B to see which way encoder is turning  
    if (digitalRead(encoder0PinA) == LOW) {   
      encoder0Pos = encoder0Pos + 1;          // CW
    } 
    else {
      encoder0Pos = encoder0Pos - 1;          // CCW
    }
  }
}

Il vient de arduino playground.

Mais il compte que dans un sens et relativement mal, Il me donne 80-86 tour?/tour reducteur alors que mes moteur ont une resolution de 90. Je n'y suis jamais arriver meme apres plusieur tentavive a des voltages different.

Merci

As-tu essayé avec les programmes de cette page ?

http://www.arduino.cc/playground/Main/RotaryEncoders

Sinon mettre des Serial.println dans le corps de l'interruption n'est pas genial (ca ralenti beaucoup).

Vaut dans le corps du loop() testé si la valeur de l'encodeur a changé est agir en conséquence.

Tiens nous au jus.

Vaut dans le corps du loop()

Vaut ?

Les code que j'ai essayé vien du lien que tu as mis. Pour l'instant je veux juste avoir un comptage juste. Aprés je pense y arriver.

Merci

Up. Merci, bonne année.

Bonjour
ce que tu as achete ce sont des servo-moteurs.
Plus d’info ici :

Je possede 4 ou 5 exemplaires d’un modele tres semblable a celui de l’illustration. Je les utilise pour modifier ma fraiseuse en CNC. Donc je connais.
Pour les faire fonctionner tu as besoin d’un circuit de commande comme ceci :

Je les utilise aussi.
Si tu as envie de simuler un tel driver avec un Arduino : bon courage !! Tu n’imagines meme pas ce qui t’attend.

Je ne comprend pas bien ta demarche. Tu as un moteur DC. Tu l’alimentes et il tourne dans un sens. C’est evident. Tu te tracasses parce que, quand tu lis tes signaux, tu ne sais pas dire dans quel sens il tourne !!! Tu as aussi des soucis parce que tu ne sais pas afficher la valeur du compteur d’impulsions sur ton terminal!! La belle affaire.

Voila ce que je te conseille :

  1. te procurer une alimentation pour tes moteurs
  2. fabriquer un pont en H pour commander ton moteur (avec les protections dont on a parle dans un autre post il n’y a pas longtemps)
  3. faire des petits test de rotation du moteur dans les 2 sens
  4. alors seulement faire ton programme Arduino. Tu fixes une valeur de consigne (duree du deplacement), tu lances ton moteur, tu diminues ta consigne de une unite a chaque transition de tes impulsions A et B (par interruption evidemment). Quand ta consigne est a 0, tu coupes l’alimentation du moteur. Ne pas oublier qu’il faut tenir compte de l’inertie du moteur. Il faut egalement ne pas oublier que quand le moteur n’est plus alimente, une contrainte mecanique va le faire bouger.

Un meilleur choix a mon avis aurait ete d’acheter des moteurs pas-a-pas !

Jacques