Arduino: Ultraschallsensor entstören: Unterschied zwischen den Versionen
(13 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Arduino]] | [[Kategorie:Arduino]] | ||
[[Datei: | [[Datei:Inf1P L12.jpg|thumb|rigth|450px|Abb. 1: Glättung der zufälligen Sensorfehler]] | ||
'''Autor:''' [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]] | {| | ||
'''Modul:''' Praxismodul I | |- | ||
''' | | '''Autor:''' || [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]] | ||
|- | |||
| '''Modul:''' || Praxismodul I | |||
|- | |||
| '''Lektion 12:''' || Mechatronik, Informatikpraktikum, 1. Semester, Wintersemester | |||
|} | |||
== Inhalt == | == Inhalt == | ||
Zeile 30: | Zeile 35: | ||
# Wurde auf <code>magic numbers</code> verzichtet? | # Wurde auf <code>magic numbers</code> verzichtet? | ||
# Wurde die [[Medium:Programmierrichtlinie.pdf|Programmierrichtlinie]] eingehalten? | # Wurde die [[Medium:Programmierrichtlinie.pdf|Programmierrichtlinie]] eingehalten? | ||
== Tutorials == | |||
* [https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-serial-plotter Arduino: Using the Serial Plotter Tool] | |||
* [[Ultraschallsensor_HC-SR04| HSHL-Wiki: Ultraschallsensor HC-SR04]] | |||
* [https://funduino.de/nr-10-entfernung-messen Funduino: Entfernungen mit einem HC-SR04 Ultraschallsensor am Arduino messen] | |||
== Demos == | |||
* [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Arduino/ArduinoLibOrdner/ArduinoUnoR3/examples/DemoGleitenderMittelwert/DemoGleitenderMittelwert.ino SVN: DemoGleitenderMittelwert.ino] | |||
* [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Arduino/ArduinoLibOrdner/ArduinoUnoR3/examples/DemoTiefpassFilter/DemoTiefpassFilter.ino SVN: DemoTiefpassFilter.ino] | |||
== Vorbereitung == | == Vorbereitung == | ||
Bereiten Sie sich anhand der nachfolgenden Aufgaben auf den Praktikumstermin vor. | Bereiten Sie sich anhand der nachfolgenden Aufgaben auf den Praktikumstermin vor. | ||
# Bereiten Sie Aufgabe 11.1 vor. | # Bereiten Sie Anhand der [[Arduino:_Ultraschallsensor_entstören#Tutorials|Tutorials]] und [[Arduino:_Ultraschallsensor_entstören#Demos|Demos]] Aufgabe 11.1 vor. | ||
# Schreiben und testen Sie die Funktion <code>GleitendesMittelwertFilter()</code>. | # Schreiben und testen Sie die Funktion <code>GleitendesMittelwertFilter()</code>. | ||
# Schreiben und testen Sie die Funktion <code>TiefpasstFilter()</code>. | # Schreiben und testen Sie die Funktion <code>TiefpasstFilter()</code>. | ||
Zeile 41: | Zeile 54: | ||
== Versuchsdurchführung == | == Versuchsdurchführung == | ||
=== Aufgabe | === Aufgabe 12.1: Charakterisierung des Ultraschallsensors === | ||
* Schreiben Sie die Funktion <code>float messeUltraschallAbstand()</code>, welche eine Messung mit dem Ultraschallsensor durchführt und die Strecke in cm zurück gibt. | * Schreiben Sie die Funktion <code>float messeUltraschallAbstand()</code>, welche eine Messung mit dem Ultraschallsensor durchführt und die Strecke in cm zurück gibt. | ||
* Zeichnen Sie die den Zeitstempel in s, die Signallaufzeit t in s und berechnete Entfernung s in cm in der Datei <code>Ultraschallmessung.txt</code> auf. Nutzen Sie hierzu <code>Putty</code>. | * Zeichnen Sie die den Zeitstempel in s, die Signallaufzeit t in s und berechnete Entfernung s in cm in der Datei <code>Ultraschallmessung.txt</code> auf. Nutzen Sie hierzu <code>Putty</code>. | ||
Zeile 47: | Zeile 60: | ||
* Stellen Sie in MATLAB® Entfernung s über der Laufzeit t dar. Beschriften Sie den Graphen. | * Stellen Sie in MATLAB® Entfernung s über der Laufzeit t dar. Beschriften Sie den Graphen. | ||
* Bestimmen Sie messtechnisch die Empfindlichkeit E, die Auflösung von t und die daraus resultierende Auflösung von s. | * Bestimmen Sie messtechnisch die Empfindlichkeit E, die Auflösung von t und die daraus resultierende Auflösung von s. | ||
* Dokumentieren Sie Ihre Ergebnisse <code> | * Dokumentieren Sie Ihre Ergebnisse <code>Lernzielkontrolle_Termin_12.pdf</code> | ||
'''Nützlich MATLAB®-Befehle:''' plot, xlabel, ylabel, legend, disp | '''Nützlich MATLAB®-Befehle:''' plot, xlabel, ylabel, legend, disp | ||
'''Arbeitsergebnisse''' in SVN: <code>charakterisiereUltraschaschallsensor.ino, USMessung.txt, charakterisiereUltraschallSensor.m, Lernzielkontrolle_Termin_11.pdf</code> | '''Arbeitsergebnisse''' in SVN: <code>charakterisiereUltraschaschallsensor.ino, USMessung.txt, charakterisiereUltraschallSensor.m, Lernzielkontrolle_Termin_11.pdf</code> | ||
---- | |||
=== Aufgabe | === Aufgabe 12.2: Statische Messunsicherheit === | ||
# Lesen Sie die Messwerte des Ultraschall-Sensors auf statische Ziele im gesamten Messbereich aus (10 cm, 20 cm, 50 cm, 1 m, 2 m, 3 m, 4 m). Schreiben Sie hierzu ein Arduino-Programm <code>statische Messunsicherheit.ino</code>. Jeder Messsatz sollte >100 Messwerte umfassen. | # Lesen Sie die Messwerte des Ultraschall-Sensors auf statische Ziele im gesamten Messbereich aus (10 cm, 20 cm, 50 cm, 1 m, 2 m, 3 m, 4 m). Schreiben Sie hierzu ein Arduino-Programm <code>statische Messunsicherheit.ino</code>. Jeder Messsatz sollte >100 Messwerte umfassen. | ||
# Nutzen Sie das Programm <code>Putty</code>, um die Daten der seriellen Schnittstelle in der ASCII-Datei <code>Ultraschallmessung.txt</code> zu speichern. | # Nutzen Sie das Programm <code>Putty</code>, um die Daten der seriellen Schnittstelle in der ASCII-Datei <code>Ultraschallmessung.txt</code> zu speichern. | ||
Zeile 65: | Zeile 78: | ||
'''Arbeitsergebnisse''' in SVN: <code>statische Messunsicherheit.ino, Ultraschallmessung.txt, zeigeUltraschallMessung.m</code> | '''Arbeitsergebnisse''' in SVN: <code>statische Messunsicherheit.ino, Ultraschallmessung.txt, zeigeUltraschallMessung.m</code> | ||
---- | |||
=== Aufgabe | === Aufgabe 12.3: Gleitendes Mittelwertfilter === | ||
Ein gleitendes Mittlwertfilter bildet einen Mittelwert über k Messwerte mittels FIFO. | Ein gleitendes Mittlwertfilter bildet einen Mittelwert über k Messwerte mittels FIFO. | ||
# Schreiben Sie die Funktion <code>GleitendesMittelwertFilter()</code>, welches die Eingangswerte zyklisch filtert. Hier bei wird der Mittelwert über die letzten k Messwerte gebildet. | # Schreiben Sie die Funktion <code>GleitendesMittelwertFilter()</code>, welches die Eingangswerte zyklisch filtert. Hier bei wird der Mittelwert über die letzten k Messwerte gebildet. | ||
Zeile 83: | Zeile 96: | ||
Eine Einführung zu rekursiven Filtern finden Sie in folgendem Video.<br> | Eine Einführung zu rekursiven Filtern finden Sie in folgendem Video.<br> | ||
* Gleitendes Mittelwertfilter: 19 m 52 s | * Gleitendes Mittelwertfilter: 19 m 52 s | ||
* | * Tiefpassfilter: 29 m | ||
<iframe key="panopto" path="/Panopto/Pages/Viewer.aspx?id=fce4a806-dcbf-4e92-b10d-ac69013d7cb1&autoplay=false&offerviewer=true&showtitle=true&showbrand=true&captions=false&interactivity=all" height="405" width="720" style="border: 1px solid #464646;" allowfullscreen allow="autoplay"></iframe> | <iframe key="panopto" path="/Panopto/Pages/Viewer.aspx?id=fce4a806-dcbf-4e92-b10d-ac69013d7cb1&autoplay=false&offerviewer=true&showtitle=true&showbrand=true&captions=false&interactivity=all" height="405" width="720" style="border: 1px solid #464646;" allowfullscreen allow="autoplay"></iframe> | ||
Zeile 89: | Zeile 102: | ||
'''Demo:''' [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoGleitenderMittelwert SVN: DemoGleitenderMittelwert] | '''Demo:''' [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoGleitenderMittelwert SVN: DemoGleitenderMittelwert] | ||
</div> | </div> | ||
---- | |||
=== Aufgabe | === Aufgabe 12.4: Rekursives Tiefpassfilter === | ||
Ein rekursives Filter kann Messwerte in Echtzeit während der Laufzeit filtern. Nutzen Sie ein Tiefpassfilter, um die Messwerte zu filtern. | Ein rekursives Filter kann Messwerte in Echtzeit während der Laufzeit filtern. Nutzen Sie ein Tiefpassfilter, um die Messwerte zu filtern. | ||
# Schreiben Sie die Funktion <code>TiefpassFilter()</code>, welches die Eingangswerte zyklisch filtert. Hier bei wird der Tiefpass berechnet. | # Schreiben Sie die Funktion <code>TiefpassFilter()</code>, welches die Eingangswerte zyklisch filtert. Hier bei wird der Tiefpass berechnet. | ||
Zeile 101: | Zeile 114: | ||
'''Hinweis:''' | '''Hinweis:''' | ||
* Die Formel für das Tiefpassfilter lautet: <math>\bar{x}(k)=\alpha \cdot \bar{x}(k-1)+ (1-\alpha)\cdot x(k)</math> für den aktuellen Messwert x(k). | * Die Formel für das Tiefpassfilter lautet: <math>\bar{x}(k)=\alpha \cdot \bar{x}(k-1)+ (1-\alpha)\cdot x(k)</math> für den aktuellen Messwert <math>x(k)</math>. | ||
* <math>\alpha</math> ist hierbei ein Filterparameter <math>0<\alpha<1</math>. | * <math>\alpha</math> ist hierbei ein Filterparameter <math>0<\alpha<1</math>. | ||
<div class="mw-collapsible mw-collapsed"> | |||
=== Aufgabe | '''Demo:''' [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoTiefpassFilter/DemoTiefpassFilter.ino SVN: DemoTiefpassFilter.ino] | ||
* Zeigen Sie das ungefilterte und das Tiefpass-gefilterte Signal in | </div> | ||
---- | |||
=== Aufgabe 12.5: Dynamische Messunsicherheit === | |||
* Zeigen Sie das ungefilterte und das Tiefpass-gefilterte Signal in MATLAB<sup>®</sup> an. Messen Sie auf ein Ziel im gesamten Messbereich (2 cm - 4 m - 2 cm). | |||
* Wurde das Signalrauschen geglättet? | * Wurde das Signalrauschen geglättet? | ||
* Sichern Sie alle Ergebnisse mit beschreibendem Text (<code>message</code>) in SVN. | * Sichern Sie alle Ergebnisse mit beschreibendem Text (<code>message</code>) in SVN. | ||
Zeile 117: | Zeile 134: | ||
'''Arbeitsergebnis''' in SVN: <code>SVN Log</code>, <code>USTiefpassFilter.ino</code>, <code>Ergebnisbewertung.pdf</code> | '''Arbeitsergebnis''' in SVN: <code>SVN Log</code>, <code>USTiefpassFilter.ino</code>, <code>Ergebnisbewertung.pdf</code> | ||
<!-- | <!-- | ||
* [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoSharpIR/DemoSharpIR.ino DemoSharpIR.ino] | * [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoSharpIR/DemoSharpIR.ino DemoSharpIR.ino] | ||
Zeile 157: | Zeile 151: | ||
# Snieders, R.: ''ARDUINO lernen''. Nordhorn: 8. Auflage 2022. URL: [https://funduino.de/vorwort https://funduino.de/vorwort] | # Snieders, R.: ''ARDUINO lernen''. Nordhorn: 8. Auflage 2022. URL: [https://funduino.de/vorwort https://funduino.de/vorwort] | ||
# Schneider, U.: ''Programmierrichtlinie für für die Erstellung von Software in C.'' Lippstadt: 1. Auflage 2022. [[Medium:Programmierrichtlinie.pdf|PDF-Dokument (212 kb)]] | # Schneider, U.: ''Programmierrichtlinie für für die Erstellung von Software in C.'' Lippstadt: 1. Auflage 2022. [[Medium:Programmierrichtlinie.pdf|PDF-Dokument (212 kb)]] | ||
---- | ---- | ||
→ zurück zum Hauptartikel: [[ | → Termine [[Einführungsveranstaltung Informatikpraktikum 1|0]] [[Einarbeitung_in_die_Versionsverwaltung_SVN|1]] [[Einstieg_in_die_Welt_des_Arduino|2]] [[Arduino: Taster auswerten und LEDs ansteuern|3]] [[Arduino:_Sensoren_einlesen|4]] [[Arduino:_Infrarotsensor_einlesen|5]] [[Arduino:_Infrarotsensor_entstören|6]] [[Arduino:_Programmier-Challenge_I_WS_WS_24/25|7]] [[Arduino:_IR-Theremin|8]] [[Arduino:_Aktoren|9]] [[Arduino:_LCD_Display_mit_I2C_Schnittstelle|10]] [[Arduino:_Ultraschall_Entfernungsmessung|11]] [[Arduino:_Ultraschallsensor_entstören|12]] [[Arduino:_Temperaturmessung_mit_NTC_und_PTC|13]] [[Arduino:_Programmier-Challenge_II_WS_WS_24/25|14]]<br> | ||
→ zurück zum Hauptartikel: [[Arduino_Praxiseinstieg_WS_24/25|Arduino Praxiseinstieg]] |
Aktuelle Version vom 12. September 2024, 14:33 Uhr
Autor: | Prof. Dr.-Ing. Schneider |
Modul: | Praxismodul I |
Lektion 12: | Mechatronik, Informatikpraktikum, 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
- Welchen Messbereich hat Ihr Ultraschallsensor?
- Welche Auflösung (t, s) hat Ihr Sensor?
- Welche Empfindlichkeit hat Ihr Sensor?
- Welche Messunsicherheit hat Ihr Sensor bei den Entfernungen 10 cm, 20 cm, 50 cm, 1 m, 2 m, 3 m und 4 m.
- Was ist ein gleitendes Mittelwertfilter? Wie wird es berechnet?
- Was ist ein rekursives Tiefpassfilter? Wie wird es berechnet?
- Wurde der Quelltext durch Header und Kommentare aufgewertet?
- Wurden jedes Programm mittels PAP geplant?
- Wurde auf
magic numbers
verzichtet? - Wurde die Programmierrichtlinie eingehalten?
Tutorials
- Arduino: Using the Serial Plotter Tool
- HSHL-Wiki: Ultraschallsensor HC-SR04
- Funduino: Entfernungen mit einem HC-SR04 Ultraschallsensor am Arduino messen
Demos
Vorbereitung
Bereiten Sie sich anhand der nachfolgenden Aufgaben auf den Praktikumstermin vor.
- Bereiten Sie Anhand der Tutorials und Demos Aufgabe 11.1 vor.
- Schreiben und testen Sie die Funktion
GleitendesMittelwertFilter()
. - Schreiben und testen Sie die Funktion
TiefpasstFilter()
. - Planen Sie alle Programme mit PAP.
Arbeitsergebnisse in SVN: PAP, charakterisiereUltraschaschallsensor.ino, USMessung.txt, charakterisiereUltraschallSensor.m, Lernzielkontrolle_Termin_11.pdf, GleitendesMittelwertFilter(), TiefpasstFilter()
Versuchsdurchführung
Aufgabe 12.1: Charakterisierung des Ultraschallsensors
- Schreiben Sie die Funktion
float messeUltraschallAbstand()
, welche eine Messung mit dem Ultraschallsensor durchführt und die Strecke in cm zurück gibt. - Zeichnen Sie die den Zeitstempel in s, die Signallaufzeit t in s und berechnete Entfernung s in cm in der Datei
Ultraschallmessung.txt
auf. Nutzen Sie hierzuPutty
. - Laden und visualisieren Sie die Messdaten in
Ultraschallmessung.txt
mit MATLAB®. - Stellen Sie in MATLAB® Entfernung s über der Laufzeit t dar. Beschriften Sie den Graphen.
- Bestimmen Sie messtechnisch die Empfindlichkeit E, die Auflösung von t und die daraus resultierende Auflösung von s.
- Dokumentieren Sie Ihre Ergebnisse
Lernzielkontrolle_Termin_12.pdf
Nützlich MATLAB®-Befehle: plot, xlabel, ylabel, legend, disp
Arbeitsergebnisse in SVN: charakterisiereUltraschaschallsensor.ino, USMessung.txt, charakterisiereUltraschallSensor.m, Lernzielkontrolle_Termin_11.pdf
Aufgabe 12.2: Statische Messunsicherheit
- Lesen Sie die Messwerte des Ultraschall-Sensors auf statische Ziele im gesamten Messbereich aus (10 cm, 20 cm, 50 cm, 1 m, 2 m, 3 m, 4 m). Schreiben Sie hierzu ein Arduino-Programm
statische Messunsicherheit.ino
. Jeder Messsatz sollte >100 Messwerte umfassen. - Nutzen Sie das Programm
Putty
, um die Daten der seriellen Schnittstelle in der ASCII-DateiUltraschallmessung.txt
zu speichern. - Schreiben Sie einmalig als Header die Bezeichnung der Messwerte Zeit in ms und Strecke in cm in die Textdatei.
- Laden und visualisieren Sie die Messdaten in Ultraschallmessung.txt mit MATLAB®.
- Stellen Sie die Messdaten in einem Diagramm in cm über der Zeit dar.
- Berechnen Sie Mittelwert und Standardabweichung und stellen Sie diese dar,
- Beschriften Sie die Graphen.
Nützlich MATLAB®-Befehle: mean, std, xline
Arbeitsergebnisse in SVN: statische Messunsicherheit.ino, Ultraschallmessung.txt, zeigeUltraschallMessung.m
Aufgabe 12.3: Gleitendes Mittelwertfilter
Ein gleitendes Mittlwertfilter bildet einen Mittelwert über k Messwerte mittels FIFO.
- Schreiben Sie die Funktion
GleitendesMittelwertFilter()
, welches die Eingangswerte zyklisch filtert. Hier bei wird der Mittelwert über die letzten k Messwerte gebildet. - Testen Sie Ihre Funktion mit Ultraschallmesswerten mit statischen Zielen.
- Visualisieren Sie Messwerte und Filterergebnis im seriellen Plotter.
- Testen Sie Ihre Funktion mit Ultraschallmesswerten mit dynamischen Zielen.
- Wählen Sie k anhand der Messwerte und diskutieren Sie Ihre Wahl mit Prof. Schneider.
Arbeitsergebnisse in SVN: testeGleitendesMittelwert.ino
Hinweis:
- Nutzen Sie das FIFO aus Aufgabe 6.4.
- Die Formel für das gleitende Mittelwertfilter lautet: für k Messwerte
Eine Einführung zu rekursiven Filtern finden Sie in folgendem Video.
- Gleitendes Mittelwertfilter: 19 m 52 s
- Tiefpassfilter: 29 m
Aufgabe 12.4: Rekursives Tiefpassfilter
Ein rekursives Filter kann Messwerte in Echtzeit während der Laufzeit filtern. Nutzen Sie ein Tiefpassfilter, um die Messwerte zu filtern.
- Schreiben Sie die Funktion
TiefpassFilter()
, welches die Eingangswerte zyklisch filtert. Hier bei wird der Tiefpass berechnet. - Testen Sie Ihre Funktion mit Ultraschallmesswerten mit statischen Zielen.
- Visualisieren Sie Messwerte und Filterergebnis im seriellen Plotter.
- Testen Sie Ihre Funktion mit Ultraschallmesswerten mit dynamischen Zielen.
- Wählen Sie anhand der Messwerte und diskutieren Sie Ihre Wahl mit Prof. Schneider.
Arbeitsergebnisse in SVN: testeTiefpassFilter.ino
Hinweis:
- Die Formel für das Tiefpassfilter lautet: für den aktuellen Messwert .
- ist hierbei ein Filterparameter .
Aufgabe 12.5: Dynamische Messunsicherheit
- Zeigen Sie das ungefilterte und das Tiefpass-gefilterte Signal in MATLAB® an. Messen Sie auf ein Ziel im gesamten Messbereich (2 cm - 4 m - 2 cm).
- Wurde das Signalrauschen geglättet?
- 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
, USTiefpassFilter.ino
, Ergebnisbewertung.pdf
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)
→ Termine 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
→ zurück zum Hauptartikel: Arduino Praxiseinstieg