Go Down

Topic: Vitesse instantané avec codeur incrémental (Read 708 times) previous topic - next topic

alex_ts1

Bonjours a tous ! :)

Donc voilà je suis en terminale S et j'ai un projet à faire avant la fin d'année.
Mon sujet est de savoir la vitesse à laquelle mon gyropode tourne et je dois l'afficher sur un écran lCD.
matériel: -écran GROVE-LCD RGB Backlight v4.0
            - carte arduino/genuino one + shield adapté
            - encodeur incrémental v1.1

(sachant que j'ai très peu de notion en codage j'ai un peu de mal à comprendre le code mais bref passons)

J'ai donc chercher sur internet différent programme arduino et j'ai en trouvé un qui me sembler correct et qui donne visiblement la pas/seconde du codeur or quand j'affiche cette vitesse donner par ce programme sur mon écran cela m'affiche des valeurs bizarre passant du positif au négatif et tout le temps des valeurs décroissantes et ne se remet pas à 0 quand j'arrête de tourner l'encodeur.

Voici donc mon code:


Code: [Select]
#include <Wire.h>
#include "rgb_lcd.h"

rgb_lcd lcd;

const int colorR = 255;
const int colorG = 255;
const int colorB = 0;
  
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
volatile float vit = 0;        // Vitesse (en nombre de pas par seconde) du codeur
volatile unsigned long t = 0;  // temps "courant" (en microsecondes)
 
void setup()  {

    // set up le nombre de colonnes et de lignes de l'écran LCD:
    lcd.begin(16, 2);
    
    lcd.setRGB(colorR, colorG, colorB);
    
    // Écrire un message pour l'écran LCD.
    lcd.print("vitesse :");          //16 caractères maxi par ligne

    delay(1000);
    
   Serial.begin(115200);
   Serial.println("Codeur incremental");
   pinMode(pinB, INPUT);
   attachInterrupt(0, front, CHANGE);  // Détection des deux types de fronts
   t = micros();                       // Initialisation du temps "courant"
}
 
void loop()   {

    // set le curseur à la colonne 0, et la ligne 1
    // (note: la ligne 1 est la deuxième rangée, puisque le comptage commence par 0):
    lcd.setCursor(0, 1);
    // imprime la vitesse du codeur incremental en pas/seconde
    lcd.print(pos);

    delay(10);
}
 
void front()   {
   unsigned long dt = micros() - t;   // Temps écoulé depuis le dernier front
   int sA = digitalRead(pinA);
   int sB = digitalRead(pinB);
   int apos = pos;                    // Mémorisation de la position précédente
   if (sA == sB)   {
      ++pos;
   }
   else   {
      --pos;
   }
  
   if (dt > 0)   {
      vit = 1e6*(pos-apos)/dt;         // Calcul de la vitesse (ici en pas par seconde)
   }
  

   Serial.print("\t");
   Serial.println(vit);
}


Je pense comprendre à peu près le code mais je ne vois pas quoi modifier ou rajouter pour que l'écran m'affiche la vitesse instantané en m/s de mon gyropode
Si vous avez un autre topic qui peut éclairer ma lanterne ou des nouvelles chose qui peuvent permettre de mettre à termes mon projet je ne suis pas contre du tout ^^

Bien Cordialement
Alex_ts1

ChPr

Dans votre méthode front(), après avoir calculé dt, il faut mettre à jour la valeur t en faisant :

Code: [Select]
t = micros();

Quels sont les signaux connectés à pinA et pinB ?

Cordialement.

Pierre
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

alex_ts1

Merci d'abord d'avoir répondu.

Ensuite que voulait vous dire avec quels sont les signaux connectés à pinA et pinB ?

Sachant que mon codeur est relié par un câble fourni dans les boites arduino, un câble avec 4 couleurs (noir rouge blanc et jaune) je ne sais pas si finalement cette initialisation est bonne

Cordialement

alex


ChPr

Avez-vous fait ce qui suit ?
Dans votre méthode front(), après avoir calculé dt, il faut mettre à jour la valeur t en faisant :

Code: [Select]
t = micros(); ...
Qu'est-ce que ça a donné ?

Cordialement.

Pierre
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

alex_ts1

oui j'ai mis la commande dans mon programme
maintenant je n'est plus de valeur décroissantes mais des valeur allant d'environ 100 à 2000 sans rester stable alors que j'utilise un moteur a une vitesse constante (moteur de 24VDC , 120W branche en 2V sur mes dernier test)
selon le programme que j'ai trouve cela devrait donner le nombre de pas/seconde et donc rester stable si je suis toujours à la meme vitesse

Alain46

#6
Feb 15, 2018, 06:18 pm Last Edit: Feb 15, 2018, 06:23 pm by Alain46
Dans la fonction loop()
Quote
// imprime la vitesse du codeur incremental en pas/seconde
    lcd.print(pos);
Ce n'est pas la vitesse qui est affichée, mais le nombre de pas du capteur

Dans la fonction front()
Quote
Serial.print("\t");
   Serial.println(vit);
Ne pas utiliser une instance de Serial dans une ISR
La fonction front() doit être le plus rapide possible. Elle ne devrait avoir qu'à traiter le calcul du nombre de pas, éventuellement la vitesse, mais pas l'affichage.

Il vaut mieux effectuer l'affichage dans la fonction loop()
Un programme qui se compile sans erreur n'est pas forcément un programme qui fonctionne.

ChPr

...  des valeur allant d'environ 100 à 2000 sans rester stable ...
Il faudrait vous assurer que les signaux appliqués en pinA et pinB ne sont pas parasités. En plaçant par exemple un petit filtre RC sur chacune de ces entrées (par exemple 10 kOhms et 10 nF).

Cordialement.

Pierre
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

alex_ts1

merci @ChPr mon signal est déja beaucoup plus stable (toujours avec le même moteur branché en 2V)

@Alain46 oui j'ai vu que la valeur donné était le pas/seconde j'essayais d'abord d'avoir une valeur stable ce qui est à peu près le cas maintenant.
Maintenant savait vous comment je peu passer du pas/seconde en m/s ? je connais à la rigueur la formule V=w.R mais c'est dans le cas où j'ai du rad/seconde or ce n'est pas le cas avait vous une idée ?

Aussi une chose en plus comment faire pour que cela retombe à zéro quand j'arrete de faire tourner le codeur ?

Cordialement

Alex_ts1

Go Up