Bevor du hier weiter liest, informiere dich über den Theorieteil zu Fototransistoren unter
Propeller Controller - Lichtsensoren -> Übung 4 Lichtmessung mit Fototransistor oder
BASIC Stamp (BS) - Lichtmessung mit LDR und Fotodiode -> Lichtmessung mit LDR, Fotodiode und Fototransistor.
Eine Navigation, die sich nur an Helligkeitsunterschieden orientiert und dann reagiert, lässt sich sehr einfach mit einer Fototransistorschaltung aufbauen. Der hellere Bereich wird mit einer binären 1, der Umgebungslichtbereich mit einer binären 0 klassifiziert. Als Lichtquellen bieten sich Glühbirnen und Taschenlampen an. Das Licht von Leuchtstofflampen und LED-Leuchtmitteln ist weniger gut geeignet.
Material |
1x Fototransistor 2x Steckdraht 1x Widerstand 2kOhm (rot-schwarz-rot) 1x Taschenlampe |
Für weitere Versuche unter verschiedenen Lichtbedingungen werden weitere Widerstände benötigt. | |
Material |
1x Widerstand 220 Ohm (rot-rot-braun) 1x Widerstand 470 Ohm (gelb-violett-braun) 1x Widerstand 1kOhm (braun-schwarz-rot) 1x Widerstand 4,7kOhm (gelb-violett-rot) 1x Widerstand 10kOhm (gelb-violett-rot) |
Aufgaben |
|
Schaltungsaufbau und Schaltskizze des Lichtdetektors
Aufgaben |
|
Das Programm Licht_Spannung.ino
Meine Messungen
Das folgende Programm Licht_sucher.ino lässt den BoE-Shield Bot Arduino vorwärts fahren, bis der Fototransistor an Pin A3 eine Spannung über 3,5V misst. Ändere den Wert ab, wenn deine eigenen Messungen geringere Spannungswerte für das Umgebungslicht und die Lichtquelle ergeben haben.
Aufgaben |
|
Das Programm Licht_sucher.ino
Wie arbeitet das Programm Licht_sucher.ino?
Die Anschlüsse A0, A1, ..., A5 auf dem Arduino-Board sind direkt verbunden mit den A/D-Anschlusspin des Atmel Mikrocontrollers. Der messbare Spannungsbereich wird in äquidistante Bereiche zerstückelt, wobei jedem Bereich ein Spannungswert zugeordnet werden kann.
Die Auflösung der A/D-Wandler eines Arduino liegt bei 10 Bit; das bedeutet, es stehen 2^10 = 1024 Stellen für die Beschreibung aller möglichen Spannungszustände zwischen 0 und 5V zur Verfügung.
Mit der Funktion analogRead lassen sich die Spannungswerte zwischen 0 und 5V durch Zahlen zwischen 0 und 1023 beschreiben. Teilt man 5V in 1024 äquidistante Bereiche, dann entspricht jedem Bereich ein Spannungswert von 5/1024 oder als Dezimalzahl geschrieben: 0,004882813 V.
Um einen Zahlenwert, der vom A/D-Wandler über die Funktion analogRead zurückgegeben wird, in einen Spannungswert umzurechnen, muss diese Zahl nur mit 5/1024 multipliziert werden.
Beispiel
Die analogRead Funktion gibt den Wert 645 zurück. Welcher Spannung entspricht dieser Wert?
Lösung
Spannung = 645 x 5V/1024 = 3,14941... V
Spannung = 3,149...V
Die Funktion volt wird über volt(A3) im Hauptprogramm aufgerufen, wobei A3 dem Argument adPin der Funktion volt übergeben. Innerhalb der Funktion analogRead(adPin) wird daraus analogRead(A3). Der Rückgabewert dieser Funktion ist eine ganze Zahl, die zwischen 0 und 1023 liegt und dem Spannungswert entspricht, der an A3 anliegt. Mit float(analogRead(adPin)) wird der ganzzahlige Wert in eine Dezimalzahl umgewandelt mit 5.0 multipliziert und anschließend durch 1024.0 dividiert.
float volt(int adPin) { return float(analogRead(adPin)) * 5.0 / 1024.0; }
Das Rechenergebnis wird über den Befehl return zurück an den Funktionsaufruf gegeben und im Programm Licht_Spannung.ino über Serial.print(volt(A3)) im Terminal angezeigt.
Im Programm Licht_sucher.ino wird der Rückgabewert im If...Statement benutzt, um eine Entscheidung zu treffen: der Roboter soll dann anhalten, wenn die Bedingung im Statement erfüllt ist.
if(volt(A3) > 3.5)
Binär vs. analog und digital
Ein binärer Sensor kann zwei Zustände einnehmen. Als Beispiel kennen wir bereits den Whisker, der ein HIGH-Signal sendet, wenn er offen oder keine Berührung mit einem Objekt und ein LOW-Signal, wenn er Berührung mit einem Objekt hatte.
Ein analoger Sensor erfasst stetig verteilte Messwerte. Dazu gehört die Schaltung mit Fototransistor, die das Umgebungslicht misst und entsprechende Spannungswerte zurückgibt.
Ein digitaler Wert ist eine Zahl, die durch Ziffern dargestellt wird. Computer und Mikrocontroller speichern analoge Messwerte als digitale Werte. Der Vorgang, mit Hilfe eines analogen Sensors die Daten digital zu speichern wird Analog-Digital-Wandlung genannt.
Die Map Funktion des Arduino
Im Programm Licht_Spannung.ino wurden die Messwerte im Bereich zwischen 0 und 1023 in Spannungswerte zwischen 0,0V und 4,995V umgewandelt und im Terminal angezeigt. Andere Anwendungen erfordern, dass die erfassten Werte in einen anderen Wertebereich umgewandelt werden müssen, um anschließend von weiteren Funktionen ausgewertet werden zu können.
Dabei hilft uns die map-Funktion, die einen Wert von einem Wertebereich in einen anderen äquivalenten Wertebereich transformiert.
Beispiel
Der Messbereich im Bereich von 0 bis 1023 soll in einen Bereich von 1300 bis 1700 transformiert werden, um ihn dann für die Ansteuerung eines Servos nutzbar zu machen. Das folgende Programmbeispiel zeigt wie die map-Funktion aufgerufen wird
In diesem Beispiel würde ein Wert von adcVal = 512 (die Mitte im Intervall von 0 bis 1023) durch die map-Funktion einen Wert neuAdcVal von 1500 (die Mitte von 1300 bis 1700) ergeben.
Bei einem konstanten Stromfluss fällt über einem großen Widerstand mehr Spannung ab als über einem kleinen. Bei konstantem Widerstand und variierendem Stromfluss wird der Spannungsabfall über dem Widerstand größer, wenn die Stromstärke steigt und kleiner, wenn sie fällt.
Die Analogeingänge des Arduino sind für einen Fototransistor-Schaltkreis nicht sichtbar, das heißt, der Eingang A3 beobachtet den Schaltkreis an der Verbindungsstelle P, hat aber auf die Schaltung selbst keinen Einfluss (Abb. 1).
Wird der 2kOhm Widerstand gegen einen 1kOhm Widerstand ausgetauscht, dann wird bei konstantem Stromfluss der Eingang A3 eine geringere Spannung wahrnehmen. Die Stromstärke müsste auf das Doppelte steigen (oder die Lichtstärke müsste entsprechend ansteigen), um ebenfalls einen Spannungsabfall von 3,5V über dem Widerstand messen zu können.
Ein kleinerer Widerstand in Serie mit einem Fototransistor verringert die Empfindlichkeit der Lichtschaltung.
Wird der 2kOhm Widerstand gegen einen 10kOhm Widerstand ausgetauscht, dann ist der Spannungsabfall 5-mal höher bei gleichbleibendem Stromfluss und die dafür notwendige Lichtstärke muss entsprechend geringer sein.
Ein größerer Widerstand in Serie mit einem Fototransistor erhöht die Empfindlichkeit der Lichtschaltung.
Die bisher benutzte Schaltung des Lichtdetektors war nur in einem bestimmten Lichtstärkebereich einsetzbar. Ein Standortwechsel mit anderen Lichtverhältnissen könnte die Schaltung unbrauchbar machen.
In der folgenden Übung beschäftigen wir uns mit einer elektronischen Schaltung, die einen sehr großen Lichtstärkebereich abdeckt mit Rückgabewerte zwischen 0 und 75.000. Kleinere Werte bedeuten jetzt stärkere Beleuchtung und große Werte schwache Beleuchtung.
Die folgenden beiden Schaltkreise reagieren unabhängig voneinander auf Lichtstärken, die von den Fototransistoren gemessen werden. Jeder von ihnen zeigt unter einem Winkel von 45° nach oben; einer zu linken der andere zur rechten Seite des Roboters. Ein Programm, das die Messwerte der beiden Fototransistoren abfragt, erkennt, welche Seite des BoE-Shield Bot Arduino die hellere ist und benutzt diese Information für die Navigation.
Material |
2x Fototransistor 2x Kondensator 0,1µF (104) 2x Widerstand 1kOhm (braun-schwarz-rot) 2x Steckdraht |
Aufgaben |
|
Schaltskizzen und Schaltungsaufbau
Jeder der beiden Kondensatoren in den Schaltkreisen kann als wiederaufladbarer Akku und die beiden Fototransistoren als lichtgesteuerte Stromventile aufgefasst werden. Die Kapazitäten lassen sich auf 5V aufladen und über die Fototransistoren entladen. Die Schnelligkeit, mit der sich der Kondensator entlädt, hängt davon ab, wieviel der Fototransistor durchlässt (Stromventil), und das wiederum hängt davon ab, wie stark er beleuchtet wird.
Je stärker der Lichteinfall, umso stärker der Stromfluss.
Mit Hilfe des Arduino wird die Zeit bestimmt, in der der Kondensator sich über den Fototransistor entlädt und seine Restspannung unter einen bestimmten Wert abgesunken ist. Die Entladezeit ist ein Maß dafür, wie weit das Stromventil geöffnet ist, das über die Helligkeit der Lichtquelle gesteuert wird. Stärkerer Lichteinfall bedeutet schnellere, weniger Licht entsprechend langsamere Entladung.
QT Schaltung
Eine übliche Abkürzung für den Ladungstransport ist QT. Dabei steht der Buchstabe Q für die elektrische Ladung und T für den Transport.
Test einer Fototransistor Schaltung
Der Sketch Licht_SensorLinks.ino lädt den Kondensator über P8 im QT-Schaltkreis, misst die Entladungszeit der Spannungsgröße und zeigt sie im Terminal an. Denke daran, je kürzer die gemessene Zeit, desto intensiver ist die Beleuchtung.
Aufgaben |
|
Das Programm Licht_SensorLinks.ino
Jetzt kommst du! - Test des zweiten Fototransistor Schaltkreises
Das, was wir eben für den linken Sensor überprüft haben, muss auch für den rechten durchgeführt werden. Beide Schaltkreise müssen fehlerfrei arbeiten, bevor wir den nächsten Schritt tun können.
Aufgaben |
|
Bei schwachem Licht könnten die Messzeiten der Funktion rcZeit so groß werden, dass sie von Variablen des Typs integer oder word nicht mehr zu verarbeitet sind. Deshalb wurde der Variablentyp long gewählt, für Werte zwischen -2.147.483.648 und + 2.147.483.648. Die Funktion
long rcZeit(int pin)
liefert eine Rückgabewert vom Typ long.
Die Messung einer Entladung umfasst sieben Schritte
In diesem Programm besteht Schritt 1 aus zwei Einzelschritten. Zuerst wird mit
pinMode(pin, OUTPUT)
der I/O Pin auf OUTPUT gesetzt und anschließend mit
digitalWrite(pin, HIGH)
die Fototransistorschaltung an 5V gelegt. Damit kann sich der Kondensator aufladen.
Schritt 3 besteht wieder aus zwei Einzelschritten. Mit dem Umschalten von OUTPUT-HIGH auf INPUT wird dem Schaltkreis ein auf dem Arduino-Board bereits integrierter Pull-up Widerstand von 20kOhm hinzugefügt,
pinMode(pin, INPUT)
der mit dem zweiten Befehl
digitalWrite(pin, LOW)
deaktiviert wird und dem Kondensator ermöglicht, seine Ladung über den Fototransistor gegen Masse abfließen zu lassen und sich damit zu entladen.
- Ein Thema für Fortgeschrittene -
Der folgende Graph zeigt die Spannungsantwort des linken und rechten QT-Schaltkreises auf dem BoE Shield Bot Arduino während eines Programmlaufes von Licht_beideSensoren.ino. Aufgenommen wurden beide Graphen mit einem Oszilloskop.
Die Hochachse zeigt die Spannung über dem Kondensator an, dabei gilt die linke Beschriftung für den linken, die rechte rote Beschriftung für den rechten Fototransistor. Die Zeitachse in der Einheit ms gilt für beide Schaltkreise. Die Markierungstexte im Graphen geben an, wann welcher Befehl im Programm Licht_beideSensore.ino ausgeführt wird und wie die Spannungsantwort darauf ist.
Die obere Kurve gibt den Spannungsverlauf an P8, dem linken Lichtsensor, im QT-Schaltkreis wieder. Als Antwort auf digitalWrite(8, HIGH) steigt der Spannungswert von 0V an der Zeitmarke 1ms sehr schnell auf ca. 5V und verbleibt für 1ms - delay(1) - auf diesem Niveau.
An der Marke 2ms auf der Zeitachse startet mit dem Aufruf von rcZeit die Entladung des Kondensators; dabei misst die Funktion rcZeit die Zeit, bis die Spannung über dem Kondensator auf 2,1V abgesunken ist und speichert den Wert in der Variablen tLinks. Der Graph zeigt, dass der Entladevorgang ca. 1ms benötigt; die Variable tLinks sollte deshalb einen Wert nahe bei 1000 annehmen.
Die untere Kurve gibt den Spannungsverlauf an P6, dem rechten Lichtsensor, im QT-Schaltkreis wieder. Die Messung beginnt, nachdem die Messung im linken Sensor abgeschlossen ist. Der Spannungsverlauf ist ähnlich dem des ersten Sensors, mit dem Unterschied, dass hier die Entladung des Kondensators gut 2ms beträgt. Es ist zu erwarten, dass die Variable tRechts einen Wert um 2000 annimmt. Der höhere Wert entspricht einer langsameren Entladung, die wiederum korrespondiert mit einer schwächeren Lichtstärke.