Sensoren einlesen und Messwerte verarbeiten

| Autor: | Prof. Dr.-Ing. Schneider |
| Modul: | Praxismodul I |
| Gruppe: | B |
| Lektion 7: | Mechatronik, Informatikpraktikum, 1. Semester |
| SVN-URL: | https://svn.hshl.de/svn/Informatikpraktikum_1/trunk |
📖 Inhalt
In dieser Lektion lernen die Studierenden, analoge Sensorsignale mit einem Arduino Uno einzulesen und zu verarbeiten. Am Beispiel eines lichtabhängigen Widerstands (LDR) werden die Grundlagen der analogen Messwerterfassung und des Analog-Digital-Wandlers (ADC) vermittelt.
Zunächst werden Sensorsignale mit `analogRead()` erfasst und im seriellen Monitor dargestellt. Anschließend werden die digitalen Messwerte interpretiert und in Spannungswerte umgerechnet.
Darauf aufbauend entwickeln die Studierenden einen Schwellwertschalter mit Hysterese. Abschließend werden verrauschte Messwerte mithilfe eines rekursiven Mittelwertfilters geglättet.
Die Aufgaben werden zunächst in Wokwi simuliert und anschließend auf die reale Hardware übertragen. Die Ergebnisse werden dokumentiert und mit SVN versioniert.
Eingeführte Begriffe und Konzepte
Neue Begriffe sind:
- Sensor
- Analog-Digital-Umsetzer (ADU)
- Abtastung
- Auflösung
- Quantisierung
- Messrauschen
- Schwellwert
- Hysterese
- Rekursiver Mittelwertfilter
- Abtastzeit
Neue Arduino-Befehle sind: analogRead(), Serial.begin(), Serial.print(), Serial.println(), millis()
🎯 Lernziele
Nach Durchführung dieser Lektion können die Studierenden:
- einen analogen Sensor an einen Arduino Uno anschließen und Messwerte erfassen.
- die Funktionsweise eines Analog-Digital-Wandlers erläutern.
- den Zusammenhang zwischen ADC-Wert und Eingangsspannung beschreiben.
- Messwerte über die serielle Schnittstelle ausgeben und interpretieren.
- einen Schwellwertschalter mit Hysterese implementieren.
- die Wirkung einer Hysterese auf das Schaltverhalten erklären.
- einen rekursiven Mittelwertfilter implementieren und dessen Wirkung beurteilen.
- ihre Programme systematisch testen, dokumentieren und mithilfe von SVN versionieren.
🧠 Lernzielkontrolle
- Welche Aufgabe hat ein Analog-Digital-Wandler?
- Welchen Wertebereich liefert `analogRead()` beim Arduino Uno R3?
- Wie viele unterschiedliche Quantisierungsstufen besitzt der ADC?
- Wie berechnet man aus einem ADC-Wert die Eingangsspannung?
- Warum kann ein Schwellwertschalter ohne Hysterese mehrfach hintereinander schalten?
- Wie unterscheidet sich eine Hysterese von einem einfachen Schwellwert?
- Welche Wirkung hat ein rekursiver Mittelwertfilter?
- Welchen Einfluss hat der Filterparameter α auf die Glättung und Reaktionsgeschwindigkeit?
- Warum sollte die Abtastzeit möglichst konstant sein?
Arbeitsergebnisse in SVN: Lernzielkontrolle_Termin_09.pdf
🚀 Getting Started
Den Einstieg in die Welt des Arduino in der Programmierung finden Sie hier:
Schritt für Schritt Anleitungen
- Fotowiderstand (LDR)
- Fotowiderstand am Arduino auslesen
- Arduino: Analoge Eingänge verwenden
- Arduino: Serielle Kommunikation()
- Wokwi: Photoresistor Sensor
💻 Demo
Demo-Quelltext: `DemoAnalogerSensor.ino`
Die Demo zeigt das Einlesen eines analogen Sensors und die Ausgabe des ADC-Wertes sowie der berechneten Eingangsspannung im seriellen Monitor.
✅ Vorbereitung
Bearbeiten Sie die nachfolgenden Aufgaben vor dem Praktikumstermin.
Alle Vorbereitungsaufgaben sind in Wokwi zu simulieren. Sichern Sie Ihre Lösungen im SVN-Gruppenordner und bereiten Sie sich darauf vor, Ihre Programme im Praktikum vorzustellen.
Vorbereitung Aufgabe 1: Analogen Sensor einlesen
1. Erstellen Sie in [Wokwi](https://wokwi.com/) eine Schaltung mit einem Arduino Uno und einem LDR-Sensor. 2. Schließen Sie den analogen Ausgang des Sensors an A0 an. 3. Lesen Sie den Sensorwert mit `analogRead()` ein. 4. Geben Sie den Messwert über den seriellen Monitor aus. 5. Verändern Sie die Lichtintensität und beobachten Sie den Messwert. 6. Untersuchen Sie, ob der Messwert bei zunehmender Helligkeit steigt oder fällt.
Arbeitsergebnis in SVN: `LDR_Einlesen.ino`
Nützliche Befehle: `analogRead()`, `Serial.begin()`, `Serial.println()`
Tipp:
- Der ADC des Arduino Uno R3 besitzt eine Auflösung von 10 Bit.
- Der Messwert liegt im Bereich von 0 bis 1023.
- Verwenden Sie den Analogpin A0.
Vorbereitung Aufgabe 2: Messwerte skalieren
1. Erweitern Sie Ihr Programm aus Aufgabe 1. 2. Berechnen Sie aus dem ADC-Wert die Eingangsspannung. 3. Geben Sie ADC-Wert und Spannung gemeinsam im seriellen Monitor aus. 4. Verändern Sie die Beleuchtung und überprüfen Sie die Plausibilität Ihrer Berechnung.
Arbeitsergebnis in SVN: `LDR_Skalierung.ino`
Tipp:
Die Eingangsspannung kann näherungsweise mit folgender Gleichung berechnet werden:
Beachten Sie, dass der ADC-Wert von 0 bis 1023 reicht und die Referenzspannung beim Arduino Uno R3 näherungsweise 5 V beträgt.
Vorbereitung Aufgabe 3: Schwellwertschalter mit Hysterese
1. Erweitern Sie Ihre Schaltung um eine LED mit Vorwiderstand. 2. Legen Sie zwei Schwellwerte fest: Einschaltgrenze und Ausschaltgrenze. 3. Die LED soll bei Dunkelheit eingeschaltet und bei ausreichender Helligkeit ausgeschaltet werden. 4. Verwenden Sie unterschiedliche Schwellwerte für das Ein- und Ausschalten. 5. Untersuchen Sie das Schaltverhalten bei wechselnder Beleuchtung.
Arbeitsergebnis in SVN: `LDR_Hysterese.ino`
Tipp:
- Verwenden Sie eine boolesche Variable für den Zustand der LED.
- Die Einschalt- und Ausschaltgrenze müssen unterschiedlich sein.
- Ermitteln Sie zunächst experimentell die Schaltwerte Ihres Sensors.
- Beachten Sie die Polarität des Sensorsignals.
Vorbereitung Aufgabe 4: Messwerte glätten
1. Erweitern Sie Ihr Programm aus Aufgabe 1. 2. Implementieren Sie einen rekursiven Mittelwertfilter. 3. Geben Sie den ungefilterten und den gefilterten Messwert aus. 4. Vergleichen Sie die beiden Signalverläufe bei wechselnder Beleuchtung. 5. Untersuchen Sie den Einfluss des Filterparameters α.
Arbeitsergebnis in SVN: `LDR_Filter.ino`
Tipp:
Die rekursive Mittelwertbildung lautet:
Dabei gilt:
- \(x_k\): aktueller Messwert
- \(y_k\): gefilterter Messwert
- \(y_{k-1}\): vorheriger gefilterter Messwert
- \(\alpha\): Filterparameter mit \(0 < \\alpha \\leq 1\)
Verwenden Sie zunächst α = 0,1.
🛠️ Versuchsdurchführung
⏱️ Zeiteinteilung
| Uhrzeit | Aufgabe | Dauer |
|---|---|---|
| 11:00 Uhr | Besprechung der Versuchsvorbereitung / SVN | 10 min |
| 11:10 Uhr | Analogen Sensor einlesen | 10 min |
| 11:20 Uhr | Messwerte skalieren | 15 min |
| 11:35 Uhr | Schwellwertschalter mit Hysterese | 20 min |
| 11:55 Uhr | Messwerte glätten | 20 min |
| 12:15 Uhr | Programme in SVN sichern | 5 min |
| 12:20 Uhr | Laborplatz aufräumen | 10 min |
| 12:30 Uhr | Praktikumsende |
Aufgabe 1: Analogen Sensor einlesen
Bauen Sie die vorbereitete Schaltung mit dem LDR-Sensor auf.
- Laden Sie Ihr vorbereitetes Programm `LDR_Einlesen.ino` aus SVN.
- Schließen Sie den LDR-Sensor an den Arduino Uno R3 an.
- Lesen Sie den Sensorwert mit `analogRead()` ein.
- Geben Sie den Messwert im seriellen Monitor aus.
- Verändern Sie die Beleuchtung des Sensors.
- Stellen Sie Ihr Programm Prof. Schneider vor.
Arbeitsergebnis in SVN: LDR_Einlesen.ino
Aufgabe 2: Messwerte skalieren
- Laden Sie Ihr vorbereitetes Programm `LDR_Skalierung.ino` aus SVN.
- Berechnen Sie aus dem ADC-Wert die Eingangsspannung.
- Geben Sie ADC-Wert und Spannung im seriellen Monitor aus.
- Überprüfen Sie die Berechnung anhand unterschiedlicher Beleuchtungszustände.
- Erläutern Sie die Auflösung des ADC.
- Stellen Sie Ihr Programm Prof. Schneider vor.
Arbeitsergebnis in SVN: LDR_Skalierung.ino
Aufgabe 3: Schwellwertschalter mit Hysterese
- Laden Sie Ihr vorbereitetes Programm
LDR_Hysterese.inoaus SVN. - Bauen Sie die LED mit Vorwiderstand auf.
- Übertragen Sie das Programm auf den Arduino.
- Überprüfen Sie die Ein- und Ausschaltgrenzen.
- Verändern Sie die Beleuchtung langsam und beobachten Sie das Schaltverhalten.
- Erklären Sie, warum zwei unterschiedliche Schwellwerte verwendet werden.
- Stellen Sie Ihr Programm Prof. Schneider vor.
Arbeitsergebnis in SVN: LDR_Hysterese.ino
Aufgabe 4: Messwerte glätten
- Laden Sie Ihr vorbereitetes Programm `LDR_Filter.ino` aus SVN.
- Erfassen Sie den Sensorwert regelmäßig.
- Berechnen Sie den rekursiven Mittelwert.
- Geben Sie den ungefilterten und den gefilterten Messwert aus.
- Verändern Sie den Filterparameter α.
- Vergleichen Sie die Reaktionsgeschwindigkeit und die Glättungswirkung.
- Stellen Sie Ihr Programm Prof. Schneider vor.
Arbeitsergebnis in SVN: LDR_Filter.ino
Aufgabe 5: Nachhaltige Dokumentation
- Sichern Sie alle Ergebnisse mit beschreibendem Text (
message) in SVN. - Beachten Sie dabei die Software Anforderungen
Arbeitsergebnis in SVN: SVN Log
🔄 SVN-Repositorium
https://svn.hshl.de/svn/Informatikpraktikum_1/trunk
Ausblick zur nächsten Lektion
In der nächsten Lektion werden Schrittmotor und Servo angesteuert.
→ Termine von Gruppe B 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
→ zurück zum Hauptartikel: Arduino Praxiseinstieg
→ Haben Sie Fragen? Informatik Praktikum FAQ