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:
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);
}
Gruß
mic
Lesezeichen