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.
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.
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.
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
Kann man mit den Analogeingang auch einen erdfeuchtesensor auslesen?
Diesen da z.Bsp.?
https://www.ramser-elektro.at/shop/bausaetze-und-platinen/giess-o-mat-sensor-bausatz/
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.
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
Hi Matrixxx,
das weiß ich auch nicht genau, aber ich glaube, dafür ist der aref-Pin da. Vielleicht hilft Dir dieses Tutorial weiter.
Liebe Grüße
Stefan”
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.
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…!?
Ich hoffe dir ist bewusst dass du ein verdammtes Genie bist
Ich hoffe dir ist b
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
@Phil: Versuch mal einen 0,1uF Keramikkondensator zwischen Ausgang und Masse zu schalten. (Datenblatt Seite 10 http://www.analog.com/static/imported-files/data_sheets/TMP35_36_37.pdf). Ich hoffe, das hilft.
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…
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?
Danke ich werde es mal versuchen.
Hallo Jens,
genau so sollte es sein. Hier ist mal eine Anleitung dazu: http://my.safaribooksonline.com/book/-/9783868999235/5dot-einfacher-digitaler-und-analoger-input/id655347
Liebe Grüße
“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ß
Hallo Stefan,
ich habe die Schaltung bereits nach dieser(http://www.kreatives-chaos.com/artikel/liniensensor-mit-cny70) Anleitung gebaut.
Ist es richtig dass ich die Pluspole der Photodioden mit den Eingängen A0-A5 verbinde?
Gruß
Philipp
Hallo Philipp,
das kommt darauf an, wie Du sie anschließt. Wenn Du einen via analogem Input einliest, wird der Wert am Analog In bei Schwarz kleiner sein, als bei Weiß. Bau es doch mal auf und guck, welche Werte der Optokoppler liefert. https://www.starthardware.org/2010/06/serielle-kommunikation/
Liebe Grüße
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
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”
Hallo ich bin absoluter Neuling auf diesem Gebiet. Ich bräuchte aber für ein Projekt einen Linienfolger der einen 12 v Servo-Motor steuert. Ich habe im Internet einen Schaltplan mit 8 Optokoppler gefunden und gebaut(http://www.kreatives-chaos.com/artikel/liniensensor-mit-cny70).
Meine Frage ist jetzt: Ist es möglich an den Arduino Uno 8 Optokoppler anzuschließen und wenn ja wo?
@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
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
“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.
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.
Hallo,
wie kann ich eine Batteriespannung 8-15V auserten?
Gruß Ingolf
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
@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 ;)
Ich sehe anderorts den Widerstand immer anodenseitig. Ist das egal auf welcher Seite der Widerstand ist?
gute erklärung hat mir (bis jetzt) sehr weitergeholfen!
frage: warum steht nur der ledpin und nicht noch der sensor im setup?
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?
Hey Roland,
vielen Dank für die Blumen. War gerade auf gegenbesuch und die Robosphere gefällt mir auch sehr gut. Weiter so und alles Gute!
Liebe Grüße
Stefan*
Gutes Tutorial… blöd nur, dass man sowas immer erst findet, wenn man es dann gerade selbst gemacht hat :-).
weiter so.
Die Kommentarfunktion ist deaktiviert.