Bonjour, cliquez-ici pour vous inscrire et participer au forum.
  • Login:



+ Répondre à la discussion
Page 1 sur 3 12 DernièreDernière
Affichage des résultats 1 à 15 sur 43

calcul de vitesse de rotation avec capteur optique et arduino uno

  1. capteurtipe

    Date d'inscription
    décembre 2016
    Âge
    21
    Messages
    31

    calcul de vitesse de rotation avec capteur optique et arduino uno

    Bonjour,

    J'aimerai calculer la vitesse de rotation d'un disque avec un capteur optique. Le capteur envoie un faisceau lumineux entre sa partie émettrice et sa partie réceptrice. Il est capable de détecter si un objet est présent etre ces deux parties. Principe de mon algorithme: j'ai fait un trou dans mon disque. Je compte le nombre de fois où le trou passe entre la partie émettrice et réceptrice du capteur durant un laps de temps et je calcule ainsi la vitesse de rotation de mon disque. Malheureusement, mon programme ne fonctionne pas et il affiche en boucle une vitesse de 0 tr/min. Je suis débutante en code arduino, je me suis inspirée de plusieurs codes existants et j'ai essayé d'utiliser la fonction millis(), le problème vient peut être de là. Il n'y a pas de faute de syntaxe.

    Voici mon code:
    Code:
    // Pins utilisé
    const int capteur=5; //capteur port OUT relié au pin5 de l'arduino
    
    // Initialisation des variables
    int lumiere; // affiche si le faisceau lumineux est coupé ou non par le disque. Si la lumière est allumé la partie trouée est devant le capteur
    int tour=0; //variable qui compte le nombre de fois où la partie trouée du disque passe devant le capteur
    float trmin; // variable qui affichera la vitesse du disque en tour/min
    unsigned long temps;  //sert à enregistrer le temps écoulé depuis la dernière mise à jour du compteur
    
    void setup() {
      Serial.begin(9600);   //connection au port série 
      pinMode(capteur, INPUT); //connection du capteur à l'arduino
      temps=millis();
    }
    
    void loop() {
      //Vérifie si le trou arrive à hauteur du capteur
      lumiere = digitalRead(capteur);
      if (lumiere == LOW) {
        // on ajoute 1 à la variable qui compte le nombre de tours
        tour=tour+1;
    
        // si il s'est passé plus d'une seconde depuis le début du calcul du nombre de tours
        if ((millis() - temps) > 1000){
        // trmin= (nb de tours depuis le dernier calcul)/ (temps écoulé entre les deux caculs en minute 1min=60 000ms
        trmin=tour/(millis()-temps)*60000.0;
        
        Serial.print("vitesse en tour/min: ");
        Serial.println(trmin);
        
        //Réinitialisation du temps et du nombre de tours
        temps=millis();
        tour=0;
        }
      }
      delay(500);
    }
    Si vous trouvez ce qui cloche ça m'aiderait beaucoup!

    -----

    Dernière modification par Antoane ; 18/03/2017 à 16h29. Motif: Ajout balises code
     


    • Publicité



  2. Forhorse

    Date d'inscription
    décembre 2010
    Messages
    1 748

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Déjà, tu ne précise pas à quelle vitesse tourne ton disque, et donc quelle va être la fréquence sur ton entrée de comptage, mais passé une certaines vitesse ça va bloquer...
    Ensuite, là dans ton compteur, tu ne comptes pas le nombre de fois que ton capteur voit le trou, mais le nombre de boucle de programme effectuée à chaque fois que le ta condition de comptage était vraie.
    Il faut que tu fasse un comptage sur le changement d'état... donc détecter les changement d'état, puis compter ces changement d'états.

    Ensuite je vois que tu divises le nombre de tour compté pendant 1 seconde (1000ms) par un dénominateur d'au moins 60000... donc hormis si ton disque tourne très très vite (et dans ce cas la méthode de comptage n'est pas la bonne) il y a de grande chance que le résultat soit toujours aux environs de 0.000000...
    Tout projet flou conduit à une connerie précise !
     

  3. Forhorse

    Date d'inscription
    décembre 2010
    Messages
    1 748

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Oups, j'avais mal vu la parenthèse de la division, donc la fin de mon message précédent ne doit pas être pris en compte.
    Tout projet flou conduit à une connerie précise !
     

  4. capteurtipe

    Date d'inscription
    décembre 2016
    Âge
    21
    Messages
    31

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Mon disque tourne environ à 1500 tr/min mais la capacité du moteur est de 3000tr/min. Cette méthode est peut être pas assez efficace alors, mais je ne vois pas trop comment régler cette fréquence de comptage
     

  5. capteurtipe

    Date d'inscription
    décembre 2016
    Âge
    21
    Messages
    31

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    J'avais aussi testé cet algorithme en tentant d'utiliser la bibliothèque FreqCount mais cela me renvoie aussi 0. Je me suis renseignée sur les fréquences que la bibliothèque peut capter jusqu'à 25kHz ce qui serait amplement suffisant dans mon cas.
    Le programme qui pose problème:
    Code:
    #include <FreqCount.h>  //Inclure la librairie de fréquence
    // le pin utilisé pour cette bibliothèque est le 5 par défaut
    
    // Variables utilisées
    unsigned long frq;    //fréquence mesurée
    int encoches=1;   //nombre d'encoches du disque 
    float trmin;  //vitesse de rotation en tour/min
    
    // Initialisation
    void setup() {
      Serial.begin(9600);   //connection au port série 
      pinMode(5,OUTPUT);
      FreqCount.begin(5000); //intervalle de mesure 5 secondes
    }
    
    //Boucle de mesures
    void loop() {
      
    
      frq= FreqCount.read(); //renvoie la dernière mesure
    
      trmin = frq/encoches*60*5;  //Vitesse de rotation en tour/min
      Serial.print("fréquence");
      Serial.println(frq);
      Serial.print("  tour/min: ");
      Serial.println(trmin);
      delay(500);
      
    }
    Là encore je n'ai pas mentionné la fréquence d'entrée de comptage, je ne vois pas trop comment faire.
     


    • Publicité



  6. Jiav

    Date d'inscription
    juillet 2004
    Messages
    8 239

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Citation Envoyé par capteurtipe Voir le message
    Si vous trouvez ce qui cloche ça m'aiderait beaucoup!
    Plusieurs choses! D'abord, ton programme devrait compter les alternances low/high plutot que de simplement detecter un des deux etat (sinon un meme passage de trou risque d'etre compte plusieures fois). Ensuite, le delay(500) fait que ta carte ne lira rien pendant 500 ms. Si la vitesse de rotation est superieure a 2Hz, c'est un probleme. Finalement je soupconne un probleme supplementaire soit dans le typage, soit dans les regles de priorite de calcul. Pourrais-tu 1) changer tour pour un type float 2) mettre la multiplication par 60000 devant la division et 3) faire un print de tour en plus de trmin, puis rapporter l'impact de ces differents changements?

    (Croisement)
    The opposite of a deep truth may well be another deep truth. Information is physical.
     

  7. capteurtipe

    Date d'inscription
    décembre 2016
    Âge
    21
    Messages
    31

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Citation Envoyé par Jiav Voir le message
    Plusieurs choses! D'abord, ton programme devrait compter les alternances low/high plutot que de simplement detecter un des deux etat
    (Croisement)
    Il ne me reste que cela à changer, mais je ne vois pas comment le coder
     

  8. Jiav

    Date d'inscription
    juillet 2004
    Messages
    8 239

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Je te suggererais de faire le point 3) en premier, sans aucun autre changement, afin de voir pas a pas ce qui change versus ce qui ne change rien. Pour les alternances, une fàcon simple est a) d'ajouter un booleen initialise a faux, b) remplacer la condition lumiere=low par une condition (lumiere low et booleen faux)ou(lumiere haute et booleen vrai) et c) ajouter booleen=!booleen apres le if (tu auras compris que c'est du pseudocode )
    The opposite of a deep truth may well be another deep truth. Information is physical.
     

  9. Forhorse

    Date d'inscription
    décembre 2010
    Messages
    1 748

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Citation Envoyé par capteurtipe Voir le message
    J'avais aussi testé cet algorithme en tentant d'utiliser la bibliothèque FreqCount mais cela me renvoie aussi 0.
    Dans ton code tu dis que l'entrée de comptage est la pin 5, et pourtant dans ton setup tu declare cette pin comme une sortie... normal que ça ne fonctionne pas.
    Tout projet flou conduit à une connerie précise !
     

  10. sandrecarpe

    Date d'inscription
    décembre 2013
    Âge
    20
    Messages
    1 046

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Salut,
    Il faut travailler avec les interruptions ! Ton programme sera plus simple et plus fiable.
    A chaque interruption tu refais le calcul de vitesse et tu incrémentes ta variable tour. Mais pas plus : millis() s'arrête de compter pendant l'interruption
    ---> voit du côté de la fonction attachInterrupt()
    Dernière modification par sandrecarpe ; 18/03/2017 à 20h56.
     

  11. capteurtipe

    Date d'inscription
    décembre 2016
    Âge
    21
    Messages
    31

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    J'ai modifié les 3 points proposés par Jiav en utilisant la fonction attachInterrupt au lieu du boléen (j'ai vu le message de sandrecarpe avant le celui de Jiav). Maintenant j'ai des valeurs farfelus: si le disque est à l'arrêt le premier print revoit bien 0 tr/min mais les suivants ont un nombre de tour non nul fluctuant entre 60 et 85 et une vitesse associée allant de 3600 à 5000 tr/min ce qui est impossible. Lorsque le disque tourne les vitesses dépassent 10 000tr/min ce qui est aussi impossible.

    Code:
    //capteur port OUT relié au pin5 de l'arduino
    
    // Initialisation des variables
    volatile float tour; //variable qui compte le nombre de fois où la partie trouée du disque passe devant le capteur
    float trmin; // variable qui affichera la vitesse du disque en tour/min
    unsigned long temps;  //sert à enregistrer le temps écoulé depuis la dernière mise à jour du compteur
    
    //comptabilise le nombre de tour effectué par le disque
    void nb_tour() {
      tour++;
    }
    
    void setup() {
      Serial.begin(9600);   //connection au port série 
      pinMode(5, INPUT); //connection du capteur à l'arduino
    
      //Initialisation des variables
      trmin=0;
      tour=0;
      temps=0; 
      
      //on appelle la fonction tour dès qu'il y a un changement d'état présence/abscence de trou
      //attachInterrupt(interruption,fonction,mode)
      attachInterrupt(0,nb_tour,CHANGE);
    }
    
    void loop() {
    
      //on arrête l'interruption pendant le calcul
      detachInterrupt(0);
      
      // si il s'est passé plus d'une seconde depuis le début du calcul du nombre de tours
      if ((millis() - temps) > 1000){
        // trmin= (nb de tours depuis le dernier calcul)/ (temps écoulé entre les deux caculs en minute 1min=60 000ms
        trmin= 60000.0*tour/(millis()-temps); 
        
        Serial.print("tour");
        Serial.print(tour);
        Serial.print("vitesse en tour/min: ");
        Serial.println(trmin);
    
         //Réinitialisation du temps et du nombre de tours
        temps=millis();
        tour=0;
      }
      //on recommence les interruptions
      attachInterrupt(0,nb_tour,CHANGE);
        
    }
     

  12. Jiav

    Date d'inscription
    juillet 2004
    Messages
    8 239

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Details: temps devrait etre initialise avec millis() plutot qu'a zero; il serait possiblement plus lisible de mettre void nb_tour ´a la fin

    Erreur: (ma faute) l'interruption devrait etre a rising ( ou falling) plutot qu'a change, ou alors il faut corriger le calcul d'un facteur 2

    Gnie?? Pourquoi mettre une ligne d'attachinterupt dans void loop()?

    Pas clair: est-ce que tu vois un nb de tour different de zero alors que c'est a l'arret ou la vitesse te semble juste trop rapide? 60 tours en 1000 ms, c'est bien 3600 tour par minute alors pourquoi le second te choque alors que le premier non?

    Merci: pour la suggestion sandrecarpe
    Dernière modification par Jiav ; 19/03/2017 à 00h35.
    The opposite of a deep truth may well be another deep truth. Information is physical.
     

  13. Forhorse

    Date d'inscription
    décembre 2010
    Messages
    1 748

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Je n'ai jamais utilisé les interruptions avec un arduino, mais moi je vois que tu désactive ton interruption à chaque tour du main, c'est à dire des millions de fois par secondes... peut être que ça doit perturber un peu le bazar

    moi je ferrais
    Code:
    void loop() {
    
     
      
      // si il s'est passé plus d'une seconde depuis le début du calcul du nombre de tours
      if ((millis() - temps) > 1000){
        //on arrête l'interruption pendant le calcul
        detachInterrupt(0);
        // trmin= (nb de tours depuis le dernier calcul)/ (temps écoulé entre les deux caculs en minute 1min=60 000ms
        trmin= 60000.0*tour/(millis()-temps);
    Tout projet flou conduit à une connerie précise !
     

  14. sandrecarpe

    Date d'inscription
    décembre 2013
    Âge
    20
    Messages
    1 046

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Voilà comment je ferais
    Code:
    const int pinCapteur = 2; //pin 2 OU 3 seulement pour les interruptions avec un arduino uno
    volatile bool nouveauTour;
    unsigned int tour;
    unsigned long temps1, temps2; //temps1 antérieur à temps2
    float trmin;
    
    void setup()
    {
    
      nouveauTour = false;
      temps1, temps2 = millis();
      trmin = 0;
      tour = 0;
      
      pinMode(pinCapteur, INPUT);
      
      
      attachInterrupt(digitalPinToInterrupt(pinCapteur), nouveauTourInterrupt, RISING);
      /*
        équivalent à 
        attachInterrupt(0, nouveauTour, RISING); si la pin 2 est utilisée
    
        et à
        attachInterrupt(1, nouveauTour, RISING); si la pin 3 est utilisée
       
       */
    
    
       
    
    
    }
    
    void loop() 
    {
    
        if(nouveauTour)
        {
            detachInterrupt(digitalPinToInterrupt(pinCapteur));
            
            trmin = ((unsigned long)60000)/(temps2-temps1);
            tour++;
            
            temps1 = millis();
    
            
            nouveauTour = false;
    
            attachInterrupt(digitalPinToInterrupt(pinCapteur), nouveauTourInterrupt, RISING);
        }
    }
    
    
    void nouveauTourInterrupt()
    {
      temps2 = millis();
      nouveauTour = true;
    }
     

  15. capteurtipe

    Date d'inscription
    décembre 2016
    Âge
    21
    Messages
    31

    Re : calcul de vitesse de rotation avec capteur optique et arduino uno

    Citation Envoyé par Jiav Voir le message
    Details:

    Pas clair: est-ce que tu vois un nb de tour different de zero alors que c'est a l'arret ou la vitesse te semble juste trop rapide? 60 tours en 1000 ms, c'est bien 3600 tour par minute alors pourquoi le second te choque alors que le premier non?
    Lorsque le disque est à l'arrêt j'avais une vitesse et un nombre de tour non nul. Le second me choque car il faut une alimentation 24V pour que mon moteur tourne à plein régime (3000tr/min) et actuellement il est alimenté avec l'arduino le temps que mon programme fonctionne, sa vitesse ne peut donc pas être aussi élevée
     


    • Publicité





 

Discussions similaires

  1. capteur mesure vitesse de rotation
    Par capteurtipe dans le forum Physique
    Réponses: 6
    Dernier message: 13/12/2016, 17h30
  2. capteur vitesse de rotation roues
    Par ProjetGIM dans le forum Électronique
    Réponses: 4
    Dernier message: 03/10/2015, 11h56
  3. brancher un capteur de vitesse de rotation
    Par chris74 dans le forum Électronique
    Réponses: 23
    Dernier message: 19/10/2011, 12h42
  4. Vitesse de rotation avec capteur de position pour asservissement
    Par robertjagger dans le forum Électronique
    Réponses: 2
    Dernier message: 05/11/2008, 19h42
  5. Capteur de vitesse de rotation inductif
    Par Antho21 dans le forum Technologies
    Réponses: 0
    Dernier message: 08/03/2008, 14h56