Optischer Geschwindigkeitssensor

Zuviel Werbung?
-> Hier kostenlos registrieren
Zu 1.: "Im Prinzip ja". Ich habe mich durch den Begriff "Event" verleiten lassen, zu denken, dass vielleicht der RasPi (und nicht Dein Programm) auf eine positive Flanke prüft und dann einen Interrupt auslöst bzw. eine Task startet. Falls das so wäre, aber der RasPi dasgleiche nicht für negative Flanken könnte, dann ...

Zu 2.: Ja, das ist der Plan. Wobei aber ausnahmsweise die Mitkopplung auf optischem (Um-)Wege wirkt.

Zu 3.: Rat mal, wer noch. ;) Kann immerhin recht knifflig werden. Aber das Prinzip hast Du offensichtlich durchschaut.

Thomas' Vorschlag mit dem Oszilloskop lag mir schon länger auf der Zunge, hab's irgendwie immer wieder verdrängt ...
Seinen Ansatz, die Störungen per SW zu unterdrücken, halte ich nicht für aussichtslos. Das hängt sehr stark von der Art und der Ursache der Störungen ab.

Ich vermute die Ursache darin, dass wir eigentlich ein analoges Signal in ein digitales wandeln: das am FotoTransistor einfallende Licht dürfte zwischen 2 Pegeln wechseln mit an- und absteigenden Rampen. Und die Rampen sind ein Problem, erst recht, wenn der Motor mitten in so einer Rampe steht und das ausgegebene Signal irgendwo zwischen Hi und Lo steht.
Bei A/B-Signalen von "richtigen" Gebern bin ich übrigens weniger skeptisch. Dort sind die StörImpulse entweder so kurz, dass sie vom der SW gar nicht erst wahrgenommen werden, oder sie sind lang genug und führen dann zu einem Hin- und Her-Zählen, so dass die Störungen sich nicht nur in einer einzigen ZählRichtung auswirken, sondern "gegenseitig kompensieren".

Zu 1.: Ok, dann hab ich dich schon richtig verstanden und ich kann definitiv steigende, fallende oder auch beide Flanken überwachen.

Was den Vorschlag von Thomas mit dem Oszilloskop angeht: ich würde wirklich gerne die Signale mal oszilloskopieren, aber ich hab leider keins...

Und Ja, ich würde es ja auch gerne Softwaretechnisch lösen. Ich hab nur keine Idee mehr wie. Die einzige Möglichkeit die vielen Impulse nach dem gültigen Impuls zu „ignorieren“, besteht doch darin, zu prellen - also letztendlich die bouncetime setzen. Aber dabei muss ich die Drehzahl beachten und zusätzlich bleibt es weiterhin mehr ein Annähern, als eine Berechnung, da die Drehzahl ja nicht sofort zu 100% da ist und die bouncetime beim Hochfahren der Drehzahl somit erstmal einen falschen Wert hat.

@Thomas: Wenn du irgendeine Idee hast, wie ich das sonst angehen könnte, dann probiere ich es gerne.

Übrigens hat mir der Support des Herstellers noch eine kleine Skizze geschickt. Auch wenn das jetzt keine bahnbrechenden Neuigkeiten sind:

dc8cb980393c87f3763c86e7dbddafca.jpeg
 
Zuletzt bearbeitet:
Die gehen also von 47 mA bei der LED aus und 12 bzw. 24 mA beim FotoTransistor.
Na ja. Behalten wird das im Hinterkopf. Ist denn die Lichtschranke als Ersatzteil gut erhältlich und ein Austausch leicht durchzuführen? :ROFLMAO:

Probier es bitte auf der FotoTransistor- bzw. RasPi-Seite gar nicht erst mit > 3,3 V. Da soll der RasPi absolut keinen Spass verstehen!

Ansonsten EmitterSchaltung statt KollektorSchaltung ... dann war ich wohl doch auf dem richtigen Wege?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit Rücksicht auf die RasPi GPIOs war ich bisher gedanklich auf eine BetriebsSpannung von 3,3 V festgenagelt.
Mit einer 2. BetriebsSpannung von 5 V oder mehr eröffnen sich andere LösungsWege.
Der Hinweis auf das Bestellen-müssen eines PNP-Transistors hat meine grauen Zellen nochmal aktiviert - leider für Dich zu spät. :oops:
Statt eines PNPs nun ein Opto-Koppler und 1 Widerstand eingespart:

