Go Down

Topic: Dunkelzeitmessung LDR (Read 298 times) previous topic - next topic

HTML-Fan

#15
Nov 12, 2019, 01:26 pm Last Edit: Nov 12, 2019, 01:45 pm by HTML-Fan
Hallo,
meine Erfahrungen sind mit LDR-Lichtschranken auch überwiegend negativ: Von 100 Messungen funktionieren nur 5 und davon sind 3 seltsam, meine ist nämlich wesentlich schneller als 0.3 km/h. Aber ich hatte auf der anderen Seite der 2cm-breiten Lichtschranke nur einfache LEDs.

Wie gena sieht deine Hardware aus? So:
Code: [Select]

GND --- LDR --+-- [10kO] --- 5V
              |
             A0

Oder so:
Code: [Select]

5V --- LDR --+-- [10kO] --- GND
             |
            A0


Welchen Durchmesser haben die Kugeln und wie lange soll der Apparat ohne Reset laufen?

HTML-Fan

Diesen Unterschied muss ich dann natürlich im Unterricht thematisieren - was ich aber in diesem Zusammenhang garnicht möchte. Ich muss mich in der Hauptschule auf einzelne Phänomene beschränken und diese abgeschottet betrachten.
Was ist daran das große Problem? "Da sich durch die Reibung und andere Einflüsse wie die Unebenheit der Bahn die Geschwindigkeit der Kugel mit der Zeit verringert, ist die Geschwindigkeit bei der zweiten Messstelle immer ein wenig geringer als die erste Geschwindigkeit.", fertig, das reicht doch als Erklärung. Ich glaube nicht, dass von dir noch die Erklärung über "Energie kann nicht erschaffen oder vernichtet werden" verlangt wird.

HTML-Fan

So könnte das Programm aussehen:
Code: [Select]
#define PULLUP             0

#define AnalogSchranke1    A0
#define DigitalSchranke1   2

#define AnalogSchranke2    A1
#define DigitalSchranke2   3

bool schranke1 = true;
bool schranke2 = true;

int analog(int pin){
  #if PULLUP
    return 1023 - analogRead(pin);
  #else
    return analogRead(pin);
  #endif
}
void schranken(){
  digitalWrite(DigitalSchranke1, LOW);
  digitalWrite(DigitalSchranke2, LOW);
 
  delayMicroseconds(100);
 
  int wert1schranke1 = analog(AnalogSchranke1);
  int wert1schranke2 = analog(AnalogSchranke2);
 
 
  digitalWrite(DigitalSchranke1, HIGH);
  digitalWrite(DigitalSchranke2, HIGH);
 
  delayMicroseconds(100);
 
  int wert2schranke1 = analog(AnalogSchranke1);
  int wert2schranke2 = analog(AnalogSchranke2);
 
  int unterschied1 = wert2schranke1 - wert1schranke1;
  int unterschied2 = wert2schranke2 - wert1schranke2;
 
  if(unterschied1 < 50){
    schranke1 = false;
  }
  if(unterschied1 > 150){
    schranke1 = true;
  }
 
  if(unterschied2 < 50){
    schranke2 = false;
  }
  if(unterschied2 > 150){
    schranke2 = true;
  }
}

void setup(){
  Serial.begin(9600);
  pinMode(DigitalSchranke1, OUTPUT);
  pinMode(DigitalSchranke2, OUTPUT);
  int zeit;
  while(schranke1){
    schranken();
  }
  //uint64_t ist ein Datentyp für riesige Zahlen, denn bei
  //micros kommen sehr hohe Zahlen raus
  uint64_t aktuell = micros();
  while(!schranke1){
    schranken();
  }
  zeit = micros() - aktuell;

  Serial.println(zeit);
}

void loop(){
  //Nichts tun
}

Es werden die Daten über den seriellen monitor ausgegeben. Das setzt vorraus, dass bei AnalogSchranke1 der   Pin, an dem der Sensor angeschlossen ist, und bei Digital der Pin für den Laser eingetragen ist.

Mahimus

Um mal eine alternative Meinung einzubringen: ich kann mir vorstellen, dass die LDRs die Aufgabe erfüllen können, wenn du dir die zeitliche Ableitung der Helligkeit anschaust. Auf die Art hab ich zwar ich nie Geschwindigkeiten gemessen aber zumindest die Reaktionsschnelligkeit deutlich verbessert.

SpaghettiCode

#19
Nov 13, 2019, 10:25 am Last Edit: Nov 13, 2019, 10:27 am by SpaghettiCode
Hi,

mal ein Ausschnitt aus einem PDF von LDRs wie sie einem Beutelweise vom freundlichen Chinesen über den Weg laufen.



Im übrigen muss man Effekte wie Reibung und sonstige Verluste nicht thematisieren, aber erwähnen schon.
In unserer Welt läuft nichts idealisiert ab.

Gruß André

Go Up