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

1 - Lichtmessung mit LDR, Fotodiode und Fototransistor

  • Weitere Vorschläge zum Thema mit den Boards: Arduino UNO - Prop-BoE - Prop-AB - Raspberry Pi

In den vorangegangenen Lektionen haben wir uns mit Drucktastern, sogenannten Kontakt-/Drucksensoren und Potenziometern als Positions-/Drehsensoren beschäftigt. Beide Bauteile sind in fast allen elektronischen Geräten zu finden – überlege selbst, wie viele Geräte man täglich benutzt, die über Drucktaster und Kontaktsensoren verfügen, ohne dass man sich darüber noch Gedanken macht.

Ein weiterer Sensor, der in sehr vielen Geräten benutzt wird, ist der Lichtsensor. Unverzichtbar geworden ist er inzwischen in den folgenden Geräten:

  • Autobeleuchtung, die automatisch angeschaltet wird, wenn es dunkel oder ein Tunnel passiert wird.
  • Straßenbeleuchtung, die sich automatisch einschaltet, wenn ein bestimmter Helligkeitswert unterschritten wird.
  • Bewegungsmelder, die die Beleuchtung einschalten, sobald ein Mensch in deren Erfassungsbereich tritt.
  • Automatische Helligkeitsregelung von Laptop Displays.
  • Kameras mit automatischer Belichtungseinstellung.
  • Sensoren in Fernsehern, Musikanlagen, DVD Spielern und anderen Audiosystemkomponenten, die sich über Fernbedienungen einstellen lassen.

Die ersten beiden Beispiele beschreiben automatisierte Lichtanlagen, die über Lichtsensoren verfügen, die Hell von Dunkel unterscheiden können. Die Elektronik muss nur auf zwei Zustände reagieren und verhält sich dabei ähnlich wie bei Drucktastern. Bei der automatischen Belichtungsregelung einer Kamera wird die Helligkeit über einen Lichtsensor ausgemessen und zum Beispiel in eine Verschlusszeit bei vorgegebenem Blendenwert umgerechnet. Das Vorgehen ähnelt eher dem Potenziometerbeispiel aus der Lektion 7-Segment-LED Display, bei der Zahlen die Position des Potis wiedergeben.

 

Die Lichtsensoren in Geräten der Unterhaltungselektronik reagieren auf infrarotes (IR) Licht, das von Fernbedienungen ausgesendet wird. Es ist für das menschliche Auge unsichtbar, kann aber von entsprechenden Sensoren wahrgenommen werden.

Am Kopf einer Fernbedienung für den Fernseher befindet sich eine solche IR LED. Jeder  Tastendruck auf der Fernbedienung sendet ein codiertes Signal aus Nullen und Einsen an den Fernseher, das wir nicht sehen können.

2 - Mehr über Infrarot LED und Detektoren

Im Kapitel über Robotics werden IR Empfänger und Sender genauer beschrieben. Ein Roboter benutzt IR LEDs als Lichtsender, deren unsichtbare Strahlen von Gegenständen, die sich ihm in den Weg stellen, reflektiert und von einem Empfänger wieder aufgefangen werden. So kann der Roboter entsprechend reagieren und zum Beispiel Hindernissen ausweichen. Mit einer IR-Fernbedienung eines Fernsehers kann ein solcher Roboter aber auch "fern"gesteuert werden. Wie das geht, zeigen wir in den Abschnitten, die sich mit Robotik befassen.

 

Es gibt sehr verschiedene Lichtsensoren, die auf die jeweilige Aufgabe, die sie erfüllen müssen, ausgerichtet sind. Die automatisch geregelte Straßenbeleuchtung reagiert auf sichtbares Licht, ein IR Sensor im Fernseher wartet auf IR-Signale von einer Fernbedienung und die Sensoren in einer digitalen Kamera reagieren möglicherweise auf unterschiedliche Farben.

Abbildung 7.1 Beispiele verschiedener Lichtsensoren - Courtesy of Parallax Inc.

Abb. 7.1 zeigt ein paar Lichtsensoren, die für unterschiedliche Anwendungen ausgelegt sind. Von links nach rechts sind das: Fototransistor, Cadmium-Sulfit LDR, linearer Lichtsensor, blau empfindliche Fotodiode, Licht-Frequenz-Konverter, IR Fototransistor und ein IR-Empfänger aus einem Fernseher.

Cadmium Sulfid (CdS) Fotowiderstand LDR

CdS Fotowiderstände sind in automatisch regulierten Lichtanlagen sehr häufig eingesetzt worden. Mit der Neuregelung der Europäischen Union über die Beschränkung der Verwendung bestimmter gefährlicher Stoffe in Elektro- und Elektronikgeräten (RoHS), darf ein CdS-Fotowiderstand in die meisten Geräte nicht mehr eingebaut werden. Damit stieg die Nachfrage nach Fototransistoren und linearen Lichtsensoren. Wir werden deshalb in unseren Übungen zur Lichtstärkemessung Fototransistoren statt der bisher üblichen LDRs einsetzen.

