Mobiles Geschwindigkeitsradar

Wir stellen uns immer die Frage: „Welches ist das schnellste Auto?“ Manchmal ist der Unterschied so groß, dass die Antwort einfach ist. Aber manchmal ist es nicht einfach. Wir können uns auch die Frage stellen: „Wer ist der schnellste Pilot?“ mit demselben Auto. Ich hatte eine elektronische Baugruppe erstellt, die von einem Rasberry Pi gesteuert wurde, aber die Installation war nicht einfach, sie dauerte tatsächlich ein paar Minuten. Ich wollte ein System schaffen, das schneller, flexibler und nicht zu teuer ist. Meine Wahl fiel auf einen Arduino Nano, mit dem ich bereits einiges zusammengebaut hatte.

Material:

  • 1 Arduino Nano (3€)
  • 1 Arduino-Nano-Unterstützung (2 €)
  • 1 9V Netzteil (2€)
  • 2 Infrarot-Näherungssensoren (3 € für 10)
  • 1 LCD-Bildschirm (3,5 €)
  • 3 Sätze mit je 4 Dupont-Fäden (1 €)

Prinzip:

Zwei Näherungssensoren erkennen das Auto, der Arduino informiert über die Vorbeifahrt des Autos und notiert die Zeit der Durchfahrt mit Mikrosekundengenauigkeit. Dann berechnet der Mikrocontroller die Differenz zwischen den beiden Zeiten, was die Dauer ergibt. Da es den Abstand zwischen den beiden Sensoren kennt, berechnet es die Geschwindigkeit. Anschließend werden die Informationen an den LCD-Bildschirm gesendet. Da das Display groß ist, werden die Anzahl der Umdrehungen (bzw. Messwerte), die Minimal-, Maximal- und Durchschnittswerte berechnet und angezeigt.

Damit nicht alle Elemente umherwandern, packe ich alles in eine Kiste. Das morgendliche Frühstück war für meine Recherche sehr nützlich. Diese gelbe Box ist mit ihrem Deckel und ihrer Größe der ideale Artikel.

Die Abdeckung ermöglicht die Befestigung der Sensoren und lässt sich leicht abnehmen. Die Seite der Box bietet Platz für das Display. Der Boden der Box wird durchbohrt, um die Durchführung des Netzkabels zu ermöglichen.

Zu diesem Zeitpunkt ist der optische Fehler, den ich sehe, die einfarbige gelbe Farbe. Ich muss Aufkleber finden, um dieses Radar zu personalisieren.

Im Inneren sehen wir, dass es einfach ist, es gibt nur ein paar Drähte zwischen jedem Element. Unten sehen wir die beiden Sensoren, die an Kunststoffwinkeln befestigt sind.

Hier ist der Montageplan der Elemente. Beachten Sie, dass Sie auf die Pin-Nummern der Sensoranschlüsse achten müssen. Sie müssen mit den im Programm angegebenen Angaben übereinstimmen.

Hier ist das Programm für den Arduino.

//Libraries 
#include <Wire.h>  
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address, if it's not working try 0x27.

const int sensorPin = A0;
int outputValue = 0;
const int IR1 = 4;
const int IR2 = 5;

int compteur1 = 1;      // variable enregistre un passage compteur 1
int compteur2 = 1;      // variable enregistre un passage compteur 2
long temps1=millis();    // Variable prise de temps pour IR 1
long temps2=millis();    // Variable prise de temps pour IR 2
long temps3 = 0;         // Variable pour le calcul du temps reel passe
float V = 0.0;            // Variable Vitesse
float TTS = 0.0;          // Variable temps passe en secondes
float VKM = 0.0;          // Variable vitesse en KM/H
float VKMN = 0.0;         // Variable vitesse en N
float VKMH0 = 0.0;        // Variable vitesse en H0

float V_min = 99999999;        // Vitesse min
float V_max = 0.0;        // Vitesse max
float V_moy = 0.0;        // Vitesse moy
float V_som = 0.0;        // Vitesse som

String texte="";
int tours=0;