LS-MitKoppl-2.jpg

Bei der angegebenen Dimensionierung und der BetriebsSpannung von 5V sollten sich Ströme von jeweils ca. 11 mA durch die VorWiderstände R1 und R2 ergeben.
Die LED der Lichtschranke wird entweder durch den mit R1 bestimmten oder durch beide Ströme (Summe!) durchflossen.
Diese Variante gefällt mir besser - bei der anderen bereitet mir das AusTarieren des "ArbeitsPunktes" des PNP weiterhin etwas KopfGrimmen. ;)
 
Mit Rücksicht auf die RasPi GPIOs war ich bisher gedanklich auf eine BetriebsSpannung von 3,3 V festgenagelt.
Mit einer 2. BetriebsSpannung von 5 V oder mehr eröffnen sich andere LösungsWege.
Der Hinweis auf das Bestellen-müssen eines PNP-Transistors hat meine grauen Zellen nochmal aktiviert - leider für Dich zu spät. :oops:
Statt eines PNPs nun ein Opto-Koppler und 1 Widerstand eingespart:

...

Bei der angegebenen Dimensionierung und der BetriebsSpannung von 5V sollten sich Ströme von jeweils ca. 11 mA durch die VorWiderstände R1 und R2 ergeben.
Die LED der Lichtschranke wird entweder durch den mit R1 bestimmten oder durch beide Ströme (Summe!) durchflossen.
Diese Variante gefällt mir besser - bei der anderen bereitet mir das AusTarieren des "ArbeitsPunktes" des PNP weiterhin etwas KopfGrimmen. ;)

Ok, finde deine neue Idee gut, aber was genau bringen mir die 5V statt der 3,3V?
Meinst du jetzt, weil die Spannung an der LED damit ohne Transistor verändert werden kann, oder sind die 5V vielleicht besser nach dem Prinzip "viel bringt viel"? ;)

Ich verstehe es jetzt so:

1. Lichtschranke unterbrochen = kein Schlitz
- Fototransistor schaltet nicht durch
- Strom durch die LED = ca. 11mA
- Transistor des Optokopplers schaltet nicht durch
- eine 0 am GPIO

2. Lichtschranke nicht unterbrochen = Schlitz
- Fototransistor schaltet durch
- Strom durch die LED = ca. 11mA + ca. 19mA = 30mA (oder 25mA? Weil die beiden Widerstände doch letztendlich parallel geschalten sind!? :confused:)
- Transistor des Optokopplers schaltet durch
- eine 1 am GPIO
 
3. ... was genau bringen mir die 5V statt der 3,3V?

1. Lichtschranke unterbrochen = kein Schlitz
- Fototransistor schaltet nicht durch
- Strom durch die LED = ca. 11mA
- Transistor des Optokopplers schaltet nicht durch
- eine 0 am GPIO

2. Lichtschranke nicht unterbrochen = Schlitz
- Fototransistor schaltet durch
- Strom durch die LED = ca. 11mA + ca. 19mA = 30mA (oder 25mA? Weil die beiden Widerstände doch letztendlich parallel geschalten sind!? :confused:)
- Transistor des Optokopplers schaltet durch
- eine 1 am GPIO
Zu 1. & 2.: Am GPIO sieht es genau umgekehrt ("invertiert") aus!

Zu 2.: Nicht die Widerstände sind parallel geschaltet, sondern die Ströme, die durch diese Widerstände fliessen. Die Spannungen an den Widerständen sind jedoch unterschiedlich!

Zu 3.: Die LEDs sind in Reihe geschaltet! Darum haben wir bei einer BetriebsSpannung von 3,3 V so gut wie keinen Spielraum, den Strom durch die OptoKoppler-LED per VorWiderstand zu beeinflussen.

