Stap 2: De Timer schets
Wat betreft de aandacht op de schets van de PinewoodTimer, zijn eerst enkele belangrijke parameters gedefinieerd...
#define IR_THRESHOLD 200 / / auto detect drempel
#define STARTER_PIN / / vanaf poort schakelaar = pin 2
#define QTI_PIN_OFFSET 5 / / 0-2 rijstroken = pinnen 5-7
#define NUM_LANES 3 / / het aantal rijstroken
#define TRACK_LENGTH 50 / / voeten
#define schaal 25 / / schaal van 1:25
#define TIMEOUT 6000 / / ms voor race timeout/herstarten
De IR_THRESHOLD moet worden ingesteld binnen het venster gedefinieerd door omgevingsomstandigheden IR en QTI reactie zoals bepaald met de schets van de PinewoodCalibrate. STARTER_PIN Hiermee geeft u de PIN-code gebruikt voor de beginnende poort switch (de andere kant van de schakelaar is aangesloten op de grond) terwijl QTI_PIN_OFFSET de pin aansluitingen voor de QTI sensoren bepaalt. Diverse configuraties bijhouden en auto-maten worden ondersteund met NUM_LANES, TRACK_LENGTH en schaal. Tot slot eindigt een time-out van de race als, bijvoorbeeld, een auto eindigt niet of slechts twee auto's zijn racing, enz.
De installatieroutine gewoon kunt de seriële terminal en Hiermee stelt u de pin-modus voor de starter poort switch.
VOID Setup {}
Serial.begin(9600);
pinMode(STARTER_PIN,INPUT_PULLUP);
}
De hoofdlus wordt gestart door het definiëren van de variabelen die worden gebruikt. De start_time is de basis voor de lopende et (verstreken tijd) met de array finish_et [] de tijd voor elke rijstrook op te slaan. De variabele race_over wordt geteld hoeveel auto's de finish hebben gekruist.
Na verrekening van de [finish_et] voor elke rijstrook, "Klaar..." wordt weergegeven op de terminal en de schets wacht op de race te beginnen. Wanneer de start schakelaar opent de schets "Go" drukt en vervolgens verschijnt ook de belangrijkste timing lus. Binnen de lus wordt elke rijstrook gecontroleerd op de aanwezigheid van een finisher door het vergelijken van de sensor van de QTI lezen met de drempel. Zodra een auto wordt ontdekt dat de verstreken tijd voor die rijstrook is opgeslagen. De timing lus wordt uitgevoerd totdat de wedstrijd voorbij is (dat wil zeggen NUM_LANEs wagens de finishlijn of de time-out is overschreden).
Ik neem een verklaring (hier commentaar) als u wilt weergeven van de benodigde tijd voor het controleren van alle de rijstroken, die beurtelings bepaalt van hoeveel rijstroken de schets aankan. Ik heb waargenomen de tijd van de lus voor een 3-baans-setup te zijn 9-10 milliseconden, of ongeveer 3 milliseconden per rijstrook. Als bijvoorbeeld de tijd per rijstrook 3ms is en een auto 30 milliseconden duurt om de finishlijn, kon de schets theoretisch maximaal tien rijstroken steunen. Echter, sommige marge dienen om aan te passen, bijvoorbeeld, een bijzonder snelle (of korte) auto. U kunt als u wilt eigenlijk het testen van de lane-capaciteit verhogen NUM_LANES en uitvoeren van herhaalde proeven om te bepalen op welk punt de timer begint te 'missen' een snelle auto kruising van de afwerkingslijn. Merk op dat u kunt doen dit testen voor elke NUM_LANES met behulp van slechts een enkele auto/baan.
void loop {}
lange start_time, et = 0, finish_et [NUM_LANES];
int race_over = 0;
int i;
voor (ik = 0; ik < NUM_LANES; i ++) {}
finish_et [i] = 0;
}
Serial.println("Ready...");
terwijl (digitalRead(STARTER_PIN)==0) {}
}
Serial.println("Go!");
start_time = millis();
terwijl ((race_over < NUM_LANES) & & (et < TIMEOUT)) {}
et = millis ()-start_time;
voor (ik = 0; i
Als (RCTime (I + QTI_PIN_OFFSET) < IR_THRESHOLD) {}
Als (finish_et [i] == 0) {}
finish_et [i] = et;
race_over ++;
}
}
}
Serial.println(Millis()-(et+start_time));
}
Na afloop van de race wordt de eindtijd voor elke rijstrook weergegeven. Met behulp van de TRACK_LENGTH en de schaal ik ook weer de gemiddelde snelheid in 'geschaald MPH' (mensen opgewonden wanneer hun auto 250 MPH gaat: =). Nadat de race resultaten worden weergegeven wacht de schets voor de beginnende poort te sluiten in voorbereiding voor de volgende race. De verklaring van de vertraging verzekert starting poort switch bounce niet ten onrechte leiden tot een onmiddellijke herstart.
Serial.println();
voor (ik = 0; i
Serial.Print ("Lane");
Serial.println(i+1);
Serial.Print ("Time");
Serial.println(float(finish_et[i]/1000.0));
Serial.Print ("snelheid");
zweven fps = TRACK_LENGTH/(finish_et[i]/1000.0);
zweven mph = ((fps * 3600.0) / 5280.0) * schaal;
Serial.Print(int(mph));
Serial.println ("MPH");
Serial.println();
}
terwijl (digitalRead(STARTER_PIN)! = 0) {}
delay(50);
}
All that's left is de RCTime-routine hoffelijkheid van Parallax (http://learn.parallax.com/KickStart/555-27401), die de sensorgegevens QTI verwerft. Het werkt door het meten van de tijd van de geen kwijting van een condensator via een weerstand van de variabele (afhankelijk van de hoeveelheid teruggekaatste IR).
lange RCTime (int sensorIn) {}
lange duur = 0;
pinMode (sensorIn, OUTPUT); Maken van pin OUTPUT
digitalWrite (sensorIn, hoge); PIN HIGH (geen kwijting condensator)
delay(1); Wachten van 1ms
pinMode (sensorIn, INPUT); Maken van pin INPUT
digitalWrite (sensorIn, laag); Uitschakelen interne pullups
while(digitalRead(sensorIn)) {/ / pin te laag gaan wachten
duur ++;
}
retourneren van duur;
}