Sturzi's Arduino-Bastelprojekt #2 - Speed-o-Meter und Rundenzähler mit Infrarot-Lichtschranken

  • Ja, so gäbe es schon einen Kurzen. Ich hoffe, es ist nichts kaputt gegangen.


    Das ist aber nicht meine vorgeschlagene Schaltung. Die Schaltung muss so sein wie im Beitrag 74. Also nichts von Pluspool. Der Arduino-Eingang wird ja durch den integrierten Pullup-Widerstand hochohmig auf 5V hochgezogen. Wenn der Schalter gedrückt wird, geht die Spannung auf 0V und das kann durch die Software erkannt werden.

  • Hallo Röbi

    Ich habe diesen Widerstand ersatzlos entfernt. Damit entspricht die Schaltung Deiner Vorlage und funktioniert tadellos.


    Mir gefällt übrigens die Kombination zwischen dem Programmieren am Computer und den Arbeiten am Steckbrett und Arduino sehr.


    Gruss

    Peter

  • Tja Freunde


    Wer keinen 3D Drucker besitzt, muss sich zu helfen wissen :love:


    Jetzt freu ich mich nur noch auf den Projektabschluss 8)


    Bischi :hi:

  • Letzter Schritt zum funktionierenden Speed-o-Meter


    Gerade noch rechtzeitig vor Weihnachten hilft dieser letzte Schritt zum fertig funktionierenden Speed-o-Meter.


    In der loop() Funktion fehlen noch zwei Code-Blöcke:

    Code
       case PHASE_TIMING_IN_PROGRESS:
            // fehlender Code-Block
        break;
    
        case PHASE_WAITING_FOR_TAIL_END:
            // fehlender Code-Block
        break;


    Der erste fehlende Code-Block (beim case PHASE_TIMING_IN_PROGRESS) sieht so aus:

    Code
        if (((currentDir == 0) && rightBeamActive) || ((currentDir == 1) && leftBeamActive)) {
          mesauredTime = (millis() - millisOnBeginOfPeriod) / 1000.0;
          lapCount[currentDir]++;
          phase = PHASE_WAITING_FOR_TAIL_END;
          calculateDisplayValues(currentDir);
          displayResults();
          displayWaitingStatus();
          millisOnBeginOfPeriod = millis();
        }

    Zeile 1: Wenn die aktuelle Messrichtung 0 ist (also von links nach rechts) und die rechte Lichtschranke angesprochen hat ODER wenn die aktuelle Messrichtung 1 ist (also von rechts nach links) und die linke Lichtschranke angesprochen hat, dann bedeutet das das Ende der Zeitnahme.


    Zeile 2: Wir holen erneut die aktuelle Zeit (millis() ) und subtrahieren davon die Zeit, die wir zu Beginn der Messung genommen haben. Wenn wir die Millis durch 1000 dividieren, erhalten wir nun die Sekunden, welche die Messung gedauert hat.


    Zeile 3: Für die aktuelle Messrichtung erhöhen wir den Rundenzähler um 1.


    Zeile 4: Die aktuelle phase ist abgeschlossen. Für den nächsten Durchlauf durch die loop() Funktion setzen wir die Variable auf die nächste Stufe PHASE_WAITING_FOR_TAIL_END.


    Zeilen 5 bis 7: Wir berechnen die neuen Werte und zeigen sie an. In der Anzeige müsste rechts ein Stern erscheinen. Dieser zeigt an, dass wir daran sind, die Schutzzeit abzuwarten.


    Zeile 8: Um jetzt die Schutzzeit noch abzuwarten, nehmen wir erneut die aktuelle Zeit in Millis.



    Und dann noch der zweite fehlende Code-Block (beim case PHASE_WAITING_FOR_TAIL_END):

    Code
        if (leftBeamActive || rightBeamActive) {
          millisOnBeginOfPeriod = millis();
        } else if ((millis() - millisOnBeginOfPeriod) > MILLIS_TO_WAIT_TO_GET_READY_AGAIN) {
          phase = PHASE_READY;
          displayWaitingStatus();
        }

    Wir sind nun daran, die Schutzzeit abzuwarten. Während der Schutzzeit (im Moment eingestellt auf 3000 Millisekunden) darf keine der beiden Lichtschranken ansprechen. Spricht trotzdem eine an, wird die Zeitnahme für die Schutzzeit erneut gestartet und wir müssen ab dann wieder die ganze Schutzzeit abwarten.


    Zeile 1: Wenn eine der beiden Lichtschranken anspricht, müssen wir wieder von vorne beginnen mit dem Abwarten der Schutzzeit.


    Zeile 2: Erneutes Starten der Zeitnahme


    Zeile 3: Ist die Schutzzeit schon um?


    Zeilen 4 und 5: Die Schutzzeit ist um. Wir können die Phase wieder auf den Initialwerte PHASE_READY setzen und die Anzeige aktualisieren. Der Stern ganz rechts in der Anzeige müsste verschwinden und das Gerät ist bereit für die nächste Messung.



    Das war's dann. Das Speed-o-Meter müsste jetzt funktionieren. Ich freue mich über jede Erfolgs-Meldung. Über Misserfolge freue ich mich natürlich nicht, bin aber gerne bereit zu helfen, bis daraus eine Erfolgs-Meldung entsteht.


    Ich werde wiederum das ganze Programm (in zwei Versionen) posten, muss dazu aber neue Beiträge starten (weil dieser sonst zu gross würde).

  • Fertiges, vollständiges Programm für diejenigen mit Keypad-Shield (Typen C und D)


  • Fertiges, vollständiges Programm für diejenigen mit Typ A


  • Funktioniert wundebar! Soeben den Weihnachtszug eingemessen. Er soll ja gemächlich um den Baum fahren…


    Danke Röbi!

    Bischi :hi:

  • Hoi Röbi

    Für deinen riesigen Einsatz danke ich dir herzlich. Heute ist mein neuer Laptop zwar angekommen, aber der IT-Spezialist ist bereits in den Ferien. Es geht erst ab 3. Januar weiter. Vorher kann ich leider nicht prüfen, ob es bei mir läuft. Ich werde mich aber bestimmt melden. Nun wünsche ich dir frohe Festtage und einen guten Rutsch!

    Beste Grüsse

    Oski

    signatur_egos.jpg

    ...auch Nichtraucher können süchtig sein nach Zündhölzern!

  • Hallo Röbi

    Dank Kopieren und Einsetzen, leichte Konfiguration für den Typ B und anschliessender Korrektur der unumgänglichen Tippfehlern funktioniert das Gerät.

    Gruss


    Peter

  • Die Distanz der Lichtschranken im Programm angepasst, ein Kabel um 180° gedreht eingesteckt, bzw. Pin 4 statt 5 genutzt und es läuft. Besten Dank Röbi.

    Gruss Erwin



    Wer rast, der verpasst das Leben.


    Kein Platz für weitere Sammelstücke ist nur eine faule Ausrede. ;) Es gibt für alles eine Lösung.

  • Habe ich das bei der Auslieferung verkehrt herum eingesteckt?

    Nein, ich habe es noch auf dem Breadboard aufgebaut und eines der konfektionierten Kabel dafür verwendet.

    Gruss Erwin



    Wer rast, der verpasst das Leben.


    Kein Platz für weitere Sammelstücke ist nur eine faule Ausrede. ;) Es gibt für alles eine Lösung.

  • Hallo Röbi

    Auch ich habe die definitive Version deines Programms geladen. Einfach genial wie es funktioniert. Nach dem ich meine Rechenkünste im Abstand umrechnen in Millimeter der Lichtschranken bestanden habe, stimmten auch die Werte. 90 statt 900 :facepalm: :rolleyes:

    Ich möchte mich herzlich für deine Zeit und Geduld dieser interessanten Arduino Aufgabe bedanken. Es hat mir grossen Spass gemacht und ich habe viel gelernt dabei. Ich denke nicht das ich desswegen schon so weit wäre ein eigenes Programm zu schreiben aber die Grundschritte verstehe ich unterdessen. :thumbup:

    Über die Weihnachtszeit steht die Messung unter dem Christbaum und wird genutzt.

    Nochmals vielen Dank. Ich wünsche dir lieber Röbi und allen anderen Moba Kollegen schöne Weihnachtstage, geniesst die Zeit und bleibt gesund.


  • Hallo Röbi


    Dein Arduino Speed-O-Meter ist einfach nur ganz grosse Klasse.


    Natürlich hat nicht immer alles sofort funktioniert. Tipp- und Syntaxfehler sind ärgerlich, aber der Compiler hilft bei der Fehlersuche, sofern man (ich) versteht was er meint - er hat bekanntlich immer recht.


    Wenn das Programm endlich auf dem Board ist, macht es entweder nichts oder irgend einen Mist. Fluchen nützt nicht, aber es hilft. Pause einschalten, Kaffee machen, sich beruhigen und dann ganz entspannt einen Fehler um den andern suchen.


    Und wenn dann alles wie erwartet läuft ist man (wieder ich) schon ein wenig stolz, und freut sich, fast schon kindisch.


    Ganz grosses Kino, das Du Röbi uns da geboten hast. Danke!

    Gruss
    Kurt

  • Hallo Röbi,


    Auch bei mir funktioniert alles Tip-Top! Werde nun die beiden Sensoren auf meiner Teststrecke fix einbauen.


    Besten Dank für Dein interessantes und lehrreiches Projekt.


    Guten Rutsch ins 2023


    Roland