Zu 2.: Ursprünglich wollte ich die Elemente im Schaltbild anders anordnen, hätte dazu aber die beiden Bestandteile der LichtSchranke auseinanderreissen müssen.
Die Übersichtlichkeit ist leider so oder so nicht wirklich überragend.
Ich nehme an, Du kommst auf 19 mA, weil Du für den SpannungsAbfall an R2 einen zu grossen Wert für die Spannung genommen hast. Davon sind noch ...
- der SpannungsAbfall an der OptoKoppler-LED (ca. 1,5 V) und
- der SpannungsAbfall am LichtSchranken-FotoTransistor (ca. 0,2 V)
... abzuziehen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Zu 1. & 2.: Am GPIO sieht es genau umgekehrt ("invertiert") aus!

Zu 2.: Nicht die Widerstände sind parallel geschaltet, sondern die Ströme, die durch diese Widerstände fliessen. Die Spannungen an den Widerständen sind jedoch unterschiedlich!

Zu 3.: Die LEDs sind in Reihe geschaltet! Darum haben wir bei einer BetriebsSpannung von 3,3 V so gut wie keinen Spielraum, den Strom durch die OptoKoppler-LED per VorWiderstand zu beeinflussen.

Zu 2.: Ursprünglich wollte ich die Elemente im Schaltbild anders anordnen, hätte dazu aber die beiden Bestandteile der LichtSchranke auseinanderreissen müssen.
Die Übersichtlichkeit ist leider so oder so nicht wirklich überragend.
Ich nehme an, Du kommst auf 19 mA, weil Du für den SpannungsAbfall an R2 einen zu grossen Wert für die Spannung genommen hast. Davon sind noch ...
- der SpannungsAbfall an der OptoKoppler-LED (ca. 1,5 V) und
- der SpannungsAbfall am LichtSchranken-FotoTransistor (ca. 0,2 V)
... abzuziehen.

Zu 1. & 2.: Ja stimmt, hab es falsch gesehen. Dachte es wäre ein Pull-Down Widerstand.

Zu 2.: Ok, passt.

Zu 3.: Verstehe.

Zu 2.: Ja, die zweite Diode hab ich erst garnicht beachtet. Hab übersehen, dass die Dioden ja dann in Reihe geschalten sind. Somit kommen dann statt 19mA, ca. 11mA dazu, richtig?
 
@Thomas: Wenn du irgendeine Idee hast, wie ich das sonst angehen könnte, dann probiere ich es gerne.

Nach ein paar Tests mit meinem Raspberry hier auf meinem Schreibtisch muss ich meinen Vorschlag mit der Softwarelösung zurückziehen. Ich habe nur mit einem Drehgeber (Bedienelement) getestet diesen mit den beiden Kanälen an zwei GPIO auszuwerten. Bei Raspberry sind schnelle zyklische Interrupts wie man so einen Geber normal auswerten würde nicht möglich, darum habe ich das auch mit dem Flanken-Interrupt probiert. Dabei kamen seltsame Ergebnisse heraus, wie dass obwohl wenn an einem Eingang eine steigende Flanke detektiert wurde, wenn ich im Interrupt den Signalzustand abfrage dieser wieder false hat - trotz diversen langen Debounce-Zeiten.

Mit etwas googeln gelangt man dann zur Information, dass die Auswertung der GPIO im Userland passiert, und mit entsprechend niedriger Priorität behandelt wird. Es kann als auch sein, dass das Ganze mal mehrere hundert ms verzögert wird. Ob dann auch Interrupts verloren gehen können habe ich nicht weiter nachgeforscht. Für mich ist nur wichtig, dass ich diese Eingänge höchstens für ein paar Schalter oder Taster verwenden kann, aber für nichts steuerungsrelevantes. Dazu wäre dann ein eigenes Kernel-Modul notwendig damit das entsprechend schnell bearbeitet wird. Aber bevor ich damit anfange, würde ich mal sehen ob die Codesys Runtime das fertig anbietet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe das jetzt so verstanden, Thomas, dass die Interrupts so schnell reagieren, dass die Informationen, auf die sie reagieren, im Programm noch gar nicht verfügbar sind?
Dann würde ich doch vorschlagen, alle 4 Flanken des A/B-Signals per Interrupt auszuwerten. Also ein "eigenes" Bit A mit der steigenden Flanke von Eingang A setzen und mit der fallenden Flanke von Eingang A rücksetzen. Dasgleiche Spiel mit Eingang B und einem "eigenen" Bit B. Diese "eigenen" Bits dann im Programm anstelle der Eingänge weiterverarbeiten.
Das hilft aber wahrscheinlich nicht, wenn man nur 1 Signal und 1 Eingang wie im Fall der LS dieses Thread hat, da wir nach wie vor nicht erkennen, ob ein Impuls "nur" eine Störung oder "ernstzunehmen" ist.