Im Datenblatt zu einem Lichtsensor wird beschrieben, für welchen Wellenlängenbereich des Lichtes der Sensor eingesetzt werden kann. Als Wellenlänge bezeichnet man

  • den Abstand zwischen zwei benachbarten Wellenbergen oder Wellentälern oder
  • den kleinsten Abstand zweier Punkte einer Welle, die die gleiche Phase oder die gleiche Auslenkung und Bewegungsrichtung haben.

 

Jede Farbe des sichtbaren Lichtes hat ihre eigene Wellenlänge. Abb. 7.2 zeigt Wellenlängen des sichtbaren und unsichtbaren Lichtes, gemessen in Nanometern (nm). Ein Nanometer ist der 1 milliardste Teil eines Meters. Der infrarote und ultraviolette Bereich des Lichtes sind für das menschliche Auge nicht sichtbar.

Abbildung 7.2 Wellenlängen und die entsprechenden Farben - Courtesy of Parallax Inc.

3 - Der Fototransistor

Ein Transistor reagiert wie ein Ventil, das eine bestimmte Menge des elektrischen Stroms durch zwei seiner Zuleitungen laufen lässt. Die dritte Zuleitung reguliert die Stärke des elektrischen Stromes durch die beiden anderen Zuleitungen. Abhängig vom Transistortyp lässt sich der Stromfluss über die Spannung, den Strom oder im Falle eines Fototransistors über das Licht regulieren. Abb. 7.3 zeigt das Schaltbild und eine Bauzeichnung eines Fototransistors. Je mehr Licht auf die Basis des Fototransistors fällt, desto mehr Strom wird vom Collectoranschluss (C) zum Emitteranschluss (E) geleitet. Umgekehrt führt weniger Licht auf der Basis dazu, dass weniger Strom durchgeleitet wird.

Abbildung 7.3 Fototransistor Schaltbild (links) und Bauteilzeichnung (rechts) - Courtesy of Parallax Inc.

Die höchste Empfindlichkeit dieses Fototransistors liegt bei 850nm, was nach Abb. 7.2 im IR-Bereich liegt. Aber er reagiert auch auf sichtbares Licht, weniger empfindlich ist er besonders bei Wellenlängen unter 450nm.

Halogen- oder Glühlampen und besonders Sonnenlicht sind wesentlich stärkere IR Lichtquellen als Leuchtstoffröhren. Der Fototransistor reagiert auf alle diese Lichtquellen, ist aber am empfindlichsten bei Sonnenlicht, weniger empfindlich bei Halogen- und Glühbirnenlicht und sehr wenig empfindlich bei Leuchtstoffröhren.

Die vorliegende elektronische Schaltung für den Fototransistor ist optimiert für die Nutzung im Innenbereich. Für den Außenbereich wird später eine andere Schaltungsvariante mit einem anderen elektronischen Bauteil, einer Licht emittierenden Diode,  genutzt.

4 - Aufbau und Test eines Lichtmessers

Im Kapitel BASIC Stamp - Drehbewegungen haben wir uns mit der Messung von Entladezeiten von Kondensatoren in einem RC-Schaltkreis mit Potenziometer beschäftigt.

Je größer der eingestellte Widerstandswert war, umso länger dauerte die Entladung des Kondensators, je kleiner der Widerstand wurde, umso kürzer wurde die Entladezeit. Als Ergebnis konnten wir festhalten: die Entladezeit ist ein Maß für den eingestellten Widerstand oder die Position des Mittelabgriffs bei einem Potenziometer.  

Wird das Potenziometer gegen einen Fototransistor ausgetauscht, dann verhält sich dieses Bauteil ähnlich einem Potenziometer. Je mehr Licht auf einen Fototransistor fällt, desto mehr Strom kann fließen und desto schneller entlädt sich ein Kondensator.  Weniger Licht bedeutet, höherer Widerstand, geringere Stromdurchlässigkeit und damit entlädt sich ein Kondensator langsamer. Mit Hilfe des RCTIME Befehls können wir jetzt die Lichtintensität mit einem Fototransistor messen.

In dieser Übung werden wir eine RC-Schaltung aufbauen und die Zeit messen, die ein aufgeladener Kondensator benötigt, um sich über einen Fototransistor zu entladen. Die Messwerte sind ein Maß für die Lichtintensität, die auf die lichtempfindliche Fläche des Fototransistors treffen. Wie schon bei den Versuchen mit einem Potenziometer werden auch hier die über den Befehl RCTIME gemessenen Zeitwerte im Debug Terminal ausgegeben.

Material

1x   Fototransistor

1x   Widerstand 220 Ohm (rot-rot-braun)