void setup(){
  lcd.begin(20,4);   // iInit the LCD for 16 chars 2 lines
  lcd.backlight();   // Turn on the backligt (try lcd.noBaklight() to turn it off)
  lcd.setCursor(0,0); //First line
  lcd.print("*** attente  ***");
  lcd.setCursor(0,1); //Second line
  lcd.print("*** vehicule ***");
  lcd.setCursor(0,2); //3eme line
  lcd.print("***   SLOT   ***");
  lcd.setCursor(0,3); //4eme line
  lcd.print("***  RACING  ***");
  // capteurs
  pinMode(IR1,INPUT);
  pinMode(IR2,INPUT);
  //Serial.begin(9600);
}

void loop(){
  
  int valIR1 = digitalRead(IR1);  
  // Lecture de broche A2 et mise du resultat dans la variable valIR1
  int valIR2 = digitalRead(IR2);   
  // Lecture de broche A3 et mise du resultat dans la variable valIR2
 
   if(valIR1 == LOW && compteur1 == 1 && compteur2 == 1) {  
   // Si passage devant IR1 ET compteur1 = 1 alors ....
   temps1=micros();       // enregistrement dans temps1 de la valeur millis
   compteur1 = compteur1 + 1;   
  // On rajoute +1 a compteur1 ce qui empeche le remplacement de la valeur de temps1   
  //Serial.print(temps1);
  //Serial.println();
   } 
 
   if(valIR2 == LOW && compteur2 == 1 && compteur1 == 2) {   
   // Si passage devant IR2 ET compteur2 = 1 alors .... 
   temps2=micros();      // enregistrement dans temps1 de la valeur millis    
   compteur2 = compteur2 + 1; 
  // On rajoute +1 a compteur2 ce qui empeche le remplacement de la valeur de temps2    
  //Serial.print(temps2);
  //Serial.println();
   }

   if(compteur1 > 1 && compteur2 > 1) {   
       // Si les valeurs de Compteur1 ET de compteur2 sont differente de 1 alors le calcul peut debuter
      tours=tours+1;
       temps3 = (temps2 - temps1);       
       // temps en millisecondes passez entre les deux capteurs
  //Serial.print(temps3);
  //Serial.println();
  //Serial.print("----");
  //Serial.println();

     
       TTS = ((float)temps3 / 1000000.0);          
       // conversion milisecondes en secondes
     
       V = (0.05 / (float)TTS)*100;               
       // calcul de d/t, ma distance est ici de 5 cm, soit 0,05 m
       // en cm/s
      V_som =V_som+V;
      V_moy=V_som/tours;
      if(V < V_min) {
        V_min=V;
      }
      if(V > V_max) {
        V_max=V;
      }
      //texte=String(V)+"cm/s -"+String(tours)+"    ";
      affichage(String(V),String(tours),String(V_min),String(V_max),String(V_moy));
      delay(500);  // delais de 10 secondes avant reprise du programme 
        // Pour permettre la liberation de la zone IR
     
        compteur1=1;  // Variable remise a 1
        compteur2=1;  // Variable remise a 1
        temps1 = 0;   // Variable remise a 0
        temps2= 0;    // Variable remise a 0
   }
 
  //delay(10);
  
}

void  affichage(String vitesse,String tours,String V_min, String V_max ,String V_moy) {

  lcd.backlight(); 
  //lcd.noBacklight();
  
  lcd.clear();
  lcd.setCursor(0,0); //First line
  lcd.print(vitesse+"cm/s");
  lcd.setCursor(0,1); //Second line
  lcd.print(tours+" tours");
  lcd.setCursor(0,2); //3eme line
  lcd.print(V_min+" a "+V_max);
  lcd.setCursor(0,3); //4eme line
  lcd.print("Moy. "+V_moy);
  
}

Wenn Sie weitere Informationen zur Implementierung des Sendens des Programms an den Arduino wünschen, können Sie den folgenden Artikel lesen: https://www.framboise314.fr/commencer-avec-larduino/

Da haben Sie es also, Sie haben ein Radar, das Sie nur noch am Rand der Strecke platzieren und dann an das Stromnetz anschließen müssen. Es ist auch möglich, eine 9-V-Batterie und einen kleinen Adapter zur Stromversorgung des Arduino zu verwenden, allerdings ist die Batterielebensdauer nicht sehr lang.