Gruss, Heinileini

PS:
Hast Du da zum Testen einen "mechanischen" Geber mit prellenden (schleifenden) Kontakten?
 
Zuletzt bearbeitet:
Hast Du da zum Testen einen "mechanischen" Geber mit prellenden (schleifenden) Kontakten?
Mechanischer Geber, ja. Prellt etwas, aber nicht übermäßig. Ich habe auch nur einen Kontakt ausgewertet nur um mal zu testen was geht. Mit Flankeninterrupts ist die Auswertung beider Kanäle immer etwas wackelig, gibt bei mikrocontroller.net einen eigenen Artikel über die Probleme die bei der Flankenerkennung auftreten können.
Aber ein optisches Gerät sollte eigentlich überhaupt nicht prellen, oder da sind andere Störungen auf der Leitung (vom Motor?). Es gibt auch einige Forenbeiträge in denen berichtet wird, dass die Erkennung bei sich langsam ändernden Spannungen oft anspricht, weil da wohl nur eine sehr geringe Hysterese vorliegt wann 1 / 0 erkannt wird.
 
Aber ein optisches Gerät sollte eigentlich überhaupt nicht prellen, oder da sind andere Störungen auf der Leitung (vom Motor?). Es gibt auch einige Forenbeiträge in denen berichtet wird, dass die Erkennung bei sich langsam ändernden Spannungen oft anspricht, weil da wohl nur eine sehr geringe Hysterese vorliegt wann 1 / 0 erkannt wird.
Da gebe ich Dir Recht, Thomas. Prellen, wie bei mechanischen Kontakten, gibt es da nicht. Die "langsam sich ändernden Spannungen" sind tatverdächtig, denn das Signal ist letztlich ein AnalogSignal, das noch nicht auf DigitalSignal getrimmt ist. Viel Licht, Bisschen weniger Licht, mittelmässig Licht, Bisschen Licht, gar kein Licht. Entsprechende Spannung kommt am GPIO an und wird hier erst digitalisiert. Da kann man dem RasPi keine Vorwürfe machen ...
Danke für den Hinweis auf die "wackelige Auswertung der FlankenInterrupts". Schau ich mir mal an.

Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mal einen kleinen Testaufbau gemacht um zu prüfen was mit dem Raspberry überhaupt geht.

Ich habe einen Ausgang eines AVR Atmega an 5V über einen Optokoppler ISP847 an den GPIO17 eines Raspi 4 angeschlossen. LED Vorwiderstand 220 Ohm, Pulldown am GPIO 10 kOhm.
Der AVR Ausgang habe ich 2 ms ein, 8 ms aus, 100 mal Wiederholen, 5 Sekunden Pause, dann wiederholen.

Auswertung über Programm wie oben mit steigender Flankenerkennung über ein Python-Programm

Erkenntnis:
Mit einem print im Interrupt gehen etliche Impulse verloren. Hier sollte möglichst wenig passieren, zumindest kein print irgendwo hin.
Macht der Raspi sonst nichts außer über das Python Programm alle 5 Sekunden den Zählerstand auszugeben, geht ca. 1 von 10000 Impulsen verloren.
Wird der Raspberry verwendet, z.B. im Webbrowser das SPS-Forum aufgerufen, gehen etliche Impulse verloren, d.h. mehrere 10 für jeden 100er Schwall.

Sinnvoll verwenden lässt sich das meiner Meinung nach nicht, wenn du mit den gezählten Impulsen wirklich etwas berechnen willst.

