Sensoren (1)

Inhalte

  • Einfache Sensoren: LDR, Thermistor, …
  • Benz-Formel
  • Die map -Funktion

    Einführung

Viele Anwendungen erfordern die Messung physikalischer Größen wie Licht, Temperatur, Druck, Distanz, … Viele elektronische Bauteile verhalten sich variabel unter Einwirkung von einer oder mehrerer dieser Größen (z.B. verändert sich der Widerstand unter Einfluss der Temperatur). Diese Bauteile können daher als Sensoren für diese Größen verwendet werden.
Im Folgenden wird eine Übersicht über die Anwendung dieser Sensoren gegeben.

Analoge Sensoren mit variablen Widerstand

  • Photowiderstände (Light Dependend Resistor – LDR) sind Bauteile mit einem variablen ohmschen Widerstand. Je nach einfallender Lichtmenge ändert sich der Widerstandswert.
  • Thermistoren haben einen variablen Widerstand abhängig von der Temperatur, der sie ausgesetzt sind.
  • Drucksensoren (Force Sensing Resistor – FSR) ändern ihren Widerstand in Abhängigkeit mit dem auf sie ausgeübten Druck.
  • u.v.m

Schaltung für Sensoren mit variablen Widerstand

Die Bauteile mit variablen Widerstand werden oft mit einem zweiten Widerstand in Serie geschalten (Spannungsteiler). Die Spannung zwischen diesen beiden Widerständen ist proportional zum Verhalten des variablen Widerstands.

analog_sensor_schaltung_Schaltplan

Der Widerstand des Sensors ist zwar variabel, bewegt sich aber zwischen einem Minimum und einem Maximum. Diese Werte können entweder aus dem Datenblatt abgelesen werden oder mit einem Multimeter gemessen werden.

Abhängig von diesen Werten muss der zweite, feste Widerstand (Referenzwiderstand) dimensioniert werden. Ziel ist es den Messbereich des analogen Inputs des Arduinos möglichst gut auszunutzen. (Erläuterung: Die analog-Digital-Wandler des Arduinos arbeiten mit einer Auflösung von 1024 Werten (10 Bit) zwischen Minimum (0V) und Maximum (5V)). Wenn die gemessenen Werte beispielsweise zwischen 200 und 300 liegen, dann wird der Gesamtbereich des ADCs nicht gut ausgenutzt. Über einen passenden Referenzwiderstand am Spannungsteiler kann dieser Bereich vergrößert werden, wobei auch mit der Wahl eines idealen Widerstands nie der gesamte Bereich zw. 0 und 1023 ausgenutzt werden wird.)

Gerne wird zur Findung des Referenzwiderstandswerts die Benz-Formel (nach Axel Benz) verwendet:

benz_formel

Beispiel 1: Lichtmessung mit einem LDRs

Folgender Aufbau demonstriert die Funktionsweise eines LDRs. Er variiert seinen Widerstand mit dem einfallenden Licht. Um die Größe des Referenzwiderstands zu ermitteln messen wir zunächst den Widerstand des LDRs bei Dunkelheit (max) und bei Lichteinfall (min). Für den hier verwendeten LDR werden folgende Werte gemessen:

  • Minimum = 570 Ω
  • Maximum = 4,7 kΩ

Mit der Benz-Formel wird der Referenzwiderstand berechnet

benz_formel_werte

Ein solcher Widerstand existiert in keinem zur Verfügung stehenden Sortiment, daher wird der nächstliegende gewählt – in diesem Beispiel ist das 1.5 kΩ.

analog_sensor_schaltung_Steckplatine

Folgender Code basiert auf dem Beispiel File -> Examples -> 03.Analog -> AnalogInOutSerial (das Beispiel wurde leicht modifiziert). Nach dem Upload auf das Board kann man im Serial Monitor die gemessenen Werte beobachten.

Hält man nun den LDR mit der Hand zu, dann steigen die gemessenen Werte aufgrund der Widerstandsänderung an. Wir haben unseren ersten Sensor implementiert.

Code-Analyse:

In diesem Beispiel wird in Zeile XX die Spannungsmessung mit analogRead  vorgenommen. Anschließend wird der gemessene Wert noch mit der map-Funktion (unten beschrieben) skaliert und in die Variable outputValue  gespeichert. Anschließend erfolgt eine Ausgabe der beiden Variablen am Serial Monitor.

Die map-Funktion

