Der Potentiometer
Stell dir den variablen Widerstand vor. Du hast vor, eine LED durch eine Drehbewegung zu dimmen. Hier kommt das Potentiometer-Modul ins Spiel, oft einfach als Poti bezeichnet. Es handelt sich dabei um ein mechanisches Bauteil, welches uns dieses Vorhaben ermöglichen kann. In seinem Kern ist das Poti ein elektrischer Widerstand.
Das einzigartige Merkmal ist, dass der elektrische Widerstand stufenlos durch Drehen angepasst werden kann. Wir setzen dabei auf ein Drehpotentiometer, bei dem der Drehwinkel zwischen 0 und 270 Grad justierbar ist. Die Drehbewegung wird durch einen Endanschlag begrenzt, was uns ein spürbares Feedback gibt.
Die Vorzüge eines Potentiometers umfassen seine benutzerfreundliche Anwendung, präzise Einstellbarkeit und weitreichende Verfügbarkeit. Sie stellen eine kosteneffiziente Option dar, um Strom und Spannung in vielerlei Anwendungsfeldern zu regulieren. So sind Potentiometer in den Bereichen Elektronik, Audio- und Videotechnik, Messtechnik, Industriesteuerungen und vielen anderen Einsatzfeldern zu finden.
Jedoch bringt die Verwendung von Potentiometern auch Nachteile mit sich. Die mechanische Reibung kann dazu führen, dass sie sich über die Zeit abnutzen und ihre Genauigkeit verlieren. Sie sind anfällig für Verunreinigungen und können Knistergeräusche hervorrufen. Zudem sind sie weniger geeignet für Anwendungen mit hoher Leistung oder dort, wo eine hohe digitale Präzision vonnöten ist.
Die Grafik unten verdeutlicht den internen Aufbau. Von den drei Anschlüssen bilden A und B die Enden des runden Widerstandsringes. Zwischen diesen beiden Kontakten besteht immer der gleiche Widerstandswert (10k Ohm), der sich nicht verändern lässt. Entlang des Ringes bewegt sich ein flexibler Schleifer (Anschluss C), der mit dem Ring in Verbindung steht und darüber gleitet. Es ist der Schleifer, der unterschiedliche Widerstandswerte generieren kann.
Die Funktionsweise wird nun erläutert. Die Anschlüsse A und B werden mit der Stromversorgung VCC und GND des Arduino verkoppelt. Zwischen diesen Anschlüssen zirkuliert nun der Strom. Der Widerstand zwischen diesen beiden Anschlüssen beträgt konstant 10K Ohm. Der bewegliche Schleifer mit dem Anschluss C wird mit einem analogen Eingang des Arduino verbunden, etwa A0. Der Strom, der durch die Anschlüsse A und C fließt, ändert sich je nach der Winkelposition des Schleifers. Ist der Schleifer in der Mittelposition, hat der Potentiometer einen Widerstand von 5K Ohm, da der Strom nur durch die Hälfte des Widerstandsringes fließt. Je weiter der Schleifer von A entfernt ist, desto größer ist der Widerstand. Erreicht er B, ist der Widerstand am größten (10K Ohm). Befindet sich der Schleifer an der Position A, beträgt der Widerstand null - es besteht also kein Widerstand.
Der Sketch
Schauen wir uns den Sketch an, der das Auslesen des Potentiometers ermöglicht. Es ist recht übersichtlich und leicht zu verstehen. Der Sketch zum Auslesen des Potentiometers ist recht einfach.
//Pin, an dem das Potentiometer angeschlossen ist
int potiPin = A0;
//Variable zum Speichern des gelesenen Potentiometerwerts
int potiValue = 0;
void setup()
{
//Initialisiere die serielle Kommunikation mit 9600 Baud
Serial.begin(9600);
}
void loop()
{
//Lies den Wert des Potentiometers
potiValue = analogRead(potiPin);
//Gib den gelesenen Wert über die serielle Schnittstelle aus
Serial.println(potiValue);
}
Die analogRead() Funktion
Lass uns die analogRead() Funktion genauer betrachten. Diese Funktion ermöglicht das Einlesen analoger Sensorsignale. Sie ist in der Lage, Spannungen im Bereich von 0 bis 5 Volt zu lesen und ist auf den Pins A0 bis A5 nutzbar. Die analogRead() Funktion nutzt einen Analog-Digital-Wandler (ADC), der das analoge Signal in ein digitales umwandelt.
Interessant ist, dass die Spannungswerte von 0 bis 5 Volt auf die Ganzzahlenwerte 0 bis 1023 abgebildet werden. Das entspricht insgesamt 1024 diskreten Werten. Es wird also eine Werteskala erstellt, auf der jeder Spannungswert einem bestimmten Ganzzahlwert zugeordnet ist. Die ADC-Nutzung stellt einen einfachen und effizienten Weg dar, um Sensorwerte zu erfassen. Ein kleines Beispiel, um das Ganze zu veranschaulichen: Bei 0 Volt an einem analogRead-Pin wird der digitale Wert 0 zugeteilt. Bei 2,5 Volt an einem analogRead-Pin entspricht dies einem digitalen Wert von 511. Und bei 5 Volt am analogRead-Pin ist der zugeordnete digitale Wert 1023. Die analogen Eingänge des Arduino weisen eine bestimmte Auflösung auf. Diese beschreibt, wie fein die Eingangswerte pro Zeiteinheit eingestellt werden können. ADC-Ports, wie zum Beispiel A0, haben eine Auflösung von 10 Bit (2^10), was 0 bis 1023 Schritten entspricht. Insgesamt gibt es also 1024 Schritte, wobei ein digitaler Schritt 4,9 mV (5V / 1024 = 4,9 mV) entspricht. Wenn also 2,5V am ADC-Port gemessen werden, ergibt das den entsprechenden Wert von 512 ADC (512 * 4,9 mV = 2508,8 mV, was etwa 2,5V entspricht).
Die Geschwindigkeit, mit der der analogRead()-Pin ein analoges Signal analysiert, liegt beim Arduino Uno bei etwa 100 Mikrosekunden (µs), das sind 0,0001 Sekunden. Wenn man das auf eine Sekunde umrechnet: 1 Sekunde ist gleich 1.000 Millisekunden und gleich 1.000.000 Mikrosekunden. Damit ist das Arduino Mega in der Lage, bis zu 10.000 Lesevorgänge pro Sekunde durchzuführen! Dies ist allerdings ein theoretischer Wert, und die tatsächliche Geschwindigkeit kann aufgrund verschiedener Faktoren variieren. Dennoch, ist es nicht beeindruckend, wie schnell diese winzige Platine arbeiten kann?
Allerdings ist es wichtig zu beachten, dass diese Analysegeschwindigkeit unter idealen Bedingungen erreicht werden kann. In der Praxis können Faktoren wie Rauschen, die Qualität der elektrischen Verbindungen und die Eigenschaften des spezifischen Sensors, der an den Arduino angeschlossen ist, die tatsächliche Lesegeschwindigkeit beeinflussen.
Du kennst sicher die analogen Pins von Arduino, sie sind durchnummeriert von A0 bis A5. Genau wie bei den digitalen Pins verwendest du auch hier eine Pinnummer und eine Variable, um die Werte des Potentiometers zu speichern.
intpotiPin = A0;
intpotiValue = 0;
Während der Strom vom 5-Volt-Pin zum GND-Pin (dem Ring des Potentiometers) fließt, ändert das Drehen am Poti den Widerstand und damit auch die Stromspannung am Signal-Pin (Schleifer). Diese Veränderung der Spannung liest du mit dem analogRead()-Pin ein. Damit du die vom Poti eingelesenen Werte sehen kannst, sendest du sie an den seriellen Monitor.
void setup()
{
Serial.begin(9600);
}
Vielleicht fällt dir auf, dass im setup() etwas fehlt - die Initialisierung des analogen Pins, wie du es beispielsweise von digitalRead() kennst.
voidsetup()
{
pinMode(potiPin, INPUT); // Initialisierung eines digitalen Pins
}
In der Arduino-Sprache ist diese Art der Initialisierung für analogRead() nicht nötig. Im Unterschied zu digitalen Pins, die als INPUT oder OUTPUT festgelegt werden können, werden die AnalogRead()-Pins in der Regel als INPUT-Pins verwendet. Bei digitalen Pins ist es sinnvoll, eine klare Initialisierung vorzunehmen, da du zwischen INPUT und OUTPUT wählen kannst. Bei den AnalogRead()-Pins verzichtest du standardmäßig auf die Initialisierung im setup(). So kannst du den Wert des Potentiometers direkt mit analogRead() abfragen und in einer Variablen speichern.
potiValue = analogRead(potiPin);
Mit der Funktion Serial.println kannst du den Poti-Wert in Echtzeit auf dem seriellen Monitor ablesen. Achte darauf, dass hier keine Anführungszeichen verwendet werden.
Serial.println(potiValue);
Wichtig zu wissen ist, dass die Auflösung der analogen Pins auf dem Arduino, also die Genauigkeit mit der Spannungen gemessen werden können, 10 Bit beträgt. Das bedeutet, dass die Spannung, die am analogen Pin anliegt, in einen von 1024 (2^10) möglichen Werten umgewandelt wird. Dies ist eine wichtige Information, wenn du genaue Messungen durchführen möchtest.
DigitalRead() - Eine Initialisierung ist nicht immer erforderlich.
Schauen wir uns den digitalRead()-Befehl an. Du wirst feststellen, dass eine Initialisierung nicht immer zwingend notwendig ist. Wenn du es unterlässt, einen digitalen Pin zu initialisieren, wird er standardmäßig als Eingang (INPUT) konfiguriert. Du bist also nicht gezwungen, einen pinMode()-Befehl zu verwenden. Der folgende Code ist trotz der fehlenden Initialisierung vollständig korrekt und ausführbar:
Aufbau und Verkabelung
int tasterPin = 3;
void setup()
{
Serial.begin(9600);
pinMode(tasterPin, INPUT); //Konfiguriere den digitalen Pin als Eingang
}
void loop()
{
int zustandTaster = digitalRead(tasterPin);
Serial.println(zustandTaster);
delay(1);
}
Trotzdem empfehle ich dir aus Gründen der Klarheit und Übersichtlichkeit, die Initialisierung mit pinMode() vorzunehmen. Nur wenn in deinem Projekt jeder Byte Speicherplatz zählt und du wirklich knapp mit Speicher bist, könntest du in Betracht ziehen, auf die Initialisierung zu verzichten – vorausgesetzt, du benötigst eine INPUT-Konfiguration.
Lassen uns zusammenfassen, was du gelernt hast: Du hast dich mit dem Auslesen eines Potentiometers mit dem Arduino befasst und gelernt, wie du die ausgelesenen Werte über den seriellen Monitor ausgeben kannst. Dabei kam die Funktion analogRead() zum Einsatz, um analoge Werte in digitale umzuwandeln. Dein Sketch bestand aus einem setup()-Teil, um die serielle Kommunikation zu initialisieren, und einem loop()-Teil, in dem du den Potentiometerwert einliest und ausgibst. Obwohl Pins in der Regel im setup()-Teil initialisiert werden, hast du gesehen, dass dies nicht immer zwingend erforderlich ist. Alles in allem hast du erfahren, wie du mit dem Arduino und einem Potentiometer arbeiten kannst, um analoge Werte zu erfassen und zu verarbeiten.