1x   Kondensator 0,01µF (Aufdruck 103)

1x   Kondensator 0,1µF (Aufdruck 104)

1x   Steckdraht

Aufgabe
  • Baue die Schaltung nach Abbildung 7.4 auf.
  • Achte auf den Emitter- und Kollektoranschluss des Fototransistors.
  • Gib das Programm TestFototransistor.bs2 in den Editor ein und speichere es anschließend unter diesem Namen ab.
  • Starte das Programm und notiere den im Terminal ausgewiesenen Zeitwert in einer Tabelle.
  • Starte das Programm erneut, dunkle die Fotodiode etwas mit der Hand ab und bestimme einen zweiten Zeitwert, der ebenfalls in die Tabelle eingetragen wird.
  • In einem dritten Programmlauf wird die Fotodiode von der Hand abgedunkelt und wiederum der Zeitwert gemessen und notiert.

Schaltbild und Schaltskizze

Abbildung 7.4 - Courtesy of Parallax Inc.

Beispielprogramm TestFototransistor.bs2

 

Die lichtempfindliche Fläche eines Fototransistors befindet sich oben im zylinderförmigen Kopf der Diode, die auch als Basis (B) gekennzeichnet ist (Abb. 7.3). Im Glaskörper sichtbar ist ein kleines schwarzes Quadrat, der eigentliche Fototransistor.

Die lichtempfindliche Stelle des Halbleiters wird unterschiedlich starkem Lichteinfall ausgesetzt. Während des Programmlaufs werden im Debug Terminal kleine Zeitwerte bei starkem und große Werte bei geringem Lichteinfall angezeigt.

Vermeide direkte Sonneneinstrahlung! Der Schaltkreis ist für Lichtintensitäten in normal beleuchteten Räumen dimensioniert und sollte nicht direkter Sonneneinstrahlung ausgesetzt werden.

Das Programm TestFototransistor.bs2

Meine Messwerte

Abbildung 7.5 Messung der Entladezeiten in einer RC-Schaltung mit C = 0,01µF Kondensator

Jetzt kommst du! - Setze andere Kondensatoren für unterschiedliche Lichtverhältnisse ein

Bei hell ausgeleuchteten Räumen oder Messungen im Freien sollte der 0.01 µF Kondensator gegen einen 0.1 µF Kondensator größerer Kapazität (Faktor 10) ausgetauscht werden. Die Zeitmessungen mit Kondensatoren größerer Kapazität benötigen in diesem Fall ca. 10-mal mehr Zeit, das heißt, dass der auf dem Debug Terminal ausgegebene Wert der Variablen zeit ebenfalls zehnmal größer wird. 

 

Das größte vom Befehl RCTIME zu messende Zeitintervall beträgt 65535 Einheiten á 2µs. Das entspricht einer maximal zu messenden Entladezeit von 65535 x 2µs = 131ms = 0,131s. Dauert eine Entladung des Kondensators länger, gibt der Befehl RCTIME den Wert 0 im Debug Terminal aus.

Aufgabe
  • Tausche den 0,01 µF Kondensator gegen einen 0,1 µF Kondensator aus.
  • Führe das Programm TestFototransistor.bs2 erneut aus und überprüfe, ob sich die RC-Zeitmessungen um den Faktor ~10 geändert haben.
  • Versuche den Fototransistor soweit abzudunkeln, dass die maximale Entladezeit überschritten wird und der Wert 0 im Terminal angezeigt wird.
  • Bevor du mit der nächsten Übung beginnst, setze wieder den 0,01µF Kondensator ein und baue die Schaltung nach Abbildung 7.4 auf.

Meine Messwerte

Abbildung 7.6 Messung der Entladezeiten in einer RC-Schaltung mit C = 0,1µF Kondensator

5 - Lichtereignisse aufzeichnen - Datalogging

Der Programmspeicher einer BASIC Stamp verliert selbst dann nicht, wenn die Spannungsversorgung abgeschaltet wird, seine Daten. Das ist eine besonders nützliche Eigenschaft. Sobald die Spannungsversorgung wieder angelegt wird, startet das vorher eingegebene Programm erneut.

Die Teile eines Programmspeichers, die vom Programm nicht genutzt werden, lassen sich als Datenspeicher einsetzen. Dies gilt vornehmlich für Daten, die die BASIC Stamp ständig benötigt und die auch nach einem Spannungsausfall sofort wieder verfügbar sein müssen.

Datalogging oder Datenaufzeichnung

Unter Datenspeicherung versteht man die periodische Aufzeichnung von Sensordaten über einen vorgegebenen Zeitraum durch einen Mikrokontroller.

