Arduino Pinewood Derby Timer (2 / 3 steg)
Steg 2: Timer skissen
Vänder till PinewoodTimer skissen, först definieras några viktiga parametrar...
#define IR_THRESHOLD 200 / / bil upptäcka tröskel
#define STARTER_PIN / / start gate switch = stift 2
#define QTI_PIN_OFFSET 5 / / lanes 0-2 = stift 5-7
#define NUM_LANES 3 / / antalet körfält
#define TRACK_LENGTH 50 / / fot
#define skala 25 / / skala 1:25
#define TIMEOUT 6000 / / ms för race timeout/vila
IR_THRESHOLD bör fastställas i fönstret definieras av IR omgivningsförhållanden och QTI svar som bestäms med PinewoodCalibrate skissen. STARTER_PIN anger PIN-koden används för växeln startar gate (andra sidan av växeln är ansluten till marken) medan QTI_PIN_OFFSET avgör pin-anslutningar för QTI sensorer. Spåra olika konfigurationer och bil storlekar som stöds med NUM_LANES, TRACK_LENGTH och skala. Slutligen avslutas en TIMEOUT tävlingen om t ex en bil inte avslutas eller bara två bilar racing, etc.
Den setup rutinen bara kan serial-uttaget och s├ñtter pin för växeln starter gate.
void setup() {
Serial.BEGIN(9600);
pinMode(STARTER_PIN,INPUT_PULLUP);
}
Huvudloop startar genom att definiera de variabler som används. Starttid är basen för den löpande et (förfluten tid) med den array [finish_et] förvaringstid för varje lane. Variabeln race_over räknar hur många bilar har passerat mållinjen.
Efter att rensa finish_et [] för varje lane, "Redo..." visas på terminalen och skissen väntar race till starta. När växeln start öppnas skiss skriver ut "Go" och sedan går in huvudsakliga timing slingan. Inom slingan kontrolleras varje körfält för förekomsten av en slutbehandlare genom att jämföra dess QTI sensor läser med TRÖSKELN. När en bil har identifierats lagras den totala träningstiden för att lane. Timing loopen körs tills tävlingen är över (dvs. NUM_LANEs bilar över mållinjen eller TIMEOUT överskrids).
Jag omnämna (här kommenterade) för att Visa tid krävs för att kontrollera alla körfält, som i sin tur bestämmer hur många körfält skissen kan hantera. Jag observerade loop tiden för en 3-lane setup att vara 9-10 millisekunder, eller ca 3 millisekunder per körfält. Om du till exempel tiden per körfält är 3ms och en bil tar 30 millisekunder att korsa mållinjen, kunde skissen teoretiskt stöd för upp till tio körfält. Dock bör viss marginal ges för att rymma, till exempel en särskilt snabb (eller kort) bil. För att faktiskt testa lane kapacitet kan du öka NUM_LANES och kör upprepade försök för att bestämma vid vilken punkt timern börjar att "missa" en snabb bil passerar mållinjen. Observera att du kan göra detta test för alla NUM_LANES med bara en enda bil/lane.
void loop() {
lång starttid, et = 0, finish_et [NUM_LANES];
int race_over = 0;
int i;
för (jag = 0; jag < NUM_LANES; i ++) {
finish_et [i] = 0;
}
Serial.println("ready...");
samtidigt (digitalRead(STARTER_PIN)==0) {
}
Serial.println("go!");
start_time = millis();
medan ((race_over < NUM_LANES) & & (et < TIMEOUT)) {
et = millis ()-starttid;
för (jag = 0; jag
om (RCTime (+ QTI_PIN_OFFSET) < IR_THRESHOLD) {
om (finish_et [i] == 0) {
finish_et [i] = et;
race_over ++;
}
}
}
Serial.println(Millis()-(et+start_time));
}
När loppet är över visas avslutningstiden för varje lane. Med hjälp av TRACK_LENGTH och skala jag också visa den genomsnittliga hastigheten i "skalas MPH" (folk bli upphetsad när deras bil går 250 MPH: =). När ras resultatet visas väntar skissen för start grinden att stänga inför nästa lopp. Dröjsmål uttalande försäkrar startande gate switch studsa inte utlöses falskt en omedelbar omstart.
Serial.println();
för (jag = 0; jag
Serial.Print ("Lane");
Serial.println(i+1);
Serial.Print ("tid");
Serial.println(float(finish_et[i]/1000.0));
Serial.Print ("Speed");
flyta fps = TRACK_LENGTH/(finish_et[i]/1000.0);
flyta mph = ((fps * 3600.0) / 5280.0) * skala;
Serial.Print(int(mph));
Serial.println ("MPH");
Serial.println();
}
medan (digitalRead(STARTER_PIN)! = 0) {}
Delay(50);
}
Allt som är kvar är RCTime rutin med tillstånd av Parallax (http://learn.parallax.com/KickStart/555-27401), som förvärvar QTI sensor läsningen. Det fungerar genom att mäta tiden urladdning av en kondensator genom en variabel (beroende på mängden reflekterat IR) motstånd.
lång RCTime (int sensorIn) {
lång varaktighet = 0;
pinMode (sensorIn, produktionen); Göra pin utgång
digitalWrite (sensorIn, hög); PIN HIGH (ansvarsfrihet kondensatorn)
Delay(1); Vänta 1ms
pinMode (sensorIn, ingång); Se kontakt-ingång
digitalWrite (sensorIn, låg); Stänga av inre pullups
While(digitalRead(sensorIn)) {/ / Wait för stift att gå lågt
längd ++;
}
returnera varaktighet;
}