Die Widerstände der Bauteile sind zwar variabel, bewegen sich aber immer innerhalb eines bestimmten Bereichs. Dementsprechend sind auch die gemessenen Spannungen immer in einem bestimmten Bereich, der aber nicht die ganze Größe des Bereichs (0-1023) ausnützt. Eine Möglichkeit die gemessenen Werte auf einen anderen Bereich zu skalieren (d.h. vergrößern oder verkleinern) ist die map -Funktion.

Für die map -Funktion werden drei Dinge definiert:

  • Ein zu konvertierender Wert
  • Der Eingangs-Wertebereich (definiert über ein Minimum und ein Maximum)
  • Der Ausgangs-Wertebereich (definiert über ein Minimum und ein Maximum)Der zu konvertiertende Wert ist Verhältnis zum Eingangswertebereich zu sehen. Der Wert wird nun so verändert, dass er im selben Verhältnis im Ausgangswertebereich zu sehen ist.

map(Wert, InputMin, InputMax, OutputMin, OutputMax)

Beispiel 1

InputMin: 200, InputMax: 600
OutputMin: 0, OutputMax1023

Wert: 200 -> gemappter Wert: 0
Wert: 600 -> gemappter Wert 1023
Wert: 400 -> gemappter Wert: 511
Wert: 500 -> gemappter Wert: 767

Beispiel 2

InputMin: 200, InputMax: 600
OutputMin: 255, OutputMax 0

Wert: 200 -> gemappter Wert: 255
Wert: 600 -> gemappter Wert 0
Wert: 400 -> gemappter Wert: 128
Wert: 500 -> gemappter Wert: 64

Hier der zugehörige Test-Code:

 

Aufgabe

[VIDEO]

  • Passen Sie Beispiel 1 so an, dass die gemessenen Eingangswerte den Ausgangsbereich 0 bis 255 möglichst gut abdecken.
  • Ersetzen Sie den LDR durch einen Thermistor, passen Sie den Widerstandswert entsprechend an und modifizieren die Werte der Map-Funktion wie in der vorigen Aufgabe.

Pulsweitenmodulation

Inhalte

  • Pulsweitenmodulation zur Simulation eines analogen Signalen mit einem digitalen Signal

Einführung

In der Digitaltechnik kommen üblicherweise nur Signale zum Einsatz, die zwei Spannungslevel darstellen können (HIGH und LOW). Oft werden aber Signale benötigt, die auch Werte dazwischen darstellen können. Die Pulsweitenmodulation (PWM) ist eine Möglichkeit solche Werte zu simulieren, indem man sehr schnell zwischen HIGH und LOW mit einer gewissen Dauer umschaltet. Im Durchschnitt ergibt die Einschaltdauer einen Wert, der sich zwischen HIGH oder LOW befindet.

Prinzip der Pulsweitenmodulation

Betrachten wir zunächst die folgenden Signale:

pwm_100_percent
Dieses Signal hat immer den Wert HIGH. Seiner durchschnittliche Energie beträgt 100%.
pwm_0_percent
Dieses Signal ist immer auf LOW. Seine durchschnittliche Energie beträgt 0%
pwm_50_percent
Dieses Signal wechselt zwischen HIGH und LOW, wobei die Dauer der Zustände gleich lange ist. Die durchschnittliche Energie im Signal ist 50%

Im letzten Bild wird durch das schnelle Umschalten zwischen HIGH und LOW die durchschnittliche Energie des Signals auf 50% reduziert. Durch eine Variation der Einschaltdauer können im Durschnitt auch viele andere Werte zwischen HIGH und LOW erreicht werden.

pwm_25_percent
Das Signal wird nur in 25% der Zeit auf HIGH gesetzt. Seine durchschnittliche Energie beträgt daher 25%
pwm_75_percent
Das Signal wird zu 75% der Zeit auf HIGH gesetzt. Seine durchschnittliche Energie beträgt daher 75%.

Der Wechsel zwischen HIGH und LOW geschieht sehr schnell (am Arduino im Bereich von mehreren hundert Hertz, d.h. mehrere hundert Male pro Sekunde). Die Dauer des eingeschalteten Signals wird in Prozent angegeben und Tastgrad (engl. duty cycle) genannt.

Wir ein solches Signal an eine LED geschickt, so schaltet diese ebenso schnell an oder aus. Das menschliche Auge ist für so schnelle Umschaltgeschwindigkeiten viel zu träge und nimmt daher nur die durchschnittlich abgegebene Energie wahr. Bei vielen Gleichstrommotoren ist führt die Anwendung der Pulsweitenmodulation zu einer niedrigeren oder höheren Drehzahl.