Datenaufzeichnungsgeräte, kurz Datalogger genannt, werden sehr häufig in der Wissenschaft eingesetzt. Um zum Beispiel Wetterinformationen an einem bestimmten Ort aufzuzeichnen ist es nicht mehr notwendig, dass dort eine Person die Temperatur, Feuchtigkeit, Windgeschwindigkeit u.a. abliest. Dies erledigt eine Wetterstation mit automatischer Datenaufzeichnung; sie fragt periodisch in vorgegebenen Zeitabständen die einzelnen Sensoren (Temperatur, Luftdruck, Windgeschwindigkeit etc.) ab, und speichert und überträgt sie zu einem späteren Zeitpunkt an die Zentrale an einem anderen Ort.

In Abbildung 7.7 ist der Chip auf der BASIC Stamp markiert, in dem Programme und Daten abgelegt werden.  Er wird als EEPROM bezeichnet und ist ein Akronym für  electrically erasable programmable read-only memory. Umgangssprachlich reden wir kurz von E-E-Prom.

Abbildung 7.7 - Courtesy of Parallax Inc.

Abbildung 7.8 zeigt den Inhalt eines EEPROMs in Form einer sogenannten Speicherbelegung. Das Fenster wird über Run und Memory Map aus dem Hauptmenü des BASIC Stamp Editors aufgerufen. Die Speicherbelegung verfügt über unterschiedliche Farbdarstellungen, die dem Nutzer sofort zeigen, wie der RAM- (Variable) und der EEPROM-Bereich (Programmspeicher) der BASIC Stamp  genutzt werden. Die EEPROM Map zeigt zwei Graphen. Das rote Quadrat ganz links im Fenster zeigt mit seiner Höhe an, wie viel vom Programmspeicher für das Fotowiderstandsprogramm belegt ist. Verschiebt man dieses Quadrat nach oben oder unten, lassen sich alle Bereiche des EEPROM Speichers anschauen. Befindet sich das Rechteck ganz unten, sieht man, wieviel Speicher das Programm TestFototransistor.bs2 aus Übung 1 belegt.

 

Die EEPROM Map zeigt mit den blau markierten Bytes an, dass 37 von insgesamt 2048 Bytes des EEPROMS vom Programm belegt sind. Die restlichen 2011 Bytes stehen als Datenspeicher frei zur Verfügung.

Abbildung 7.8 EEPROM Map und RAM Map einer BASIC Stamp 2

In der EEPROM Map werden die Adressen mit hexadezimalen Zahlen angegeben. Die Spalte links zeigt die Startadresse jeder Zeile, die Zahlen oberhalb die Bytezahl innerhalb der Zeile (hexadezimal von 0 bis F) an. Die höchste Speicheradresse ist 7FF, die niedrigste 000.

Beispiel

Der hexadezimale Wert DB ist in dem in Abbildung 7.8 gezeigten Beispiel an der Speicheradresse 7E0 und AC an der Speicheradresse 7E3 abgelegt.  

Abbildung 7.9 Kilo-Byte und Kilo-Bit

PBASIC Programme werden immer von der höchsten Adresse im EEPROM beginnend gespeichert. Soll ein Programm zusätzlich auch noch Daten im EEPROM speichern, sollten diese bei der niedrigsten Adresse 0 starten. Damit ist die Wahrscheinlichkeit sehr groß, dass Programmcode nicht von Daten überschrieben wird und zu einem Programmabbruch führt.

 

In Abbildung 7.8 nimmt das Programm den Speicher von 7DFF bis 7DB im EEPROM ein. Daten lassen sich also ab Speicheradresse 0 bis 7DA im EEPROM unterbringen. Rechnen wir das in Dezimalzahlen um, sind das die Speicher von 0 bis 2010.

Wenn man also Daten im EEPROM Speicher ablegen möchte, muss man die Umrechnungen von hexadezimal zu dezimal beherrschen.

Informiere dich über das hexadezimale und dezimale Stellenwertsystem.

Die Datenspeicherung im EEPROM kann bei Datenaufzeichnungen, die über einen längeren Zeitraum gehen, sehr nützlich sein. Anwendungsbeispiele sind: Temperaturaufzeichnungen in einer Wetterstation oder einem Kühltransporter. Aber auch Lichtstärkemessungen ließen sich mit einer Wetterstation aufzeichnen, die dann einen Hinweis auf die Bewölkung, die Luftverschmutzung oder Kondenstreifendichte von Flugzeugen geben könnten. 

 

Da wir einen Fotowiderstand zur Lichtmessung benutzen, werden wir in dieser Übung eine Technik kennenlernen, die Messdaten in einem EEPROM abspeichert und von dort auch wieder ausliest. Wir werden dazu zwei PBASIC Beispielprogramme entwerfen, von denen das erste die aufgenommenen Messdaten im EEPROM abspeichert und das zweite diese Daten wieder ausliest und auf dem Debug Terminal anzeigt.

6 - Datenaufzeichnung von Langzeitmessungen

Mit dem Befehl WRITE werden Daten in das EEPROM geschrieben und mit READ wieder ausgelesen. Die Syntax des Befehls WRITE lautet:

  • WRITE Location, {WORD} Data Item
    

