Ein analoger Input ist ein Eingang, an welchem Spannungsunterschiede gemessen werden können. Viele Sensoren sind im Prinzip nichts anderes als ein variabler Widerstand und lassen sich nicht an einem digitalen PIN (EIN/AUS) einlesen. Das Arduino bietet deshalb die analogen Inputs (A0-A5) um die Werte z.B. von Sensoren zu erfassen. Um einen Spannungsunterschied (analoges Signal) feststellen zu können, verfügt das Arduino über einen 6 Kanal, 10-bit Analog zu Digital Konverter (AD Wandler). Eine Auflösung von 10-bit bedeutet, dass das Arduino einen Spannugsunterschied von 0V zu 5V mit einer Auflösung von 10-bit erfasst. Es liefert demnach 1024 unterschiedliche Werte für diesen Bereich (dies entspricht einer Genauigkeit von 4.9 mV pro Schritt).
Für unsere Zwecke reicht diese Genauigkeit aus. Es gibt jedoch wesentlich genauere Analog zu Digital Konverter, welche z.B. mit 16-bit (65535 Werte) oder sogar 32-bit (ca. 4.3 Mio Werte) arbeiten. Diese verlangen jedoch nach einer aufwändigen Filterung und Schirmung und sind deshalb für uns uninteressant.
Funktionen
Um ein Signal an einem analogen Pin einzulesen verwenden wir die Funktion analogRead(PIN). Diese Funktion gibt uns direkt eine Zahl zwischen 0 und 1024 zurück. Wir müssen für diese Funktion keinen pinMode(PIN, MODUS) im setup() aufrufen, wie wir es bei digitalen Pins machen.
Beispiel mit einem Fotoresitor
Ein einfacher Sensor ist der Fotoresistor. Er verändert seine elektrische Leitfähigkeit (Widerstand) je nach Helligkeitseinfall und lässt sich deshalb als auch als Helligkeitssensor bezeichnen. Um den Sensor anschliessen zu können nutzen wir eine sog. Spannungsteiler Schaltung.
Spannungsteiler
Mit Hilfe eines Spannungsteilers können wir Unterschiede im Spannungsverhältnis zweier Widerstände zwischen 0V und Vcc (in unserem Fall 5V) messen. Typischerweise ist einer der Widerstände ein Sensor (variabler Widerstand) und einer ein Festwiderstand. Die Schaltung sieht folgendermassen aus…Analoger Input (DE)
An analog input can measure a voltage difference. Many phenomena can be measured with simple sensors that output analog voltage value, for example, sound, light intensity, and or preasure. Therefore the Arduino offers the analog inputs (A0-A5) to read such values. To be able to detect a voltage difference (analog signal), the Arduino has a 6 channel, 10-bit analog to digital converter (AD converter). A resolution of 10-bit means that the Arduino detects a voltage difference from 0V to 5V with a resolution of 10-bit. It, therefore, delivers 1024 different values for this range (this corresponds to an accuracy of 4.9 mV per step).
For our purposes, a 10-bit resolution is sufficient. However, there are much more accurate analog to digital converters, with say 16-bit (65535 values) or even 32-bit (approx. 4.3 million values).
Function
To read a signal at an analog pin we use the function analogRead(Pin_Number). This function directly returns us a number between 0 and 1024. We don't need to call pinMode(PIN, MODE) in setup() for this function as we do for digital pins.
Example with a Photo Resistor
One type of simple sensor is a photoresistor. It changes its electrical conductivity (resistance) depending on the incidence of brightness and can therefore also be called a brightness sensor. To connect the sensor we use a so-called voltage divider circuit.
Voltage Divider
With the help of a voltage divider, we can measure differences in the voltage ratio of two resistors between 0V and Vcc (in our case 5V). Typically one of the resistors is a sensor (variable resistor) and one is a fixed resistor. The circuit looks like this:
Die entsprechende Formel, deren Herleitung vom Ohmschen Gesetz in diesem Wikipedia Eintrag erläutert wird lautet:
Vres = Vcc*(R2/(R1+R2))
Vres = Resultierende Spannung
Vcc = Anliegende Spannung (5V)
R1 = Erster Widerstand (Fotoresistor)
R2 = Zweiter Widerstand (Festwiderstand)
Für unseren Fotoresistor ergibt sich also folgende Schaltung…
...
Example-Code
Für den Code lassen wir uns die von Arduino gelesenen Werte über den Serial Monitor ausgeben (siehe dazuFor the code, let's output the values read from Arduino via the Serial Monitor (see: Serial).
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#define BRIGHTNESS A0 void setup() { Serial.begin(9600); } void loop() { int reading = analogRead(BRIGHTNESS); // HierWe get werdenthe diesensor Wertevalue abgerufenhere Serial.println(reading); // We Anzeigensend derthe Wertemessage überto Serialserial Monitor } |
Betrachten wir die Werte im Serial Monitor, so sehen wir, dass sie sich verändern, sobald wir z.B. die Hand über den Sensor halten.
Das Potentiometer
Das Potentiometer ist eine spezielle Form eines variablen Widerstandes, da es an sich schon als Spannungsteiler funktioniert. Das Potentiometer eignet sich dehalb auch sehr gut um eine schnelle analoge Eingabe zu generieren. Die Funktionsweise lässt sich folgendermassen verinfacht darstellen …
Um das Potentiometer am Arduino anzuschliessen verwenden wir folgende Schaltung…
Aufgaben:
1. Nutzt die Schaltung mit dem Fotoresistor, um die Helligkeit einer LED zu steuern.
2. Nutz ein Potentiometer um die Blinkgeschwindigkeit einer LED zu steuern.
3. Steuert mit Hilfe des Potentiometers drei LEDs nacheinander (Poti Links If we look at the values in the Serial Monitor, we see that they change as soon as we hold our hand over the sensor, for example.
Potentiometers
A potentiometer is a special form of a variable resistor since it functions in itself as a voltage divider. This makes it perfect for generating a fast analog input. The function can be simplified as follows:
To connect the potentiometer to the Arduino we use the following circuit:
Exercises:
1. Use the circuit with the photoresistor to control the brightness of an LED.
2. Use a potentiometer to control the blinking speed of an LED. 3.
3. Use the potentiometer to control three LEDs one after the other (Poti left = LED_1, Poti Mitte middle = LED_2, Poti Rechts right = LED_3).
...
Usefull Functions
map()
Mappt einen Wertebereich auf eine neue Skalierung
z.B. map(WERT, 0, 1024, 0, 255Map a value in one range to a new scale
e.g. map(Value, Start_Old_Range, End_Old_Range, Start_New_Range, End_New_Range)
Or in our case
map(Value, 0, 1023, 0, 254)
constrain()
Beschränkt einen Wert auf einen bestimmten Bereich
z.BLimits a value to a specific range
e.g. constrain(WERT, 0, 255)