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);
}