Einstieg Mikrocontroller mit dem Arduino         

3 Analoge Messungen         


Elektronik-Labor   Projekte   AVR 




Die Anschlüsse A0 bis A7 können nicht nur an und aus unterscheiden, sondern eine Spannung genau messen. Innen ist ein Analog-Digital-Wandler (ADC, AD-Wandler) eingebaut, ähnlich wie in einem Digitalmultimeter. 


Baue ein Trimmpoti als Spannungsteiler so ein, dass eine Spannung zwischen 0 V und 5 V eingestellt werden kann. Diese Spannung soll über den Analogeingang A0 gemessen werden.
 

//Analog A0
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("A0 = ");
  Serial.println(analogRead(A0));
 
delay(100);     

Der Versuch zeigt, dass die Ausgabe jede Zahl zwischen 0 und 1023 zeigen kann. 0 steht für 0 V und 1023 steht für 5 V. Warum gerade 1023? Weil das die größte 10-Bit-Zahl ist. 11 111 111 (binär) = 1023 (dezimal).

Ändere das Programm so, dass die Spannung in Volt angezeigt wird.

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("A0 = ");
  Serial.println(analogRead(A0) * (5.0 / 1023.0));
 
delay(100);     

Schaue dir die Messwerte im seriellen Monitor an. Du kannst jetzt alles zwischen 0,00 V und 5,00 V einstellen. Versuche einmal, genau 2,50 V zu treffen.

Beende dann den seriellen Monitor und starte den seriellen Plotter. Damit werden deine Messwerte in einem Diagramm aufgezeichnet. Bewege das Poti und beobachte die Änderungen im Diagramm.
 

Verringere die Wartezeit im Programm auf eine Millisekunde. Führe dann eine Messung mit einem freien Kabel an A0 durch. Wenn du das Ende anfasst, siehst du die 50-Hz-Schwingungen der Netzleitung als Störsignale. Ohne direkte Berührung werden die Schwingungen kleiner. 


Der serielle Plotter zeigt 500 Messwerte von links nach rechts. Bei einer Verzögerung von einer Millisekunde dürften doch eigentlich nur 25 Schwingungen aufgezeichnet werden. Warum sind es so viele? Weil die Übertragung der Daten zu langsam ist. Stelle daher einmal in deinem Programm und im seriellen Plotter eine Übertragungsrate von 500 000 Baud ein. Dann sieht das Bild so aus: Es werden 37 Schwingungen gezeichnet. Damit hast du schon ein recht ordentliches Oszilloskop gebaut.
 


Halte nun deine Hand nur in die Nähe des offenen Kabels und bewege deie Füße auf dem Boden. Die Bewegungen werden klar und deutlich aufgezeichnet. Es liegt daran, dass du dich durch die Bewegung unterschiedlich elektrisch auflädst.



Teste einmal ganz genau, ab welcher Spannung ein digitaler Port eine 1 erkennt und unterhalb welcher Spannung er eine 0 liest. Es gibt da einen engen Bereich, in dem jeweils der letzte Zustand erhalten bleibt. Man nennt das Hysterese. Eine eindeutige Null findet man zum Beispiel bei Spannungen unter 2,3 V, eine eindeutige Eins bei über 2,5 V. Aber diese Eckpunkte können bei jedem Controller etwas anders sein. 

void setup() {
  Serial.begin(9600);

void loop() {
  Serial.print("D2 = ");
  Serial.print(digitalRead(2));
  Serial.print("   ");
  Serial.print("A0 = ");
  Serial.print(analogRead(A0) * (5.0 / 1023.0));    
  Serial.println(" V");
 
delay(100);
}
 


Miss die Spannung einer LED. Bei der roten LED kannst du feststellen, dass erst ab einer Spannung über 1,5 V das Leuchten beginnt. Auch bei großer Helligkeit steigt die Spannung nicht über 1,8 V. Untersuche auch andere Farben.

 

Aufgabe 1: Baue ein Spiel und gewinne es!

Das Spiel geht so: Im seriellen Plotter entstehen zwei Linien. Die eine folgt einer perfekten Sinusfunktion. Die andere steuerst du mit dem Poti am Anschluss A0. Die Aufgabe besteht darin, beide Linien so gut wie möglich zur Deckung zu bringen. Du musst also die Spannung am Poti so nachstellen, dass sie der berechneten Kurve folgt.

Das Programm braucht zwei Variablen. int t wird als Zähler gebraucht, der mit t++ erhöht wird. float sinus kann eine Kommazahl (float) aufnehmen, mit der die berechnete Sinusfunktion dargestellt werden soll. Das macht nichts, wenn man die Berechnung noch nicht ganz versteht, man muss sie nur richtig in den Quelltexteditor bringen, kompilieren und laden.  

//Sinus verfolgen
int t;
void setup() {
  Serial.begin(9600);
}

void loop() {
  t++;
  float sinus = 2.5 + 2.5 * sin (t / 50.0);
  Serial.print("S ");
  Serial.print(sinus);
  Serial.print("  A0 ");
  Serial.println(analogRead(A0) * (5.0 / 1023.0));   
 
delay(10);
}  

Hier kommt das noch nicht perfekte Ergebnis eines ersten Spiels. Man sieht zwar, dass die orange Linie der roten folgen soll, aber das geht noch besser!
 

 
Aufgabe 2: Entwickle eine elektronische Flöte, deren Tonhöhe mit dem Poti eingestellt wird.

Download: Arduino3.zip 

Zurück: ArduinoKurs2.htm


Zusatzversuch Pulsmessung


Der Piezo-Schallwandler wird als Mikrofon eingesetzt und mit einer Kabelverlängerung an die Halsschlagader gehalten. Im Programm wird der Messbereich auf 1,1 V reduziert. Die Referenzspannung von 1,1 V liegt dann am Pin AREF. Ein Spannungsteiler mit zwei Widerständen von 10 MOhm legt die mittlere Spannung auf den halben Messbereich fest. Mit dem Programm wird eine hohe Empfindlichkeit der Messung erreicht. Man muss allerdings etwas probieren, bis man ein brauchbares Signal findet.

//Analog A0, EKG
int u;
void setup() {
  Serial.begin(9600);
  analogReference(INTERNAL);
}

void loop() {
  u=(u*3+analogRead(A0))/4;
  Serial.print("A0 = "); 
  Serial.println(u-400);
  delay(20);      
}

Das Programm verwendet zwei Tricks: Die Wartezeit wurde auf 20 ms eingestellt, damit 50-Hz-Störungen unterdrückt werden. Und es gibt eine Mittelwertbildung über 4 Messungen (Genauer ein IIR-Filter), um die Messung etwas zu glätten. Die Messung zeigt eine Signalspannung von ca. 100 mV und einen gleichmäßigen Puls. Unregelmäßigkeiten sind auf den nicht konstanten Anpressdruck des Sensors zurückzuführen. Achtung, das ist nur ein Experiment und hat keine medizinische Relevanz. 







Die Aktiven im Online-Kurs


Elektronik-Labor   Projekte   AVR