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 .
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
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 ? .
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.
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
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.
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
# 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.
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 :
te procurer une alimentation pour tes moteurs
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)
faire des petits test de rotation du moteur dans les 2 sens
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 !