PWM am Arduino ( analogWrite )

Manche der digitalen Pins am Arduino erlauben die Ausgabe eines PWM-Signals. Diese Pins sind mit einer Tilde (~) gekennzeichnet. Über den Aufruf der Funktion analogWrite(PIN, WERT)  kann an einem PIN ein PWM-Signal mit einem bestimmten duty cycle erzeugt werden. Der WERT muss zwischen 0 (0% duty cycle) und 255 (100% duty cycle) liegen. Ein duty cycle von 50% verlangt also den Wert 127.

Zusammenfassung

PWM-Signale simulieren analoge Spannungen, indem sie ein digitales Signal sehr schnell ein- und ausschalten. Die eingeschaltete Zeit im Verhältnis zur Gesamtzeit eines solchen Zyklusses wird duty cycle genannt und in Prozent angegeben.

Am Arduino lässt sich auf bestimmten Pins, die mit einer Tilde ~ gekennzeichnet sind ein PWM-Signal erzeugen. Der Befehl analogWrite  nimmt Werte im Bereich 0 bis 255 an, um den duty cycle des Signals zu setzen.

Weiterführende Links

 

 

 

Analoges I/O

Inhalte

  • Analoger Input am Arduino mit analogRead
  • Pseudo-analoger Output am Arduino mit analogWrite
  • Spannungsteiler und Potentiometer

Einführung

In den bisherigen Beispielen wurden immer digitale Werte für Input und Output am Arduino verwendet. Digital bedeutet, dass nur binäre Werte zum Einsatz kamen ( LOW oder HIGH , false  oder true , 0 oder 1). Dementsprechend waren auch unsere Input- und Output Optionen auf zwei Werte beschränkt (Taster nicht gedrückt oder Taster gedrückt, LED aus oder LED an).

In der Realität benötigt man zur Beschreibung eines Zustands oft mehr als zwei Werte. Um eine Temperatur zu messen wird ein Thermometer üblicherweise mehr als zwei Zustände anzeigen (also nicht nur HEISS oder KALT, sondern Werte auf einer kontinuierlichen Skala, z.B. zwischen -20° Celsius und +50° Celsius).

Werte, die viele unterschiedliche Zustände annehmen können, bezeichnet man als analoge Werte. Das Arduino hat mehrere Inputs um analoge Spannungen in einem gewissen Spannungsbereich messen zu können. Diese Inputs sind als A0  bis A5  am Board gekennzeichnet.

analog_pins

Analoge Inputs

Die analogen Inputs am Arduino konvertieren die anliegende elektrische Spannung in einen Zahlenwert. Intern kommt hierfür ein Analog-Digital-Konverter (ADC) mit einer Auflösung von 1024 Werten zum Einsatz (Details zur Funktionsweise im Artikel BITS UND BYTES). Dies bedeutet, dass eine anliegende Spannung von 0V den mit dem Wert 0 ausgelesen wird, eine Spannung von 5V (bei anderen Boards auch 3.3V) wird als Wert 1023 ausgelesen. Spannungen dazwischen werden proportional dazwischen verteilt (so bekommt die Hälfte der Spannung von 5V, also 2,5V,  den Wert 511, was ungefähr der Hälfte von 1023 entspricht).

Im Arduino Code wird die Funktion analogRead(PIN_NUMMER)  verwendet um vom ADC einen Wert am entsprechenden Pin auszulesen. Im folgenden Beispiel wird vom Analog-Pin A0  der Wert ausgelesen und in die Variable analogValue  gespeichert:

Pseudo-Analoge Outputs

Um analoge Spannungswerte mit einem Mikrocontroller auszugeben, benötigt man eigentlich einen Digital-Analog-Konverter (DAC). Leider existiert ein solcher auf dem Arduino nicht. Mit einem Trick kann man aber auch nur mittels zwei digitalen Werten analoge Werte simulieren (vereinfacht gesagt werden hierzu die Ausgänge sehr schnell aus- und wieder eingeschalten. Details im Artikel Pulsweitenmodulation).

Am Arduino können nur bestimmte digitale Pins als pseudo-analoge Outputs verwendet werden. Diese sind mit dem Tilde-Zeichen (~) gekennzeichnet.

digital_pins