Soll zum Beispiel die Zahl 195 in die Adresse 7 des EEPROMS geschrieben werden, dann erfolgt dies über den Befehl:

  • WRITE 7, 195
    

Variablen vom Typ Word können Zahlenwerte zwischen 0 und 65565 verwalten, während die vom Typ Byte auf den Bereich zwischen 0 und 255 beschränkt sind.

Eine Word Variable benötigt im Speicher zwei Byte. Soll sie in einem EEPROM abgelegt werden, muss der Bezeichner Word der Zahl vorangestellt werden. Da eine Word-Variable zwei Byte benötigt, setzt sich der Schreibvorgang an der übernächsten Speicherstelle fort. Sollen beispielsweise die Werte 659 und 50012 im EEPROM abgelegt werden, dann könnte zum Beispiel die erste Zahl an der Speicherstelle 8 abgelegt werden. Der zweite Wert muss dann aber an der Adresse 10 beginnend gespeichert werden.

  • WRITE 8, Word 659
    
  • WRITE 10, Word 50012
    
Abbildung 7.10

Beispielprogramm  -  SpeichernInEeprom.bs2

In diesem Beispielprogramm erfährst du, wie man den WRITE Befehl einsetzt. Dazu werden über einen Zeitraum von 2,5 Minuten alle 5 Sekunden Lichtintensitäten mit dem Fototransistor gemessen  und die Werte ins EEPROM geschrieben.

Aufgabe
  • Gib das folgende Programm ein und speicher es ab unter SpeichernInEeprom.bs2 .
  • Starte das Programm.
  • Trage die auf dem Debug Terminal ausgegebenen Messwerte in die untenstehende Tabelle (Abb. 7.12) ein, so dass die aus dem EEPROM zurückgelesenen Daten nachher überprüft werden können.
  • Dunkle den Fototransistor während der Messung über 2,5 Minuten immer stärker ab.

Das Programm SpeichernInEeprom.bs2

Abbildung 7.11 Programm SpeichernInEeprom.bs2

Meine Messwerte

Abbildung 7.12 Messwerte in ein EEPROM speichern

Wie arbeitet das Programm SpeichernInEeprom.bs2?

Die FOR…NEXT Schleife, die die Entladezeiten aufnimmt und im EEPROM ablegt, zählt in Zweierschritten, da die Werte im EEPROM im Format Word abgelegt werden. 

  • FOR eepromAdresse = 0 to 58 STEP 2
    

Der Befehl RCTIME lädt die Zeitmesswerte in die Variable zeit vom Typ Word

  • RCTIME 2, 1, zeit
    

Die zeit Variable wird bei jedem Schleifendurchlauf an der Adresse, die durch den aktuellen Wert der Variablen eepromAdresse bestimmt wird, abgelegt. eepromAdresse erhöht sich bei jedem Schleifendurchlauf um zwei, da die im Speicher abgelegten Zahlen vom Typ Word (2 Byte) sind. Die Adresse in einem WRITE Befehl wird immer in Byte angegeben. 

  • WRITE eepromAdresse, Word zeit
    
  • NEXT 

7 - EEPROM auslesen

Beispielprogramm  -  LesenAusEeprom.bs2

Mit dem Befehl READ werden Daten aus dem EEPROM ausgelesen. Die Syntax des READ Befehls lautet:

  • READ Location, {WORD} Data Item
    

Während der WRITE Befehl sowohl Konstante als auch Variable verarbeitet, muss das DataItem Argument des READ Befehls immer eine Variable sein, da es Werte aus dem EEPROM ausliest, die über den READ Befehl dort hineingeschrieben worden sind.

Nehmen wir an, dass die Variablen eepromWertA und eepromWertB Variablen vom Typ Word sind und kleinEE eine Variable vom Typ Byte ist. Mit den folgenden Befehlen lassen sich die abgespeicherten Werte wieder zurückholen

  • READ 7, kleinEE
    
    READ 8, Word eepromWertA
    
    READ 10, Word eepromWertB
    

Im Beispielprogramm wird gezeigt, wie der Befehl READ aufgerufen werden muss, um Daten der Lichtmessung, die mit dem Programm SpeichernInEeprom.bs2 im EEPROM abgespeichert wurden, wieder auszulesen.

Variablen werden bei der BASIC Stamp im RAM abgelegt. Im Gegensatz zu EEPROMs werden die Daten im RAM gelöscht, sobald die Betriebsspannung ausgeschaltet oder ein Reset auf dem Board ausgelöst wird.

Die BASIC Stamp 2 verfügt über einen RAM von 26 Bytes, die auf der rechten Seite in der Memory Map dargestellt sind (Abb. 7.8). Eine Variable vom Typ Word benötigt 2 Byte, vom Typ Byte 1 Byte und ein Nibble ein halbes Byte. Ein Bit benötigt 1/8 eines Byte.

