Arduino: Ultraschallsensor entstören
Autor: Prof. Dr.-Ing. Schneider
Modul: Praxismodul I
Lehrveranstaltung: Mechatronik, Informatikpraktikum 1, 1. Semester, Wintersemester
Inhalt
- Statische und dynamische Messung
- Kennlinienuntersuchung und Filterung
- Programmierung und Anwendung eines gleitenden Mittelwertfilters
- Programmierung und Anwendung eines gleitenden Tiefpassfilters
Lernziele
Nach Durchführung dieser Lektion
- können Sie die zufällige Sensorfehler erkennen und behandeln.
- können die Messwerte vergleichend anzeigen und bewerten.
- können Sie die Messwerte charakterisieren.
- können Sie ein gleitendes Mittelwertfilters erläutern und anwenden.
- können Sie ein Tiefpassfilter erläutern und anwenden.
Lernzielkontrolle
- Wie bestimmt man die Größe eines Arrays?
- Wie installiert man in der Arduino IDE eine neuen Bibliothek?
- Wie nutzt man die Bibliothek
ArduinoSort
, um ein Array auszugeben und zu sortieren? - Was ist ein Median-Filter? Wie wird der Median berechnet?
- Was ist in C ein Zeiger und wie wird er verwendet?
- Wurde der Quelltext durch Header und Kommentare aufgewertet?
- Wurden jedes Programm mittels PAP geplant?
- Wurde auf
magic numbers
verzichtet? - Wurde die Programmierrichtlinie eingehalten?
Vorbereitung
Bereiten Sie sich anhand der nachfolgenden Aufgaben auf den Praktikumstermin vor.
- Legen Sie ein Array an und bestimmen Sie dessen Größe. Nutzen Sie das DemoSizeOfArray.ino.
- Installieren Sie die Bibliothek
ArduinoSort-master.zip
. Hier finden Sie die Anleitung. - Machen Sie sich mit dem
DemoSortiereArray
vertraut. - Geben Sie mit ein Array im seriellen Monitor aus. Machen Sie sich mit der Funktion von Zeigern in C vertraut.
- Recherchieren Sie hier die Bezeichnungen "call by value" und "call by reference".
- Sortieren Sie ein Array mit zufälligen Zahlen. Versuchen Sie das Demo DemoSortiereArray.ino nachzuvollziehen.
- Schauen Sie sich die Videos zum Median Filter sowie das dazugehörige DemoMedianFilter an.
Arbeitsergebnisse in SVN: Lernzielkontrolle_Termin_06.pdf
Versuchsdurchführung
Aufgabe 11.1: Lernzielkontrolle
Präsentieren Sie Prof. Schneider das Ergebnis der Lernzielkontrolle.
Arbeitsergebnisse in SVN: Lernzielkontrolle_Termin_06.pdf
Aufgabe 11.2: Messwertanalyse
- Messen Sie die Zeit in Millisekunden (ms) mit dem Befehl
millis()
- Geben Sie die Zeit und Messdaten im seriellen Monitor mit 115200 Baud aus (z. B.
Zeit in ms : Entfernung in cm
1 : 5). - Analysieren Sie die Messdaten. Was fällt Ihnen auf?
- Diskutieren Sie das Ergebnis mit Prof. Schneider.
- Wie lässt sich der Fehler beheben?
Nützliche Befehle: millis(), Serial.begin(), Serial.println(), analogRead()
Arbeitsergebnisse in SVN: zeigeIRMesswerte.ino
Demos:
- DemoSharpIR.ino
- [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoLookupTableIR/DemoLookupTableIR.ino DemoLookupTableIR.ino
]
Aufgabe 11.3: IR Sensorcharakterisierung
- Zeichnen Sie die gemessene Entfernung im Verhältnis zu einer Referenz auf. Die Referent kann ein Gliedermaßstab sein. Welchen Messbereich hat Ihr IR-Sensor?
- Zeichnen Sie die gemessenen Entfernungsschritte über dem Messbereich auf. Welche Auflösung hat Ihr Sensor?
- Zeichnen Sie die Auflösung über dem Messbereich auf. Welche Empfindlichkeit hat Ihr Sensor?
Nützliche Befehle: analogRead(), Serial.println()
Arbeitsergebnisse in SVN: IR_Sensorcharakterisierung.pdf
Tipps: Messbereich: Sie messen auf ein Ziel in verschiedenen Distanzen und zeichnen auf x die Referenz und auf y die Anzeige Ihres Systems. Minimalbeispiel:
WW/cm | MW/cm |
3 | 3,2 |
10 | 9,7 |
15 | 14,9 |
20 | 20,1 |
80 | 79,0 |
Mit der Abweichung von einer Ursprungsgraden können wir im Gespräch die Güte bewerten. Gibt es beispielsweise einen Offset oder driften die Werte auseinander?
Auflösung: [1]
- Welche Auswirkung hat D=700 zu D=699 auf die Ausgangsgröße d?
- Tragen Sie diese Werte gegeneinander auf ergibt sich eine Kurve.
- Im Nachbereich haben wir eine Auflösung von weniger als 1 mm und bei 70 cm Entfernung macht ein Inkrement 3 cm aus. Die Kurve beschreibt alle Zwischengrößen.
- Erkenntnis: Mit der Entfernung sinkt die Auflösung und somit steigt die Messunsicherheit.
Minimalbeispiel:
/cm | |
700 - 699 | 0,02 |
699 - 698 | 0,02 |
.. | .. |
21-20 | 2,5 |
Empfindlichkeit: [2]
- Hier setzen Sie ins Verhältnis.
- Das sind die partiellen Ableitungen (Steigung) der Kennlinie in Abb. 8.
Aufgabe 11.4: Median-Filter
- Ausreißer lassen sich gut mit einem Median-Filter entfernen. Ein Beispielvideo finden Sie in diesem Artikel.
- Schreiben Sie die Funktion
int MedianFilter(int Messwert_s16)
. Diese Funktion soll über einen statischen 5 Werte Ringspeicher (first in first out, FIFO) verfügen. Der erste Wert wird gelöscht, die nachfolgenden Werte rutschen einen auf und der neue Messwert (Messwert_s32) nimmt Platz 5 ein. - Sortieren Sie die 5 Werte nach Größe z. B.
2,2,4,1,2
wird zu1,2,2,2,4
. Nutzen Sie hierfür die Funktionen ausDemoSortiereArray
- Geben Sie als Rückgabewert die Mitte des Arrays
SortiertesArray[3]
zurück. - Testen Sie die Funktion Ihrer Funktion mit Zufallszahlen im
void loop()
Nützliche Befehle: random(), Serial.println(), analogRead(), LookupTable(), analogRead()
Arbeitsergebnisse in SVN: testeMedianFilter.ino
Lösungsansatz: Median-Filter für die Störung
Ein Demo für die Implementierung eines Median-Filters finden Sie in SVN.
Aufgabe 11.5: Ergebnisbewertung und Nachhaltige Doku
- Zeigen Sie das ungefilterte und das Median-gefilterte Signal im seriellen Plotter an.
- Wurden die Messfehler entfernt?
- Sichern Sie alle Ergebnisse mit beschreibendem Text (
message
) in SVN.
- Wurden die Regeln für den Umgang mit SVN eingehalten?
- Wurde die Programmierrichtlinie eingehalten?
- Wurde nachhaltig dokumentiert?
- Haben die Programme einen Header?
- Wurden der Quelltext umfangreich kommentiert?
- Wurden die PAPs erstellt und abgelegt? Passen die PAPs 100% zum Programm?
Arbeitsergebnis in SVN: SVN Log
, IRMedianFilter.ino
, Ergebnisbewertung.pdf
Bewertung
Aufgabe | Punkte |
11.1 | 2 |
11.2 | 2 |
11.3 | 2 |
11.4 | 2 |
11.5 | 2 |
Tutorials
- Arduino: Using the Serial Plotter Tool
- Arduino Referenz:
analogRead()
- Installation einer Bibliothek IDE v2.0.1
- Installation einer Bibliothek via Zip-Datei
- Wiki: SHARP IR Abstandsensor
Tutorial: Lookup Table
Tutorial: Lookup Table programmieren
Demos
- DemoSharpIR.ino
- DemoLookupTable.ino
- DemoLookupTableIR.ino
- DemoUnterfunktion.ino
- DemoSizeOfArray.ino
- DemoSortiereArray.ino
- DemoMedianFilter
Literatur
- Brühlmann, T.: Arduino Praxiseinstieg. Heidelberg: mitp, 4. Auflage 2019. ISBN 978-3-7475-0056-9. URL: HSHL-Bib, O'Reilly-URL
- Brühlmann, T.: Sensoren im Einsatz mit Arduino. Frechen: mitp Verlag, 1. Auflage 2017. ISBN: 9783958451520. URL: HSHL-Bib, O'Reilly
- Snieders, R.: ARDUINO lernen. Nordhorn: 8. Auflage 2022. URL: https://funduino.de/vorwort
- Schneider, U.: Programmierrichtlinie für für die Erstellung von Software in C. Lippstadt: 1. Auflage 2022. PDF-Dokument (212 kb)
- Sharp: GP2Y0A41SK0F. URL: [3]. Datenblatt (858 kb)
→ zurück zum Hauptartikel: Arduino Praxiseinstieg