Mit dem analogWrite(PIN_NR, WERT)  Befehl kann man eine analoge Ausgabe an einem solchen Ausgang simulieren. Der in diesem Befehl angegebene Wert muss zwischen 0 und 255 liegen.

Beispiel 1

In diesem Experiment wird die analoge Spannung an einem analogen Pin mittels analogRead  gemessen. Das Ergebnis dieser Messung wird gleich mittels analogWrite  auf einen Pin geschrieben, der mit einer LED verbunden ist. Um einen Spannungswert zu erhalten, der zwischen 0 und 5V liegt wird ein Spannungsteiler verwendet (das Prinzip hierfür wird weiter unten genauer beschrieben).

spannungsteiler_Steckplatine

Verbinden sie nun eines der drei Kabel mit dem Pin A0.

  • Bei Verbindung mit dem GND-Pin bleibt die LED dunkel.
  • Bei Verbindung mit dem 5V Pin wird die LED hell.
  • Bei Verbindung mit dem Kabel, das zwischen den beiden Widerständen weggeht, leuchtet die LED gedimmt. Die beiden Widerstände fungieren hier als Spannungsteiler, welche die Spannung abhängig von den verwendeten Widerständen reduzieren.

Spannungsteiler

Spannungsteiler bestehend aus ohmschen Widerständen werden verwendet, um eine höhere Spannung auf eine niedrigere Spannung zu reduzieren. Dabei werden zumindest zwei Widerstände in Serie geschalten, sodass sich der Gesamtspannungsabfall auf die beiden Widerstände proportional verteilt.

[GRAFIK Spannungsabfall]

Intuitiv kann man erkennen, dass bei zwei gleich großen Widerstandswerten, die Spannung am Teilungspunkt genau die Hälfte beträgt. Werden unterschiedlich große Widerstandswerte verwendet, kann man sich die Spannungsabfälle mit folgender Formel berechnen:

Rges

Verhaeltnis_1 , weil  Spannungsteiler_U1

Spannungsteiler_U2 , weil  Verhältnis_2

Potentiometer

Ein Potentiometer (kurz „Poti“) ist ein Bauteil, dass einen variablen Spannungteiler realisiert. Es besteht aus einem Widerstand, an dessen vorderem und hinteren Ende zwei verschiedene Spannungspotentiale angelegt werden können. An dem Widerstand ist ein dritter Ausgang angebracht, der sich zwischen den beiden anderen Enden verschieben lässt. Dementsprechend teilt er den gesamten Widerstand in zwei Teilwiderstände auf. Der an diesem Ausgang gemessene Spannungswert entspricht also dem Ort, an dem sich der Punkt der Spannungsabnahme befindet.

Beispiel 2

Wir wiederholen Beispiel 1, dieses Mal mit einem Potentiometer als variablen Spannungsteiler. Bei Verstellung des Potis wird die LED ein- und ausgedimmt.

spannungsteiler_poti_Steckplatine

Aufgabe

Realisieren Sie folgende zwei Aufgabenstellung mit dem Arduino:

[VIDEO Endergebnis]

Teil 1

  • Bauen Sie eine Schaltung mit einem Taster zur Eingabe und einer LED zur Ausgabe.
  • Auf Tastendruck soll die LED eingeschaltet werden. Der Einschaltvorgang soll aber langsam vor sich gehen, d.h. die Helligkeit soll eingedimmt werden. Wenn die LED ihre volle Leuchtkraft erreicht hat, bleibt sie in diesem Zustand.
  • Auf einen weiteren Tastendruck soll die LED ausgedimmt werden, d.h. die Helligkeit soll langsam reduziert werden, bis sie komplett dunkel ist. (Verwenden Sie eine for -Schleife um die Helligkeit kontinierlich zu steigern).

Teil 2

Erweitern Sie Teilaufgabe 1 um ein Potentiometer. Das Potentiometer dient zur Helligkeitseinstellung der LED. Beachten Sie dabei folgendes:

  • Nur im Moment des Einschalten der LED durch Tastendruck wird der Spannungswert am Potentiometer abgelesen und in einer Variable gespeichert.
  • Beim Eindimmen entspricht der maximal-Helligkeitswert der der LED dem beim Tastendruck gemessenen Wert des Potentiometers.

Weiterführende Links

  • http://www.frustfrei-lernen.de/elektrotechnik/spannungsteiler.html
  • http://www.arduino-tutorial.de/2010/06/analog-in/