Analog Input

Der Analog Input vom Arduino wird verwendet, um analoge Sensoren auszulesen. Dabei handelt es sich zum Beispiel um Potentiometer, Fotowiderstände (LDR), Druck- und Temperatursensoren. Im Gegensatz zu digitalen Signalen, die entweder HIGH oder LOW sind, liefern analoge Sensoren auch Zwischenwerte.

Analog Input Schaltplan

Im Beispiel ist ein Potentiometer ans Arduino-Board angeschlossen.

Arduino Analog Input Potentiometer

Ein Potentiometer ist am Analog Input 0 des Arduinos angeschlossen (Grafik mit Fritzing erstellt)

Die beiden äußeren Beine werden mit dem GND und dem 5V+ verbunden, das mittlere mit einem Analog Input. Das Arduino-Board kann nun das Verhältnis der Widerstände zu einander ermitteln und liefert durch den Befehl analogRead(Pin); Werte zwischen 0 und 1023.

Darüber hinaus ist eine LED mit der Anode (langes Beinchen) am Pin 13 und der Kathode (kurzes Beinchen) am nebenliegenden GND angeschlossen.

Codebeispiel

Das Beispiel AnalogInput (File>Examples>Analog>AnalogInput) aus der Arduino-Software lässt die LED verschieden schnell blinken.

Im Beispiel wird das mittlere Bein des Potentiometers im AnalogIn 0 ausgelesen. Der Wert, der zwischen 0 und 1023 liegt, wird als Verzögerung (delay) in das Programm eingefügt und reguliert so die Blinkgeschwindigkeit der LED.

Schaltplan mit Fotowiderstand (LDR)

Nun kann man das Potentiometer auch gegen einen anderen Sensor austauschen. Wie beim Potentiometer benötigt das Arduino-Board ein Verhältnis zweier Widerstände, um einen analogen Wert zu erfassen.

Arduino Analog Input LDR

Fotowiderstand (LDR) am Analog Input des Arduinos (Grafik mit Fritzing erstellt.)

Ein Fotowiderstand (LDR) im Beispiel allein kann dieses Verhältnis nicht liefern. Man benötigt einen zusätzlichen Referenzwiderstand. Die Größe (Widerstandswert) des Referenzwiderstands richtet sich nach dem verwendeten Sensor und dem Umfeld, in dem er betrieben wird.

Um den Referenzwiderstand des Fotowiderstands auszurechen, muss sein Widerstand in einem hellen und einem dunklen Umfeld bestimmt werden. Beide Werte werden mit einander multipliziert und aus dem Ergebnis die Wurzel gezogen.

Wurzel aus (Rmin * Rmax) = Rref

Es ergibt sich der Referenzwiderstand. Widerstände haben allerdings genormte Werte. Es reicht, einen Widerstand zu wählen, der nah dem Ausgerechneten liegt. Im Beispiel beträgt der Widerstand 100kOhm.

Alternativ kann man aber auch einfach ausprobieren, mit welchem Widerstand man ausreichende Ergebnisse erzielt.

Schaltplan mit drucksensitivem Sensor (FSR)

Dieses Beispiel zeigt, wie ein drucksensitiver Sensor (FSR) angeschlossen wird. Auch für diesen Sensor wird ein Referenzwiderstand benötigt.

Arduino Analog Input FSR

Schaltung mit drucksensitivem Sensor (Grafik mit Fritzing erstellt)

