Tijd & Snelheid
Doel
Het toestel dat je in dit project maakt, meet tijden met een resolutie van 4!! microseconden. We gebruiken twee infrarode lichtsluizen – één om de tijd te starten en één om de tijd te stoppen. Als processor gebruiken we aan Brainbox AVR (Arduino). Voor amper 75€ maakt u zelf dit toestel om tijd, snelheid en versnelling te meten, helemaal op maat van uw labo Fysica! Een mooie link tussen Fysica en Engineering dus.
Uitleg schema
Deze tijdmeting wordt gestart en gestopt met twee IR lichtsluizen. Een meer gedetailleerde uitleg van deze led/sensor combinatie kan u via deze link terugvinden. Als processor gebruiken we het ‘made in Flanders’ Arduino Leonardo bordje Brainbox AVR. De IR leds trekken nogal wat stroom. We maken dan ook dankbaar gebruik van 2 van de 4 power-outputs die standaard op de BBA aanwezig zijn. De sensorwaarden worden digitaal (1 of 0) ingelezen op ingang 23 en 18. Na de STOP meting wordt het resultaat berekend en via de USB kabel doorgestuurd naar de ‘Serial Monitor’ van de PC.
Aankopen pakket spectrofotometer:
Pakket TIJD & SNELHEID bestaande uit:
- 2x IR led, 2x IR sensor
- Nodige kabels en weerstanden
(Dit pakket is nog zelf te solderen – indien nodig kan hier ondersteuning voor zijn)
Code spectrofotometer
/* januari 2018 www.e2cre8.be bart Huyskens gebruikte hardware: Brainbox AVR : https://e2cre8.be/?page_id=21 tijdsmeting op lat van 1 meter tussen twee x InfraRood lichtsluis afstand tussen lichtsluizen in 1 meter aansluiting : https://e2cre8.be/wp-content/uploads/2015/12/I-DIG-LIGHT-BEAM-NEW-HW-NL.pdf micros: Returns the number of microseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 70 minutes. On 16 MHz Arduino boards (e.g. Duemilanove and Nano), this function has a resolution of four microseconds (i.e. the value returned is always a multiple of four). millis: Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days. */ // Namen geven aan pinnummers const int IRSENS_0 = 23; const int IRSENS_100 = 18; // Variabelen (kunnen veranderen tijdens het programma) int IR_0_STATE = 0; // status sensor op afstand 0 int IR_100_STATE = 0; // status sensor op afstand 100 unsigned long copy_micros = 0; // aantal microseconden sinds start programma - kan zeer groot worden unsigned long start_micros = 0; // aantal microseconden sinds start programma - kan zeer groot worden float tussensom = 0; // float kan kommagetal bevatten float snelheid = 0; // float kan kommagetal bevatten void setup() { pinMode(IRSENS_0, INPUT); // Intitialisser deze pin als input: pinMode(IRSENS_100, INPUT); // Intitialisser deze pin als input: pinMode(5, OUTPUT); // pin 5 is power output pin van Brainbox AVR - stuurt IR led 0 pinMode(6, OUTPUT); // pin 5 is power output pin van Brainbox AVR - stuurt IR led 100 digitalWrite(5, HIGH); // zet IR led 0 aan digitalWrite(6, HIGH); // zet IR led 100 aan Serial.begin(9600); // instelling serial monitor while(!Serial){} // wacht hier tot de Serial monitor correct opgestart is delay(1000); // wacht nog 1 sec voordat deze tekst verschijnt Serial.println("De tijd tussen het onderbreken van lichtsluis 1 en lichtsluis 2"); Serial.println("wordt gemeten in microseconden"); Serial.println("Resolutie: 4 microseconden, Maximale tijd meetbaar = 70 minuten"); Serial.println(""); } void loop() { IR_0_STATE = digitalRead(IRSENS_0); //lees IR lichtsluis pos0 in while (IR_0_STATE == HIGH) // IR lichtsluis waar niets tussen staat is hoog { IR_0_STATE = digitalRead(IRSENS_0); // zolang er niets tussen staat - blijf hier wachten } // deze instructies worden uitgevoerd als sensor 1 een voorwerp detecteert copy_micros = 0; // zet tijd op 0 start_micros = micros(); // copieer de huidige waarde van micros in deze var IR_100_STATE = digitalRead(IRSENS_100); // lees eerst de waarde van IRsens 100 al 1x in while (IR_100_STATE == HIGH) // blijf in deze loop hangen zolang sensor 2 geen voorwerp ziet { IR_100_STATE = digitalRead(IRSENS_100); } copy_micros = (micros()-start_micros); // bereken de verstreken tijd in usec en zet deze in de var copy_micros snelheid = (1000000.0/((float)copy_micros)); // bereken snelheid in m/sec - als je een kommagetal als resultaat wenst, moet alle data van het type float zijn. // schrijf resultaat naar serial monitor Serial.print("verstreken tijd in microseconden: "); Serial.print(copy_micros); Serial.print(" snelheid in m/sec: "); Serial.println(snelheid); }