Die Helligkeitsmessung mit einer LED an einem Microcontroller-Pin ist ein beliebter Hack der in vielen Varianten durch das Netz geistert. Ein Beispiel wird auch hier beschrieben: https://www.mikrocontroller.net/articles/Lichtsensor_/_Helligkeitssensor Das Problem ist, dass LEDs zwar als Lichtsensoren funktionieren, aber nur sehr kleine Photoströme liefern (<500nA). Selbst mit einem großen Sense-Widerstand lassen sich kaum brauchbare Spannungen erzeugen, die direkt mit einem ADC ausgelesen werden können. Daher wird häufig der Trick genutzt, dass die Sperrschichtkapazität (Und Eingangskapazität des GPIO) der LED aufgeladen und danach über den Photostrom entladen wird. Über einen Eingangspin lässt sich die Entladezeit messen, welche idealerweise proportional zum Photostrom ist. Prinzipiell bastelt man sich einen Ein-Rampen Integrierenden ADC. So weit, so gut. Wer das schon ausprobiert hat, weiss das es eher schlecht als recht funktioniert. Die Messung dauert sehr lange und ist extrem ungenau. Ich frage mich jetzt, ob es nicht möglich ist, die Genauigkeit zu verbessern. Kennt jemand noch bessere Methoden? Könnte man über den Pull-Up Widerstand Ladung injezieren und damit einen Sigma-Delta ADC basteln?
> Kennt jemand noch bessere Methoden?
Eine echte Photodiode.
PD schrieb: >> Kennt jemand noch bessere Methoden? > Eine echte Photodiode. Das ist unsportlich und von der Ansteuerung auch nicht einfacher :) Dann bitte einen Phototransistor. Oliver Stellebaum schrieb: > BH1750FVI verwenden. Olles Teil. Da gibt es Besseres.
Tim schrieb: > Olles Teil. Da ich eine Tüte Fotowiderstände habe, sind das die ollen Teile meiner Wahl.
Tim schrieb: > PD schrieb: >>> Kennt jemand noch bessere Methoden? >> Eine echte Photodiode. > > Das ist unsportlich und von der Ansteuerung auch nicht einfacher :) Dann Klingt für mich nach, sich mit Trikot und Bier ein Fußballspiel vorm Fernseher reinzuziehen und wenn die eigene Mannschaft gewonnen hat, zu prahlen wie gut man doch war und sonst nur das Unvermögen anderer zu erkennen. Wer sportlich sein will muß schon selbst etwas machen und schieben lassen hilft nicht.
Ok, habe die Idee von oben mal testweise implementiert. Anbei zwei Oszilloskop-Screenshots. Links der normale Single-Slope Integrierender Wandler. Rechts die neue Version. Wenn die untere Schwelle erreicht ist, lade ich über einen kurzen Puls über den Pull-Up Widerstand den Integrationskondensator so weit auf, dass ich wieder über die Schwelle komme. Dadurch kann ich in der gleichen Zeit mehr Bits generieren und das "Komparator"-Rauschen (vom GPIO-Digitaleingang) reduzieren. Im Prinzip entspricht das einem "Continuously-integrating converter", wenn ich den Wikipedia-Artikel richtig verstehe. (http://en.wikipedia.org/wiki/Integrating_ADC) Gefühlt verbessert sich die Reproduzierbarkeit. Allerdings ist die Ladungsinjektion über den Pull-Up Widerstand nicht sehr genau und könnte zusätzliches Rauschen erzeugen.
sauber schrieb: > Klingt für mich nach, sich mit Trikot und Bier ein Fußballspiel vorm > Fernseher reinzuziehen und wenn die eigene Mannschaft gewonnen hat, zu > prahlen wie gut man doch war und sonst nur das Unvermögen anderer zu > erkennen. Wer sportlich sein will muß schon selbst etwas machen und > schieben lassen hilft nicht. Ganz so einfach sind Photodioden nun doch nicht zu verwenden.
Tim schrieb: > Ganz so einfach sind Photodioden nun doch nicht zu verwenden. Die sind aber um Grössenordnungen empfindlicher als LEDs. Typisch muss man ja auch nicht alle Messprobleme direkt mit einem "µC" erschlagen, sondern kann ja auch ein vernünftiges analoges "Frontend" verwenden. Bei privaten Projekten sollte ja wohl auch die Einsparung von einigen Cent (<1€) kaum eine Rolle spielen. Gruss Harald
Ich sach mal, wenn eine LED als Lichtsensor auch nur einen einzigen Vorteil hätte, würde man das auch in praktischen Schaltungen finden und nicht nur in Edelbastler-Hacks. Eine mechanische Lösung LED+Fototransistor in einer Frontplatte ist vermutlich deutlich einfacher und kostengünstiger, als sich mit geringer Sensitivität, Reproduzierbarkeit und Störungen rumzuplagen.
Peter Dannegger schrieb: > Eine mechanische Lösung LED+Fototransistor in einer Frontplatte ist > vermutlich deutlich einfacher und kostengünstiger, als sich mit geringer > Sensitivität, Reproduzierbarkeit und Störungen rumzuplagen. Nun, wenn man Millionen von Geräten bauen will, spielt die Einsparung von einigen Cent schon eine Rolle. Für den Privatbastler ist das m.E. nicht von Belang.
Es handelt sich um einen Hack! Für mich steht die Frage im Vordergrund, wie man mit einem MCU und möglichst wenigen externen Bauteilen Ströme im nA-Bereich messen kann. Es gibt allerdings tatsächlich einige Anwendungen für LEDs als Lichtsensoren. z.B. wenn eine spezielle Spektralantwort gewünscht ist. Silizium ist vor allem im Infraroten empfindlich. LEDs sind für Wellenlängen kleiner ihres Abstrahlspektrums empfindlich. Damit ist z.B. eine rote LED besser an die Spektralantwort des menschlichen Auges angepasst als eine Silizium-PD.
Harald Wilhelms schrieb: > Nun, wenn man Millionen von Geräten bauen will Dann poste dochmal einen Link auf so ein kommerzielles Gerät mit LED als Sensor.
Tim schrieb: > wie man mit einem MCU und > möglichst wenigen externen Bauteilen Ströme im nA-Bereich messen kann. Da der Leckstrom des MC bis zu 1µA betragen kann, wirds mit nA wohl Essig sein. Vielleicht spezielle teure OPVs mit geringem Bias-Strom (OPA111: 1pA).
Peter Dannegger schrieb: > Tim schrieb: >> wie man mit einem MCU und >> möglichst wenigen externen Bauteilen Ströme im nA-Bereich messen kann. > > Da der Leckstrom des MC bis zu 1µA betragen kann, wirds mit nA wohl > Essig sein. > Vielleicht spezielle teure OPVs mit geringem Bias-Strom (OPA111: 1pA). Guter Punkt. Atmel gibt typ <50nA an. Die 1µA sind wahrscheinlich die Testspec im finalen Bauteiltest und durch das Testequipment, bzw. die Testzeit limitiert. Das schließt natürlich trotzdem ein Fehlbauteil nicht aus. Für die Massenproduktion ist das wohl nichts, aber als Hack reicht es... Wenn der Eingang auf Vcc/2 gebaised ist und man bei Raumtemperatur arbeitet, sollten die Leckströme zusätzlich noch einmal deutlich geringer ausfallen, da dann die Schutzdioden weniger Lecken.
Wie groß der Photostrom von der LED ist, hängt stark von der Type ab. Ein erster Schritt wäre da ggf. ein paar durchzumessen. Im Datenblatt findet man den Wert in der Regel nicht. Den Vorteil den die LED als Sensor bietet ist vor allem, dass man kein zusätzliches Loch in der Frontplatte braucht. Ein Möglichkeit wäre ggf. noch die Kapazität am Ausgang etwas zu vergrößern, so dass man etwas mehr als die Sperrschaichtkapazität hat. Also etwa 1-10 nF zusätzlich, ggf. über 100 Ohm isoliert. Die Spannung könnte man dann über den ADC messen. Über die Zeit die man der Photodiode lässt den Kondensator zu laden kann man den Bereich festlegen - die Helligkeiten gehen schließlich oft über einen großen Bereich. Es könnte von Vorteil sein hier vielfache von 10 ms zu nutzen um 100 Hz Störungen zu unterdrücken.
Tim schrieb: > Es handelt sich um einen Hack! Ein "Hack" ist m.E. die Modifikation eines bestehenden Gerätes. Hier handelt es sich eher um eine sog Kunstschaltung. Oder sehe ich das falsch?
>Wie groß der Photostrom von der LED ist, hängt stark von der Type ab. >Ein erster Schritt wäre da ggf. ein paar durchzumessen. Im Datenblatt >findet man den Wert in der Regel nicht. Das stimmt. Ich habe einige Leds für diese Anwendung untersucht: Beitrag "led debugging" Am meisten Photstrom haben ultrahelle rote oder gelbe LEDs gebracht.
Lurchi schrieb: > Wie groß der Photostrom von der LED ist, hängt stark von der Type ab. > Ein erster Schritt wäre da ggf. ein paar durchzumessen. Im Datenblatt > findet man den Wert in der Regel nicht. Ich verwende eine $0.02 0603 rote SMD led. Also worst case... Der Photostrom wird wohl hauptsächlich von der Chipgröße abhängen. > Ein Möglichkeit wäre ggf. noch die Kapazität am Ausgang etwas zu > vergrößern, so dass man etwas mehr als die Sperrschaichtkapazität hat. > Also etwa 1-10 nF zusätzlich, ggf. über 100 Ohm isoliert. Die Spannung > könnte man dann über den ADC messen. Über die Zeit die man der > Photodiode lässt den Kondensator zu laden kann man den Bereich festlegen > - die Helligkeiten gehen schließlich oft über einen großen Bereich. Es > könnte von Vorteil sein hier vielfache von 10 ms zu nutzen um 100 Hz > Störungen zu unterdrücken. Im Moment habe ich tatsächlich hauptsächlich Probleme mit geringer Helligkeit (<10 lx, wenn man meinem handy trauen kann). Hier scheint die Anfangsladung Einfluss auf die Messung zu haben, bzw. die Messung dauert einfach zu lange. (>200ms) Mit einem größeren Kondensator würde das Problem nur noch schwieriger werden. Allerdings könnte man dann evtl. Tatsächlich den ADC verwenden. Der S&H Kondensator macht das system allerdings wieder schwerer beherrschbar. Beim Starten des ADC wird Ladung abgezogen. Nach oben hin lässt sich ein erstaunlicher Dynamikumfang erreichen -> ca 10klx. Ohne LED hält sich die Ladung übrigens erstaunlich stabil auf dem Pin. der Leckstrom wird bei deutlich unter 50nA liegen.
Harald Wilhelms schrieb: >> Es handelt sich um einen Hack! > > Ein "Hack" ist m.E. die Modifikation eines bestehenden Gerätes. Hier werden auch Bauteile in einer nicht vorgesehenen Weise verwendet. > Hier handelt es sich eher um eine sog Kunstschaltung. > Oder sehe ich das falsch? Du könntest den HaD Leuten ja vorschlagen, Ihre Seite in "Kunstschaltung a day" umzubennenen :)
chris_ schrieb: > Am meisten Photstrom haben ultrahelle rote oder gelbe LEDs gebracht. Das kann man wahrscheinlich darüber erklären, dass die LEDs in einem kurzwelligeren Bereich photoempfindlich sind, als sie abstrahlen. Smaragdgrüne und Blaue LEDs sind demnach eher im UV empfindlich.
>Das kann man wahrscheinlich darüber erklären, dass die LEDs in einem >kurzwelligeren Bereich photoempfindlich sind, Dass es etwas mit der Wellenlänge zu tun haben könnte, daran habe ich auch schon gedacht. Wenn ich mich richtig erinnere, waren die roten LEDs die ersten LEDs die es gab. Allerdings ist rotes Licht langwelliger als grünes oder blaues Licht. Ich glaube, Silizium ist im roten Bereich empfindlicher. Es gab ja auch schon sehr früh IR-LEDs und blaube LEDs erst seit ein paar Jahren. Bei meinen Versuchen hatte es mich gewundert, dass die orangen LEDs etwas besser waren.
Tim schrieb: >So weit, so gut. Wer das schon ausprobiert hat, weiss das es eher >schlecht als recht funktioniert. Die Messung dauert sehr lange und ist >extrem ungenau. Darauf bin ich beim Bau meines Ultra-Low-Cost Roboters gestoßen: http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=131 Dort werden für die Linienverfolgung 2 LEDs verwendet, die jeweils abwechselnd als Beleuchtung und Photosensor betrieben werden. Da vom reflektierten Licht nur wenig zurück kommt, kann der Roboter nur in sehr kleinen Schritten fahren. Das sieht aber trotzdem lustig aus. Für Beitrag "led debugging" habe ich später eine direkte Spannungsmessung mit dem ADC eines Arduino verwendet. Mit etwas Filterung kommt man dann in einen Datenübertragungsbereich von bis zu 1KBit.
Tim schrieb: > Du könntest den HaD Leuten ja vorschlagen, Ihre Seite in "Kunstschaltung > a day" umzubennenen :) Ja, es ist leider Mode geworden, altbekannte deutsche Wörter in neue, englischklingende Wörter umzuwandeln, die nur die Hälfte der Deutschen verstehen. :-(
:
Bearbeitet durch User
Ich würde erstmal mit einem Multimeter die Kennlinie aufnehmen, was bessere Ergebnisse liefert, die Fotospannung oder der Sperrstrom. Kleine Ströme kann man im 0,2V Bereich messen (0,2V / 10M = 20nA).
So. Komme jetzt von ca <5lx bis auf >30klux. Mit einem Dynamikumfang von 12 Bit bezogen auf den Photostrom. Dafür wird ein 17bit counter mit bis zu 256fachem adaptivem oversampling benötigt. Maximale Samplezeit sind <200ms. Ziemlich erstaunlich für eine einfache 0603 LED, keinen ADC und im fliegenden Aufbau. Ich werde das einmal direkt zusammenlöten, dann sollte die Signalqualität besser werden. Außerdem noch Source aufräumen...
Peter Dannegger schrieb: > Ich würde erstmal mit einem Multimeter die Kennlinie aufnehmen, was > bessere Ergebnisse liefert, die Fotospannung oder der Sperrstrom. > > Kleine Ströme kann man im 0,2V Bereich messen (0,2V / 10M = 20nA). Habe es schon versucht, aber konnte nur bei hoher Helligkeit etwas messen. Muss vielleicht noch einen 10M Widerstand auftreiben. Die direkte Messung der Photospannung habe ich mit dem AVR-ADC bisher nicht hin bekommen.
Tim schrieb: > keinen ADC Natürlich mit einem ADC. Anscheinend ist das Wissen, das ein ADC nicht unbedingt aus einem IC mit vielen Pins bestehen muss, verloren gegangen. :-)
Tim schrieb: > Die direkte Messung der Photospannung habe ich mit dem AVR-ADC bisher > nicht hin bekommen. Es wäre einen Versuch wert, einen AVR mit integriertem Opamp vor dem ADC zu verwenden, wie z.B. den Tiny25/45/85. Abgesehen von der wahlweisen Verstärkung hat man dann doch einen recht hochohmigen Eingang, lt. Datenblatt etwa 100 MOhm.
Peter Dannegger (peda) schrieb >Habe es schon versucht, aber konnte nur bei hoher Helligkeit etwas >messen. Muss vielleicht noch einen 10M Widerstand auftreiben. >Die direkte Messung der Photospannung habe ich mit dem AVR-ADC bisher >nicht hin bekommen. Das sollte aber gehen, bei mir funktioniert das super. Ich stecke einfach eine Rote Ultrabrigt 5mm LED an einen Arduino Uno und gebe die Spannung aus. Programm: http://www.arduino.cc/en/Tutorial/AnalogReadSerial
Hier ist noch ein Beispiel für einen Solarvogel mit zusätzlichen Lichsensor, den ich mal gemacht habe: http://www.hobby-roboter.de/forum/viewtopic.php?f=5&t=43#p545 ( Die LED dient dazu, Drehungen zu detektieren )
Der Solarvogel funktioniert allerdings noch mit Zeitmessung der Entladung und nicht mit der Messung der Spannung. Im Code stehen die Untersuchungsergebnisse für die verschiedenen LED-Typen und Lichtbedingungen.
Ulrich F. schrieb: > Da ich eine Tüte Fotowiderstände habe, sind das die ollen Teile meiner > Wahl. unsportlich bin ich auch, ich kaufe die sogar nach mit einem zusätzlichen R am ADC, ist einfach und schnell, was soll ich da experimentieren, ich habe nicht (mehr) viel Zeit.
:
Bearbeitet durch User
Der Weg ist das Ziel. Habe wieder etwas gelernt. Anbei ein paar Bilder. - Photo vom Set-Up. Die rote 0603 SMD LED scheint so ziemlich den kleinstmöglichen Die zu haben und ist damit eher unempfindlich. Eine Orange 5mm LED mit war ca. 10x empfindlicher. - Kalibrierung gegen den Lichtsensor in meinem Handy. Wie man sieht, erreicht man ca. >3000:1 Dynamikumfang. Mit der 5mm LED etwas mehr. Bei niedrigen Lichtstärken gibt es einen Offset, da die integration abgebrochen werden muss. Allerdings funktionierte hier der Lichtsensor im Handy auch schon nicht mehr richtig. - Oszilloskopbild des per Software implementierten continuous integration Wandlers.
:
Bearbeitet durch User
Matthias Sch. schrieb: > Tim schrieb: >> Die direkte Messung der Photospannung habe ich mit dem AVR-ADC bisher >> nicht hin bekommen. > > Es wäre einen Versuch wert, einen AVR mit integriertem Opamp vor dem ADC > zu verwenden, wie z.B. den Tiny25/45/85. Abgesehen von der wahlweisen > Verstärkung hat man dann doch einen recht hochohmigen Eingang, lt. > Datenblatt etwa 100 MOhm. Dumm, dass die LED in meinem Set-up an den falschen Pins hängt. Hängt der Opamp auch an den single-Rail Eingängen?
Harald Wilhelms schrieb: >> keinen ADC > > Natürlich mit einem ADC. Anscheinend ist das Wissen, das ein ADC > nicht unbedingt aus einem IC mit vielen Pins bestehen muss, > verloren gegangen. :-) Hat man die ADC früher etwa als Software implementiert? :)
>- Oszilloskopbild des per Software implementierten continuous >integration Wandlers. Sieht gut aus. Wie genau funktioniert Dein Wandler?
Tim schrieb: > Hängt der Opamp auch an den single-Rail Eingängen? Lt. Datenblatt des Tiny25 hat der ADC im Single- als auch im Differential Mode 100 MOhm Eingangswiderstand. Sieht also so aus, als ob er immer dran hängt.
chris_ schrieb: >>- Oszilloskopbild des per Software implementierten continuous >>integration Wandlers. > > Sieht gut aus. Wie genau funktioniert Dein Wandler? Statt den Kondensator nur einmal ab VCC zu entladen, wird der Kondensator periodisch durch einen kurzen Puls über den Pull-Up Widerstand wieder aufgeladen und bis zur Schaltschwelle entladen. Diese Messung wird für 100ms wiederholt. Das hat einige Vorteile: - Die Rampe wird jetzt nur noch über 0.5V gefahren (Eingangshysterese der AVR Pins). Dadurch sinkt die Messzeit und es können mehrere Messungen gemittelt werden. - Durch das Mitteln von vielen Messungen wird Quantisierungsrauschen und überlagertes Rauschen am Eingang reduziert. - Die LED, bzw. der Eingangspin ist jetzt im Mittel auf ca 0.5VCC gebiased. Dadurch verbessert sich die Linearität deutlich (Oben sieht man, dass der Entladevorgang ab VCC sehr nichtlinear ist). Außerdem sinken die Leckströme über die Clamp-Dioden am I/O Pin. Etwas unklar ist noch, wie stabil die Ladungsinjektion über den Pull-Up ist. Bereits ein oder zwei Taktzyklen reichen aus, um einen Spannungshub von >0.5V zu erreichen. Das ganze ist ziemlich timingkritisch. Werde es wohl noch in Assembler umsetzen müssen, um einige Timingfehler auszumerzen.
:
Bearbeitet durch User
Oliver Stellebaum schrieb: > Tim schrieb: >> Olles Teil. Da gibt es Besseres. > > Zu welchem Preis? Vielleicht der hier? Gibt noch Dutzende mehr. http://www.ti.com/product/OPT3001/samplebuy
>Statt den Kondensator nur einmal ab VCC zu entladen, wird der Kondensator
periodisch durch >einen kurzen Puls über den Pull-Up Widerstand wieder aufgeladen
und bis zur Schaltschwelle >entladen. Diese Messung wird für 100ms wiederholt.
Klingt fast so ahnlich wie ein Sigma-Delta Wandler.
Der Algorithmus waere:
Ist die Spannung 0 => kurzer high Puls
Ist die Spannung 1 => kurzer low Puls
Output=Pulse mitteln
Damit muesste die Wandlung noch schneller werden.
chris schrieb: >>Statt den Kondensator nur einmal ab VCC zu entladen, wird der > Kondensator > periodisch durch >einen kurzen Puls über den Pull-Up Widerstand wieder > aufgeladen > und bis zur Schaltschwelle >entladen. Diese Messung wird für 100ms > wiederholt. > > Klingt fast so ahnlich wie ein Sigma-Delta Wandler. > Der Algorithmus waere: > Ist die Spannung 0 => kurzer high Puls > Ist die Spannung 1 => kurzer low Puls > Output=Pulse mitteln > > Damit muesste die Wandlung noch schneller werden. Ja, prinzipiell ist es ein Sigma-Delta Wandler. Der "Low-Puls" ist in diesem Fall ein Null-Puls. Die Hysterese der I/O-Eingänge verhindert eine feiner aufgelöste Taktung.
Ich experimentiere schon länger in diese Richtung, auch mit RGB-LEDs, ausschließlich an ATMEL-Controllern. Habe dabei auch schon Erfolg gehabt, aber auch Fehlschläge erlebt, hier meine Erfahrungen: Der Analog-Komparator der AVRs ist für solche Messungen ganz gut brauchbar. Rote, Orangene und gelbe LEDs sind lichtempfindlicher als Grüne und Blaue. Grüne und Blaue reagieren nicht auf langwelliges Licht. Ein kleiner Kondensator 10pF .. 33pF parallel zur LED macht die Messergebnisse, bei der Zeitmessungs-Methode, stabiler, verlängert die Messzeit aber erheblich. Mittelwertbildung mehrerer Messungen macht die Messung deutlich besser (Eventuell gleitender Mittelwert, wenn oft ein aktueller Wert benötigt wird). Bei der Messung kleiner Lichtstärke haben Leckströme der LED einen großen Einfluss, die Exemplarstreuungen der LEDs sind erheblich, hier kann selektieren helfen, die mit der längsten Messzeit, bei Dunkelheit, ist die Beste. Die Leckströme sind deutlich temperaturabhängig, hier kann der interne Temperatursensor, den viele AVRs haben, und eine Korrekturtabelle helfen. Recht gute Ergebnisse habe ich mit folgender Methode erzielt, unter Verwendung des ADC: LED laden, dazu ADC-Pin auf Ausgang, auf diesem Kanal eine ADC-Messung starten (läd den S/H-Kondensator auf eine definierte Spannung), ADC-Pin auf Eingang schalten (Beginn Messzeit), definierte Zeit warten (Messzeit), weitere ADC-Messung starten, liefert das Ergebnis. Die Messzeit sollte der Helligkeit angepasst werden, eventuell automatisch. Wärend dem Mess-Ablauf möglichst nicht auf einen anderen ADC-Kanal umschalten, das verschleppt Ladungen, und macht die Messung so unsicherer. Falls dies unvermeidlich ist, z.B. Messung an mehreren LEDs, kann der Einfluss aber ganz gut rausgerechnet werden. Mit freundlichen Grüßen - Martin
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.