Go Down

Topic: Capteur de vitesse pour vélo (Read 775 times) previous topic - next topic

Victor1998

Bonjour,
Je suis en terminale S SI et dans le cadre de notre projet je dois réaliser un capteur de vitesse pour un vélo.
J'ai a ma disposition un ILS fixe et un aiment qui tourne sur la roue. Lorsque l'aiment passe devant l'ILS le contact se ferme.

Je pensais faire un programme du type:

Début
Démarrer le chronomètre
Lire la valeur du temps -> T
FAIRE      "attendre"
JUSQU'À   contact fermé        (le contact de l'ILS)
FINFAIRE
Lire T -> t1
SI contact ouvert
ALORS FAIRE     "attendre"
          JUSQU'A contact fermé
          FINFAIRE
Lire T -> t2
FINSI
Périmètre de la roue / t2-t1 -> V
Afficher V

Le problème c'est que je n'arrive pas à mesurer le temps à l'instant précis où le contact se ferme.
Et je ne parvient pas à faire une mesure de temps dans mon programme pour les valeur de t1 et t2.
De plus je me demande si ce programme pourrait fonctionner ou s'il y a des fautes.

PS: je fais l'intégralité de mon programme sur le site 123D Circuits (site conseillé par mon professeur de SI)

hameau

Salut,

Il faut passer par une gestion des interruptions, qui va compter un nombre d'impulsions provenant de ILS durant une mettons 1s, puis à partir de la, tu pourras déterminer la vitesse du vélo, connaissant la fréquence du signal et le diamètre de la roue.

@+

Victor1998

D'accord je vois. Je vais essayer cela ! Merci beaucoup

coyotte

Hello,

Ta première approche n'est pas mauvaise, mais celle de Hameau va permettre de limiter les erreurs de mesure. TU auras une valeur beaucoup plus précise.

Quand tu écris
Quote
Le problème c'est que je n'arrive pas à mesurer le temps à l'instant précis où le contact se ferme.
Qu'entends-tu par là ?

Coyotte
Conference over procrastination has been postponed to tomorrow

hameau

#4
Feb 15, 2016, 07:25 pm Last Edit: Feb 15, 2016, 07:26 pm by hameau
Va voir ici :

http://forum.arduino.cc/index.php?topic=92398.msg703005#msg703005

post 7, c'est pour un anémomètre, mais le principe de mesure reste strictement le même avec l'utilisation ILS et Interruption.

@+
 

Victor1998

Salut Coyotte,
le problème était que je ne parvenait pas a connaître la valeur de t1 et t2 parce que je ne sais pas comment faire pour les mesurer.
Je ne sais pas si c'est clairement expliqué mais en gros je ne trouvais pas ces valeurs.

Mais du coup j'ai commenceé à faire un compteur de changement d'état de l'ILS, et je vais regarder le lien que hameau a envoyé, d'ailleurs merci ! :)

Victor1998

Bonsoir,
post 7, c'est pour un anémomètre, mais le principe de mesure reste strictement le même avec l'utilisation ILS et Interruption.

Je ne comprends pas vraiment la boucle void anemometre(). Et je ne vois pas comment le temps intervient dans le programme...

rjnc38

#7
Feb 15, 2016, 10:21 pm Last Edit: Feb 15, 2016, 10:25 pm by rjnc38
Je ne comprends pas vraiment la boucle void anemometre(). Et je ne vois pas comment le temps intervient dans le programme...
void anemometre() est attaché a l'inter 0 (D2), elle compte donc les impulsions de l'ils
le temps est pris en compte dans la loop avec le delay(1000) ou on calcule la vitesse est on remet a zero le compteur (théoriquement toutes les secondes)
ça marche si tu ne fais pas grand chose dans la loop .....

Victor1998

int bout1 = 2;                 //entrées des boutons
int bout2 = 4;
int etat_bouton = 0;
int nbr_de_tour = 0;
float V = 0;


void setup()
{   
  Serial.begin(9600);          //débit en bits/s
 
  pinMode(bout1, INPUT);       //définie l'entrée
 
  attachInterrupt (0, ILS, FALLING);  //interruption d'un évenement.
                                                 //FALLING car on passe d'un état haut à bas
}


void loop()
{
  delay(1000);                            //Calcule la vitesse chaque second
  Serial.print("V= ");
  Serial.print(3.1415*0.6*nbr_de_tour*3.6);       //V = Pi*Diamètre*Nbr de tours*3.6 (km/h) 
  Serial.println(" km/h");                                       // ici Diamètre = 60cm = 0.6 m
  nbr_de_tour = 0; 
 
}
 
 void ILS()
{
  etat_bouton = digitalRead(bout1);            //mémorise l'état du bouton dans une variable

  if (etat_bouton != HIGH)
    {
      nbr_de_tour++;
    }
       
}


 

   
   
 
   
 
 
   

Victor1998

Bonjour,
Voila ce que j'ai réalisé, pensez-vous que cela est juste?

PS: int bout2 = 4; est pour une autre boucle, donc rien à voir avec mon ILS

Go Up