Analoge Werte auslesen
Neben digitalen Eingängen und PWM Ausgängen hat der Arduino auch einige analoge Eingänge, welche mit einem Analog-Digital-Wandler (analog-digital converter: ADC) analoge Spannungswerte zwischen 0 und 5 Volt in diskrete Zahlenwerte umwandelt. Analoge Eingänge werden beim Arduino mit einem A bezeichnet (also A0
, A1
, A2
, ...)
Der Arduino UNO verwendet intern einen 10 Bit Analog-Digital-Wandler. Dadurch wird eine beliebige analoge Eingangspannung in einen diskreten Zahlenwert zwischen und umgewandelt.
Die Abtastrate des Arduino, also die Anzahl der analogen zu digitalen Wandlungen, liegt bei ca. 10.000 pro Sekunde.
Die Eingangsspannung an den Analogeingängen des Arduino darf 5V nicht überschreiten.
Schaltung mit Potentiometer
Wird ein Potentiometer wie unten abgebildet zwischen 0 V und 5 V angeschlossen, so kann der dritte Anschluss mit dem veränderlichen Widerstandswert an einen analogen Eingang (Pin A0
) geführt werden. Je nach Stellung des Potentiometers ergibt sich am Analogeingang eine andere Teilspannung.
analogRead()
Zum Auslesen der am Analogeingang angelegten Spannung kann der Befehl analogRead()
verwendet werden.
// liest einen Analogwert am Pin A0, Rückgabewert ist zwischen 0 und 1023
int analogWert = analogRead(A0);
Der Paramter der Funktion gibt den verwendeten Pin an (hier A0
) und der Rückgabewert (analogWert
) ist der umgewandelte Spannungswert als Ganze Zahl zwischen 0 und 1023.
Beispiel
Mit dem abgebildeten Programmcode kann der analoge Spannungswert des Potentiometers am Arduino-Pin A0
eingelesen werden. Anschließend wird die digitalisierte Spannung als Wert zwischen 0 und 1023 auf dem seriellen Monitor ausgegeben. Verwenden Sie den seriellen Plotter (Werkzeuge>serieller Plotter) um sich die eingelesenen Werte als Liniendiagramm anzeigen zu lassen.
#define pinPoti A0
void setup(){
Serial.begin(9600);
pinMode(pinPoti, INPUT); // als Eingang konfigurieren
}
void loop()
{
int messWert = analogRead(pinPoti); // als analogen Wert einlesen
Serial.println(messWert); // Ausgabe auf seriellem Monitor
}
Erläuterungen
Bei dem Program wird zuerst der entsprechende Pin pinPoti
als Eingang definiert
pinMode(pinPoti, INPUT)
um anschließend mit dem Befehl
int messWert = analogRead(pinPoti);
den Pin pinPoti
auszulesen.
Die map()
- Funktion
Ein häufiges Problem im Zusammenhang mit dem Einlesen analoger Werte ist das Umrechnen dieser Werte in einen anderen Wertebereich. Als Beispiel soll mit einem Potentiometer eine LED gedimmt werden.
Das zum Dimmen der LED notwendige PWM-Signal wird mit der analogWrite()
Funktion erzeugt. Als Parameter muss der Funktion das gewünschte Tastverhältnis im Bereich 0 ... 255
angegeben werden. Da die Funktion analogRead()
jedoch digitaliserte Werte im Bereich 0 ... 1024
ausgibt, muss der Zahlenbereich von analogRead()
an den Zahlenbereich von analogWrite()
angepasst werden.
Dafür eignet sich die Funktion map()
// Umwandeln des Wertebereichs: [0,1023] -> [0,255]
int pwmWert = map(messWert, 0, 1023, 0, 255);
Die Funktion map()
benötigt 5 Paramter:
- Der 1. Parameter (
messWert
) ist die Variable, dessen Zahlenwerte umgewandelt werden sollen. - Die 2. und 3. Paramter (
0
und1023
) geben den ursprünglichen Zahlenbereich an. - Die 4. und 5. Paramter (
0
und255
) geben den neuen Zahlenbereich an.
Der Rückgabewert (pwmWert
) ist der umgewandelte Wert in dem neuen Zahlenbereich.
Beispiel
#define LED 9 // LED am PWM Pin (~9)
#define pinPoti A0 // Potentiometer
void setup()
{
Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(pinPoti, INPUT);
}
void loop()
{
int messWert = analogRead(pinPoti); // Analogwert einlesen
int pwmWert = map(messWert, 0, 1023, 0, 255);// Werte ändern [0,1023] -> [0,255]
analogWrite(LED, pwmWert); // PWM Signal für die LED
Serial.print(messWert); // serielle Ausgabe
Serial.print(" -> ");
Serial.println(pwmWert);
}
Aufgaben
Bauen Sie einen Spannungsteiler aus zwei Widerständen (z.B. 220 Ω und 500 Ω) auf. Berechnen Sie die jeweiligen Teilspannungen, wenn die Gesamtspannung 5 Volt beträgt. Bestimmen Sie anschließend sowohl rechnerisch als auch messtechnisch mit dem Arduino, den digitalen Wert des Analogeingangs. Analysieren Sie mögliche Abweichungen des Messwertes von dem theoretischen Ergebnis.
Bauen Sie eine Balkenanzeige, bestehend aus 5 bis 7 LEDs und einem Potentiometer, auf. Programmieren Sie Ihre Schaltung so, dass proportional zur Stellung des Potentiometers die Anzahl der leuchtenden LEDs variiert. Nutzen Sie die ´for´-Schleife und die
map()
-Funktion.Erweitern Sie das Programm zur letzten Aufgabe. Anstatt die LEDs einzeln nur an- oder auszuschalten, sollen die LEDs nun einzeln entsprechend der Stellung des Potentiometers an- oder ausgedimmt werden.
Werte, die über einen analogen Eingang eingelesen wurden, sollen auf dem seriellen Monitor mit einer Art Balkenanzeige dargestellt werden. Je größer der eingelesen Wert, desto mehr
>
werden dargestellt. Die Balkenanzeige soll 25 Balken haben und das Maximum wird durch|
angezeigt. Mit einem angeschlossenen Potentiometer soll die Balkenanzeige gesteuert werden.[Serieller Monitor]
>>>>>....................|
>>>>>>>>>>>>>>...........|
>>>>>>>>>>>>>>>>>>>>>>...|Fügen Sie zur Balkenanzeige noch eine numerisch Angabe des Messwertes in Prozent hinzu.
[Serieller Monitor]
>>>>.....................[13%]
>>>>>>>>.................[32%]
>>>>>>>>>>>>>>>>.........[62%]
>>>>>>>>>>>>>>>>>>>>>>...[89%]
Serieller Plotter
Der serielle Plotter ist ein praktisches Tool, um Daten, die mit der seriellen Schnittstelle an den Computer geschickt wurden, als Liniendiagramm darzustellen. Der serielle Plotter befindet sich in der Arduino IDE unter Werkzeuge>Serieller Plotter. Der serielle Plotter kann nicht zur selben Zeit geöffnet sein wie der serielle Monitor.
Damit der serielle Monitor Daten als Liniendiagramm dargestellt werden, müssen diese nur mit Serial.println()
gesendet werden. Wird also bei dem einfachen Beispiel zum Auslesen der Analogwerte der serielle Plotter anstatt des seriellen Monitors geöffnet, wird der Verlauf des Analogwertes graphisch dargestellt.