35 Comments

  1. Panzi

    Hi!

    Danke für das Tutorial – hat mir schon mal sehr viel geholfen – aber eine Frage bleibt mir noch: Wie kann ich den tatsächlichen Widerstand des Sensors ermitteln? Es geht hierbei um einen Temperatursensor (kty 83-110)

    An Daten stehen mir zur Verfügung: serial output vom arduino (544), ungefärer Widerstand (zwischen 889 und 962 ohm, ausgehend von der Raumtemperatur und dem Datenblatt) und der Referenzwiderstand 1120 (sollte eigentlich 1125 sein aber näher komme ich gerade nicht). Gibt es eine Möglichkeit, zwischen Serial output und Widerstand hin und her zu rechnen?

  2. timo brandt

    gute erklärung hat mir (bis jetzt) sehr weitergeholfen!

    frage: warum steht nur der ledpin und nicht noch der sensor im setup?

  3. Sueton

    Ich sehe anderorts den Widerstand immer anodenseitig. Ist das egal auf welcher Seite der Widerstand ist?

  4. @Sueton: Ob in der Schaltung rechts oder links + und – ist, ist eigentlich egal. Nur die Werte zählen dann andersrum. Aber hier würde ich sagen: probier aus, was passiert ;)

  5. Marcel

    Hi zusammen,

    evtl. könnt ihr mir weiterhelfen:

    Ich würde gerne aus reiner Neugierde erfahren, wie die Berechnung für das Poti stattfindet. Überall lese ich 10KOhm, aber was sind die Zahlenwerte hierfür…? Angenommen U Analogeingang ist 3,3v und der max. Strom sind 40mA…Wie komme ich auf die 10KOhm?

    Vielen Dank für Eure Antworten & Grüße

    Marcel

  6. Elmar

    Hallo,
    den Potentiometerwiderstand kannst Du wie folgt berechnen:
    Angenommen, du möchtest die Stromquelle mit Deinem Widerstand mit höchstens 40 mA belasten. Die Spannung der Quelle beträgt 5 Volt.
    Dann muss der Poti mindestens! (er darf ruhig größer sein) diesen Wert haben: R=U/I, also dein Widerstand R=5 Volt / 40 mA = 125 Ohm.
    Dabei wird im Widerstand eine Leistung von P= U * I verbraten, die er aushalten muss: P= 5 Volt * 40 mA = 0,2 Watt.
    Nimmst Du z.B. einen zehnmal so großen Widerstand mit 1,25 kOhm, werden nur noch 0,02 Watt verbraten und so weiter.

  7. Elmar

    „wie kann ich eine Batteriespannung 8-15V auserten?“
    @Ingolf

    Der Analogeingang kann Spannungen von 0-5 Volt messen mit einer Auflösung von 10 Bit, also 1024 Werte, also in ca. 5mV Schritten.
    (Außer beim Arduino Mega und Due, die sogar A/D-Wandler mit 12 Bit Genauigkeit haben, also 4x so fein auflösen können. Allerdings von 0-3,3 Volt messen (nicht bis 5V).

    Wenn Du nun Deine Batteriespannung bis 15 Volt messen willst, brauchst Du einen Spannungsteiler. Du schaltest hierzu 2 Widerstände von Deiner Batteriespannung in Reihe zu GND (Masse). Die Batteriespannung teilt sich dann auf die 2 Widerstände auf. Den Analogeingang verbindest Du nun mit dem Punkt zwischen den beiden Widerständen anstelle ihn direkt mit der Batteriespannung zu verbinden. Für den unteren Widerstandswert R2(gegen GND) nimmst Du in Deinem Fall 1/3 des Gesamtwiderstands (R1+R2) und für den oberen Wert R1 die restlichen 2/3 des Gesamtwiderstands (R1+R2). Nun fällt am R1 nur 1/3 der gesamten Batteriespannung ab, also z.B. statt 15 Volt nur noch 5 Volt.
    Bei der Berechnung in Deiner Software nimmst Du dann den gemessenen Wert x3 und erhälst so die Spannung, die an der Batterie anliegt.
    Die Widerstände können so hoch gewählt werden, daß nur ein sehr geringer Strom fließt, z.B. 1 mA. Also z.B. R1 = 10 kOhm, R2 (dessen Spannung Du dann mißt)= 5 kOhm.

    Zusatz:
    Wenn Du besonders genau messen möchtest, kannst Du einen zusätzlichen A/D Wandler-Baustein benutzen, z.B. mit 16 Bit Auflösung und ihn seriell vom Arduino auslesen lassen. Auch kannst Du einen Referenzspannungsbaustein (z.B. REF 2,5) einsetzen und dessen Ausgangsspannung mit einem zweiten Port einlesen und mit der Meßspannung vergleichen, falls die von hause aus gelieferten 5V zu ungenau sind.

  8. Frank

    Hallo,

    ich habe ein Problem beim Auslesen der analogen Werte eines Drehpotis.
    Ich benutze ein 100kOhm Drehpoti einfacher Bauart von Reichelt und lese die Werte in einem „Arduino auf einem Breadboard“ (mit Atmel 328P-PU) aus, benutze sie als Verzögerung für eine Kameraauslösung und zeige Sie gleichzeitig auf einem 2-reihigen LCD Display an, damit ich mir die Werte merken und später erneut einstellen kann.

    Das funktioniert auch sehr gut. Sobald ich aber eine andere Stromquelle als die von einem Arduino Board (direkt 5V) benutze schwanken die ausgelesenen Poti-Werte sehr stark im Bereich +-10. Die Zahlen flackern im Display und ein genaues Einstellen der Werte ist nicht mehr möglich. Als andere Stromquelle benutze ich einen Trafo mit 14,8V und 2A. Die Spannungsregelung übernimmt ein 7805 in der Beschaltung wie in einem weiteren Tutorial hier beschrieben.

    Hat jemand eine Idee wie ich die permanenten Schwankungen des Potiwertes in den Griff bekommen kann? Was mich wundert ist, dass die Spannungsquelle einen solch starken Einfluss auf das Auslesen des Potiwertes hat.

    Gruß
    Frank

  9. @Frank: Also die Stromquelle hat einen sehr großen Einfluss darauf. Deine Energie scheint nicht gut gelättet zu sein und die Spannungsregelung hier ist auch nicht die aller perfekteste. Guck mal ins Datenblatt vom 7805. Da sollten noch ein paar Tipps drin stehen.

    Liebe Grüße
    Stefan

  10. Hi Philipp,

    das ist eine gute Frage. Wahrscheinlich musst Du das probieren. Wenn Du analoge Eingänge brauchst, hat das Uno natürlich nur 6, wenn es Digitale sein können, hast Du genug. Dann ist es eher eine Frage der Rechenleistung.

    Liebe Grüße

    Stefan“

  11. Philpp

    Hallo Stefan,

    wie müsste ich den Arduino programmieren, dass die 6 Optokoppler den Unterschied zwischen Weiß und Schwarz erkennnen und dass der Arduino dann dem Servo entsprechend vorgibt, in welche Richtung er das Fahrzeug drehen muss.

    Gruß
    Philipp

  12. Jens

    „Wie beim Potentiometer benötigt das Arduino-Board ein Verhältnis zweier Widerstände, um einen analogen Wert zu erfassen.“

    Ist es dann nicht Möglich eine externe spannung direkt zu messen zwischen AI1 und GND ?
    Also wenn ich z.B. einen Lasersensor habe der mir ein Ausgangssignal von 0-5V liefert

    gruß

  13. Phil

    Hallo Leute
    Hab ein merkwürdiges Phänomen welches ich mir nicht erklären kann. Ich möchte einen TMP36 Temperaturfühler an einem AnalogIn des Due verwenden. Die Eingansspannung am AnalogIn ist permanent 0.73V (~23°C) was auch stimmt so, aber der Arduino liest komisches Zeugs ein, meistens liest er gut 5s die richtige Spannung ein, danach fällt sie dramatisch tief auf 0.17V (was aber nicht stimmt). Ich hab schon diverse Einganspins probiert, jedesmal dasselbe. Die AREF Funktion wird auf dem Due ja nicht verwendet. Hat jemand einen Tipp für mich?

  14. Phil

    Faszinierend, hab noch gleich was rausgefunden :-)
    Wenn ich den delay statt 1s auf 500ms stelle, liest er die Spannung korrekt ein! 0.74V = 24.44°C
    Ist zwar etwas hoch gegriffen, mein multimeter sagt 23.8°C aber das ist Rechensache, der Pin liest also richtig ein. Als ich wieder delay 1s eingestellt hab, hat er wieder ab der vierten Messung Blödsinn ausgegeben…

  15. Phil

    Hallo Stefan.
    Danke für den Tipp. Funktioniert hat es leider nicht. Ich kann es mir nicht erklären, wieso dass es bei einem delay(500) geht und bei einem delay(1000) nicht. die Spannung ist wie gesagt konstant. Aber ich werde den Sketch halt nun so nutzen. ;) danke

  16. joe

    hallo, bin neueinsteiger und deine tutorials sind extrem hilfreich! ;-)
    mal ne frage am rande: hat das eigentlich einen bestimmten grund, warum die variablen zu anfang des programms gleich initialisiert werden? Etwa die integer variable „sensorvalue“? würde das auch gehen, wenn man sie nur deklariert, also:
    int sensorvalue;
    im verlauf des programmes erhält sie ja eh einen anderen wert…!?

  17. matrixxx

    super tutorial, vielen dank. aber ich hätte da noch einen fall:
    ich möchte spannungen z.b. zwischen 2-3.5 volt messen – ebenfalls mit 10bit genauigkeit. wie realisiert man sowas?

    danke dir :)
    michael.

  18. Sebi

    Hallo Stefan,

    kurze Frage und zwar möchte ich über ein Labor-Netzgerät Werte zwischen 0…5 V in den Analogen Input werfen und damit dann eine Motordrehzahl steuern. Ist das nur mit dem Arduino Realisierbar ? Zum Betreiben des Motors würde ich dann noch einen Transistor zwischen schieben damit der auch genung Spannung hat.

    Vielen Danke

    Sebi

  19. Felix

    Hallo, bin ein absoluter Neuling. Mir ist nicht ganz klar woher der Arduino weiß ob er einen digitalen PWM Pin ansteuern soll oder einen der analogen A0-A5 Pins.

    beides mal würde doch der Befehl
    analogWrite(Pin, X); heißen?

    Genauso ist mir nicht klar, wenn ich definiere
    pinMode(3, INPUT); woher der Arduino nun weiß ob der den analogen Pin A3 als Input definieren soll oder den digitalen PWM Pin 3?

    Vielen Dank schon einmal falls mir da jemand weiterhelfen kann.

  20. Hallo Stefan,
    ich bin Anfänger und möchte gerne den Servo über zwei LDR steuern. Beim Hochladen kommt eine Fehlermeldung und ich erkenne den Fehler nicht. Kannst Du mir helfen?
    Danke schon mal im Voraus
    Lg Guido

    #include
    #define analogPin 0
    #define analogPin 1
    #define ServoPin 9
    Servo meinServo;

    int analogWertPin1;
    int analogWertPin2;
    int mittelPosition = 90;
    int ergebnisMessung = 0;
    int ansprechzeit = 100;
    unsigned long zeitletzteMessung = 0;

    void setup() {
    meinServo.attach(ServoPin);
    }

    void loop() {

    analogWertPin0 = analogRead(analogPin0);
    analogWertPin1 = analogRead(analogPin1);
    if(millis() – zeitletzteMessung > ansprechzeit {
    for(int i = 0; i< anzahlMessungen; i++) {
    int messung = (analogWertPin1 – analogWert0);
    messungSample = messungSample + messung;

    }
    ergebnisMessung = messungSample/ anzahlMessungen;
    meinServo.write(mittelPosition + ergebnisMessung);
    zeitletzteMessung = millis();
    }
    messungSample = 0;

    }

  21. Klaus

    Hallo, bin neu und suche gerade nach meinem Problem im netz – aber ich finde nichts :-(
    Kann mir jemand helfen?

    int pot=analogRead(poti); //read the analogvalue
    if(analogRead(poti)==HIGH) {spd=map(pot, 0,1023, 1,1000);} //map 0-1023 to 1-1000
    else {spd=150;}

    Ich möchte, wenn ich den mittelstift des Potis rauszihe aus A0, das dann sofort spd=150 aus ELSE übernommen wird, das geht aber nicht :-(

    Danke

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.