Aufgabe
  • Sobald das Programm SpeichernInEeprom.bs2 beendet ist, setze den PWR-Schalter des BoE auf 0 und schalte damit die Spannungsversorgung aus.
  • Gib das Programm AuslesenAusEeprom.bs2 in den BASIC Stamp Editor ein und speichere das Programm ab.
  • Schalte die Spannungsversorgung der BASIC Stamp wieder ein.
  • Starte das Programm AuslesenAusEeprom.bs2.
  • Vergleiche die im Terminal ausgegebenen Zahlenwerten mit denen deiner eigenen Tabelle.

Das Programm AuslesenAusEeprom.bs2

Abbildung 7.12 AuslesenAusEeprom.bs2

Wie arbeitet das Programm AuslesenAusEeprom.bs2?

Die Befehle WRITE und READ benutzen Byteadressen. Da aus dem EEPROM  Werte vom Typ Word ausgelesen werden, muss die Variable eepromAdresse nach jedem FOR…NEXT Schleifendurchlauf um 2 erhöht werden. 

  • FOR eepromAdresse = 0 to 58 STEP 2
    

Mit dem READ Befehl wird der Wert vom Typ Word an der Adresse eepromAdresse ausgelesen. Sein Wert wird der Variablen zeit zugewiesen. 

  • READ eepromAdresse, Word zeit
    

Die Werte der Variablen zeit und eepromAdresse werden spaltenweise in einer Tabelle im Debug Terminal ausgegeben. 

  • DEBUG DEC2 eepromAdresse, "           ", DEC zeit, CR
    
  • NEXT   

8 - Einfache Schaltung zur Messung der Lichtintensität

Die Information eines Lichtsensors kann auf verschiedene Art und Weise ausgewertet und umgesetzt werden. Das Lichtintensitäts-Messgerät in dieser Übung bringt die äußeren LEDs auf einer 7-Segment-Anzeige nacheinander zum Leuchten, so dass der Eindruck eines umlaufenden Lichtes entsteht. Die Umlauffrequenz soll dabei abhängig von der jeweils gemessenen Lichtintensität sein.

Material

1x  Fototransistor

1x  Widerstand – 220 Ohm (rot-rot-braun)

1x  Kondensator – 0.01 µF

1x  Kondensator – 0.1 µF

1x  7-Segment LED Anzeige

8x  Widerstand – 1 kOhm (braun-schwarz-rot)

6x  Steckdraht

Aufgabe

Baue die Schaltung nach Abb. 7.15 auf dem Steckbrett auf.

Schaltungsaufbau und Schaltskizze

Abbildung 7.13 7-Segment-LED Anzeige
Abbildung 7.14 Fototransistor an P2
Abbildung 7.15 Schaltungsaufbau zu Übung 3 - Courtesy of Parallax Inc.

9 - Unterprogramme

Die meisten Programme, die wir bisher geschrieben haben, sind in eine DO…LOOP Schleife eingebettet. In ihr wurden die grundlegenden Aktionen oder Routinen ausgeführt, deshalb nennen wir einen solchen Programmteil auch Hauptprogramm.

Sobald zu einer elektrischen Schaltung weitere Schaltkreise und damit dem Hauptprogramm weitere Programmfunktionen hinzugefügt werden, die die neuen Schaltkreise abfragen, kann ein sehr unübersichtliches umfangreiches Hauptprogramm entstehen.

 

Ein Programm ist übersichtlicher gestaltet, wenn es in kleinere Teilprogramme, von denen jedes nur eine Aufgabe übernimmt, zerlegt wird. PBASIC stellt dafür einige Befehle zur Verfügung. Mit einem Sprungbefehl gelangt man aus dem Hauptprogramm in ein sogenanntes Unterprogramm und die dort anstehenden Aufgaben werden abgearbeitet. Anschließend kehrt das Programm zum Hauptprogramm zurück und setzt seine Arbeit an der Stelle fort, wo es vorher in das Unterprogramm abgezweigt war. Teilaufgaben lassen sich über eine solche Struktur sehr einfach aus dem Hauptprogramm herausnehmen und damit übersichtlicher und lesbarer werden.

Abb. 7.16 zeigt ein Beispiel für ein Unterprogramm und wie es aufgerufen wird.  Mit GOSUB Subroutine_Name wird das Programm angewiesen, mit seiner Ausführung im Unterprogramm mit der Einsprungmarke Subroutine_Name: fortzufahren. Es werden alle folgenden Befehle und Anweisungen ausgeführt, bis das Programm auf die Anweisung RETURN trifft.

An dieser Stelle endet das Unterprogramm und die Arbeit wird im Hauptprogramm in der Zeile fortgesetzt, die auf den GOSUB Befehl folgt. Für das Beispiel in Abb. 7.16 heißt das, der nächste auszuführende Befehl nach dem Rücksprung aus dem Unterprogramm lautet: DEBUG "Next command".

