Hallihallo. Ich arbeite aktuell daran eine Lichtschranke zu basteln, mit meinem Elegoo Uno R3. Die Schaltung klappt soweit und ein LCD Display habe ich auch angeschlossen, welches mir die Geschwindigkeit, nach Messung angeben soll. Die Lichtschranken (in dem Fall billige Infrarot-Licht Sensoren, welche sowohl Licht abgeben, als auch die Reflexion empfangen, wenn etwas drüber gehalten wird) sind in einem Abstand von 15 cm aufgebaut. Nun laufe ich jedoch in ein Problem. Für kleinere Geschwindigkeiten scheint das ganz zu funktionieren, jedoch nicht, wenn ich bspw. meine Hand einfach mal so schnell ich kann darüber bewege. Daraufhin zeigt mir der Arduino Zahlen an, die so 1. nicht stimmen können 2. einfach ... naja oddly specific sind. Also es ganz zufällig immer die selben Werte sind. Ich werde nicht zufällig immer so genau die selbe Geschwindigkeit schaffen. Mir kommt es dabei so vor, als wenn der Arduino es, bei sehr kleinen Zahlen bezüglich der Zeit, dann einfach nicht schafft das ganze zu rechen und das dann immer dabei raus kommt.
haben die Lichtschranken einen definierten Ruhepegel am Ausgang?
Stichwort Pullup/Pulldown.
Laut Code sind sie Low aktiv. Korrekt?
Eine neue Messung kann erst starten wenn alle Daten der vorherigen Messung ausgegeben wurden.
float Time sollte unsigned long sein.
unsigned long time = millis() - start1;
float v = 150.0 / time;
Das am Rande. Hat erstmal keine Auswirkung auf den generellen Ablauf. Im Code Ablauf sehe ich erstmal kein Problem. Welche Werte bekommst du denn ausgegeben? Welche erwartest du? Es kommt auch darauf an, ob du bei der Rückwärtsbewegung auch beide abdecken kannst? Dann hätte man 0er Werte.
Du müßtest erstmal immer in der gleichen Richtung drüber und außen vorbei. Beim rückwärts passiert folgendes, du hast '7' schon ausgelöst und er wartet nach der Rückwärtsbewegung in der folgenden Vorwärtsbewegung nur noch auf '8'. Sodass hier größere Zeiten rauskommen können und wohl auch werden.
Angeschlossen sind die, indem sie halt Vcc bekommen und GND haben und der Output dieser dann mit den Digital Inputs am Arduino verbunden ist. Meinst du also ich sollte einmal Widerstände dazwischen schalten und mal die Analogen Eingänge Probieren ?
Ich denke ja. Die sind Low aktiv. Also ich habe kein Problem bezüglich der Rückwärtsbwegung oder dergleichen. Wenn es nun aber Zahlen werte >= 7,50 sind so gibt mir der Arduino nurnoch Werte wie 7.50 ; 8.33 ; 10.00 ; 8.82; aus. Also immer die selben Werte. Ich schätze mal immer den, wo der reale Wert am ehesten dran liegt.
Also ich habe es nun über die AnalogPin probiert. Programm soweit zum laufen gebracht und er hat immer noch das Problem. Also dass bei höheren Zahlen er immer die selben Zahlen ausgibt, was einfach nicht sein kann.
Als AnalogPin ist ein ganz schlechte Idee. Der Ausgang der Lichtschranke ist definitv ein Digitalsignal, da hat analog nichts zu suchen. Es sein denn Du benutzt die Analogpins als Digitaleingang. Dann ändert sich aber auch nichts gegenüber reinen Digitaleingängen.
Versuch mal am Ende des loop erstmal zu warten, bis beide LS wieder in 'Ruhestellung' sind, bevor Du einen neuen Durchlauf machst.
Nenn mich ruhig einen Esel, aber ich verstehe nicht, wie das in den Code einbauen müsste, damit das die entsprechende Wirkung hat. Also ich verstehe den Ansatz nicht ganz.
Als letzte Anweisung in loop ( nach der Ausgabe der Werte ). Dann bist Du sicher, dass er bei dem nächsten loop-Durchlauf nicht falsch durchläuft, weil ein LS noch von der vorherigen Messung auf LOW steht - z.B. weil kurz beide abgedeckt waren.
Hallo,
kannst auch mal ein delay(500) am ende des loop einbauen. ich denke da wird was zweimal gemessen 7.5m/s entspricht 20 ms das schaffst Du mit der Hand sicher nicht.
was ist eigendlich mit den Lichtschranken , wie schnell fallen die wieder ab ? ich muss mir muss mal das Datenblatt ansehen.
Heinz
Nachtrag laut Schaltbild gibt es ein C vor dem OP . damit hat das Ding eine zeitliche Komponente , man müsse mal messen wie lang ein Impuls mindestens ist.
Hallo,
mit ist da noch was aufgefallen . wenn Du von so kleinen Zeiten ausgehst ist das Messergebnis dann ja 17,18,19,20 ms das ergibt Deine Messwerte von 8.82; 8.33; 7.89; 7.50. Da reicht es nicht für einen bessere Auflösung . Versuche mal mit micros() zu arbeiten.
Heinz
Das scheint das Problem behoben zu haben. Ich habe ein Paar Dinge angepasst, die auch sonst bemängelt wurden. Ich hatte es zuvor schon einmal mit micros probiert, muss mich dann aber irgendwo verzettelt haben. Vielen Dank an alle