Wenn man sich im Handbuch die Schlitze ansieht, dürften die Hellzeit auch nur sehr kurz sein, Verhältnis würde ich mal als 1:20 ansetzen.
 
Habe mir mal diese Thema durchgelesen.
Ohne der Signalkontrolle per Oszi ist das Feststellen ob doppelimpule auftreten schwierig.

Die schaltung von Heinileini mit Mitkopplung sieht ja mal nicht so schlecht aus. Die Mitkoppling müsste aber schon über den nicht definierten Bereich des GPIO Eingangs liegen. Bei TTL als über 2,4V schon wirken. Damit wird der nicht definierte Bereich schnell durchgeschalten.

Deswegen wäre die Einfachste Lösung, nach dem Opto Transistor Ausgang (1te Schaltung) einen Tiefpass mit ca. 2kHz bis 5kHz und danach einen Schnittrigger baustein HC14 zu verwenden.

Sollte der Pyton Schmitttrigger Eingänge haben, reicht ein RC Glied.
 
Die Mitkoppling müsste aber schon über den nicht definierten Bereich des GPIO Eingangs liegen. Bei TTL als über 2,4V schon wirken. Damit wird der nicht definierte Bereich schnell durchgeschalten.
Was bedeutet "... müsste über den nicht definierten Bereich des GPIO-Eingangs liegen"?
Das AusgangsSignal der Schaltung muss im RuheZustand unter dem nicht definierten Bereich liegen oder darüber und das Überqueren des Bereichs muss "zügig" geschehen.

Der EingangsPegel der Schaltung ist davon ganz unabhängig und der Bereich, in dem die Hysterese wirksam ist, muss so gelegt werden, dass die Schaltung sicher in dem Bereich arbeiten kann, den der FotoTransistor "hergibt".
Die Mitkopplung darf nicht so stark sein, dass die Schaltung an einem der Anschläge hängenbleibt und danach das Signal des FotoTransistors ignoriert.
Die Variante mit dem OptoKoppler sollte eigentlich auf Anhieb funktionieren - ggfs muss man die LED-Ströme noch ein wenig anheben.
Bei der Variante mit dem PNP-Transistor gehe ich davon aus, dass man den SpannungsTeiler noch "tunen" muss, von dem die Basis angesteuert wird.

Verdrillte, abgeschirmte Leitungen zum FotoTransistor einerseits und zur LED andererseits, wären mir wichtiger, als mit einem Tiefpass zu experimentieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die elektrischen Spezifikationen des Raspberry sind sehr mangelhaft dokumentiert, viele Werte wurden von Benutzern nur durch Versuch und Irrtum herausgefunden.
Da die Auswertung mit dem GPIOs des Raspberry eh nicht zuverlässig funktioniert (zumindest nicht solange man Linux und die Auswertung mit Programmen im Userland macht), würde ich mich direkt nach einer anderen Lösung umsehen. Evtl. sind dann auch die ganzen anderen Phänomene mit erledigt.

Ich habe mir mal die Codesys Runtime auf meinen Raspberry aufgespielt, um zu sehen wie sich damit die Eingänge auswerten lassen, das sieht bei schnellen Signalen aber nochmal schlechter aus.
Ich bin ehrlich gesagt nach diesen Tests von Raspberry etwas enttäuscht. Im Grunde ist das nicht mehr als ein billiger PC, für kleine elektronische Spielereien ist damit meiner Meinung nach nichts zu holen, da viel zu spärlich dokumentiert, und das Linux oben drüber macht vieles schwer bis unmöglich.
 
Heinilein
Nehmen wir TTL Pegel. Dann ist log High über 2.4V und Log Low unter 0.8V. Dazwischen ist der digitale Pegel nicht definiert.
Der Opto Koppler wird aber durch die langsames Licht verschwinden und Licht kommen auch am Ausgang keinen definierten Pegel liefern. Wenn also der Pegel am Opto Koppler Ausgang von 0,8V auf 2,4V innerhalb geschätze 500us ansteigt, dann kann der Prozessor mehrere steigende Flanken erkennen.