Abbildung 7.16 Unterprogramm-Technik - Courtesy of Parallax Inc.

Programmbeispiel   EinfachesUnterprogramm.bs2

In diesem Programm wird gezeigt, wie aus Unterprogrammen Botschaften in das Debug Terminal gesendet werden.

Aufgabe
  • Gib das Programm EinfachesUnterprogramm.bs2 in den BASIC Editor ein und speichere es ab.
  • Schaue dir nur das Programm EinfachesUnterprogramm.bs2 an und finde heraus, in welcher Reihenfolge die DEBUG Befehle abgearbeitet werden.
  • Starte anschließend das Programm.
  • Vergleiche das Verhalten des Programms mit den eigenen Vorhersagen.

Das Programm EinfachesUnterprogramm.bs2

Abbildung 7.17 EinfachesUnterprogramm.bs2

Wie arbeitet das Programm EinfachesUnterprogramm.bs2?

Abb. 7.18 zeigt, wie der erste Unterprogrammaufruf Erstes_Unterprogramm im Hauptprogram (DO…LOOP) arbeitet. Die Anweisung GOSUB Erstes_Unterprogramm verursacht einen Sprung zur Marke Erstes_Unterprogramm:. Die drei Befehle des Unterprogramms werden ausgeführt. Mit Erreichen der Anweisung RETURN kehrt das Programm zu der Anweisung zurück, die dem Befehl GOSUB folgt, in diesem Fall ist das DEBUG "Zurück im Hauptprogramm.", CR.

Abbildung 7.18

Es lassen sich auch Unterprogramme aus Unterprogrammen aufrufen. Dies bezeichnen wir als geschachtelte Unterprogramme. Maximal sind vier Schachtelungsebenen zulässig.

10 - Messung der Lichtintensität

Die einzelnen Anzeigensegmente einer 7-Segment-LED Anzeige werden kreisförmig durchlaufen, wobei die Umlaufgeschwindigkeit um so höher ist, je höher die vom Fototransistor aufgenommene Lichtintensität ist. Wird das Licht gedimmt, nimmt auch die Umlauffrequenz ab. 

Das Programm für das Lichtmessgerät enthält drei unterschiedliche Ausführungsteile:

  1. Fototransistor auslesen.
  2. Berechnung, wie groß die Pause sein muss, bis die 7-Segment LED Anzeige aktualisiert wird.
  3. Aktualisierung der 7-Segment LED Anzeige.

Für jedes dieser Ausführungsteile wurde ein eigenes Unterprogramm geschrieben. Die Hauptroutine ruft über eine Endlosschleife DO…LOOP  diese Unterprogramme nacheinander auf.

Aufgabe
  • Gib das Programm Lichtintensitaet.bs2 in den BASIC Stamp Editor ein und speichere es ab.
  • Starte das Programm Lichtintensitaet.bs2.
  • Überzeuge dich davon, dass das auf der 7-Segment Anzeige dargestellte Beleuchtungsmuster durch die vorherrschenden Beleuchtungsbedingungen, die über den Fototransistor aufgenommen werden, gesteuert wird, indem du den Sensor mit der Hand oder einem Stück Papier unterschiedlich intensiv beschattest.

Programmbeispiel  Lichtintensitaet.bs2

Abbildung 7.19 Programm Lichtintensitaet.bs2

Wie arbeitet das Programm  Lichtintensitaet.bs2?

In den ersten beiden Zeilen werden die Variablen deklariert. Dabei spielt es keine Rolle, ob diese Größen im Haupt- oder Unterprogramm aufgerufen werden. Wir vereinbaren, dass die Variablen und Konstanten am Anfang eines Programms, dem sogenannten Deklarationsteil, definiert werden. Dieser Begriff erscheint als Kommentar rechts in der ersten Zeile der Variablendeklaration.

index VAR Nib                  ' Deklarationsteil.

zeit  VAR Word

In vielen Programmen werden auch Deklarationen benötigt, die man einmal am Anfang eines Programms einstellen sollte. Zum Beispiel, wenn bei einer 7-Segment Anzeige alle I/O Pins auf LOW gesetzt und als Ausgänge deklariert werden müssen. Diesen Abschnitt innerhalb eines PBASIC Programms bezeichnen wir als Initialisierung. 

OUTH = %00000000              ' Initialisierung der 7-Segment
DIRH = %11111111               ' Anzeige

Der folgende Programmteil wird als Hauptprogramm bezeichnet. Im Hauptprogramm wird als erstes Unterprogramm RC_zeit, dann das Unterprogramm Verzoegerung und schließlich update_display aufgerufen. Denke bitte daran, dass das Programm die drei Unterprogramme beliebig oft durchläuft und abarbeitet. 

