Bin neu hier und habe leider nur wenig programmier Erfahrung.
Ich möchte die Zeit zwischen zwei steigenden Flanken messen.
Sprich:
Auf Eingang 2 hängt ein Sensor, auf Eingang 3 hängt ein Sensor.
Als erster kommt immer Eingang2 , dann einige Sekunden oder ms später kommt Eingang3, die Zeit möchte ich messen und dann daraus die Geschwindigkeit messen.
Kann mir hier jemand einen Codeansatz machen!?
Danke im Voraus
tschiesi:
Ich möchte die Zeit zwischen zwei steigenden Flanken messen.
Sprich:
Auf Eingang 2 hängt ein Sensor, auf Eingang 3 hängt ein Sensor.
Als erster kommt immer Eingang2 , dann einige Sekunden oder ms später kommt Eingang3, die Zeit möchte ich messen und dann daraus die Geschwindigkeit messen.
Kann mir hier jemand einen Codeansatz machen!?
Du ermittelst den Zeitpunkt, an dem Eingang 2 auf HIGH wechselt
Du ermittels den Zeitpunkt, an dem Eingang 3 auf HIGH wechselt
Zum selben Zeitpunkt wie unter 2. ermittelst Du die Zeitdifferenz aus den beiden Zeitpunkten
Je nach gewünschter zeitlicher Auflösung verwendest Du zur Feststellung von Zeitpunkten die millis() oder die micros() Funktion.
Die Daten kannst Du hinterher aus dem Seriellen Monitor herauskopieren in die Zwischenablage und von dort in anderen Programmen einfügen, oder in eine Textdatei einfügen und abspeichern.
Unter Windows Kopieren in die Zwischenablage:
Gewünschten Bereich mit der Maus markieren, dann Tastenkombination Strg-C
Du ermittelst den Zeitpunkt, an dem Eingang 2 auf HIGH wechselt
Du ermittels den Zeitpunkt, an dem Eingang 3 auf HIGH wechselt
Zum selben Zeitpunkt wie unter 2. ermittelst Du die Zeitdifferenz aus den beiden Zeitpunkten
Jurs ???
Wenn schon so ähnlich , dann:
void loop ()
{
while(digitalRead(LS_1) == LOW) ;
start = millis(); // LS_1 ist jetzt nicht mehr LOW
while(digitalRead(LS_2) == LOW) ;
dauer = millis()-start;
Serial.print(dauer); Serial.println ( " ms ");
while ( digitalRead(LS_1) == HIGH || digitalRead(LS_2) == HIGH ) { /* warten bis beide wieder LOW sind */ }
}
Gibt es eine Möglichkeit, dass ich die beiden Lichtschranken erst wieder mit einem Tastaturdruck (Enter) "scharf stelle"?
Was das ganze im Endeffekt werden soll ist eine Geschwindigkeitsmessung für ein Radrennen. Dafür möchte ich noch vorher jeweils eine Starnummer hinterlegen, und dann sollten die Daten alle in eine Excel geschrieben werden!?
Ist das möglich?
Wenn ja, könnt ihr mir da etwas helfen?
Danke im Voraus!
tschiesi:
Gibt es eine Möglichkeit, dass ich die beiden Lichtschranken erst wieder mit einem Tastaturdruck (Enter) "scharf stelle"?
Unter Sehr dringend Hilfe für Stoppuhr benötigt - #51 by jurs - Deutsch - Arduino Forum habe ich gerade einen Sketch für eine Lichtschranken-Zeitmessung gepostet, der nach Abschluss der Messung in eine Endlosschleife geht und dann nichts mehr macht. Ein "Reset" des Controllers stellt dann erneut die Messbereitschaft her. Man kann es natürlich auch so machen, dass über ein Kommando von der seriellen Schnittstelle wieder auf Messbereitschaft geschaltet wird.
tschiesi:
Was das ganze im Endeffekt werden soll ist eine Geschwindigkeitsmessung für ein Radrennen. Dafür möchte ich noch vorher jeweils eine Starnummer hinterlegen, und dann sollten die Daten alle in eine Excel geschrieben werden!?
Ist das möglich?
Datenformate, die sich leicht schreiben und von Excel lesen lassen, sind zum Beispiel "CSV" (Comma Seperated Values). Solche Daten sind Textformate, die sich leicht erzeugen lassen.
Du müßtest Dir nur überlegen, wo die Daten gespeichert werden sollen. Dabei stellt sich die Frage, ob Du sehr viele Startnummern und sehr viele Zeiten messen möchtest. Oder vielleicht nur 100 bis 200.
Zum Speichern großer Datenmengen kommen SD-Karten in Frage. Dann müßtest Du den Arduino mit SD-Kartenhardware ausrüsten. Zum Speichern kleiner Datenmengen kommt der im Chip eingebaute EEPROM-Speicher in Frage, der beim UNO 1 KB groß ist. Also wenn Du beispielsweise eine Startnummer zwischen 0 und 255 und eine Zeit in Millisekunden pro Messwert in 5 Bytes abspeicherst, würden ca. maximal 200 Messungen im EEPROM speicherbar sein.
ist auch eine Flankenmessung an einem Pin möglich?
Habe einen Universalencoder mit 8 Polen und würde gerne die Zeit zwischen 2 Flanken messen um die Geschwindigkeit 2 Motoren aneinander anzupassen.
den alten Skatch solltest Du nicht nehmen der blokiert alles. Und da Du ja sonst noch was anderes machen willst geht das nicht.
Ich hab hier mal was rausgesucht aus meinen ersten gehversuchen mit dem UNO.
eventuell must Du bei dem lesen des Einganges das invertieren rausnehmen.
Wenn Dein Encoder schnell dreht , und dein übriges Programm lange läuft , kann es sein das Du eventuell mit Interrupt arbeiten must. Da hab ich aber noch keine Ahnung von.
Gruß Heinz
// Taster angeschlossen zwischen pin2 und 0V
int taster = 2;
unsigned long startzeit;
bool flag;// Hilfsflag
bool s_taster;// Pegel Taster
void setup() {
pinMode(taster, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
s_taster = !digitalRead(taster); // Taster invertiert lesen
if (s_taster && !flag) {
flag = true ;
startzeit = micros();
//delay(10);// zum entprellen
}
else if ( !s_taster && flag) {
flag = false ;
float messung = (micros() - startzeit) / 1000.0;
Serial.print("Taster war gedrückt für ");
Serial.print( messung, 3); Serial.println(" ms");
//delay(10);// zum entprellen
}
}
wenn du dich mit den universellen Pin Interrupt auseinandersetzen möchtest, die Funktion haben viele Pins, an PCINTx erkennbar, nicht verwechseln mit INTx, dann kann ich dir ein Bsp. geben. Dazu µC Manual aufschlagen unter "external interrupts" und lesen. Dann kannste mit Bitmaskierung deine Zustände oder Flanken selbst auswerten und hast mehr Pins zur Verfügung wie nur die zwei INT0 und INT1. Der Vorteil wäre, dass der Zeitpunkt der Feststellung unabhängig von der Programmlaufzeit ist. Wenn dein Programm allerdings nichts weiter macht wäre auch normales Polling ausreichend ohne die Interruptauswertung.