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 |
|
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 |
|
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.
Graphisches Testprogramm für Fototransistoren | |
Aufgaben |
|
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.
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.
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 |
|
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.