IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Codage chronomètre


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    janvier 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2020
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Codage chronomètre
    Bonjour,

    Je cherche à coder un chronomètre avec un capteur ILS sans utiliser de bouton. Je cherche à obtenir le temps entre deux passage d'aimant sur mon capteur ILS.
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    //-----------------------------------------------------------
     
    // Inclusion de la bibliothèque pour les messages en Français
    #include <PrintFr.h> //Source : <a href="https://github.com/EpixFr/Arduino-PrintFr" target="_blank">https://github.com/EpixFr/Arduino-PrintFr</a>
     
    /* Déclaration des constantes définissant l'utilisation des broches */
     
    //Broche utilisée pour les données du contact ILS
    const int pin_ils = 10;
    bool chronoStatus; 
     
     
    /* Déclaration des variables globales */
    //Etat du contact ILS
    int etat_ils = 0;
     
    unsigned long millisON = millis();
    unsigned long millisOff = 0;
     
    void setup() {
      //Initialisation de la broche ILS en entrée numérique
      pinMode(pin_ils, INPUT);
      Serial.begin(9600);
      chronoStatus = true;
    }
     
     
    void loop() {
     
      etat_ils = digitalRead(pin_ils);
      delay(100);                                  // Pour couvrir les rebonds
     
      if (etat_ils == LOW && chronoStatus == false) // Si bouton pressé et chrono arrêté cela veut dire demarrer le chrono
      {
        millisON = millis();
        Serial.println("Chrono ON");
        chronoStatus = true;
      }
     
      if (etat_ils == HIGH && chronoStatus == true) // Si bouton relâché et chrono en marche cela veut dire arreter le chrono
      {
        millisOff = millis() - millisON;
        Serial.println("Chrono OFF = " + String(millisOff));
        chronoStatus = false;
      }
    }
    Merci de votre aide

  2. #2
    Membre chevronné
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    février 2013
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : février 2013
    Messages : 897
    Points : 2 045
    Points
    2 045
    Par défaut
    Bonjour Appoline

    Citation Envoyé par appoline.martin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delay(100);                                  // Pour couvrir les rebonds
    C'est pas utile, l'ILS n'a pas de rebonds.

    Comment as-tu câblé ton ILS, est-ce-que il est contre GND, si oui as-tu une résistance de PULL_UP?
    Sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pinMode(pin_ils, INPUT_PULLUP)
    Ou, si ton ILS est câblé contre le VCC, une résistance de PULL_DOWN.

    Tu cherches à chronométrer le temps de passage de l'aimant ou le temps entre 2 passages de l'aimant?

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    janvier 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2020
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Codage chronomètre
    Bonjour,
    Merci pour cette réponse.
    Notre capteur est codé en GND et nous avons une résistance placée entre le GND et le capteur. Nous cherchons à obtenir le temps entre deux passages de l'aimant.

    Merci d'avance

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    avril 2002
    Messages
    3 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : avril 2002
    Messages : 3 068
    Points : 11 125
    Points
    11 125
    Par défaut
    Salut,
    Citation Envoyé par jpbbricole Voir le message
    C'est pas utile, l'ILS n'a pas de rebonds.
    Attention, ce genre d'interrupteur a aussi des rebonds. Ils en parlent ici :https://electronics.stackexchange.co...witch-debounce

    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  5. #5
    Membre expert

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    1 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 1 765
    Points : 3 392
    Points
    3 392
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Attention, ce genre d'interrupteur a aussi des rebonds.
    Tout à fait, un interrupteur REED (dénommé ILS) est un interrupteur à lames souples contenues dans une ampoule de verre. Ces deux lames vont former un contact quand actionné par la proximité d'un aimant.
    Nom : forum349173_L.jpg
Affichages : 583
Taille : 27,4 Ko
    Comme tout ce qui est mécanique il y aura des rebonds lors des vibrations dues à la fermeture ou ouverture du contact


    il y a d'autres capteurs à effet Hall (genre SS495A, A3144, ...) qui sont montés sur shield et n'auront pas de rebonds
    Nom : ori-module-a-effet-hall-st014-26102.jpg