DO                             ' Hauptprogramm.
  GOSUB RC_zeit
  GOSUB verzoegerung
  GOSUB update_display
LOOP

Alle Unterprogramme werden im allgemeinen über das Hauptprogramm aufgerufen. Das erste Unterprogramm trägt den Namen RC_zeit: und misst im Fototransistor-Schaltkreis die Entladezeit. In diesem Unterprogramm wird der Befehl PAUSE aufgerufen, der dafür sorgt, dass sich der Kondensator aufladen kann. Beachte, dass der Befehl RCTIME den Wert der Variablen zeit bestimmt. Dieser Wert wird im zweiten Unterprogramm benötigt.

RC_zeit:                  ' Unterprogramm Entladezeit
  HIGH 2
  PAUSE 3
  RCTIME 2, 1, zeit
RETURN

 Der Name der zweiten Routine lautet verzoegerung, das Unterprogramm selbst besteht nur aus dem Befehl PAUSE. Sind zusätzliche Berechnungen mit der Variablen zeit  erforderlich, bevor sie im Befehl PAUSE aufgerufen werden, sollte dies in diesem Unterprogramm erfolgen.  

Verzoegerung:
  PAUSE zeit/3
RETURN

Das dritte Unterprogramm lautet update_display. Der Befehl LOOKUP in diesem Unterprogramm enthält eine Tabelle mit sechs Bitmustern, die für die Darstellung des Kreismusters auf der 7-Segment Anzeige benötigt werden. Da bei jedem Unterprogrammaufruf die Variable index um 1 erhöht wird, wird das folgende Bitmuster aus der Tabelle an OUTH übergeben. Die Lookup Tabelle enthält nur Einträge für die index Werte von 0 bis 5.

Was passiert, wenn der Indexwert 6 anzeigt? Der Lookup Befehl kann diesen Wert nicht interpretieren, deshalb lässt sich mit einer IF...THEN Anweisung der nicht definierte Zustand beheben. Die Befehlszeile

IF index = 6 then index = 0

setzt den Wert von index auf 0, wenn er 6 anzeigt. Damit wird erreicht, dass sich die Folge der  Bitmuster in OUTH ständig wiederholen. Das wiederum lässt die 7-Segment Anzeige das Kreismuster ständig wiederholen.

Jetzt kommst du! – Hard- und Software der Messschaltung abändern

Die Empfindlichkeit des Lichtintensitätsmessers lässt sich auf zwei verschiedene Arten beeinflussen.

 

Mit Hilfe der Software

Wird die Variable zeit im Unterprogramm verzoegerung statt durch 3 durch einen Faktor größer 3 geteilt, dann erhöht sich die Umlaufgeschwindigkeit, ein Faktor kleiner 3 erniedrigt sie. Wird die Variable zeit mit einem ganzzahligen Faktor multipliziert, reduziert das die Umlaufgeschwindigkeit sehr stark. Für ein Feintuning sollte dann der Operator */ eingesetzt werden.

 

Mit Hilfe der Hardware

Bei parallel geschalteten Kondensatoren addieren sich die Kapazitätswerte. Wird ein zweiter Kondensator der Kapazität 0,01µF zu dem vorhandenen parallel geschaltet, dann ergibt sich eine Gesamtkapazität von 0,02µF. Bei doppelt so hoher Kapazität wird die Entladezeit bei gleicher Lichtintensität doppelt so lang sein.

Material

zusätzlich zum Material aus Übung 1

1x  Kondensator 0,01µF

Aufgabe
  • Setze den PWR-Schalter auf dem BoE auf 0.
  • Schalte parallel zum Kondensator mit C = 0,01µF einen zweiten gleicher Kapazität (Abb. 7.20)
  • Starte das Programm Lichtintensität.bs2 erneut.
  • Beobachte die Umlauffrequenz auf der LED-Anzeige. Sie sollte sich verringern.

Die Entladezeit dauert jetzt doppelt so lang wie vorher; die Rotationsgeschwindigkeit auf der 7-Segment-Anzeige sollte sich also ungefähr halbieren.

Schaltskizze und Schaltungsaufbau

Abbildung 7.20 - Courtesy of Parallax Inc.

Alle Lichtintensitätsmessungen lassen sich auch mit einem LDR durchführen. Dazu muss der Fototransistor gegen den LDR getauscht und die Anpassung der Empfindlichkeit der Schaltung über die Soft- und Hardware (Austausch des Kondensators) vorgenommen werden.

Diese Unterrichtsvorlagen sind entstanden in Anlehnung an die deutsche Übersetzung des Buches "What´s a Microcontroller?" Vers. 2.2 und 3.0 by Andy Lindsay, Parallax Inc., übersetzt und bearbeitet von Reinhard Rahner. BASIC Stamp, Board of Education, Homework Board sind eingetragene und geschützte Warenzeichen der Firma Parallax Inc.

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