Étape 2: L’esquisse de la minuterie
Porter attention à l’esquisse de la PinewoodTimer, tout d’abord, certains paramètres clés sont définis...
#define IR_THRESHOLD 200 / / voiture détecte le seuil
#define STARTER_PIN / / départ interrupteur de porte = pin 2
#define QTI_PIN_OFFSET 5 / / voies 0-2 = broches 5-7
#define NUM_LANES 3 / / nombre de voies
#define TRACK_LENGTH 50 / / pieds
#define échelle 25 / / échelle 01:25
#define TIMEOUT 6000 / / ms pour la course timeout/redémarrage
Le IR_THRESHOLD doit être définie dans la fenêtre définie par les conditions ambiantes de IR et réponse QTI déterminée avec l’esquisse de la PinewoodCalibrate. STARTER_PIN spécifie le NIP utilisé pour le commutateur de la grille de départ (l’autre côté de l’interrupteur est relié à la terre) tandis que QTI_PIN_OFFSET détermine les connexions des broches pour les capteurs QTI. Suivre les diverses configurations et tailles de voiture sont pris en charge avec échelle, TRACK_LENGTH et NUM_LANES. Enfin, un délai d’attente termine la course si, par exemple, une voiture ne finit pas ou seulement deux voitures racing, etc..
La routine d’installation juste permet au terminal série et définit le mode de broche pour l’interrupteur de porte de démarreur.
void setup() {}
Serial.Begin(9600) ;
pinMode(STARTER_PIN,INPUT_PULLUP) ;
}
La boucle principale commence par définir les variables utilisées. La valeur de start_time est la base pour la course et (temps écoulé) avec le tableau finish_et [] stocker le temps pour chaque voie. La variable race_over compte combien de voitures ont franchi la ligne d’arrivée.
Après avoir dégagé le [finish_et] pour chaque voie, "Prêt..." est affiché sur le terminal et le croquis attend la course commencer. Lorsque l’interrupteur de démarrage ouvre l’esquisse imprime « Go » et ensuite entrer dans la boucle principale de chronométrage. Dans la boucle, chaque voie est vérifiée la présence d’un finisseur en comparant son capteur QTI lecture avec le seuil. Une fois qu’une voiture est détectée, le temps écoulé pour cette voie est stocké. La boucle de synchronisation s’exécute jusqu'à ce que la course est terminée (c.-à-d. NUM_LANEs voitures franchissent la ligne d’arrivée, ou le délai d’expiration est dépassée).
Inclure une déclaration (ici commentée) pour afficher le temps requis pour vérifier toutes les voies, qui à son tour détermine combien de voies le croquis peut gérer. J’ai observé le temps de la boucle pour une installation à 3 voies à 9-10 millisecondes, soit environ 3 millisecondes par couloir. Si, par exemple, le temps par voie de circulation est 3ms et une voiture prend 30 millisecondes pour franchir la ligne d’arrivée, l’esquisse pourrait théoriquement soutenir jusqu'à dix voies. Une marge devrait être toutefois d’accommodement, par exemple, une voiture particulièrement rapide (ou courte). Pour tester réellement les capacités de la voie, vous pouvez augmenter NUM_LANES et exécuter des essais répétés pour déterminer à quel point la minuterie commence à « miss » une voiture rapide, franchissant la ligne d’arrivée. Notez que vous pouvez faire ce test pour n’importe quel NUM_LANES avec juste une seule voiture/voie.
void loop() {}
start_time long, et = 0, finish_et [NUM_LANES] ;
int race_over = 0 ;
int i ;
pour (i = 0; i < NUM_LANES; i ++) {}
finish_et [i] = 0 ;
}
Serial.println("Ready...") ;
tandis que (digitalRead(STARTER_PIN)==0) {}
}
Serial.println("Go!") ;
start_time = millis() ;
tandis que ((race_over < NUM_LANES) & & (et < TIMEOUT)) {}
et = millis ()-start_time ;
pour (i = 0; i
Si (RCTime (I + QTI_PIN_OFFSET) < IR_THRESHOLD) {}
Si (finish_et [i] == 0) {}
finish_et [i] = he ;
race_over ++ ;
}
}
}
Serial.println(Millis()-(et+start_time)) ;
}
Une fois que la course est terminée, l’heure de fin pour chaque voie est affiché. À l’aide de la TRACK_LENGTH et l’échelle j’ai également afficher la vitesse moyenne dans « mise à l’échelle MPH » (les gens s’énerver quand leur voiture va 250 MPH: =). Après que les résultats des courses sont affichés le croquis attend la grille de départ fermer en prévision de la prochaine course. La déclaration de retard assure la grille de départ interrupteur bounce faussement ne déclenche pas un redémarrage immédiat.
Serial.println() ;
pour (i = 0; i
Serial.Print ("Lane") ;
Serial.println(i+1) ;
Serial.Print ("Time") ;
Serial.println(float(finish_et[i]/1000.0)) ;
Serial.Print ("Speed") ;
flotteur fps = TRACK_LENGTH/(finish_et[i]/1000.0) ;
flotteur mi/h = ((fps * 3600.0) / 5280.0) * à l’échelle ;
Serial.Print(int(mph)) ;
Serial.println ("MPH") ;
Serial.println() ;
}
tandis que (digitalRead(STARTER_PIN)! = 0) {}
Delay(50) ;
}
Tout ce qui reste est la routine de RCTime avec la permission de parallaxe (http://learn.parallax.com/KickStart/555-27401), qui acquiert la lecture du capteur QTI. Cela fonctionne en mesurant le temps de décharge d’un condensateur à travers une résistance variable (selon la quantité de IR réfléchie).
long RCTime (int sensorIn) {}
longue durée = 0 ;
pinMode (sensorIn, sortie) ; Faire des broches sortie
digitalWrite (sensorIn, HIGH) ; Broche haute (décharge de condensateur)
Delay(1) ; Attendre 1 ms
pinMode (sensorIn, entrée) ; Faire des broches d’entrée
digitalWrite (sensorIn, basse) ; Mettez hors tension interne pullups
while(digitalRead(sensorIn)) {/ / attente pour bornes aller en bas
durée ++ ;
}
retourne la durée ;
}