Zum Inhalt springen

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.

    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 zueinander ermitteln und liefert durch den Befehl analogRead(Pin); Werte zwischen 0 und 1023.


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Darüber hinaus ist eine LED mit der Anode (langes Beinchen) über einen Widerstand von 220 Ohm 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.

    // von David Cuartielles und Tom Igoe
    
    int sensorPin = 0;
    int ledPin = 13;
    int sensorValue = 0;
    
    void setup() {
      pinMode(ledPin, OUTPUT);
    }
    
    void loop() {
      sensorValue = analogRead(sensorPin);
      digitalWrite(ledPin, HIGH);
      delay(sensorValue);
      digitalWrite(ledPin, LOW);
      delay(sensorValue);
    }

    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 miteinander 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 druck sensitivem Sensor (FSR)

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

    Arduino Analog Input FSR
    Schaltung mit druck sensitivem Sensor (Grafik mit Fritzing erstellt)

    34 Gedanken zu „Analog Input“

    1. 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

    2. 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.

    3. 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

    4. 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.

    5. 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…!?

    6. 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

    7. 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…

    8. 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?

    9. “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ß

    10. 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

    11. 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”

    12. @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

    13. 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

    14. “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.

    15. 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.

    16. 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

    17. @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 ;)

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

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

    19. 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?

    Die Kommentarfunktion ist deaktiviert.