Nach dem Tiefpass ist ein Schitttrigger. Das heisst das Signal müsste merklich absinken um am schnitttrigger eine andere Flanke zu erzeugen.
 
Hier eine Simulation mit Tiefpass 100nFx2kOhm
Am HC14 müsste sich die Spannung um 0,4V ändern um am Ausgang einen Anderen Zustand zu erzeugen.

tiefpass.JPGhc14.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

also ich hab mir jetzt mal ein billiges Oszilloskop aus China gekauft - ja ich weiß, Qualität kostet mehr ;-)

Trotz allem konnte ich damit jetzt mal die Rechteckspannung visualisieren und wer weiß - vielleicht ist es ja doch ganz nützlich das Signal etwas besser zu verstehen...

Ich hab mal ein kurzes Video gemacht, bei dem ich die Pumpe bei 0,4 V (entspricht 152 UPM) laufen lassen hab.

Auf dem Display vom Oszilloskop seht ihr ja die Einstellungen dazu.

Wenn ich irgendwas verändern soll bei der Anzeige oder der Spannung usw., dann sagt mir bitte kurz bescheid und ich mach gerne noch weitere Videos.

https://www.dropbox.com/s/l6hptd2gfat3e84/Oszilloskop1.mov?dl=0

---

Was die grundsätzliche Umsetzung mit dem Raspberry Pi angeht, verstehe ich schon, dass die GPIOs durch das darüber liegende Betriebssystem nicht 100% zuverlässig sind. Möglich wäre auch z.B. einen Arduino Due zu verwenden und mit dem Raspberry zu verbinden, dass der Arduino nur die Hardware-Steuerung übernimmt und der Raspberry Pi nur Daten anzeigt und Befehle an den Arduino weitergibt. Wäre doch eine mögliche Lösung oder?

Danke auf jeden Fall für eure große Hilfe!

---

EDIT:

Mir ist gerade aufgefallen, dass ich das Signal vor dem Pulldown-Widerstand genommen hab. Hier nochmal ein Video mit den selben Einstellungen, aber mit Pulldown.

Wenn ich das richtig interpretiere, dann wird das Signal dadurch doch geglättet!?

https://www.dropbox.com/s/pz72y494ymwu2xn/Oszilloskop2.mov?dl=0
 
Zuletzt bearbeitet:
Mir ist gerade aufgefallen, dass ich das Signal vor dem Pulldown-Widerstand genommen hab. Hier nochmal ein Video mit den selben Einstellungen, aber mit Pulldown.

Wenn ich das richtig interpretiere, dann wird das Signal dadurch doch geglättet!?
Wenn ich das richtig interpretiere, meinst Du mit "das Signal vor dem Pulldown-Widerstand" vor dem Einbauen des PullUps in die Schaltung.
Das Signal im 2. Video sieht für meinen Geschmack besser aus, weil sich das Signal zügiger dem Zustand 0 nähert. Eine Glättung (TiefPass) würde aber das Gegenteil bewirken.
 
Wenn ich das richtig interpretiere, meinst Du mit "das Signal vor dem Pulldown-Widerstand" vor dem Einbauen des PullUps in die Schaltung.
Das Signal im 2. Video sieht für meinen Geschmack besser aus, weil sich das Signal zügiger dem Zustand 0 nähert. Eine Glättung (TiefPass) würde aber das Gegenteil bewirken.

Ja genau, ich hab das Kabel vor dem Pulldown-Widerstand rausgezogen und ans Oszilloskop angeschlossen, also war der Pulldown-Widerstand nicht angeschlossen.

Glättung war jetzt eher der falsche Begriff für das was ich meinte. Ich meinte damit, dass das Signal "sauberer" aussieht, also weniger Störungen (Zacken...) bei 0V und 3,3V.

Sorry, ich bin nicht der Vollprofi was das angeht, deshalb kann ich es nur so gut wie möglich beschreiben...

Ps: Ich hab auch mal deine erste Schaltung mit dem Transistor aufgebaut (den Optokoppler hab ich leider nicht nicht) - das Ergebnis sieht so aus:

https://www.dropbox.com/s/iic2mfefipzn4g1/Oszilloskop3.mov?dl=0
 
Zurück
Oben