Hallo
Ich hoffe, dieser Beitrag ist nicht zu sehr offtopic:
Man kann auch normale LEDs als Fotosensor verwenden. Das funktioniert, weil eine in Sperrichtung geschaltete LED eine von der Beleuchtungsstärke abhängige Kapazität besitzt (~5pF?). Nur mit einem Mikrokontroller und einer LED (ohne zusätzliche Bauteile!) ist die Auswertung, auch in Bascom, sehr einfach:
Die LED wird zwischen Vcc (Kathode) und einem Pin (Anode) angeschlossen. Im normalen Zustand wird der Pin auf Eingang-High geschaltet, die LED liegt dann beidpolig an Vcc. Um die Messung einzuleiten setzt man den Pin kurz auf Ausgang-Low um die LED "aufzuladen", dann schaltet man den Pin auf Eingang (ohne PullUp) und misst die Zeit die vergeht bis die LED über den Pin soweit entladen ist dass am Pin ein High erkannt wird. Diese Zeit ist direkt abhängig von der Beleuchtungsstärke mit der die LED bestrahlt wird.
Hier zwei Beispiele in Bascom:
http://www.b-kainka.de/kosmos/microelec3.htm
http://www.franzis.de/elo-das-magazi...ed-lichtsensor
(weitere Beispiele bei google)
Möglicherweise beeinflußt die Wellenlänge der LED auch ihre Empfindlichkeit für Lichtquellen unterschiedlicher Wellenlängen. Das habe ich aber noch nicht untersucht. Die Auswertung der zwei eingebauten ACS-IR-LEDs als Lichtsensoren bei meinem RP6 sieht in C so aus:
GrußCode:// LED-Sensor Die ACS-LEDs werden kurz in Sperrichtung "geladen" 4.4.2008 mic // und dann wird die Entladezeit gemessen. (Anode gegen GND geschaltet) #include "RP6RobotBaseLib.h" int main(void) { initRobotBase(); // Beide ACS-LEDs allpollig auf 5V legen DDRB |= ACS_PWRH | ACS_L; // Pins als Ausgang DDRC |= ACS_R; DDRD |= ACS_PWR; PORTB |= (ACS_PWRH | ACS_L); // alle auf 5V PORTC |= ACS_R; PORTD |= ACS_PWR; while(1) { DDRD |= ACS_PWR; // Pins als Ausgang DDRB |= ACS_PWRH; PORTD &= ~ACS_PWR; // Anoden gegen GND schalten PORTB &= ~ACS_PWRH; sleep(10); // Kurz warten und Stopuhren starten setStopwatch1(0); setStopwatch2(0); startStopwatch1(); startStopwatch2(); DDRD &= ~ACS_PWR; // Anoden als Eingang DDRB &= ~ACS_PWRH; // Entladung messen while((!(PIND & ACS_PWR)) || (!(PINB & ACS_PWRH))) { if(PIND & ACS_PWR) stopStopwatch1(); if(PINB & ACS_PWRH) stopStopwatch2(); } stopStopwatch1(); // sicher ist sicher! stopStopwatch2(); // Debug writeInteger(getStopwatch1(), 10); writeString_P(" - "); writeInteger(getStopwatch2(), 10); writeString_P("\n\r"); mSleep(300); } return(0); }
mic







Zitieren

Lesezeichen