Chronomètre de circuit

Réalisation d'un système de chronométrage
pour les robots suiveurs de ligne.

 

Le but :
Connaitre le temps mis par le robot pour faire 1 tour du parcours.

Le matériel :
- Une carte Arduino Uno.
- Une platine de prototypage.
- Une photo résistance.
- Une led de haute luminosité.
- Une résistance ajustable 10K.
- Trois résistance 330 Ohms.
- Un écran LCD 16x2.

Le principe :
Le capteur photo résistance et la led de haute luminosité sont placés de chaque coté de la ligne que suit le robot.
Au passage le robot coupe le faisceau lumineux. Le premier passage déclenche le compteur, le second passage l'arrête et affiche sur l'écran lcd le temps écoulé entre les deux interruptions.
Astuces.

Les branchements

 

Les branchements :

L'écran LCD

Nom Rôle
1 VSS Masse
2 Vdd +5V
3 V0 Résitance variable du contraste
4 RS Sélection du registre (commande ou donnée facultatif)
5 R/W Lecture ou écriture (à la masse dans notre cas pour écrire sur l'écran)
6 E Entrée de validation
7 à 14 D0 à D7 Bits de données (dans notre cas seules les pin D4 à D7 sont utilisée, les caractères sont sur 4 bits)
15 A Anode du rétroéclairage (+5V ou +3V)
16 K Cathode du rétroéclairage (masse)

Le code pour faire fonctionner cela

#include <LiquidCrystal.h>
#include <Timer.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int Lum ;
int PinLed = 7;
int PinLedRouge = 8;
int PinLedVerte = 9;
int ValEclaire ;
int ValEteint ;
int SeuilLuminosite ;
bool EnCourse = false ;
unsigned long TempsMemo = 0;
unsigned long TempsDepart = 0 ;
float TempsAffiche ;
bool Devant = false;
Timer AffTps ;
Timer Cligno ;

int a ;
int b ;

void setup() {
  Serial.begin(9600);
  pinMode(PinLed, OUTPUT);
  pinMode(PinLedRouge, OUTPUT);
  pinMode(PinLedVerte, OUTPUT);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("LudiLab");
  lcd.setCursor(0, 1);
  lcd.print("Initialisation");
  
  digitalWrite(PinLed, HIGH);
  delay(1000);
  b = 0;
  for (a = 0;a < 10;a ++) {
    delay(50);
    b += analogRead(A0);
  }
  ValEclaire = b / 10 ;
  digitalWrite(PinLed, LOW);
  delay(1000);
  b = 0;
  for (a = 0;a < 10;a ++) {
    delay(50);
    b += analogRead(A0);
  }
  ValEteint = b / 10 ;
  SeuilLuminosite = ValEteint + ((ValEclaire - ValEteint) / 2);
  digitalWrite(PinLed, HIGH);
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("LudiLab  - OK -");
  TempsMemo = millis();
  digitalWrite(PinLedVerte, HIGH);
}

void loop() {
  Lum = analogRead(A0);
  if (Lum < SeuilLuminosite && (millis() > TempsMemo + 1000) ) {
    TempsMemo = millis();
    if (Devant == false) {
      Devant = true ;
      if (EnCourse == false) {
        TempsDepart = millis();
        EnCourse = true;
        AffTps.every(250,affiche_chrono);
        Cligno.oscillate(PinLedRouge,100,HIGH);
        digitalWrite(PinLedVerte, LOW);
        lcd.clear();
        lcd.print("Course en cours");
      } else {
        EnCourse = false;
        AffTps.stop(affiche_chrono);
        Cligno.stop(PinLedRouge);
        digitalWrite(PinLedRouge, LOW);
        digitalWrite(PinLedVerte, HIGH);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("LudiLab  - OK -");
        lcd.setCursor(0, 1);
        TempsAffiche = (millis() - TempsDepart) / 1000.0 ;
        lcd.print(TempsAffiche,3);
        lcd.setCursor(8, 1);
        lcd.print("secondes");
      }
    }
  }
  if (Lum > SeuilLuminosite && Devant == true) {
    Devant = false ;
  }
  if (EnCourse == true) {
    AffTps.update();
    Cligno.update();
  }
}

void affiche_chrono() {
  lcd.setCursor(5, 1);
  TempsAffiche = (millis() - TempsDepart) / 1000.0 ;
  lcd.print(TempsAffiche,1);
}
Contact - Mentions légales - Plan du site