Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

1 - Navigation mit Fototransistor

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.

(Courtesy of Parallax Inc.)

2 - Licht - Spannung - Sensor

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
  • Löse die Verbindung zur Batteriehalterung und das USB-Kabel vom Arduino-Board. Bringe den Power-Schalter auf dem BoE-Shield Board in die Position 0.
  • Entferne alle Schaltungsaufbauten auf dem Steckbrett.
  • Baue die Schaltung nach der Schaltungsskizze auf.
  • Überprüfe die Schaltung nach dem Aufbau ein weiteres mal und achte darauf, dass sich die Elektroden des Fototransistors nicht berühren.

Schaltungsaufbau und Schaltskizze des Lichtdetektors

(Courtesy of Parallax Inc.)
Aufgaben
  • Verbinde die Batteriehalterung und das USB-Kabel mit dem Arduino-Board. Bringe den Power-Schalter auf dem BoE-Shield Board in die Position 1.
  • Übertrage das Programm Licht_Spannung.ino in den Editor und speichere es ab. Starte das Programm.
  • Bewege das Taschenlampenlicht langsam über den Fototransistor und beobachte die angezeigten Spannungswerte im Terminal. Helleres Licht bedeutet eine höhere Spannungsanzeige.
  • Ist das Umgebungslicht heller als das Taschenlampenlicht, muss der 2kOhm Widerstand gegen einen kleineren Wert ausgetauscht werden. Probiere nacheinander die Werte 1kOhm, 470Ohm oder 220Ohm.
  • Ist das Umgebungslicht schwach und als Lichtquelle wird eine Leuchtstoff-deckenlampe oder eine LED Taschenlampe benutzt, kann es hilfreich sein, den 2kOhm Widerstand gegen einen 4,7kOhm oder 10kOhm Widerstand zu tauschen.
  • Notiere den Messwert für das Umgebungslicht (die normale Raumbeleuchtung).
  • Notiere den Messwert für die Lichtquelle, die direkt auf den Fototransistor gerichtet ist.

Das Programm Licht_Spannung.ino

Terminalausgabe des Programms Licht_Spannung.ino

Meine Messungen

3 - Lichtsucher

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
  • Übertrage das Programm Licht_sucher.ino in den Editor und speichere es ab.
  • Bestimme den Mittelwert aus den beiden Spannungsmessungen zum Umgebungslicht und zur Lichtquelle. Setze diesen Wert als Begrenzungswert in das If...-Statement des Programms ein.
  • Starte das Programm.
  • Halte die Lichtquelle etwa 30cm über dem Erdboden, stelle den Roboter auf den Boden etwa 40 cm von der Lichtquelle entfernt so auf, dass er bei Geradeausfahrt die Lichtquelle passiert.
  • Bringe den Power-Schalter auf dem BoE-Shield Bot in Position 2 und lasse den Roboter losfahren. Wo kommt der Roboter in Bezug auf die Lichtquelle zum Halten?
  • Verändere die Einstellung des Schwellenwertes in der Programmzeile if(volt(A3) > ...) solange, bis der Roboter direkt unter der Lichtquelle zum Stehen kommt.

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

  • int adcVal = analogRead(A3);
  • int neuAdcVal = map(adcVal, 0, 1023, 1300, 1700);

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.  

4 - Wie arbeitet ein Fototransistor Schaltkreis?

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).

Abbildung 1 - Fototransistor Schaltung

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.

5 - Lichtstärke messen

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.

6 - Fotosensitive Augen

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
  • Entferne die Batterien und das USB-Anschlusskabel vom Arduino Board.
  • Baue die beiden Schaltkreise nach der Schaltskizze auf dem Steckbrett auf.
  • Überprüfe die aufgebaute Schaltung ein zweites mal auf eventuelle Fehlbeschaltungen und sich berührende Drähte.
  • Richte die Fototransistoren so aus, dass sie einen Winkel von ca. 90° zueinander einnehmen und nach außen gerichtet sind. Zum Steckbrett sollten sie einen Winkel von 45° einnehmen (Abb. 2).

Schaltskizzen und Schaltungsaufbau

Schaltskizze und Schaltungsaufbau für Fotosensivite Augen (Courtesy of Parallax Inc.)
Abbildung 2 - Ausrichtung der Fototransistoren auf dem BoE-Shield Arduino (Courtesy of Parallax Inc.)

7 - Ladungstransport im Fototransistor-Schaltkreis

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.

Abbildung 3 - Terminalausgabe zum Programm Licht_SensorLinks.ino
Aufgaben
  • Bei direkter Sonneneinstrahlung in den Versuchsraum sollten die Jalousien oder das Rollo heruntergelassen werden.
  • Übertrage das Programm Licht_SensorLinks.ino in den Editor und speichere es ab.
  • Starte das Programm und öffnet das serielle Terminal.
  • Notiere die im Terminal angezeigten Werte.
  • Werden keine Werte angezeigt oder hängt sich das Programm auf, dann könnte ein Verkabelungsfehler vorliegen.
  • Schatte den Fototransistor an P8 mit der Hand etwas ab.
  • Überprüfe den angezeigten Messwert im Terminal. Er sollte höher liegen als der Vorgängerwert. Notiere den Wert.
  • Schatte den Fototransistor an P8 stärker ab und notiere auch dafür den Messwert.
  • Fahre mit der Abschattung weiter fort und notiere jedes mal den Messwert.

Das Programm Licht_SensorLinks.ino

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
  • Lade das Programm Licht_SensorLinks.ino in den Editor und speichere es unter dem neuen Namen Licht_SensorRechts.ino ab.
  • Ersetze in der Methode loop() bei rcZeit das Argument 8 durch die Zahl 6.
  • Ändere alle Instanzen tLinks in tRechts.
  • Speichere das Programm ab und starte es.
  • Überprüfe, ob der zweite Schaltkreis fehlerfrei arbeitet.
  • Speichere das Programm unter dem neuen Namen Licht_beideSensoren.ino ab.
  • Ersetze die Methode loop() durch die folgenden Programmzeilen.
  • Drehe den BoE-Shield-Bot Arduino so, dass eine Seite in Richtung der hellsten Lichtquelle  im Raum und die andere Seite von ihr weg sieht. Wie groß ist die Differenz der Messwerte zwischen tLinks und tRechts im Terminal.
Neue Methode loop() im Programm Licht_beideSensoren.ino
Terminalausgabe zum Programm Licht_beideSensoren.ino

8 - Die Funktion rcZeit und die Abnahme der Spannung

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

  1. Setze den I/O Pin auf HIGH und lade den Kondensator.
  2. Warte so lange, bis der Kondensator geladen ist.
  3. Setze den I/O Pin auf Eingang.
  4. Bestimme die Zeit.
  5. Warte, bis der Spannungswert unter 2.1V gefallen ist.
  6. Bestimme erneut die Zeit.
  7. Berechne die Entladezeit aus der Subtraktion der zuerst gemessene Zeit von der zuletzt gemessenen.

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.

8 - Entladung eines Kondensators

- 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.

Abbildung 3 - Entladung eines Kondensators in einer Widerstand-Fototransistor-Schaltung (Courtesy of Parallax Inc.)

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.

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf