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

1 - Aufbau einer Fototransistorschaltung

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 und unter BoE Shield Bot Arduino -> Fototransistor.

Wir werden zwei Fototransistorschaltung aufbauen und dem ActivityBot damit später die notwendigen "Augen" verleihen, damit er sich besser in seiner Umgebung zurecht findet.

Fototransistorschaltung mit einem Propeller Mikrocontroller
Material

2x  Fototransistor

2x  0,01µF Kondensator

2x  220Ohm Widerstand

Aufgaben
  • Baue die Schaltung nach Abbildung 1 auf.
  • Die kürzere Elektrode des Fototransistors ist mit Masse verbunden, so wie im Verdrahtungsplan gezeigt.
  • Benutze den 0,01µF Kondensator (Aufdruck 103). Er ist nicht polar.
  • Biege die Fototransistoren um 90° nach vorne und 45° zur Seite.
Abbildung 1 - Schaltungsaufbau und Schaltskizze zur Fototransistorschaltung (Courtesy of Parallax Inc.)

2 - Fototransistorschaltung testen

In diesem Testlauf werden die Rohdaten der Schaltung im Terminal dargestellt. Dazu wird  eine Taschenlampe benötigt, die heller leuchtet als die Umgebungsbeleuchtung.

Fototransistorschaltungen arbeiten ohne Probleme im Gebäude, bei normaler Lampenbeleuchung, auch mit Leuchtstoffröhren. Direkte Sonneneinstrahlung oder das direkte Licht von Halogenleuchten sollte unbedingt vermieden werden. Sie würden Fototransistoren mit ihren zu hohen Infrarotanteilen überfluten.

Erster Testlauf mit einem Fototransistor

Aufgaben
  • Im Übungsraum sollte die direkte Sonneneinstrahlung durch Rollos vermieden. Halogenlampen sollten nicht vorhanden, ausgeschaltet oder so gerichtet sein, dass sie nicht direkt die Fototransistoren bestrahlen.
  • Übertrage das Programm IR_1.c in den Editor von SimpleTools.
  • Schiebe den PWR-Schalter auf dem ActivityBoard in Position 1.
  • Starte das Programm über Run with Terminal.
  • Halte die Hand über den Fototransistor, anschließend über den anderen und beobachte die im Terminal angezeigten Werte und ihre Veränderung.

Ergebnisdarstellung im Terminalfenster

Die hier dargestellten Werte wurden in einem Raum mit künstlichem Licht aufgenommen. Als Lichtquelle diente eine LED-Lampe. Der linke Fototransistor zeigt einen höheren Wert als rechts, das liegt daran, dass der linke Transistor mit einer Hand etwas abgedunkelt wurde.

 

Abweichende Messwerte

Es ist sehr unwahrscheinlich, dass die Messungen der beiden eingesetzten Fototransistoren exakt die gleichen Zahlenwerte ergeben. Die Sensoren unterscheiden sich Hersteller bedingt voneinander und die Lichtintensität ist nicht gleichmäßig über den Raum verteilt. Ist bei gleicher Lichtquelle der Helligkeitswert des einen Fototransistors zum Beispiel 100x höher als beim anderen, dann ist der eine vielleicht falsch eingesetzt. Überprüfe den Schaltkreis ein weiteres mal und versuche eine erneute Messung.

Das Programm IR_1.c

Wie arbeitet die Schaltung?

Zu Beginn des Programm werden zwei Variablen deklariert: IRlinks und IRrechts jeweils vom Typ int. Sie speichern die von den Fototransistoren gelieferten Werte.

Das Wesentliche passiert innerhalb der Endlosschleife while(1), in der zwei Messungen über die beiden Fototransistoren ausgeführt werden mit anschließender Ausgabe des Ergebnisses im Terminalfenster.

Messungen mit dem Fototransistor sind immer 2-Schritt-Prozesse:

1. Schritt 

Der Fototransistor wird mit HIGH(9) an +3,3V gelegt; der parallel geschaltete Kondensator kann sich aufladen. Das Ganze geht sehr schnell vor sich; eine Pause von 1ms ist ausreichend.

2. Schritt

Aufruf der rc_time Funktion und Entladung des Kondensators. Die ermittelte Entladezeit wird den dafür vorgesehenen Variablen IRlinks und IRrechts zugewiesen.

Die nachfolgende print-Anweisung gibt die Zahlenwerte im Terminal aus.

 

Für die ActivityBot Navigation sind die Rohdaten der beiden Lichtsensoren nicht brauchbar. Interessant und aussagekräftig sind die Differenzen der Lichtintensitäten zwischen dem rechten und linken Sensor. Daran kann der Roboter sich orientieren und eine Fahrstrategie entwickeln. Umfassende Informationen darüber findet man unter dem Thema Robotik.

3 - Graphisches Testprogramm

Graphisches Testprogramm für Fototransistoren
Aufgaben
  • Übertrage das Programm Fotoransistor_grafisch.c in den Editor und speichere es ab.
  • Klicke auf den Button Run with Terminal.
  • Drehe den ActivityBot ins Licht und aus dem Licht und beobachte jeweils die Position des Sterns in der Terminalanzeige.

Terminaldarstellung

Probleme mit der Darstellung?

Sollte das SimpleIDE Terminalfenster sehr klein sein, dann sind die Ergebnisse dort nicht zu erkennen. Vergrößere das Terminalfenster und dann starte das Programm erneut.

Das Programm Fototransistor_grafisch.c

Wie das Programm arbeitet

Jetzt wird es etwas anstrengend, da viel Text folgt, aber es lohnt sich zu verstehen, wie die grafische Darstellung im Terminal mit den print-Anweisungen aus der Bibliothek simpletools erzeugt wird.

 

Es werden zusätzlich zu den vorhandenen Variablen zwei weitere deklariert: ndiff  und position.

  • ndiff                speichert das Ergebnis aus der Berechnungsformel.
  • position           wird benutzt, um den Sterncursor im SimpleIDE Terminal zu platzieren.

 

Innerhalb der Funktion main definieren drei Befehlszeilen das Darstellungslayout im Terminal.

 

Die erste print-Anweisung zeigt die Werte der drei gelisteten Variablen und die Formatierungsanweisung \n (neue Zeile) sorgt dafür, dass drei leere Zeilen ausgegeben werden. Dadurch wird im Terminal Platz für den Sternchencursor oberhalb der Zahlenskala gemacht.

 

Die zweite print-Anweisung zeigt die Zahlenskala, gefolgt vom Formatierungsbefehl \n.

 

Die dritte print-Anweisung gibt die Zahlenmarken aus und endet ebenfalls mit einem Formatierungsbefehl \n.

 

In der folgenden Anweisung wird ein Zeichenfeld s deklariert und mit 51 Leerzeichen initialisiert. Sie werden für die Positionierung des Sternchencursors oberhalb der Zahlenleiste benötigt.

 

Es folgt eine Endlosschleife while(1). Die folgenden 8 Programmzeilen, die sich mit der Sammlung der Rohdaten der Sensoren beschäftigen, dürften uns inzwischen bekannt vorkommen.

In Zeile 24 wird die Berechnung des differentiellen Schattens ausgeführt. Die dazu benutzte Formel ist an anderer Stelle bereits besprochen worden.

  

Die drei folgenden print-Anweisungen positionieren den Cursor (Zeile 26), geben den aktuellen Dezimalwert der Sensoren IRrechts, IRlinks und ndiff im Terminal aus und löschen alle sonstigen Zeichen (Zeile 27) und bewegen abschließend (Zeile 28) den Cursor in die Zeile, in der der Sterncursor erscheint.

 

Mit einem Offset von 100 für ndiff wird in Zeile 30 sichergestellt, dass position eine positive Zahl ist. Diese wird so weit herunterskaliert, dass sie im Terminal darstellbar ist. Eine Division durch 4 bringt das gewünschte Ergebnis, das der Variablen position zugewiesen wird.

 

In Zeile 31 wird gezeigt, wie der Sterncursor positioniert wird. Mit s[position] = '*' wird das positionste-Element im s-Array zu einem Sternchen statt einem Leerzeichen. Anschließend wird dieses Zeichen im Terminal mit dem print(s) Befehl (Zeile 32) ausgegeben; es werden alle Elemente des s-Arrays ausgegeben, davon sind aber alle bis auf eines Leerzeichen und nur eines ist das Sternchen.

 

In Zeile 33 wird an das positionste-Element im s-Array wieder ein Leerzeichen geschrieben und das Sternchen kann beim nächsten Schleifendurchlauf woanders platziert werden. Fehlt diese Zeile, dann würde die Darstellungszeile für das Sternchen langsam zuwachsen mit Sternzeichen.

4 - Navigation mit Lichtsensoren

In dieser Übung wird der ActivityBot dem Licht folgen. Mit dem folgenden Programm findet der Roboter den Weg aus einem dunklen Raum in einen hell beleuchteten Flur oder er folgt dem Licht einer Taschenlampe.

Navigation mit Lichtsensoren
Aufgaben
  • Besorge dir eine helle Taschenlampe.
  • Übertrage das Programm Fototransistor_Licht.c in den Editor und speichere es ab.
  • Klicke auf den Button Load EEPROM & Run.
  • Löse das USB-Kabel vom Roboter und stelle ihn auf eine große freie Fläche.
  • Schiebe den PWR-Schalter in Position 2 und drücke den Reset-Button.
  • Halte die Taschenlampe vor den Roboter und beobachte, ob er sich in Richtung des Lichtes bewegt. Sollte die Taschenlampe nur schwach leuchten, müssen die Sensoren direkt angeleuchtet werden.
  • Schalte alle Lichtquellen im Zimmer aus und öffne die Tür zum hell erleuchteten Flur oder Nebenraum. Der ActivityBot sollte seinen Weg aus dem Raum heraus in den hellen Flur/Nebenraum finden.

Das Programm Fototransistor_Licht.c

Wie das Programm Fototransistor_Licht.c arbeitet

 

Für das Programm werden die Bibliotheksdateien simpletools und abdrive benötigt.  Nach der Initialisierung einiger Variablen besteht das Programm aus einer Endlosschleife, in der permanent Werte von den Fototransistoren ausgelesen werden, mit denen dann die Servogeschwindigkeiten so eingestellt werden, dass der Roboter sich immer in die Richtung der helleren Seite oder zum Licht hin bewegt.

 

Die Variablen IRlinks, IRrechts, ndiff vom Typ int nehmen die Messwerte der Sensoren auf oder enthalten aus den Rohdaten berechnete neuen Werte.

 

Die ersten sechs Programmzeilen aus der Endlosschleife while(1) kennen wir bereits aus dem Programm Fototransistor_graphisch.c; es sind die Rohdaten aus den Messungen der Lichtsensoren, die in den Variablen IRlinks und IRrechts gespeichert werden.

 

Die Berechnung in Zeile 21 ist ebenfalls bekannt und bezieht sich auf die Berechnung des differentiellen Schattens. Die Multiplikation mit 200 und anschließende Subtraktion von 100 skaliert die Werte von ndiff auf einen Bereich zwischen -100 und +100. Bei positiven ndiff Werten hat der linke Fototransistor den stärkeren Lichtanteil erfasst, bei negativen der rechte.

Je größer der Abstand vom Nullpunkt, desto größer ist die Differenz der gemessenen Lichtanteile vom linken und rechten Fototransistor.

 

In den Zeilen 23 und 24 werden die Variablen speedLinks und speedRechts mit 100 initialisiert. Der nachfolgende Entscheidungsbefehl lässt sich wie folgt übersetzen

  • "Wenn ndiff größer oder gleich 0 ist (die Lichtintensität auf der linken Seite ist höher), dann setze speedLinks auf 100 minus ndiff*4"
    

Mit dieser Festsetzung wird speedLinks ein Wert kleiner als der voreingestellte Wert von 100 zugewiesen, während speedRechts bei 100 verbleibt. In der Befehlszeile 28 wird dem Roboter die Geschwindigkeit für das rechte und linke Rad zugewiesen. Da sich das rechte Rad schneller als das linke dreht, schwenkt der Roboter nach links, dem Licht zu.

Beispiel:  Mit einem Messwert von ndiff = 50 errechnet sich speedLinks zu -100. Drive_speed(-100, 100) lässt den Roboter nach links schwenken, dem Licht entgegen.

 

Wenn jedoch ndiff negativ ist, wird der ELSE-Zweig der IF-Anweisung ausgeführt: speedRechts += (ndiff * 4). Dies könnte man wie folgt übersetzen:

  • "... sonst setze speedRechts auf 100 + ndiff * 4"
    

Dies führt, da ndiff negativ ist, ebenfalls zu einem Wert kleiner als 100.

Beispiel: Mit einem Messwert von ndiff = -25 errechnet sich speedRechts zu 100 + (-25 * 4) und wird identisch 0, während speedLinks bei 100 liegt. Drive_speed(100, 0) führt dazu, dass der ActivityBot auf der Stelle nach rechts dreht in Richtung des Lichts.

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

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

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