Geschwindigkeitsmessung

Hallo,

Ich möchte eine Geschwindigkeitsmessung mit zwei Lichtschranken Realisieren.

Fährt ein Objekt in die erste Lichtschranke hinein soll eine Zeit gestoppt werden bis die Zweite Lichtschranke durchfahren wird.

Der Abstand der Lichtschranken ist fest (0,5m)

Mit dieser Zeit soll die geschwindikeit berechnet werden.

Ideen?

Gruss

Dennis

Was für eine Idee brauchst du noch?
Du hast doch alles wichtige genannt.

Außer, dass die Zeit in der ersten Lichtschranke nicht gestoppt, sondern gestartet (speichern) werden soll und in der zweiten dann gestoppt wird. Mit der Differenz der beide Zeiten kannst du dann rechnen.

Ich hab auch keine Idee, welche Ideen Du noch brauchst.
Von welcher Geschwindigkeit / Zeit reden wir?
Informiere Dich über millis() bzw micros() und Interrupt.

Grüße Uwe

Ich weis nicht wie die Zeitgestetet werden kann und wie ich sie dann am besten weiterverarbeite so das ich damit auch rechnen kann sowie ich das Lese wohl mit Interrupt Stimmt das?

DeBran:
Ich weis nicht wie die Zeitgestetet werden kann und wie ich sie dann am besten weiterverarbeite so das ich damit auch rechnen kann sowie ich das Lese wohl mit Interrupt Stimmt das?

Das sind genau die Dinge, wie Uwe schon schreibt, über die du dich informieren muss.

Da gibt es im Netzt sehr viele Infos drüber, aber lesen muss du schon. :wink:

In der Interruptroutine speicherst Du die Zeit von millis() bzw micros() in einer Variablen ab und berechnest daraus die Zeitdifferenz und dadurch die Geschwindigkeit.

Grüße Uwe

Mach dir mal einen Ablaufplan (Flowchart) mit den einzelnen Funktionen des Programms. Dann kommst du an das umsetzte.
-Lichtschranken auswerten am Arduino
-Zeitstempel speichern über Interrupts speichern
-Berechnung der Geschwindigkeit etc.

Alles schön trocken testen und zusammensetzten. Und bei Problemen mit Programmnen Schaltplan und Programm (Sketch) hier rein und dann bekommst du Hilfe. Hier gibt es extrem gute Hilfe zur Selbsthilfe, keiner bzw ganz wenige schreiben dir hier fertige Programme.

Gruß
DerDani

Ein Paar Links:
Link1
Link2

Ich habe mal eine Implementation hingeschrieben (zur meiner Übung, nicht zu deiner Demotivation).

Ich verwende zwei Taster mit Pullup zur Simulation der Lichtschranken.
Um die Übergangserkennung zu vereinfachen benutze ich Bounce2.
Funktioniert in beide Richtungen.

#include <Bounce2.h>

// Lichtschranken Zeitmessung
// Eingabesimulation mit Tasten (INPUT_PULLUP)

typedef enum Zustand {
  warte = 1,
  vonRechts,
  vonLinks,
  gemessen,
} tZustand;

void naechsterZustand(const __FlashStringHelper* msg, tZustand neuerZustand);

const byte lsLinksPin = 2;
const byte lsRechtsPin = 3;

int aktuellerZustand;
bool uebergaengeAnzeigen = false;

Bounce SchrankeL;
Bounce SchrankeR;

unsigned long WertLinks;
unsigned long WertRechts;

unsigned long Ergebnis;

unsigned long topLoop;
unsigned long zustandErreicht;

void setup() {
  SchrankeL.attach(lsLinksPin, INPUT_PULLUP);
  SchrankeR.attach(lsRechtsPin, INPUT_PULLUP);
  Serial.begin(115200);
  naechsterZustand(F("Mess-Lichtschranke"), warte);
}

void loop() {
  topLoop = micros();
  SchrankeL.update();
  SchrankeR.update();
  switch (aktuellerZustand) {
    case warte:
      if (SchrankeR.fell()) {
        WertRechts = topLoop;
        naechsterZustand(F("erst Rechts"), vonRechts);
      }
      if (SchrankeL.fell()) {
        WertLinks = topLoop;
        naechsterZustand(F("erst Links"), vonLinks);
      }
      break;
    case vonRechts:
      if (SchrankeL.fell()) {
        WertLinks = topLoop;
        Ergebnis = WertLinks - WertRechts;
        naechsterZustand(F("dann Links"), gemessen);
      }
      break;
    case vonLinks:
      if (SchrankeR.fell()) {
        WertRechts = topLoop;
        Ergebnis = WertRechts - WertLinks;
        naechsterZustand(F("dann Rechts"), gemessen);
      }
      break;
    case gemessen:
      Serial.print(F("Dauer "));
      Serial.print(Ergebnis);
      Serial.println(F(" micro Sekunden"));
      naechsterZustand(F("naechste Messung"), warte);
      break;
  }
}

void naechsterZustand(const __FlashStringHelper* msg, tZustand neuerZustand) {
  if (msg != NULL) {
    Serial.println(msg);
  }
  if (neuerZustand == warte) {
    Serial.println(F("warte..."));
  }
  zustandErreicht = millis();
  if (uebergaengeAnzeigen) {
    Serial.print(zustandErreicht);
    Serial.print(F(" von "));
    Serial.print(aktuellerZustand);
    Serial.print(F(" in "));
    Serial.println(neuerZustand);
  }
  aktuellerZustand = neuerZustand;
}
Mess-Lichtschranke
warte...
erst Links
dann Rechts
Dauer 771060 micro Sekunden
naechste Messung
warte...
erst Rechts
dann Links
Dauer 971768 micro Sekunden
naechste Messung
warte...

Dann im fertigen Projekt braucht eine Lichtschranke keine Entprellung weil sie nicht prellt.
Grüße Uwe

Ich hab damals eine Geschwindigkeitsanzeige für einen Kicker gebaut. Vielleicht hilft dir das weiter. Jegliche Beschreibungen und Downloads sind dabei.

Geschwindigkeitsmessung für einen Kicker