Laserlichtschranke zur Geschwindigkeitsbestimmung

Hallo!
Ich (49 Jahre alt) bin neu hier und beschäftige mich auch erst seit ein paar Tagen mit dem Arduino/Genuino.
Einige Vorkenntnisse (programmieren, Elektronik) sind bei mir aber vorhanden. Erste Versuche mit dem Arduino habe ich auch erfolgreich absolviert. Nun will ich mich meinem ersten Projekt widmen.

Dabei möchte ich die Geschwindigkeit der Kugel beim Kegeln ermitteln. Der Durchmesser der Kugel ist dabei bekannt (16 cm), was dazu führt, dass man nur eine Lichtschranke benötigt.
Mein Schaltplan dazu sieht so aus: (Anhang: “Laser-Lichtschranke.png”)

Und mein Sketch: (Anhang: “Lichtschranke.ino”)

#define PHOTO_TRANSISTOR  A0 // A0 als Eingang für den Photo-Transistor

unsigned int AnalogVal = 0; // Sensordaten speichern
unsigned int TresholdVal = 700; // Analogwert für High/Low-Übergang
byte BowlDiameter = 16; // Durchmesser der Kegelkugel (in cm)
unsigned long CurrentMicros = 0;  // Microsekunden-Zwischenspeicher
unsigned long Darktime = 0; // Lichtschranken-Unterbrechungszeit (Mikrosekunden)
float Speed = 0; // Geschwindigkeit (km/h)

void setup() {
  pinMode(PHOTO_TRANSISTOR, INPUT); // A0 auf Eingang schalten
  Serial.begin(9600); // Serielle Kommunikation zum PC mit 9600 bps
  Serial.println("Geschwindigkeitsmessung aktiv!");
}

void loop() {
  // warten, bis der Photo-Transistor in den Sperrzustand geht (Lichtschranke wird unterbrochen)
  do {
    AnalogVal = analogRead(PHOTO_TRANSISTOR);
  } while (AnalogVal < TresholdVal);
  
  CurrentMicros = micros(); // aktuellen micros-Wert speichern

  // warten, bis der Photo-Transistor wieder durchschaltet (Lichtschranke nicht unterbrochen)
  do {
    AnalogVal = analogRead(PHOTO_TRANSISTOR);
  } while (AnalogVal > TresholdVal);
  
  Darktime = micros() - CurrentMicros; // die Differenz zum gespeicherten Wert ist die Dunkelzeit
  
  Serial.print("Dunkelzeit: ");
  Serial.print(Darktime);
  Serial.println(" Mikrosekunden");
  
  Speed = BowlDiameter / float(Darktime) * 36000; // umrechnen in km/h
  
  Serial.print("Geschwindigkeit: ");
  Serial.print(Speed);
  Serial.println(" km/h");
}

Auf meinem Schreibtisch funktioniert das auch ganz gut. Das Laser-Modul ist so hell, dass der Photo-Transistor voll durchschaltet und auch der Dunkelwert ist mehr als ausreichend (Treshold-Wert habe ich mal willkürlich auf 700 gesetzt).

Im Moment betreibe ich das Laser-Modul noch mit einem Extra-Netzteil. Das soll später dann mit an die Stromversorgung des Arduino. Es soll dann auch noch eine Anzeige (4 x 7-Segment-Display) dazukommen.

Nun ist meine Frage, ob das so optimal ist oder ob man da noch etwas verbessern kann?

Lichtschranke.ino (1.44 KB)

Sieht doch gut aus soweit, hast du es mal mit einem Digitaleingang ausprobiert?

Zitat hier aus dem Forum: "Ein Programm, das tut, was es soll, ist ein gutes Programm!" Also auf die Schulter klopfen und freuen!

slartibartfast: Nun ist meine Frage, ob das so optimal ist oder ob man da noch etwas verbessern kann?

Solltest Du weitere Funktionen ergänzen wollen, könnte die blockierende do/while-Schleife zum Problem werden.

Auch benötigt die AD-Wandlung Zeit, die zu Ungenauigkeiten führt. Im Datenblatt lese ich "13 - 260μs Conversion Time". Ein digitaler Eingang, möglicherweise verknüpft mit einem Interrupt, könnte hier mehr Genauigkeit bringen.

Laßt beim Brechen von Geschwindigkeitsrekorden die Kegel heil, gut Holz!

Ich habe es noch nicht mit einem Digital-Eingang versucht, aber ich denke, so hochgenau muss es gar nicht sein und ob das nun 260μs mehr oder weniger sind, macht dann auch nichts. Von der Geschwindigkeit hängt ja keine Platzierung ab. Das soll ja nur ein Gimmick sein. :)

Das 4fach 7-Segment-Display (über I2C) für die Geschwindigkeitsanzeige habe ich jetzt auch angeschlossen. Das funktioniert auch einwandfrei! :)

Jetzt muss das Ganze nur noch richtig verkabelt (gelötet) und in entsprechende Gehäuse verpackt werden. Mal schauen, ob ich das bis zum nächsten Kegeltermin hinkriege.

Eine Frage hätte ich noch, die nicht direkt mit dem Projekt zu tun hat: Wenn ihr mit einem Projekt fertig seid und etwas Neues anfangt, versetzt ihr dann den Arduino in "Werkszustand"? Ich meine, da ist ja ein Sketch geladen, der verschiedene Ports auf Ein-/Ausgang schaltet und wenn man dann mit einer neuen Hardware-Verkabelung anfängt, dann könnte das ja zu Komplikationen führen. Was wäre denn da am Besten? Alle Ports als Eingang schalten und einen leeren Sketch hochladen?

Es reicht auch erst mal alle externe Hardware zu entfernen und dann den neuen Sketch hochladen. Dann kannst du das Zeug anstecken.

Ein leerer Sketch geht natürlich auch.

Wenn ihr mit einem Projekt fertig seid und etwas Neues anfangt, versetzt ihr dann den Arduino in "Werkszustand"? Ich meine, da ist ja ein Sketch geladen, der verschiedene Ports auf Ein-/Ausgang schaltet und wenn man dann mit einer neuen Hardware-Verkabelung anfängt, dann könnte das ja zu Komplikationen führen. Was wäre denn da am Besten? Alle Ports als Eingang schalten und einen leeren Sketch hochladen?

Ich lade einen Sketch, von dem ich genau weiß, was er macht - z.B. "Blink", bevor ich den ausgebauten Arduino neu verkable. Und Pin 13 lasse ich wenn möglich immer frei, damit ich die "Statusled" später für Zustandsanzeigen (Blinksequenzen) benutzen kann.

Gruß,

Helmuth

Möglicherweise wirst du ein Problem mit Fremdlicht bekommen, wenn die Fotozelle Licht von der Seite erwischt. Auf der sicheren Seite bist du mit moduliertem Licht. Dazu hast du 2 Möglichkeiten: In Hard- oder in Software. Es gibt für Fernbedienungen Empfangsmodule, die meist auf 36 KHz empfundlich sind. Kannst natürlich auch mit einem einfachen Fototransistor arbeiten und vom µC die "Sortierung" erledigen lassen. Ein weiterer Punkt ist, das es unterschiedlich schwere Kugeln gibt, die unterschiedliche Durchmesser haben und somit die Lichtschranke unterschiedlich lange abdunkeln. 2 Lichtschranken beheben das Problem ;)

offtopic: es gibt beim Kegeln auch unterschiedliche Kugeln?

Misst du eigentlich direkt am Anfang, in der Mitte oder erst kurz vor den Kegeln?

gruß

Ja, es gibt unterschiedliche Kugeln! Bei uns aber nur 16 cm für die Erwachsenen und 14 cm für die Kinder.

Das Problem mit dem Fremdlicht sehe ich im Moment nicht. Der Laserstrahl ist derart hell, dass das Fremdlicht schon sehr hell sein müsste, um zu stören. Meine 10 W-LED-Taschenlampe schafft das zwar, aber ich denke, dass die normale Zimmerbeleuchtung nicht stört.
Ich werde aber wohl noch ein schwarzes Pappröhrchen oder so vor den Photo-Transistor anbringen, dann dürfte auch das seitliche Licht kein Problem sein.

Achso, und messen werde ich wohl so 1 bis 2 Meter hinter dem Aufsatzpunkt.

Der Ansatz mit dem fixen Durchmesser ist ja echt hardwareschonend. Aber ist es nicht besser, hier universell durch den minimalen Einsatz eines zweiten Pointers mit Empfänger Eventualitäten auszuschließen?

Und nebenbei gefragt: wie schnell sausen denn so Kügelchen durch die Gegend?

Klaus_ww: Der Ansatz mit dem fixen Durchmesser ist ja echt hardwareschonend. Aber ist es nicht besser, hier universell durch den minimalen Einsatz eines zweiten Pointers mit Empfänger Eventualitäten auszuschließen?

Ich will erstmal die "kleine" Variante testen. Mit zwei Lichtschranken wäre die Größe der Kugel egal. Wobei man auch mit einem Laser-Modul und einer Photodiode auskommen kann, wenn man beide auf einer Seite anbringt (im Abstand von z.B. 50 cm) und auf der gegenüberliegenden Seite den Laserstrahl mit 2 Spiegeln (jeweils im 45 Grad Winkel und wieder im Abstand von 50 cm) entsprechend umlenkt. Der Aufwand beim ausrichten ist aber viel höher als bei der "kleinen" Variante.

Klaus_ww: Und nebenbei gefragt: wie schnell sausen denn so Kügelchen durch die Gegend?

Tja, genau das weiß ich ja noch nicht.

Ich möchte mal berichten, wie der Praxistest ausgefallen ist. :slight_smile:

Doch zunächst: Ich habe mich dann doch für die Version mit den zwei Spiegeln und somit gegen die “einfache” Version entschieden. Das hatte zwei Gründe:

  1. Laser-Modul und Photo-Transistor + Arduino Nano wären auf den gegenüberliegenden Seiten der Kegelbahn. Das hätte ich aber mit einer extra Stromversorgung (Akkupack) für das Laser-Modul noch in den Griff bekommen.
  2. Die Ausrichtung des Laser-Moduls und des Photo-Transistors hätten höhenverstellbar sein müssen, weil bei der “einfachen” Variante der Durchmesser der Kugel Geschwindigkeitsbestimmend ist und somit der Laserstrahl die Kugel genau auf der Kugelhälfte treffen muss.

Deswegen wurde daraus dann doch die 2-Spiegel-Variante.
Hier mal ein Bild, wie der Aufbau jetzt im Praxistest aussah: (siehe Bild im Anhang)

Die Ausrichtung der Spiegel war dank des sichtbaren Laserstrahls und der vertikal schwenkbaren Spiegel schnell gemacht und erwies sich als erstaunlich stabil. Das Fremdlicht (Deckenbeleuchtung) machte keine Probleme und mein Programm brachte plausible Ergebnisse.

Einzig die Powerbank schaltete sich anfangs immer ab, weil die Schaltung unterhalb des Mindeststroms blieb. Ich habe dann die 7-Segment-Anzeige in den Pausen auf “8888” gestellt, sodass die Schaltung mehr Strom zieht. Das reichte dann aus, um die Powerbank am auschalten zu hindern.

Das Ganze lief über 3 Stunden erfolgreich im Dauereinsatz und die Powerbank zeigte am Ende immer noch 4 LEDs (75-100%) an.

Wir erreichten dabei Geschwindigkeiten von 12 bis 25 km/h (je nach Kegler).
Bemerkenswert dabei war auch, dass jeder Kegler so “seine” Geschwindigkeit hat.

Alles in allem ein gelungenes Projekt und einige staunende Kegler. :slight_smile:

Sehr cool - und noch besser, dass es funktioniert!

Und dass Du hier Rückmeldung gibst ;)

slartibartfast: Alles in allem ein gelungenes Projekt und einige staunende Kegler. :)

So soll es sein! Danke für die Rückmeldung!

Wenn Du magst, kannst Du ein Foto in unsere Projektsammlung zur Inspiration für andere einstellen.