Mesure de vitesse

Toutes les discussions sur l'Arduino !

Modérateur : MOD

Répondre
Avatar du membre
patsushi
Messages : 8
Enregistré le : sam. 30 mars 2013, 12:05
Echelle pratiquée : HO
Prénom : Patrick
Localisation : ESSONNE

Mesure de vitesse

Message par patsushi » lun. 26 mai 2014, 08:14

Travaillant en analogique et faisant piloter mes trains par un ARDUINO, j'ai besoin de connaître la vitesse réelle de mes différents trains pour pouvoir régler au mieux les tensions pour chaque train. J'ai donc fait un petit banc de test pour mesurer ces vitesses.
Comme j'ai une double voie, le banc peut mesurer soit la voie 1 soit la voie 2.

Image

Ce banc est constituer de deux barrières optiques I/R espacées de 983 mm.
A chaque passage devant la barrière DEBUT, puis FIN, l'ARDUINO enregistre le temps, la vitesse est donnée par un simple calcul : V (en km/h) = 307 875 / T (en ms).
Petite explication : 307 785 = 983 (distance entre les 2 barrières) * 3600 (sec par heure) * 87 (pour l'échelle HO) / 1000 (pour le Temps en ms)
L'afficheur sur l'ARDUINO affiche directement la vitesse en km/h.

Schéma :

Image

Image

Et le programme :

/*
Mesure et calcul de la vitesse des trains
sélection de la voie à mesurée sur pin 2
lecture sur A0/A2 du passage à la barrière de début
lecture sur A2/A0 du passge à la barrière de fin

*/

#include <LiquidCrystal.h> // inclusion de la librairie pour l'afficheur LCD

// initialise la librarie avec les pin à connecter

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

int Voie = 0 ; // voie de mesure
int VoieDebut = 0 ; // barrière optique Début
int VoieFin = 0 ; // barrière optique Fin
int lect = 0 ; // valeur lue sur les barrières optiques
int Tdebut = 0 ; // Temps sur la barrière début
int debut = 0 ;
int Tfin=0; // temps sur la barrière fin
int fin = 0;
int Temps = 0; // Temps de passage ( = Tfin - Tdebut )
int Vitesse = 0; // vitesse calculée


void setup() {
Voie = digitalRead (2); // choix de la voie (connecteur "haut" = Voie 2, "bas" = Voie 1)
if ( Voie == HIGH ) { // Voie 1
VoieDebut = 2 ;
VoieFin = 0 ;
}
if ( Voie == LOW ) { // Voie 2
VoieDebut = 0 ;
VoieFin = 2 ;
}

// défini les colonnes et lignes, affiche la première ligne et la fin de la seconde
lcd.begin(16, 2); // défini le nre de caractères et de lignes
lcd.setCursor (1, 0); // positionne ligne 1 colonne 1
lcd.print("Vitesse (km/h) = "); // écrit
lcd.setCursor(10, 1); // positionne ligne 2 colonne 11

if ( Voie == HIGH ) { // Voie 1
lcd.print ("Voie 1");
}
if ( Voie == LOW ) { // Voie 2
lcd.print ("Voie 2");
}

}

void loop() {
debut = 0;
fin = 0;
while (debut == 0 ) {
lect = analogRead (VoieDebut);
if ( lect < 10 ) {
Tdebut = millis ();
debut = 1;
}
}
while (fin == 0 ) {
lect = analogRead (VoieFin);
if ( lect < 10 ) {
Tfin = millis ();
fin = 1;
}
}

Temps = Tfin - Tdebut;
Vitesse = 307875 / Temps ;

lcd.setCursor(1, 1); // repositionne le curseur ligne 2 colonne 1
lcd.print(Vitesse); // écrit la vitesse calculée

delay (10000);
lcd.setCursor(1, 1); // positionne le curseur ligne 2 colonne 1
lcd.print(" "); // efface la vitesse

}



Si cela peut être utile à quelqu'un, j'en serai ravi.
Patsushi
Fichiers joints
Diapositive2.jpg
Diapositive4.jpg
Diapositive5.jpg

Avatar du membre
likiki
Causant
Messages : 296
Enregistré le : dim. 29 avr. 2012, 15:21
Echelle pratiquée : H0 3R
Prénom : Christian
Site Internet : http://passionnement.forumactif.org
Localisation : Corbeil Essonne
Âge : 52

Re: Mesure de vitesse

Message par likiki » lun. 26 mai 2014, 19:04

Bonjour Patrick (et voisin :siffle: ),

Une autre approche du problème ==> ICI <==.

:ange:
Cordialement,

Christian.

Répondre