Affichages : 560
Taille : 24,9 Ko
    un capteur à effet Hall va mesurer le champ magnétique et donne une valeur analogique sous forme de tension. Le shield amplifie ce signal et le passe dans un comparateur qui déclenche le signal au dessus d'un seuil.

  6. #6
    Membre chevronné
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    février 2013
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : février 2013
    Messages : 897
    Points : 2 045
    Points
    2 045
    Par défaut
    Bonjour Appoline

    Il me semble que ton programme du post #1 ne fait que chronométrer le temps que passe l'aimant devant l'ILS.
    Voici comment je vois la chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    //-----------------------------------------------------------
     
    // Inclusion de la bibliothèque pour les messages en Français
    #include <PrintFr.h> //Source : <a href="https://github.com/EpixFr/Arduino-PrintFr" target="_blank">https://github.com/EpixFr/Arduino-PrintFr</a>
     
    /* Déclaration des constantes définissant l'utilisation des broches */
     
    //Broche utilisée pour les données du contact ILS
    const int pin_ils = 10;
    bool chronoStatus;
    bool aimantPassage;
     
     
    /* Déclaration des variables globales */
    //Etat du contact ILS
    int etat_ils = 0;
     
    unsigned long millisON = millis();
    unsigned long millisOff = 0;
     
    void setup() {
    	//Initialisation de la broche ILS en entrée numérique
    	pinMode(pin_ils, INPUT_PULLUP);
    	Serial.begin(9600);
    	chronoStatus = true;
    }
     
     
    void loop() {
     
    	etat_ils = digitalRead(pin_ils);
    	delay(100);                                  // Pour couvrir les rebonds
     
    	if (etat_ils == LOW)                         // Si aimant sur ILS
    	{
    		aimantPassage = true;                    // Noter le pasage de l'aimant
    	}
     
    	if (aimantPassage) // L'aimant est devant l'ILS
    	{
    		if (chronoStatus == false) // Si chrono arrêté cela veut dire demarrer le chrono
    		{
    			millisON = millis();
    			Serial.println("Chrono ON");
    			chronoStatus = true;
    		}
     
    		else                       // Autrement arreter le chrono
    		{
    			millisOff = millis() - millisON;
    			Serial.println("Chrono OFF = " + String(millisOff));
    			chronoStatus = false;
    		}
    		aimantPassage = false;
    	}
     
    	/*
    		Attendre que l'aimant quitte l'ILS
    		Ainsi le chrono se déclenche dès l'aimant sur l'ILS
    		Pour déclencher le chrono une fois que l'aimant quitte l'ILS
    		mettre cette boucle While, juste avant if (aimantPassage)
    	*/
    	while(etat_ils == LOW)                   // Attendre que l'aimant quitte l'ILS
    	{
    		etat_ils = digitalRead(pin_ils);
    	}
    }
    A+
    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  7. #7
    Membre chevronné
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    février 2013
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : février 2013
    Messages : 897
    Points : 2 045
    Points
    2 045
    Par défaut
    Bonjour
    Citation Envoyé par Vincent PETIT Voir le message
    Attention, ce genre d'interrupteur a aussi des rebonds.
    Mea culpa , ça devait être, encore, un de ces vieilles idées qui traînent au fond de ma tête.

    Perso, je n'utilises plus de relais reed mais des capteurs à effet de Hall de type A3240 ou ses remplacements.

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  8. #8
    Membre expérimenté

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : mai 2013
    Messages : 542
    Points : 1 622
    Points
    1 622
    Par défaut Ca tourne ?
    Bonjour,

    Comme on parle d'un seul ILS et d'un seul aimant, j'ai tendance à penser qu'il s'agit plus d'un compteur de vélo que d'un chronomètre classique. J'ai donc repris les différents codes dans cette optique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // Broche utilisée pour les données du contact ILS
    const int pin_ils = 10;
     
    /* Déclaration des variables globales */
    unsigned long Told = millis();
     
    void setup() {
       pinMode(pin_ils, INPUT_PULLUP);         // Initialiser la broche ILS en entrée numérique
       Serial.begin(9600);
    }
     
    void loop() {
       unsigned long T;
       if (digitalRead(pin_ils) == LOW) {      // Aimant devant l'ILS
          T  = millis();
          dT = T - Told;
          Serial.println("Temps = " + String(dT) + "ms");
          Told = T;
          delay(100);                          // Eviter les rebonds au collage
          while(digitalRead(pin_ils) == LOW);  // Attendre que l'aimant quitte l'ILS (un délai pourrait être ajouté dans la boucle pour éviter une surconsommation)
          delay(100);                          // Eviter les rebonds au décollage
       }
    }
    Si je ne me trompe pas, il n'y a plus qu'à pédaler.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  9. #9
    Membre expert

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    1 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 1 765
    Points : 3 392
    Points
    3 392
    Par défaut
    La majorité des capteur REED ont un bounce time de 0,5ms à 1ms (source).
    On peut prendre de la marge, par exemple un delay(5) voire un delay(10) mais je pense que prendre 100 c'est vraiment ceinture bretelle

    Avec 2 delay (à l'ouverture et fermeture) donc 200ms, vous allez pénaliser la réactivité de l'application (la circonférence d'un pneu de vélo fait 2m environ, à 30km/h la roue fait plus de 4 tours par seconde et on aurait un tick tous les 240ms.. on approche de la limite faudrait pas aller bcp plus vite, au delà de 36km/h ça ne fonctionne plus)

    cela dit si c'est pour compter quelque chose qui se passe en secondes ou minutes alors pas de pb.

    *****************************************************************

    sinon si la mémoire flash disponible est contrainte, évitez de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serial.println("Temps = " + String(dT) + "ms");
    et séparez cela en 3 morceaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Serial.print(F("Temps = "));
    Serial.print(dT);
    Serial.println(F("ms"));
    ça évite d'inclure la classe String qui est hyper gourmande.

  10. #10
    Membre expérimenté

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : mai 2013
    Messages : 542
    Points : 1 622
    Points
    1 622
    Par défaut Manque de réflexion
    Bonjour Jay,

    Citation Envoyé par Jay M Voir le message
    La majorité des capteur REED ont un bounce time de 0,5ms à 1ms (source).
    On peut prendre de la marge, par exemple un delay(5) voire un delay(10) mais je pense que prendre 100 c'est vraiment ceinture bretelle .
    Prendre 2x100 ms, ce n'est pas vraiment ceinture bretelle, c'est surtout que j'ai repris les temps sans vraiment y réfléchir.

    Pour la bibliothèque String, si le code reste aussi succinct, je pense qu'on peut gaspiller un peu.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  11. #11
    Membre expert

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    1 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 1 765
    Points : 3 392
    Points
    3 392
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Prendre 2x100 ms, ce n'est pas vraiment ceinture bretelle, c'est surtout que j'ai repris les temps sans vraiment y réfléchir.
    Salut - OK, certes !

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    août 2005
    Messages
    912
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 912
    Points : 1 785
    Points
    1 785
    Par défaut
    Bonjour,
    Par curiosité, c'est pour chronométrer le temps au tour sur une piste de kart ? Puisque j'avais essayé de remplacer le capteur ILS défaillant de mon chrono embarqué Alfano par un capteur de ma fabrication (quelques euros au lieu de 80 à l'époque) et j'aurai pu te donner quelques infos sur le choix de l'ILS (tous ne conviennent pas) compte-tenu du faible champ magnétique au niveau du plancher du kart.

Discussions similaires

  1. [Interbase] [Trigger] Codage
    Par AnestheziE dans le forum InterBase
    Réponses: 9
    Dernier message: 06/11/2003, 15h51
  2. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 21h24
  3. [MFC] Boîte de dialogue chronométrée
    Par mdriesbach dans le forum MFC
    Réponses: 5
    Dernier message: 18/02/2003, 13h40
  4. [Accents - XML] Problème de codage non supporté !!
    Par Smortex dans le forum Composants VCL
    Réponses: 6
    Dernier message: 24/11/2002, 12h00
  5. codage objet
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 22/08/2002, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo