Herzfrequenz/Pulsesensor SE050: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(419 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 15: Zeile 15:


== Einführung ==
== Einführung ==
Dieser Artikel beschreibt, wie man mit einem vorhandenen Pulse Sensor, Arduino UNO R3, LCD 16x02 I2C und einem Buzzer ein einfaches Herzfrequenzmessgerät aufbaut und dessen Hauptfunktionen schnell und zuverlässig mit Matlab & Simulink realisiert. Von diesem Gerät wird erwartet, dass es einen angemessenen Herzfrequenzwert in Simulink anzeigt und diesen Wert gleichzeitig auf dem LCD-Bildschirm darstellt. Außerdem soll jeder Herzschlag über den Buzzer hörbar gemacht werden können.
=== Aufgabenstellung ===
=== Aufgabenstellung ===
Messen Sie die die Herzfrequenz am Ohrläppchen oder Finger in Herzschlag pro Minute (BPM).
Messen Sie die die Herzfrequenz am Ohrläppchen oder Finger in Herzschlag pro Minute (BPM).
Zeile 44: Zeile 47:
|}
|}


*'''Thema/Fragestellung:''' Messung der Entfernung mit dem Sensor Sharp GP2-0430K
*'''Thema/Fragestellung:''' Messung der Herzfrequenz mit dem Pulsesensor SE050 
*'''Hypothese:''' Die Entfernung lässt sich im Bereich von 4 cm bis 50 cm fehlerfrei messen.
*'''Hypothese:''' Herzfrequenz kann fehlerfrei gemessen werden.
* '''Einordnung in den Lehrplan'''
* '''Einordnung in den Lehrplan'''


Zeile 54: Zeile 57:
! #  !! Anzahl !! Material
! #  !! Anzahl !! Material
|-
|-
| 1  || 1|| PC mit MATLAB/Simulink R2022b
| 1  || 1|| PC mit MATLAB/Simulink R2023b
|-
| 2  || 1 || Pulsesensor SE050
|-
|-
| 2 || 1 || Sensor Sharp GP2-0430K
| 3 || 1 || LCD 16x02 I2C
|-
|-
| 3 || 1 || Arduino Uno R3
| 4 || 1 || Buzzer
|-
|-
| 4 || 1 || Streckbrett
| || 2 || Arduino Uno R3
|-
|-
| 5 || 5 || Jumper Kabel, männlich/männlich, 20 cm
| 6 || 1 || Streckbrett
|-
| 7 || 22 || Jumper Kabel
|}
|}
Beschreibung Funktionsweise der verwendeten Hard- und Software
Beschreibung Funktionsweise der verwendeten Hard- und Software
* Arduino Uno R3
* '''Arduino Uno R3''' <br>
* Sensor Sharp GP2-0430K
[[Datei:Arduino UNO r3.jpg|thumb|right|200px|Abb. 2: Arduino Uno R3]]
* Simulink R2022b
Arduino Uno R3 (siehe Abb. 2[[#Literatur|<sup>[1]</sup>]]) ist ein Open-Source-Mikrocontroller-Entwicklungsboard, das von der Firma Arduino entwickelt und produziert wurde. Es integriert viele wichtige Komponenten. Zu den Hauptkomponenten gehören der Atmega328P-Mikrocontroller, eine externe Quarzquelle zur Bereitstellung einer hohen Taktfrequenz, ein Upload-Gerät, das aus einer USB-Schnittstelle und einem Atmega16U2-Signalumwandlungsmodul besteht, eine Reset-Taste zum Neustarten von Programmen sowie zwei Reihen von Schnittstellen zur Verbindung von Peripheriegeräten.[[#Literatur|<sup>[2,S.1]</sup>]]
Da ein Mikrocontroller der AVR-Serie verwendet wird, unterstützt das Arduino-Board eine Vielzahl von Funktionen wie digitale Ein-/Ausgabe, analoge Ein-/Ausgabe, Timer/Zähler und Interrupts, die die grundlegenden Anforderungen eingebetteter Systeme erfüllen.[[#Literatur|<sup>[3,S.1]</sup>]]<br>
 
 
 
 
 
 
* '''Pulsesensor SE050'''
[[Datei:Pulsesensor.jpg|thumb|right|200px|Abb. 3: Pulsesensor]]
Pulse Sensor (siehe Abb. 2[[#Literatur|<sup>[4]</sup>]]) ist ein Open-Source-Hardwareprojekt, das von Joel Murphy und Yury Gitman entwickelt wurde. Aus den verfügbaren Informationen und durch direkte Beobachtung lässt sich erkennen, dass der Pulse Sensor eine runde Leiterplatte (PCB) ist, die verschiedene Komponenten integriert. Zu den wichtigsten Komponenten gehören der Lichtsensor „APDS-9008“ und eine grüne LED von „Kingbright“. Diese beiden Komponenten ermöglichen die Photoplethysmographie (PPG)-Technologie. Genauer gesagt, sendet die grüne LED Licht auf die Haut, wobei ein Teil des Lichts vom Blut absorbiert und ein Teil vom Gewebe reflektiert wird und auf den „APDS-9008“-Lichtsensor trifft. Durch die Erkennung der durch den Blutfluss verursachten Änderungen dieser Lichtstrahlen kann die Herzfrequenz gemessen werden.[[#Literatur|<sup>[5]</sup>]]<br>
 
 
 
 
 
 
 
 
 
 
 
*'''LCD Modul 16x02 I2C'''
[[Datei:LCD 16x02 I2C.jpg|thumb|right|200px|Abb. 4: LCD 16x02 I2C]]
LCD 16x02 I2C (siehe Abb. 4[[#Literatur|<sup>[6]</sup>]]) ist ein Display, das das I2C-Kommunikationsprotokoll unterstützt und 16x2 Zeichen anzeigen kann. Das Display besteht hauptsächlich aus zwei Teilen: Erstens dem LCD-Bildschirm und zweitens dem HD44780-Controller.[[#Literatur|<sup>[7]</sup>]] Der HD44780 ist das Herzstück des Displays. Er wandelt die empfangenen digitalen Signale in Steuersignale für die Pixel um und enthält einen integrierten Zeichengenerator, der die Anzeige von Zeichen vereinfacht. Allerdings unterstützt der HD44780 nur die parallele Kommunikation. Um die Verbindung zu vereinfachen, ist ein I2C-Erweiterungsmodul (mit dem PCF8574T-Chip) auf dem Bildschirm verlötet.[[#Literatur|<sup>[8]</sup>]] Dieses Modul wandelt serielle I2C-Signale in parallele Signale um, wodurch die Anzahl der Verbindungskabel zwischen dem Displaymodul und dem Host reduziert wird und die Nutzung erleichtert wird.
 
 
 


=== Technische Daten ===
 
 
 
 
 
* '''Buzzer'''
[[Datei:Piepton.jpg|thumb|right|200px|Abb. 5:Buzzer]]
Ein Buzzer (siehe Abb. 5[[#Literatur|<sup>[9]</sup>]]) ist ein elektronisches akustisches Gerät, das durch elektrische Signale Töne erzeugen kann. In diesem Experiment wird ein passiver Summer verwendet, der keine interne Oszillatorschaltung enthält und ein externes Steuersignal (PWM) benötigt.
 
 
 
 
 
 
 
 
 
 
 
* '''Matlab & Simulink R2023b'''
[[Datei:Matlab.jpg.jpg|thumb|right|200px|Abb. 6:Matlab & Simulink]]
Um die Analyse von Sensordaten zu erleichtern, werden Matlab & Simulink(siehe Abb. 6[[#Literatur|<sup>[10]</sup>]]) verwendet. Darüber hinaus muss zur Unterstützung von Arduino-Projekten das Plugin „Simulink Support Package for Arduino Hardware“ heruntergeladen und installiert werden. Durch die Verwendung des Simulink Support Package for Arduino Hardware können Entwickler effektiv RCP (Rapid Control Prototyping) durchführen, wodurch der Entwurfs- und Validierungsprozess von Steuerungssystemen beschleunigt wird. Konkret ermöglicht der Einsatz dieses Plugins, dass Modelle, die auf Arduino-Funktionen basieren, in Maschinencode umgewandelt und auf die Arduino-Entwicklungsplatine hochgeladen werden. Anschließend können die Ausgaberesultate der Arduino-Entwicklungsplatine in Echtzeit in Simulink beobachtet werden.
 
 
 
 
 
 
 
 
 
 
 
 
 
=== Technische Daten[[#Literatur|<sup>[11]</sup>]] ===
{| class="wikitable"
{| class="wikitable"
|-  
|-  
| Messbereich || 0&thinsp;° .. 180&thinsp;°
| Messbereich || 0.3&thinsp;V .. 5&thinsp;V
|-
|-
| PWM-Modulation || analog
| Versorgungsspannung || 3.3&thinsp;V oder  5.0&thinsp;V
|-
| PWM-Pulszykluszeit || 20&thinsp;ms
|-
| PWM-Pulsweite || 500-2400&thinsp;ms
|-  
| Versorgungsspannung || 4.0&thinsp;V .. 7.2&thinsp;V
|-  
|-  
| Versorgungsstrom || 20&thinsp;mA
| Versorgungsstrom || < 4&thinsp;mA  
|-  
|-  
| Geschwingigkeit || 0,12&thinsp;s/60&thinsp;° (@4,8&thinsp;V, lastfrei)
| Ausgangssignaltyp || Analogsignal
|-  
|-  
| Drehmoment || 1,5&thinsp;kg/cm (@4,8&thinsp;V)
| Ausgangssignalbereich || 0.3&thinsp;V .. VCC&thinsp;V
|-
| Gewicht || 9&thinsp;g
|-  
|-  
| Getriebe || Kunststtoff
| Getriebe || Kunststtoff
|-  
|-  
| Arbeitstemperatur || 0&thinsp;°C .. +55&thinsp;°C
| Arbeitstemperatur || -40&thinsp;°C .. +85&thinsp;°C
|-  
|-  
| Abmessungen|| 22,2&thinsp;mm x 11,8&thinsp;mm x 31&thinsp;mm
| Abmessungen|| &empty; = 15.8&thinsp;mm ; &delta; = 3.6&thinsp;mm
|}
|}
=== Pinbelegung ===
=== Pinbelegung ===
{| class="wikitable"
{| class="wikitable"
Zeile 102: Zeile 164:
! style="font-weight: bold;" | Signal
! style="font-weight: bold;" | Signal
|-
|-
| 1 || Versorgungsspannung VCC  || 5&thinsp;V
| 1 || Signal|| Analogsignal (0.3&thinsp;V .. 5&thinsp;V)
|-
|-
| 2 || Triggereingang || TTL-Pegel
| 2 || Versorgungsspannung VCC  || 5&thinsp;V
|-
|-
| 3 || Echo, Ausgang Messergebnis  || TTL-Pegel
| 3 || Masse (GND)  || 0&thinsp;V
|-
| 4 || Masse (GND)  || 0&thinsp;V
|}
|}
== Funktionsweise Primärsensor ==
===Primärsensor APDS-9008===
[[Datei:APDS-9008.jpg|thumb|right|400px|Abb. 7: APDS-9008]]
Der APDS-9008 ist Primärsensor in Pulsesensor und ein kostengünstiger, analoger Umgebungslichtsensor, der zur Messung von Umgebungslicht verwendet wird.
'''Funktionsprinzip'''
*'''Fotoelektrische Umwandlung:'''  Wie in der Abbildung 7[[#Literatur|<sup>[12, S.12]</sup>]] gezeigt, kann der Sensor Lichtsignale in hochverstärkte Stromsignale umwandeln.
*'''Strom-zu-Spannungs-Umwandlung:'''  Der Strom kann durch einen externen Lastwiderstand in ein Spannungssignal umgewandelt werden.
*'''Physikalischer Filter:''' Ein 10uF-Kondensator parallel zum Lastwiderstand filtert Hochfrequenzrauschen heraus, während das Haupt-Niedrigfrequenzsignal durch den Lastwiderstand fließt und ein stabiles Spannungssignal bildet. Diese Konfiguration kann das Ausgangssignal glatter und stabiler machen.


== Versuchsaufbau und Durchführung ==
== Versuchsaufbau und Durchführung ==
=== Versuchsaufbau ===
=== Versuchsaufbau ===
[[Datei:Schaltplan Sharp.jpg|thumb|rigth|450px|Abb. 2: Schaltplan]]
 
[[Datei:Anschlussplan Sharp.png|thumb|rigth|450px|Abb. 3: Anschlussplan]]
Die korrekte Verbindung der Komponenten mit dem Master ist die Grundlage für den Erfolg des Experiments. Vor der Verbindung sollten die Betriebsspannung, das Kommunikationsprotokoll und die Ausgangssignalart der einzelnen Komponenten berücksichtigt werden. Abb. 8, Abb. 9 und Abb. 10 zeigen den Schaltplan, den Anschlussplan und den Versuchsaufbau.
[[Datei:Foto Sharp.png|thumb|rigth|450px|Abb. 4: Foto des Versuchsaufbaus]]
 
Der Versuchsaufbau wird durch einen Schaltplan (Abb. 2), Anschlussplan (Abb. 3) und Foto des Aufbaus (Abb. 4) dokumentiert.
<table>
  <tr>
    <td style="text-align:center;">
      [[Datei:Schatplan für Herzfrequenz.jpg|260px]]
      <div>Abb. 8: Schatplan</div>
    </td>
    <td style="text-align:center;">
      [[Datei:Anschlussplan der Messgeräte.jpg|340px]]
      <div>Abb. 9: Anschlussplan</div>
    </td>
    <td style="text-align:center;">
      [[Datei:Versuchsaufbau für Herzfrequenzmessgeräte.jpg|300px]]
      <div>Abb. 10: Versuchsaufbau</div>
    </td>
  </tr>
</table>


=== Versuchsdurchführung ===
=== Versuchsdurchführung ===
[[Datei:Simulink Sharp.png|thumb|rigth|450px|Abb. 5: Simulink-Modell]]
Das Modell zur Datenverarbeitung wurde gemäß Abb. 5 in Simulink aufgebaut. Die Messdaten wurden aufgezeichnet. Ein Video der Versuchsdurchführung findet sich hier.


'''Modelleinstellungen:''' Arduino Uno, Solver: Fixed-step, discrete, Abtastrate: 0,001 s
Dieser Abschnitt beschreibt ausführlich den Prozess der Modellierung und Optimierung. Zunächst wird die erste Modellierung kurz schriftlich beschrieben. Anschließend werden die mit diesem unausgereiften Modell gewonnenen Daten analysiert, um potenzielle Risiken des Modells zu identifizieren. Schließlich wird das Modell erneut optimiert, um das endgültige Modell zu erhalten. Am Ende dieses Abschnitts findet mandie entsprechende Abbildung des endgültigen Modells (Abb. 16).
 
 
*'''Erste Modellierung'''
 
Pulse Sensor verwendet die PPG-Technologie. Während des Betriebs des Geräts wird das Pulssignal wie Abb. 11[[#Literatur|<sup>[13, S.5]</sup>]] synchron und kontinuierlich mit den Pulsschwingungen ausgegeben. Daher reicht es aus, den Zeitraum dieses Schwingungssignals zu bestimmen, um die momentane Herzfrequenz zu ermitteln.
 
<div style="text-align:center;">
  <table style="margin:auto;">
    <tr>
      <td style="text-align:center;">
        [[Datei:Ausgangswellenform.jpg|430px]]
        <div>Abb. 11: Pulssignal</div>
      </td>
    </tr>
  </table>
</div>
 
 
Beim Erstellen des Modells muss das Analog Input-Block verwendet werden, um die Ausgangsabtastung des Pulse Sensors vom Arduino UNO R3 zu erhalten und in ein Digitalsignal umzuwandeln.
 
Aus dem Datenblatt des Mikrocontrollers Atmega328P geht hervor, dass die ADC-Umwandlungszeit maximal 260 µs beträgt, während das Abtastintervall 67 µs beträgt.[[#Literatur|<sup>[3, S.205]</sup>]] Daher beträgt die gesamte A/D-Umwandlungszeit 327 µs und ist somit kleiner als 1 ms. Daher kann die Systemabtastuhr in Simulink mit discretem Fixed-step auf 0,001 s fest eingestellt werden.
 
Beobachtungen zeigen, dass bei jedem Herzschlag ein höherer und ein niedrigerer Peak im Signal wie Abb .11 auftreten. Der höhere Peak repräsentiert den Herzschlag, während der niedrigere Peak aufgrund der Struktur der Blutgefäße entsteht.[[#Literatur|<sup>[14]</sup>]] In diesem Projekt kann der niedrigere Peak ignoriert werden. Daher kann ein Filter, der aus einem Constant-Block und einem Relational Operator-Block besteht, verwendet werden, um die höheren Peaks zu erhalten. Der Wert des Constant-Blockes wird auf 3,5 gesetzt. Es reicht aus, das Zeitintervall der ansteigenden Flanke des Signals, das den Schwellenwert von "3,5" überschreitet, zu erkennen und die Umrechnungsformel zu verwenden, um die momentane Herzfrequenz zu berechnen.
 
Da das Herzfrequenzmessgerät, bestehend aus dem Pulse Sensor und dem Arduino UNO R3, während des Signalwandlungsprozesses einige Fehler verursachen kann, ist es notwendig, die Messfehler des Geräts zu bestimmen und zu analysieren, ob diese Fehler die Herzfrequenzmessung negativ beeinflussen können.
 
<div style="text-align:center;">
  <table style="margin:auto;">
    <tr>
      <td style="text-align:center;">
        [[Datei:Erstes Modelljpg.jpg||700px]]
        <div>Abb. 12: Erstes Modell</div>
      </td>
    </tr>
  </table>
</div>
 
 
*'''Vorläufige Bewertung der Messunsicherheit'''
 
Da die Herzfrequenz eine nicht kontrollierbare Variable ist, kann im Messdesign kein bestimmter Wert als Referenzstandard festgelegt werden. Daher kann das Messgerät nur vor der Herzfrequenzmessung, wenn die Herzfrequenz null ist, kalibriert werden. Externe Lichtquellen isolierender Pulse Sensor(Abb. 13) zeigt den auf dem Tisch ruhenden Pulse Sensor, der von externen Lichtquellen abgeschirmt ist. Die Erfassung der Ausgangsspannung des Pulse Sensors in diesem Zustand sollte im Laufe der Zeit einen relativ stabilen Wert nahe VCC/2 zeigen.
 
Messdaten des Stillstands (Abb. 14) zeigen die Daten innerhalb von zwei Minuten. Die Messwerte schwanken zwischen 2,44 V und 2,54 V, ohne große Abweichungen. Diese Schwankungen können durch externe elektromagnetische Störungen, sensorinterne Geräusche und ADC-Quantisierungsrauschen verursacht werden. Daher können die im Diagramm dargestellten zufälligen Fehler als Standardunsicherheit Typ A kategorisiert werden.
 
 
<div style="text-align:center;">
  <table style="margin:auto;">
    <tr>
      <td style="text-align:center; padding-right: 20px;">
        [[Datei:Externe Lichtquellen isolierender Pulse Sensor.jpg|250px]]
        <div>Abb. 13: Externe Lichtquellen isolierender Pulse Sensor</div>
      </td>
      <td style="text-align:center; padding-left: 20px;">
        [[Datei:Messdaten des Stillstands .jpg|360px]]
        <div>Abb. 14: Messdaten des Stillstands</div>
      </td>
    </tr>
  </table>
</div>
 
 
 
 
 
*'''Die konkrete Messunsicherheit mit Matlab berechnen'''
 
<div style="width:1000px; height:600px; overflow:scroll; border: hidden">
<syntaxhighlight lang="matlab" style="border: none; background-color: #EFF1C1; font-size:15px">
%% Daten aus dem Workspace abrufen
Daten = simout;   
 
%% Datenverarbeitung
n = length(Daten);            % Die Anzahl der Daten ermitteln
RE = mean(Daten);                  % Den Durchschnitt berechnen
sE = std(Daten);              % Die Standardabweichung berechnen
 
%% Die Paramete aus Atmega328p-Datenblatt
Aufloesung = 10;                            % Aufloesung,10 bit
v_ref = 5;                      % Referenz Spannung, Einheit : V
lsb = v_ref / (2^Aufloesung);  % Mindestaufloesung,Einheit: V
 
% Jede Fehlerquelle (Einheit:LSB)
absolute_genauigkeit_lsb = 3.5;  % Absolute Genauigkeit, maximal
inl_lsb = 1.5;        % Integraler nichtlinearer Fehler, Maximum
dnl_lsb = 0.7;  % Differenzieller Nichtlinearitätsfehler, maximal
gain_error_lsb = 3.5;              % Verstärkungsfehler, maximal
offset_error_lsb = 3.5;                      % Offsetfehler, max.
 
%% Fehlerquelle in Spannung umrechnen (Einheit: V)
absolute_genauigkeit = absolute_genauigkeit_lsb * lsb;
inl_error = inl_lsb * lsb;
dnl_error = dnl_lsb * lsb;
gain_error = gain_error_lsb * lsb;
offset_error = offset_error_lsb * lsb;
 
%% Berechnen Standardunsicherheit Typ A
alpha = 1-0.6827;
p = 1-(alpha/2);
t = tinv(p,n-1);
uA = t*sE/sqrt(n);
 
%% Berechnen die Standardunsicherheit Typ B
uB = sqrt(absolute_genauigkeit^2 + inl_error^2 + dnl_error^2 + gain_error^2 + offset_error^2 );
 
%% Berechnen Standardunsicherheit Typ C
uC = sqrt((uA)^2+(uB)^2); 
 
%% Berechnen absolute Messunsicherheit
k  = 2; % Vertrauensfaktor (Vertrauensniveau 0.9545)
uAbs = k*uC; % absolute Messunsicherheit
 
%% Vollständige Messergebnis
disp(['Vollständige Messergebnis: U = ',num2str(RE),' ± ',num2str(uAbs),' V '])
</syntaxhighlight>
</div>
<br/>
 
Die Verwendung von Matlab ermöglicht eine einfache Bestimmung der Messunsicherheit. Zunächst werden die gemessenen Spannungsdaten aus Simulink in den Workspace importiert, um die Standardunsicherheit Typ A durch die Anwendung statistischer Methoden zu bestimmen. Anschließend werden die Spezifikationsparameter der Hardwaregeräte, wie z.B. Kalibrierzertifikate und technische Spezifikationen des Herstellers, gesammelt, um die Standardunsicherheit Typ B zu bestimmen. Schließlich werden die Standardunsicherheiten der Typen A und B zur Typ-C-Standardunsicherheit kombiniert.
 
Im Fenster oben zeigt sich ein MATLAB-Algorithmus, der zur Berechnung des wahren Werts der gemessenen Spannung innerhalb 2 Minuten, der Standardunsicherheit sowie der absoluten Messunsicherheit innerhalb von ±1σ einer Gaußschen Verteilung dient. In dem Algorithmus wurde bei der Bestimmung der Standardunsicherheit TypB aufgrund fehlender detaillierter Informationen über den Pulse Sensor nur die Herstellerdaten des ADC-Wandlers des Arduino UNO R3 verwendet.Beim Durchsehen des Datenblatts des Atmega328p können die folgenden Eigenschaften seines ADC-Komponenten festgestellt werden: Der maximale Wert der absoluten Genauigkeit beträgt 3,5 LSB, der maximale Wert der Integral-Nonlinearität beträgt 1,5 LSB, der maximale Wert der Differenzial-Nonlinearität beträgt 0,7 LSB, der Bereich des Verstärkungsfehlers beträgt 3,5 LSB und der Bereich des Offset-Fehlers beträgt 3,5 LSB.[[#Literatur|<sup>[3, S.265]</sup>]] Bei der Berechnung der Standardunsicherheit vom Typ B wird angenommen, dass diese Fehler gleichmäßig verteilt sind, und ihre Standardunsicherheit wird als diese Maximalwerte geteilt durch &radic;3berechnet.
Durch die Anwendung des oben genannten Matlab-Algorithmus ergibt sich ein vollständiges Messergebnis: U = 2,4867 ± 0,035431 V. Dabei repräsentiert "2,487" den Mittelwert, also den wahren Wert, und "0,035" die absolute Messunsicherheit.
 
 
 
 
*'''Darstellung der Messunsicherheit(1σ)'''
 
<div style="width:1000px; height:600px; overflow:scroll; border: hidden">
<syntaxhighlight lang="matlab" style="border: none; background-color: #EFF1C1; font-size:15px">
Max = max(Daten);  %% Den Maximalwert im Daten-Array finden
Min = min(Daten);  %% Den Minimalwert im Daten-Array finden
x = Min:0.0001:Max;%% Einen Bereich vom Minimalwert bis zum Maximalwert erstellen
pE = normpdf(x,RE,sE );
 
figure;
hold on;
 
% Zeichnen der Wahrscheinlichkeitsdichtekurve
p1 = plot(x, pE, 'LineWidth', 1, 'Color', 'black', 'DisplayName', 'Normalverteilung PE(R)');
 
% Zeichnen des echten Werts mit roter Farbe
p2 = xline(RE, 'Color', 'red', 'LineWidth', 2, 'DisplayName', 'Mittelwert');
 
% Markieren der Standardabweichung
p3 = xline(RE + sE, 'k--', 'LineWidth', 1, 'DisplayName', 'Standardabweichung +');
p4 = xline(RE - sE, 'k--', 'LineWidth', 1, 'DisplayName', 'Standardabweichung -');
 
% Zeichnen der Anzahlen der verschiedenen Spannungen
p5 = histogram(Daten, 'Normalization', 'pdf', 'DisplayName', 'Daten Histogram');
 
% Legend hinzufügen
lgd = legend([p1 p2 p3 p4 p5]);
lgd.FontSize = 18;  % Hier die gewünschte Schriftgröße einstellen
xlabel('Zeit (s)', 'FontSize', 18);
ylabel('Spannung (V)', 'FontSize', 18);
title({['Messergebnis : U = ', num2str(RE), ' $\pm$ ', num2str(uAbs), 'V']}, ...
'Interpreter', 'latex', 'FontSize', 18);
hold off;
 
</syntaxhighlight>
</div>
<br/>
 
Der Matlab-Code oben dient zur Visualisierung der oben berechneten Daten. Mit diesem Code kann die Verteilung der gemessenen Spannung dargestellt werden, einschließlich der Wahrscheinlichkeitsdichtekurve der Spannungsdaten, des Durchschnittswertes der Spannungsdaten, der Position einer Standardabweichung sowie des Histogramms der Spannungsdaten . Der Titel gibt den Durchschnittswert und die Unsicherheit des kompletten Messergebnisses an. Das Ergebnis der Programmausführung ist in der Darstellung der Messunsicherheit(Abb.15)zu sehen.
 
<div style="text-align:center;">
  <table style="margin:auto;">
    <tr>
      <td style="text-align:center;">
        [[Datei:Darstellung der Messunsicherheit.jpg|630px]]
        <div>Abb. 15: Darstellung der Messunsicherheit</div>
      </td>
    </tr>
  </table>
</div>
 
 
 
 
*'''Kalibrierung'''
Der gemessene Spannungswert weist sehr wahrscheinlich einen systematischen Fehler auf. Dieser systematische Fehler hat jedoch keinen Einfluss auf die Messung der Herzfrequenz, da dieser Fehler lediglich zu einer Gesamtverschiebung der Spannungsdaten führt. Die Genauigkeit der Herzfrequenzberechnung hängt von der Präzision der Zeitabstände zwischen den definierten Anstiegsflanken der Herzfrequenzwellenform ab. Daher muss der systematische Fehler nicht korrigiert werden.
 
 
 
 
*'''Nachteilige Auswirkungen der Messunsicherheit'''
Durch Experimente und Analysen wurde festgestellt, dass die Messunsicherheit zwischen -0,035 und +0,035 V liegt. Diese Messunsicherheit kann dazu führen, dass der aktuell gemessene Spannungswert das Modul zur Berechnung der Herzschlagzeitintervalle (bei der ansteigenden Flanke der Herzschlagwelle und einem Messwert größer als der eingestellte Schwellenwert von 3,5 V) vorzeitig oder verspätet auslöst, wodurch die Genauigkeit der Herzfrequenzmessung indirekt beeinflusst wird.
 
Zum Beispiel: Angenommen, der aktuell gemessene Spannungswert beträgt 3,465 V, was unterhalb des Auslöseschwellenwerts liegt. Aufgrund der Messunsicherheit könnte dieser Spannungswert jedoch auf 3,465 V + 0,035 V erhöht werden, was zu einer vorzeitigen Auslösung führt.
 
Ebenso könnte der gemessene Spannungswert, wenn er genau 3,5 V beträgt und somit die Auslösebedingungen erfüllt, aufgrund der Messunsicherheit unter 3,5 V fallen, wodurch das Modul zur Berechnung der Herzschlagzeitintervalle nicht ausgelöst wird, was zu einer verspäteten Auslösung führt.
 
Offensichtlich führen vorzeitige oder verspätete Auslösungen zu Fehlern bei den Herzschlagzeitintervallen. Daher muss analysiert werden, ob diese vorzeitigen oder verspäteten Auslösungen durch Filter eliminiert werden können. Falls dies nicht möglich ist, sollte bewertet werden, wie groß die durch vorzeitige oder verspätete Auslösungen verursachten Zeitfehler sind.
 
Darüber hinaus könnte die ungenaue Auslösung dazu führen, dass das Modul innerhalb einer sehr kurzen Zeitspanne mehrmals ausgelöst wird, wodurch die angezeigte Herzfrequenz unzuverlässig wird.
 
Zum Beispiel: Angenommen, der gemessene Spannungswert beträgt 3,465 V und wird aufgrund der Messunsicherheit auf 3,5 V erhöht, wodurch das Modul ausgelöst wird. Theoretisch sollte der nächste Auslösezeitpunkt des Moduls bei der nächsten ansteigenden Flanke des Herzschlags liegen. Aufgrund der sehr kurzen Simulink-Abtastzeit könnte der Spannungswert jedoch im nächsten Abtastschritt der ansteigenden Flanke des aktuellen Herzschlags nicht signifikant ansteigen und aufgrund der Messunsicherheit auf unter 3,5 V fallen, wodurch er unter den vorherigen Abtastspannungswert fällt und eine abfallende Flanke erzeugt. Nach einigen Abtastschritten wird der Spannungswert jedoch wieder über 3,5 V steigen und die Auslösebedingungen erneut erfüllen, was zu einer kurzen, aufeinanderfolgenden Auslösung des Moduls führt. Daher muss festgestellt werden, ob dieses Risiko besteht, und es müssen Methoden gefunden werden, um dieses Risiko vollständig zu eliminieren.
 
 
 
 
*'''Verzicht auf die Verwendung eines Filters dabei'''
Ein Tiefpassfilter eignet sich zur Filterung der Herzschlag-Abtastspannung, reduziert scharfe Schwankungen und Störungen, verbessert das Signal-Rausch-Verhältnis und glättet das Spannungssignal, sodass das Signal stabiler und kontinuierlicher wird. Obwohl der Tiefpassfilter Hochfrequenzrauschen effektiv unterdrücken kann, kann er das Rauschen nicht vollständig beseitigen, sodass das Problem der ungenauen Auslösung nicht behoben wird. Daher kann auf die Verwendung des Filters verzichtet werden.
 
 
 
 
*'''Risikobeseitigung'''
 
<div style="width:1000px; height:600px; overflow:scroll; border: hidden">
<syntaxhighlight lang="matlab" style="border: none; background-color: #EFF1C1; font-size:15px">
% Extrahieren der Spannungsdaten von der ansteigenden Flanke aus simout
Daten = simout(45:60,1);
% Länge der Daten ermitteln
n = length(Daten);
% Erstellen der Zeitdaten von 1 bis n
Zeit = 1:n;
 
% Definieren von x als Zeit und y als Daten
x = Zeit;
y = Daten;
 
% Berechnung der Kovarianzmatrix von x und y
Kovarianzmatrix = cov(x, y);
% Extrahieren von sxx, syy und sxy aus der Kovarianzmatrix
sxx = Kovarianzmatrix(1,1);
syy = Kovarianzmatrix(2,2);
sxy = Kovarianzmatrix(1,2);
 
% Berechnung der Regressionskoeffizienten b1 und b0
b1 = sxy/sxx;
 
% Regressionsgerade berechnen
% Einstellen des Zeitinkrements in Millisekunden
Delta_Zeit = 1; % in ms
% Berechnung des Spannungsinkrements in Volt
Delta_U = b1 * Delta_Zeit % in V
</syntaxhighlight>
</div>
<br/>
 
Im oben genannten Text wurde erwähnt, dass das Risiko besteht, dass das Modul zur Berechnung der Herzschlagzeitintervalle innerhalb eines sehr kurzen Zeitraums mehrfach ausgelöst wird. Um dieses Risiko zu beseitigen, muss sichergestellt werden, dass die Spannung im nächsten Abtastschritt nach der Auslösung nicht mehr unter den festgelegten Auslöseschwellenwert (3,5 V) fällt.
 
Beobachtungen der Herzschlagwelle zeigen, dass die ansteigende Flanke der Welle nahezu linear verläuft und eine hohe Steigrate aufweist. Daher reicht es aus, das Abtastzeitintervall zu verlängern, um sicherzustellen, dass die Spannung einen ausreichenden Anstieg aufweist. Wenn der Spannungsanstieg größer ist als der maximale Unterschied der Messunsicherheit benachbarter Abtastwerte, d. h. das Doppelte der Messunsicherheit, kann sichergestellt werden, dass die Spannung beim nächsten Abtastschritt definitiv über 3,5 V liegt, wodurch das Risiko einer mehrfachen Auslösung beseitigt wird.
 
Um die Spannungszunahme bei unterschiedlichen Abtastintervallen zu berechnen, müssen zunächst die Abtastpunkte entlang der ansteigenden Flanke durch lineare Regression angepasst werden, um eine Funktion zu erhalten. Anschließend kann durch Einsetzen verschiedener Zeitintervalle die Spannungszunahme ermittelt werden.
 
Die MATLAB-Code oben extrahiert die Spannungsdaten entlang der ansteigenden Flanke und führt eine lineare Regression dieser Datenpunkte durch, basierend auf dem aktuellen Modell mit einer Abtastzeit von 1 ms.
Die Ausführung des obigen Programms ergibt &Delta;U = 0,065. Dies zeigt, dass das Spannungsinkrement bei einem Abtastzeitintervall von 1 ms kleiner als das Doppelte der Messunsicherheit ist, was bedeutet, dass das Risiko mehrfacher Auslösungen tatsächlich besteht. Daher sollte das Simulink-Abtastzeitintervall neu eingestellt werden. Um das Risiko vollständig zu eliminieren, sollte das Abtastzeitintervall auf 3 ms bzw. 0,003 s festgelegt werden.
 
 
 
 
*'''Einfluss des Abtastzeitintervalls auf die BPM-Genauigkeit'''
 
Da das Modul zur Berechnung der Herzschlagintervalle vorzeitig oder verspätet ausgelöst wird, beträgt der maximale Fehler zwischen dem tatsächlich gemessenen und dem idealen Intervallzeitpunkt: &Delta; t = 2*3 = 6 ms.
 
Durch das Hinzufügen dieses Zeitfehlers zur Zeitdauer und das Einsetzen in die Herzfrequenzberechnungsformel kann festgestellt werden, dass die Herzfrequenz dadurch geringfügig schwankt. Da Herzschläge diskret und positive Ganzzahlen sind, muss das Berechnungsergebnis gerundet werden. Bei der Rundung wird in der Regel das mathematische Verfahren „kaufmännisch Runden“ angewendet. Durch den Zeitfehler kann jedoch beim Rundungsverfahren statt aufrunden abgerundet werden und umgekehrt. Daher führt der Spannungsabnahmefehler des Messsystems letztendlich zu einer Herzfrequenzmessunsicherheit von ± 1 BPM.
 
'''Herzfrequenzberechnungsformel:''' <math> BPM= \frac{60 \cdot 1000}{Zeitdauer}</math> <br>
 
 
 
 
*'''Endmodell'''
 
'''Modelleinstellungen:''' Arduino Uno, Solver: Fixed-step, discrete, Abtastrate: 0,003 s
 
Das Modell zur Datenverarbeitung wurde gemäß Abb. 16 in Simulink aufgebaut.
 
<div style="text-align:center;">
  <table style="margin:auto;">
    <tr>
      <td style="text-align:center;">
        [[Datei:Herzrate Messung Modell.jpg|1000px]]
        <div>Abb. 16: Simulink-Modell</div>
      </td>
    </tr>
  </table>
</div>
 
Das endgültige Modell besteht aus drei Teilen: Das erste Modul dient zur Echtzeit-Herzfrequenzmessung, die zuvor ausführlich beschrieben wurde. Das zweite Modul steuert das Buzzer. Da in diesem Projekt ein passiver Buzzer verwendet wird, muss dieser mit einem PWM-Signal angesteuert werden. Daher wurde ein PWM-Modul hinzugefügt und ein Constant-Modul liefert ein 1-Signal (100 % Duty Cycle) an das PWM-Modul, um den Buzzer mit voller Leistung zu betreiben. Das PWM-Modul wird bei jedem Herzschlag ausgelöst, sodass der Buzzer bei jedem Herzschlag ertönt. Das dritte Modul ist zur Hilfsanzeige gedacht. Dieses Modul kann Dezimalzahlen in Binärzahlen umwandeln und über das Digitale Output-Modul ausgeben.
 
Da es in Simulink schwierig ist, das LCD 16x02 I2C zu konfigurieren, wird ein zweites Arduino UNO R3 verwendet, um das LCD anzusteuern. Dieses Anzeigemodul, bestehend aus dem zweiten Arduino UNO R3 und dem LCD 16x02 I2C, wird über die Arduino IDE konfiguriert. Das Anzeigemodul erhält die binären Herzfrequenzdaten vom ersten Arduino UNO R3 und wandelt diese wieder in Dezimalzahlen um, die auf dem LCD angezeigt werden.
 
 
 
*'''Die Konfiguration für Darstellung - Modell mit Arduino IDE'''
 
Das folgende Fenster zeigt die Konfiguration des Anzeigemoduls in der Arduino IDE. Dieses Konfigurationsprogramm wurde von ChatGPT erstellt und vom Autor getestet und angepasst.
 
<div style="width:1000px; height:600px; overflow:scroll; border: hidden">
<syntaxhighlight lang="matlab" style="border: none; background-color: #EFF1C1; font-size:15px">
#include <Wire.h>
 
#define LCD_ADDR 0x27
#define LCD_CMD  0
#define LCD_DATA 1
#define LCD_BACKLIGHT 0x08 
#define LCD_NOBACKLIGHT 0x00
#define En 0b00000100 
#define Rw 0b00000010 
#define Rs 0b00000001
 
 
int Alt_Wert;
int Neu_Wert;
 
void lcd_init();
void lcd_send_byte(uint8_t, uint8_t);
void lcd_write_command(uint8_t);
void lcd_write_data(uint8_t);
void lcd_set_cursor(uint8_t, uint8_t);
void lcd_print(String);
int readBinaryValue();
int binaryToDecimal(int binary);
 
void setup() {
  Wire.begin();
  lcd_init();
  for (int pin = 6; pin <= 13; pin++) {
    pinMode(pin, INPUT);
  }
}
 
void loop() {
  int binaryValue = readBinaryValue();
  Neu_Wert  = binaryToDecimal(binaryValue);
  if (Alt_Wert != Neu_Wert){
  lcd_send_byte(0x01, LCD_CMD);
  delay(5);
  }
  lcd_set_cursor(0, 0);
  lcd_print("BPM:  ");
  lcd_print(String(Neu_Wert));
  Alt_Wert = Neu_Wert;
}
 
 
 
int readBinaryValue() {
  int value = 0;
for (int pin = 13; pin >= 6; pin--) {
    value <<= 1;         
    value |= digitalRead(pin);
  }
  return value;
}
 
int binaryToDecimal(int binary) {
  return binary;
}
 
void lcd_init() {
  lcd_send_byte(0x33, LCD_CMD);
  lcd_send_byte(0x32, LCD_CMD);
  lcd_send_byte(0x28, LCD_CMD);
  lcd_send_byte(0x0C, LCD_CMD);
  lcd_send_byte(0x06, LCD_CMD);
  lcd_send_byte(0x01, LCD_CMD);
  delay(5);
}
 
 
void lcd_send_byte(uint8_t val, uint8_t mode) {
  uint8_t highnib = val & 0xf0;
  uint8_t lownib = (val << 4) & 0xf0;
  lcd_write_4_bits((highnib) | mode);
  lcd_write_4_bits((lownib) | mode);
}
 
 
void lcd_write_4_bits(uint8_t val) {
  Wire.beginTransmission(LCD_ADDR);
  Wire.write(val | LCD_BACKLIGHT);
  Wire.endTransmission();
  lcd_pulse_enable(val);
}
 
 
void lcd_pulse_enable(uint8_t val) {
  Wire.beginTransmission(LCD_ADDR);
  Wire.write(val | En | LCD_BACKLIGHT);
  Wire.endTransmission();
  delayMicroseconds(1);
  Wire.beginTransmission(LCD_ADDR);
  Wire.write((val & ~En) | LCD_BACKLIGHT);
  Wire.endTransmission();
  delayMicroseconds(50);
}
 
 
void lcd_write_command(uint8_t cmd) {
  lcd_send_byte(cmd, LCD_CMD);
}
 
 
void lcd_write_data(uint8_t data) {
  lcd_send_byte(data, LCD_DATA);
}
 
 
void lcd_set_cursor(uint8_t col, uint8_t row) {
  static uint8_t offsets[] = {0x00, 0x40, 0x14, 0x54};
  lcd_write_command(0x80 | (col + offsets[row]));
}
 
 
void lcd_print(String s) {
  for (int i = 0; i < s.length(); i++) {
    lcd_write_data(s[i]);
  }
}
 
</syntaxhighlight>
</div>
<br/>


=== Versuchsbeobachtung ===
=== Versuchsbeobachtung ===
[[Datei:Sharp Ergebnis 1.png|thumb|rigth|450px|Abb. 6: Darstellung des Rohsignals des IR-Entfernungssensors (rote Kurve)]]
 
[[Datei:Sharp Ergebnis 2.png |thumb|rigth|450px|Abb. 7: Darstellung von dynamischen Messwerten des IR-Entfernungssensors]]
Aus der Darstellung der rohren BPM-Änderungskurve kann man erkennen, dass die Herzfrequenz nicht konstant ist und starke Schwankungen aufweist. Diese Schwankungen sind jedoch nicht durch Messfehler verursacht. Tatsächlich wird die Herzfrequenz von verschiedenen Faktoren beeinflusst, darunter körperliche Aktivität, emotionaler Zustand, Atemmuster, Umweltveränderungen und physiologische Schwankungen im Körper, wie die Regulierung durch das autonome Nervensystem, was zu natürlichen Schwankungen in kurzer Zeit führt.[[#Literatur|<sup>[15]</sup>]]
Das Signal des Sensors weist alle 40&thinsp;ms systematische Ausreisser auf (vgl. Abb. 6, rote Kurve).
 
Um eine repräsentativere Herzfrequenzanzeige zu erhalten, sollten die gemessenen Daten verarbeitet werden, indem mehrere aufeinanderfolgende Messungen durchgeführt und deren Mittelwert bestimmt wird, um zufällige Messfehler zu minimieren. Aus der Darstellung der rohren BPM-Änderungskurve kann man auch einige Extremwerte erkennen. Diese sind auf die Bewegung des Fingers während der Messung zurückzuführen, was zu Veränderungen im Kontakt zwischen dem Pulssensor und der Fingeroberfläche führt (siehe Abb. 18 für die anomale Veränderung der Herzschlagwellenform), was zu anomalen Lichtreflexionen und fehlerhaften Berechnungen der Herzschlagintervalle führt und schließlich zu Extremwerten.
 
Um diese beiden Probleme zu lösen, wird der rekursive Medianfilter verwendet, da der Medianfilter die zentrale Position einer Gruppe von Messdaten bewerten und die Auswirkungen von Extremwerten verhindern kann. Darüber hinaus ermöglicht der rekursive Medianfilter durch das gleitende Fenster, vergangene Daten zu speichern und sofort die neuesten Messdaten aufzunehmen und zu verarbeiten, was die Echtzeitmessung der Herzfrequenz in gewissem Maße gewährleistet.
 
 
<div style="text-align:center;">
  <table style="margin:auto;">
    <tr>
      <td style="text-align:center; padding-right: 20px;">
        [[Datei:BPM-Änderungskurve.jpg|430px]]
        <div>Abb. 17: Darstellung der rohren BPM-Änderungskurver</div>
      </td>
      <td style="text-align:center; padding-left: 20px;">
        [[Datei:Herzschlagkurve.jpg|480px]]
        <div>Abb. 18:  Darstellung der Herzschlagkurve</div>
      </td>
    </tr>
  </table>
</div>


== Auswertung==
== Auswertung==
Die Messhypothese wurde verworfen. Der Sensor weist systematische Messwertausreisser auf.
Das Herzfrequenzmesssystem kann zuverlässige Messungen durchführen. Benutzer können ihre Echtzeit-Herzfrequenz schnell über das LCD-Display abrufen und die Herzschlagfrequenz anhand des Buzzersounds abschätzen, um die Zuverlässigkeit der angezeigten Herzfrequenz zu bewerten.
 
Der Pulse Sensor gibt analoge Signale aus, hat jedoch keine spezifische Kennlinie zur Darstellung der Beziehung zwischen Spannung und Herzfrequenz. Daher müssen Benutzer einen eigenen Algorithmus zur Berechnung der Herzfrequenz entwickeln. Die Messgenauigkeit hängt vom Sensor, dem Algorithmus und der Abtastrate des Systems ab. Bei minimaler Fingerbewegung beträgt die Messunsicherheit des Systems ±1 BPM, wodurch die Messhypothese für das System unter den gegebenen Bedingungen gültig ist.


Die Ausreisser lassen sich mit einem Signalfilter eliminieren. Hierzu eignet sich ein Rangordnungsfilter (z.&thinsp;B. Median-Filter). Das Filter wird hierzu auf eine Fensterbreite von 30 Werten
eingestellt. Das zufriedenstellende Filterergebnis für statische Werte zeigt Abb. 6 als blaue Kurve. Es konnte mit dynamische Werten verifiziert werden (vgl. Abb. 7). Das Datenblatt ([2, S. 6]) belegt die Messungen und bezeichnet die Messausreisser als "instabile Ausgabe" für maximal 5&thinsp;ms alle 40&thinsp;ms. Mit 50 Werten erhöht sich die Filterwirkung, es entsteht jedoch ein Delay von 10&thinsp;ms. Mit 10 Werten ist die Filterwirkung zu gering.
== Zusammenfassung und Ausblick ==
== Zusammenfassung und Ausblick ==
* Zusammenfassung der Kapitel 1-4
'''Zusammenfassung'''
* Diskussion der Ergebnisse
 
* Ausblick
Beim Einsatz eines unbekannten Sensors und anderer Geräte ist das Lesen des Datenblatts sehr wichtig, da es Informationen über das Kommunikationsprotokoll, die Sensoreigenschaften und die Art der Ausgangsdaten liefert.
* Selbstreflexion/Lessons learned
 
Das Auslesen der Daten aus dem Sensor ist der erste Schritt, aber die Datenverarbeitung ist entscheidend. Sensordaten enthalten oft Rauschen und Störungen, die durch Datenverarbeitung gefiltert werden können, um sinnvolle Messwerte zu extrahieren.
 
Die Bewertung der Messunsicherheit wird ebenfalls erläutert. Diese Daten helfen, die Genauigkeit der Messergebnisse zu beurteilen, die Vertrauenswürdigkeit der Messwerte zu klären und den Nutzern zu helfen, zuverlässigere Entscheidungen zu treffen.
 
 
'''Diskussion der Ergebnisse'''
 
Der Pulsesensor erfordert für präzise Herzfrequenzmessungen hohe Anforderungen. Ohne die Hilfe eines Filters führen kleinste Änderungen im Kontakt zwischen Sensor und Finger zu Messfehlern. Durch die Anwendung eines Medianfilters auf die Ausgabedaten können jedoch die negativen Auswirkungen dieser Kontaktänderungen verringert werden. Diese Filtermethode glättet die Daten, entfernt Ausreißer, die durch kurzfristige Kontaktveränderungen entstehen, und verbessert dadurch die Stabilität und Zuverlässigkeit der Herzfrequenzmessungen.
 
 
'''Ausblick'''
 
Aufgrund fehlender professioneller Ausrüstung während des Experiments wurde der Pulsesensor direkt auf den Finger geklebt, was eine unzuverlässige Fixierung darstellt. Zur Erhöhung der Messgenauigkeit sollte ein Gehäuse entworfen und produziert werden, das den Sensor fixiert und mit einem wiederverwendbaren Band am Finger befestigt wird. Zudem wurden die Geräte mittels Jumperkabel verbunden, was ebenfalls instabil ist und Rauschen verursachen kann. Um dies zu beheben, sollte eine PCB entwickelt werden, die den Mikrocontroller, Pulsesensor, Summer und das LCD integriert, um die Stabilität und Aussicht des Messsystems zu verbessern.
 
 
'''Selbstreflexion/Lessons learned'''
 
Durch den Kurs Angewandte Informatik habe ich die Bedeutung der Daten- und Signalverarbeitung erkannt. Darüber hinaus vereinfacht die Rapid Control Prototyping-Methode, basierend auf dem "Simulink Support Package for Arduino Hardware", die Komplexität der Entwicklung. Sie hilft Entwicklern, den Entwicklungszyklus zu verkürzen und ermöglicht es, Algorithmen schnell auf Hardware zu testen und zu validieren.


== Ergebnisvideo ==
== Ergebnisvideo ==
Binden Sie hier Ihr Ergebnisvideo ein.
Dieses Video handelt von der Messung der Herzfrequenz. Die Echtzeit-Herzfrequenz kann nicht nur auf einem LCD angezeigt, sondern auch im Simulink-Fenster gelesen werden. Außerdem kann man das Piepen des Buzzers hören.


Anleitung: [[Videos_einbinden|Videos im Wiki einbinden]]
[[Datei:Herzrrate Messung.mov|thumb|center|800px|Ergebnisvideo über Herzfrequenzmessung]]


== Lernzielkrontrolle ==
== Lernzielkrontrolle ==
Zeile 167: Zeile 710:


== Literatur ==
== Literatur ==
[1]A<span style="font-variant:small-caps">mazon</span>:Arduino UNO SMD REV3. URL: https://www.amazon.de/A000073-ARDUINO-UNO-SMD-Edition/dp/B007R9TUJE, 16. Juli 2024 <br>
[2] A<span style="font-variant:small-caps">rduino® uno r3</span>: A000066-datasheet. URL: https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf, 17. Juli 2024 <br>
[3] A<span style="font-variant:small-caps">tmel® </span>: ATmega328P. URL:https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf, 17. Juli 2024 <br>
[4] O<span style="font-variant:small-caps">penbci online Store </span>: PULSE SENSOR. URL: https://shop.openbci.com/products/pulse-sensor, 17. Juli 2024 <br>
[5] P<span style="font-variant:small-caps">ulsesensor </span>: Open Hardware. URL: https://pulsesensor.com/pages/open-hardware, 17. Juli 2024 <br>
[6] S<span style="font-variant:small-caps">unsky</span>: Arduino IIC/12C+1602. URL: https://www.sunsky-online.com/zh_CN/p/DIY4006/New-IIC-I2C-with-1602-LCD-Display-Screen-Board-Module-for-Arduino.htm, 17. Juli 2024 <br>
[7] H<span style="font-variant:small-caps">itachi </span>: HD44780U. URL: https://www.sparkfun.com/datasheets/LCD/HD44780.pdf, 17. Juli 2024 <br>
[8] T<span style="font-variant:small-caps">exas Instruments </span>: PCF8574. URL: https://www.ti.com/lit/ds/symlink/pcf8574.pdf, 17. Juli 2024 <br>
[9] S<span style="font-variant:small-caps">martkits</span>: Buzzer Ativo 5V 12mm. URL: https://www.smartkits.com.br/buzzer-ativo-5v, 17. Juli 2024 <br>
[10] P<span style="font-variant:small-caps">ositiverecords</span>: MathWorks MATLAB for Mac R2023b. URL: https://positiverecords.ru/pages/photoshop/3d_811.html, 17. Juli 2024 <br>
[11] D<span style="font-variant:small-caps">igikey</span>: Pulse Sensor Datasheet by Adafruit Industries LLC . URL: https://www.digikey.pl/htmldatasheets/production/3024658/0/0/1/pulse-sensor-datasheet.html, 17. Juli 2024 <br>
[12] A<span style="font-variant:small-caps">vagotech</span>:  Miniature Surface-Mount Ambient Light Photo Sensor. URL: https://www.mouser.com/datasheet/2/678/av02-1169en-1828127.pdf, 17. Juli 2024 <br>
[13] A<span style="font-variant:small-caps">icdata</span>: Pulse Sensor Getting Started Guide
. URL: https://www.allicdata.com/pdf/sen-11574-datasheet/2718390.html, 18. Juli 2024 <br>
[14] T<span style="font-variant:small-caps">eachmephysiology</span>: Pressures Within the Heart. URL: https://teachmephysiology.com/cardiovascular-system/cardiac-cycle-2/cardiac-cycle/, 18. Juli 2024 <br>
[15] L <span style="font-variant:small-caps">ivestrong</span>: What Causes a Fluctuating Heart Rate. URL: https://www.livestrong.com/article/350761-fluctuating-heart-rate/, 18. Juli 2024 <br>
Zitieren Sie nach [[Zitieren_nach_DIN1505|DIN ISO 690:2013-10]].
Zitieren Sie nach [[Zitieren_nach_DIN1505|DIN ISO 690:2013-10]].


== Anhang ==
== Anhang ==
* Datenblätter
* Datenblätter
* Simulink-Modell
* Simulink-Modell
[[Datei:Pulsesensor SE50.zip|mini]]
* Originaldateien (PAP, Schaltplan,... )
* Originaldateien (PAP, Schaltplan,... )
----
----
→ zurück zum Hauptartikel: [[BSE_Angewandte_Informatik_-_SoSe24|BSE Angewandte Informatik SoSe24]] | [[BSE_Angewandte_Informatik_-_SoSe24_-_Hausarbeit|Hausarbeit SoSe24]]
→ zurück zum Hauptartikel: [[BSE_Angewandte_Informatik_-_SoSe24|BSE Angewandte Informatik SoSe24]] | [[BSE_Angewandte_Informatik_-_SoSe24_-_Hausarbeit|Hausarbeit SoSe24]]

Aktuelle Version vom 28. Juli 2024, 20:02 Uhr

Abb. 1: Herzfrequenz/Pulsesensor SE050
Autor: Weiran Wang
Studiengang: Business and Systems Engineering
Modul: BSE-M-2-1.03, Hausarbeit in Angewandte Informatik gehalten von Prof. Dr.-Ing. Schneider
Semester: Sommersemester 2024
Abgabetermin: 28.07.2024

Einführung

Dieser Artikel beschreibt, wie man mit einem vorhandenen Pulse Sensor, Arduino UNO R3, LCD 16x02 I2C und einem Buzzer ein einfaches Herzfrequenzmessgerät aufbaut und dessen Hauptfunktionen schnell und zuverlässig mit Matlab & Simulink realisiert. Von diesem Gerät wird erwartet, dass es einen angemessenen Herzfrequenzwert in Simulink anzeigt und diesen Wert gleichzeitig auf dem LCD-Bildschirm darstellt. Außerdem soll jeder Herzschlag über den Buzzer hörbar gemacht werden können.


Aufgabenstellung

Messen Sie die die Herzfrequenz am Ohrläppchen oder Finger in Herzschlag pro Minute (BPM).

  • Thema/Fragestellung: Messung der Herzfrequenz mit dem Pulsesensor SE050
  • Hypothese: Herzfrequenz kann fehlerfrei gemessen werden.
  • Einordnung in den Lehrplan

Projektbeschreibung

Tabelle 2: Materialliste
# Anzahl Material
1 1 PC mit MATLAB/Simulink R2023b
2 1 Pulsesensor SE050
3 1 LCD 16x02 I2C
4 1 Buzzer
5 2 Arduino Uno R3
6 1 Streckbrett
7 22 Jumper Kabel

Beschreibung Funktionsweise der verwendeten Hard- und Software

  • Arduino Uno R3
Abb. 2: Arduino Uno R3

Arduino Uno R3 (siehe Abb. 2[1]) ist ein Open-Source-Mikrocontroller-Entwicklungsboard, das von der Firma Arduino entwickelt und produziert wurde. Es integriert viele wichtige Komponenten. Zu den Hauptkomponenten gehören der Atmega328P-Mikrocontroller, eine externe Quarzquelle zur Bereitstellung einer hohen Taktfrequenz, ein Upload-Gerät, das aus einer USB-Schnittstelle und einem Atmega16U2-Signalumwandlungsmodul besteht, eine Reset-Taste zum Neustarten von Programmen sowie zwei Reihen von Schnittstellen zur Verbindung von Peripheriegeräten.[2,S.1] Da ein Mikrocontroller der AVR-Serie verwendet wird, unterstützt das Arduino-Board eine Vielzahl von Funktionen wie digitale Ein-/Ausgabe, analoge Ein-/Ausgabe, Timer/Zähler und Interrupts, die die grundlegenden Anforderungen eingebetteter Systeme erfüllen.[3,S.1]




  • Pulsesensor SE050
Abb. 3: Pulsesensor

Pulse Sensor (siehe Abb. 2[4]) ist ein Open-Source-Hardwareprojekt, das von Joel Murphy und Yury Gitman entwickelt wurde. Aus den verfügbaren Informationen und durch direkte Beobachtung lässt sich erkennen, dass der Pulse Sensor eine runde Leiterplatte (PCB) ist, die verschiedene Komponenten integriert. Zu den wichtigsten Komponenten gehören der Lichtsensor „APDS-9008“ und eine grüne LED von „Kingbright“. Diese beiden Komponenten ermöglichen die Photoplethysmographie (PPG)-Technologie. Genauer gesagt, sendet die grüne LED Licht auf die Haut, wobei ein Teil des Lichts vom Blut absorbiert und ein Teil vom Gewebe reflektiert wird und auf den „APDS-9008“-Lichtsensor trifft. Durch die Erkennung der durch den Blutfluss verursachten Änderungen dieser Lichtstrahlen kann die Herzfrequenz gemessen werden.[5]






  • LCD Modul 16x02 I2C
Abb. 4: LCD 16x02 I2C

LCD 16x02 I2C (siehe Abb. 4[6]) ist ein Display, das das I2C-Kommunikationsprotokoll unterstützt und 16x2 Zeichen anzeigen kann. Das Display besteht hauptsächlich aus zwei Teilen: Erstens dem LCD-Bildschirm und zweitens dem HD44780-Controller.[7] Der HD44780 ist das Herzstück des Displays. Er wandelt die empfangenen digitalen Signale in Steuersignale für die Pixel um und enthält einen integrierten Zeichengenerator, der die Anzeige von Zeichen vereinfacht. Allerdings unterstützt der HD44780 nur die parallele Kommunikation. Um die Verbindung zu vereinfachen, ist ein I2C-Erweiterungsmodul (mit dem PCF8574T-Chip) auf dem Bildschirm verlötet.[8] Dieses Modul wandelt serielle I2C-Signale in parallele Signale um, wodurch die Anzahl der Verbindungskabel zwischen dem Displaymodul und dem Host reduziert wird und die Nutzung erleichtert wird.





  • Buzzer
Abb. 5:Buzzer

Ein Buzzer (siehe Abb. 5[9]) ist ein elektronisches akustisches Gerät, das durch elektrische Signale Töne erzeugen kann. In diesem Experiment wird ein passiver Summer verwendet, der keine interne Oszillatorschaltung enthält und ein externes Steuersignal (PWM) benötigt.






  • Matlab & Simulink R2023b
Abb. 6:Matlab & Simulink

Um die Analyse von Sensordaten zu erleichtern, werden Matlab & Simulink(siehe Abb. 6[10]) verwendet. Darüber hinaus muss zur Unterstützung von Arduino-Projekten das Plugin „Simulink Support Package for Arduino Hardware“ heruntergeladen und installiert werden. Durch die Verwendung des Simulink Support Package for Arduino Hardware können Entwickler effektiv RCP (Rapid Control Prototyping) durchführen, wodurch der Entwurfs- und Validierungsprozess von Steuerungssystemen beschleunigt wird. Konkret ermöglicht der Einsatz dieses Plugins, dass Modelle, die auf Arduino-Funktionen basieren, in Maschinencode umgewandelt und auf die Arduino-Entwicklungsplatine hochgeladen werden. Anschließend können die Ausgaberesultate der Arduino-Entwicklungsplatine in Echtzeit in Simulink beobachtet werden.







Technische Daten[11]

Messbereich 0.3 V .. 5 V
Versorgungsspannung 3.3 V oder 5.0 V
Versorgungsstrom < 4 mA
Ausgangssignaltyp Analogsignal
Ausgangssignalbereich 0.3 V .. VCC V
Getriebe Kunststtoff
Arbeitstemperatur -40 °C .. +85 °C
Abmessungen ∅ = 15.8 mm ; δ = 3.6 mm

Pinbelegung

Pin Belegung Signal
1 Signal Analogsignal (0.3 V .. 5 V)
2 Versorgungsspannung VCC 5 V
3 Masse (GND) 0 V

Funktionsweise Primärsensor

Primärsensor APDS-9008

Abb. 7: APDS-9008

Der APDS-9008 ist Primärsensor in Pulsesensor und ein kostengünstiger, analoger Umgebungslichtsensor, der zur Messung von Umgebungslicht verwendet wird.


Funktionsprinzip

  • Fotoelektrische Umwandlung: Wie in der Abbildung 7[12, S.12] gezeigt, kann der Sensor Lichtsignale in hochverstärkte Stromsignale umwandeln.
  • Strom-zu-Spannungs-Umwandlung: Der Strom kann durch einen externen Lastwiderstand in ein Spannungssignal umgewandelt werden.
  • Physikalischer Filter: Ein 10uF-Kondensator parallel zum Lastwiderstand filtert Hochfrequenzrauschen heraus, während das Haupt-Niedrigfrequenzsignal durch den Lastwiderstand fließt und ein stabiles Spannungssignal bildet. Diese Konfiguration kann das Ausgangssignal glatter und stabiler machen.

Versuchsaufbau und Durchführung

Versuchsaufbau

Die korrekte Verbindung der Komponenten mit dem Master ist die Grundlage für den Erfolg des Experiments. Vor der Verbindung sollten die Betriebsspannung, das Kommunikationsprotokoll und die Ausgangssignalart der einzelnen Komponenten berücksichtigt werden. Abb. 8, Abb. 9 und Abb. 10 zeigen den Schaltplan, den Anschlussplan und den Versuchsaufbau.

     
Abb. 8: Schatplan
     
Abb. 9: Anschlussplan
     
Abb. 10: Versuchsaufbau

Versuchsdurchführung

Dieser Abschnitt beschreibt ausführlich den Prozess der Modellierung und Optimierung. Zunächst wird die erste Modellierung kurz schriftlich beschrieben. Anschließend werden die mit diesem unausgereiften Modell gewonnenen Daten analysiert, um potenzielle Risiken des Modells zu identifizieren. Schließlich wird das Modell erneut optimiert, um das endgültige Modell zu erhalten. Am Ende dieses Abschnitts findet mandie entsprechende Abbildung des endgültigen Modells (Abb. 16).


  • Erste Modellierung

Pulse Sensor verwendet die PPG-Technologie. Während des Betriebs des Geräts wird das Pulssignal wie Abb. 11[13, S.5] synchron und kontinuierlich mit den Pulsschwingungen ausgegeben. Daher reicht es aus, den Zeitraum dieses Schwingungssignals zu bestimmen, um die momentane Herzfrequenz zu ermitteln.

       
Abb. 11: Pulssignal


Beim Erstellen des Modells muss das Analog Input-Block verwendet werden, um die Ausgangsabtastung des Pulse Sensors vom Arduino UNO R3 zu erhalten und in ein Digitalsignal umzuwandeln.

Aus dem Datenblatt des Mikrocontrollers Atmega328P geht hervor, dass die ADC-Umwandlungszeit maximal 260 µs beträgt, während das Abtastintervall 67 µs beträgt.[3, S.205] Daher beträgt die gesamte A/D-Umwandlungszeit 327 µs und ist somit kleiner als 1 ms. Daher kann die Systemabtastuhr in Simulink mit discretem Fixed-step auf 0,001 s fest eingestellt werden.

Beobachtungen zeigen, dass bei jedem Herzschlag ein höherer und ein niedrigerer Peak im Signal wie Abb .11 auftreten. Der höhere Peak repräsentiert den Herzschlag, während der niedrigere Peak aufgrund der Struktur der Blutgefäße entsteht.[14] In diesem Projekt kann der niedrigere Peak ignoriert werden. Daher kann ein Filter, der aus einem Constant-Block und einem Relational Operator-Block besteht, verwendet werden, um die höheren Peaks zu erhalten. Der Wert des Constant-Blockes wird auf 3,5 gesetzt. Es reicht aus, das Zeitintervall der ansteigenden Flanke des Signals, das den Schwellenwert von "3,5" überschreitet, zu erkennen und die Umrechnungsformel zu verwenden, um die momentane Herzfrequenz zu berechnen.

Da das Herzfrequenzmessgerät, bestehend aus dem Pulse Sensor und dem Arduino UNO R3, während des Signalwandlungsprozesses einige Fehler verursachen kann, ist es notwendig, die Messfehler des Geräts zu bestimmen und zu analysieren, ob diese Fehler die Herzfrequenzmessung negativ beeinflussen können.

       
Abb. 12: Erstes Modell


  • Vorläufige Bewertung der Messunsicherheit

Da die Herzfrequenz eine nicht kontrollierbare Variable ist, kann im Messdesign kein bestimmter Wert als Referenzstandard festgelegt werden. Daher kann das Messgerät nur vor der Herzfrequenzmessung, wenn die Herzfrequenz null ist, kalibriert werden. Externe Lichtquellen isolierender Pulse Sensor(Abb. 13) zeigt den auf dem Tisch ruhenden Pulse Sensor, der von externen Lichtquellen abgeschirmt ist. Die Erfassung der Ausgangsspannung des Pulse Sensors in diesem Zustand sollte im Laufe der Zeit einen relativ stabilen Wert nahe VCC/2 zeigen.

Messdaten des Stillstands (Abb. 14) zeigen die Daten innerhalb von zwei Minuten. Die Messwerte schwanken zwischen 2,44 V und 2,54 V, ohne große Abweichungen. Diese Schwankungen können durch externe elektromagnetische Störungen, sensorinterne Geräusche und ADC-Quantisierungsrauschen verursacht werden. Daher können die im Diagramm dargestellten zufälligen Fehler als Standardunsicherheit Typ A kategorisiert werden.


       
Abb. 13: Externe Lichtquellen isolierender Pulse Sensor
        
Abb. 14: Messdaten des Stillstands



  • Die konkrete Messunsicherheit mit Matlab berechnen
%% Daten aus dem Workspace abrufen
Daten = simout;    

%% Datenverarbeitung
n = length(Daten);             % Die Anzahl der Daten ermitteln
RE = mean(Daten);                   % Den Durchschnitt berechnen
sE = std(Daten);               % Die Standardabweichung berechnen

%% Die Paramete aus Atmega328p-Datenblatt
Aufloesung = 10;                            % Aufloesung,10 bit
v_ref = 5;                      % Referenz Spannung, Einheit : V
lsb = v_ref / (2^Aufloesung);   % Mindestaufloesung,Einheit: V

% Jede Fehlerquelle (Einheit:LSB)
absolute_genauigkeit_lsb = 3.5;  % Absolute Genauigkeit, maximal
inl_lsb = 1.5;        % Integraler nichtlinearer Fehler, Maximum
dnl_lsb = 0.7;  % Differenzieller Nichtlinearitätsfehler, maximal
gain_error_lsb = 3.5;              % Verstärkungsfehler, maximal
offset_error_lsb = 3.5;                       % Offsetfehler, max.

%% Fehlerquelle in Spannung umrechnen (Einheit: V)
absolute_genauigkeit = absolute_genauigkeit_lsb * lsb; 
inl_error = inl_lsb * lsb;
dnl_error = dnl_lsb * lsb;
gain_error = gain_error_lsb * lsb;
offset_error = offset_error_lsb * lsb;

%% Berechnen Standardunsicherheit Typ A
alpha = 1-0.6827;
p = 1-(alpha/2);
t = tinv(p,n-1); 
uA = t*sE/sqrt(n); 

%% Berechnen die Standardunsicherheit Typ B
uB = sqrt(absolute_genauigkeit^2 + inl_error^2 + dnl_error^2 + gain_error^2 + offset_error^2 );

%% Berechnen Standardunsicherheit Typ C
uC = sqrt((uA)^2+(uB)^2);  

%% Berechnen absolute Messunsicherheit 
k  = 2; % Vertrauensfaktor (Vertrauensniveau 0.9545)
uAbs = k*uC; % absolute Messunsicherheit 

%% Vollständige Messergebnis
disp(['Vollständige Messergebnis: U = ',num2str(RE),' ± ',num2str(uAbs),' V '])


Die Verwendung von Matlab ermöglicht eine einfache Bestimmung der Messunsicherheit. Zunächst werden die gemessenen Spannungsdaten aus Simulink in den Workspace importiert, um die Standardunsicherheit Typ A durch die Anwendung statistischer Methoden zu bestimmen. Anschließend werden die Spezifikationsparameter der Hardwaregeräte, wie z.B. Kalibrierzertifikate und technische Spezifikationen des Herstellers, gesammelt, um die Standardunsicherheit Typ B zu bestimmen. Schließlich werden die Standardunsicherheiten der Typen A und B zur Typ-C-Standardunsicherheit kombiniert.

Im Fenster oben zeigt sich ein MATLAB-Algorithmus, der zur Berechnung des wahren Werts der gemessenen Spannung innerhalb 2 Minuten, der Standardunsicherheit sowie der absoluten Messunsicherheit innerhalb von ±1σ einer Gaußschen Verteilung dient. In dem Algorithmus wurde bei der Bestimmung der Standardunsicherheit TypB aufgrund fehlender detaillierter Informationen über den Pulse Sensor nur die Herstellerdaten des ADC-Wandlers des Arduino UNO R3 verwendet.Beim Durchsehen des Datenblatts des Atmega328p können die folgenden Eigenschaften seines ADC-Komponenten festgestellt werden: Der maximale Wert der absoluten Genauigkeit beträgt 3,5 LSB, der maximale Wert der Integral-Nonlinearität beträgt 1,5 LSB, der maximale Wert der Differenzial-Nonlinearität beträgt 0,7 LSB, der Bereich des Verstärkungsfehlers beträgt 3,5 LSB und der Bereich des Offset-Fehlers beträgt 3,5 LSB.[3, S.265] Bei der Berechnung der Standardunsicherheit vom Typ B wird angenommen, dass diese Fehler gleichmäßig verteilt sind, und ihre Standardunsicherheit wird als diese Maximalwerte geteilt durch √3berechnet. Durch die Anwendung des oben genannten Matlab-Algorithmus ergibt sich ein vollständiges Messergebnis: U = 2,4867 ± 0,035431 V. Dabei repräsentiert "2,487" den Mittelwert, also den wahren Wert, und "0,035" die absolute Messunsicherheit.



  • Darstellung der Messunsicherheit(1σ)
Max = max(Daten);  %% Den Maximalwert im Daten-Array finden
Min = min(Daten);  %% Den Minimalwert im Daten-Array finden
x = Min:0.0001:Max;%% Einen Bereich vom Minimalwert bis zum Maximalwert erstellen
pE = normpdf(x,RE,sE ); 

figure;
hold on;

% Zeichnen der Wahrscheinlichkeitsdichtekurve
p1 = plot(x, pE, 'LineWidth', 1, 'Color', 'black', 'DisplayName', 'Normalverteilung PE(R)');

% Zeichnen des echten Werts mit roter Farbe
p2 = xline(RE, 'Color', 'red', 'LineWidth', 2, 'DisplayName', 'Mittelwert');

% Markieren der Standardabweichung
p3 = xline(RE + sE, 'k--', 'LineWidth', 1, 'DisplayName', 'Standardabweichung +');
p4 = xline(RE - sE, 'k--', 'LineWidth', 1, 'DisplayName', 'Standardabweichung -');

% Zeichnen der Anzahlen der verschiedenen Spannungen
p5 = histogram(Daten, 'Normalization', 'pdf', 'DisplayName', 'Daten Histogram');

% Legend hinzufügen
lgd = legend([p1 p2 p3 p4 p5]);
lgd.FontSize = 18;  % Hier die gewünschte Schriftgröße einstellen
xlabel('Zeit (s)', 'FontSize', 18);
ylabel('Spannung (V)', 'FontSize', 18);
title({['Messergebnis : U = ', num2str(RE), ' $\pm$ ', num2str(uAbs), 'V']}, ...
'Interpreter', 'latex', 'FontSize', 18);
hold off;


Der Matlab-Code oben dient zur Visualisierung der oben berechneten Daten. Mit diesem Code kann die Verteilung der gemessenen Spannung dargestellt werden, einschließlich der Wahrscheinlichkeitsdichtekurve der Spannungsdaten, des Durchschnittswertes der Spannungsdaten, der Position einer Standardabweichung sowie des Histogramms der Spannungsdaten . Der Titel gibt den Durchschnittswert und die Unsicherheit des kompletten Messergebnisses an. Das Ergebnis der Programmausführung ist in der Darstellung der Messunsicherheit(Abb.15)zu sehen.

       
Abb. 15: Darstellung der Messunsicherheit



  • Kalibrierung

Der gemessene Spannungswert weist sehr wahrscheinlich einen systematischen Fehler auf. Dieser systematische Fehler hat jedoch keinen Einfluss auf die Messung der Herzfrequenz, da dieser Fehler lediglich zu einer Gesamtverschiebung der Spannungsdaten führt. Die Genauigkeit der Herzfrequenzberechnung hängt von der Präzision der Zeitabstände zwischen den definierten Anstiegsflanken der Herzfrequenzwellenform ab. Daher muss der systematische Fehler nicht korrigiert werden.



  • Nachteilige Auswirkungen der Messunsicherheit

Durch Experimente und Analysen wurde festgestellt, dass die Messunsicherheit zwischen -0,035 und +0,035 V liegt. Diese Messunsicherheit kann dazu führen, dass der aktuell gemessene Spannungswert das Modul zur Berechnung der Herzschlagzeitintervalle (bei der ansteigenden Flanke der Herzschlagwelle und einem Messwert größer als der eingestellte Schwellenwert von 3,5 V) vorzeitig oder verspätet auslöst, wodurch die Genauigkeit der Herzfrequenzmessung indirekt beeinflusst wird.

Zum Beispiel: Angenommen, der aktuell gemessene Spannungswert beträgt 3,465 V, was unterhalb des Auslöseschwellenwerts liegt. Aufgrund der Messunsicherheit könnte dieser Spannungswert jedoch auf 3,465 V + 0,035 V erhöht werden, was zu einer vorzeitigen Auslösung führt.

Ebenso könnte der gemessene Spannungswert, wenn er genau 3,5 V beträgt und somit die Auslösebedingungen erfüllt, aufgrund der Messunsicherheit unter 3,5 V fallen, wodurch das Modul zur Berechnung der Herzschlagzeitintervalle nicht ausgelöst wird, was zu einer verspäteten Auslösung führt.

Offensichtlich führen vorzeitige oder verspätete Auslösungen zu Fehlern bei den Herzschlagzeitintervallen. Daher muss analysiert werden, ob diese vorzeitigen oder verspäteten Auslösungen durch Filter eliminiert werden können. Falls dies nicht möglich ist, sollte bewertet werden, wie groß die durch vorzeitige oder verspätete Auslösungen verursachten Zeitfehler sind.

Darüber hinaus könnte die ungenaue Auslösung dazu führen, dass das Modul innerhalb einer sehr kurzen Zeitspanne mehrmals ausgelöst wird, wodurch die angezeigte Herzfrequenz unzuverlässig wird.

Zum Beispiel: Angenommen, der gemessene Spannungswert beträgt 3,465 V und wird aufgrund der Messunsicherheit auf 3,5 V erhöht, wodurch das Modul ausgelöst wird. Theoretisch sollte der nächste Auslösezeitpunkt des Moduls bei der nächsten ansteigenden Flanke des Herzschlags liegen. Aufgrund der sehr kurzen Simulink-Abtastzeit könnte der Spannungswert jedoch im nächsten Abtastschritt der ansteigenden Flanke des aktuellen Herzschlags nicht signifikant ansteigen und aufgrund der Messunsicherheit auf unter 3,5 V fallen, wodurch er unter den vorherigen Abtastspannungswert fällt und eine abfallende Flanke erzeugt. Nach einigen Abtastschritten wird der Spannungswert jedoch wieder über 3,5 V steigen und die Auslösebedingungen erneut erfüllen, was zu einer kurzen, aufeinanderfolgenden Auslösung des Moduls führt. Daher muss festgestellt werden, ob dieses Risiko besteht, und es müssen Methoden gefunden werden, um dieses Risiko vollständig zu eliminieren.



  • Verzicht auf die Verwendung eines Filters dabei

Ein Tiefpassfilter eignet sich zur Filterung der Herzschlag-Abtastspannung, reduziert scharfe Schwankungen und Störungen, verbessert das Signal-Rausch-Verhältnis und glättet das Spannungssignal, sodass das Signal stabiler und kontinuierlicher wird. Obwohl der Tiefpassfilter Hochfrequenzrauschen effektiv unterdrücken kann, kann er das Rauschen nicht vollständig beseitigen, sodass das Problem der ungenauen Auslösung nicht behoben wird. Daher kann auf die Verwendung des Filters verzichtet werden.



  • Risikobeseitigung
% Extrahieren der Spannungsdaten von der ansteigenden Flanke aus simout
Daten = simout(45:60,1);
% Länge der Daten ermitteln
n = length(Daten);
% Erstellen der Zeitdaten von 1 bis n
Zeit = 1:n;

% Definieren von x als Zeit und y als Daten
x = Zeit;
y = Daten;

% Berechnung der Kovarianzmatrix von x und y
Kovarianzmatrix = cov(x, y);
% Extrahieren von sxx, syy und sxy aus der Kovarianzmatrix
sxx = Kovarianzmatrix(1,1);
syy = Kovarianzmatrix(2,2);
sxy = Kovarianzmatrix(1,2);

% Berechnung der Regressionskoeffizienten b1 und b0
b1 = sxy/sxx;

% Regressionsgerade berechnen
% Einstellen des Zeitinkrements in Millisekunden
Delta_Zeit = 1; % in ms
% Berechnung des Spannungsinkrements in Volt
Delta_U = b1 * Delta_Zeit % in V


Im oben genannten Text wurde erwähnt, dass das Risiko besteht, dass das Modul zur Berechnung der Herzschlagzeitintervalle innerhalb eines sehr kurzen Zeitraums mehrfach ausgelöst wird. Um dieses Risiko zu beseitigen, muss sichergestellt werden, dass die Spannung im nächsten Abtastschritt nach der Auslösung nicht mehr unter den festgelegten Auslöseschwellenwert (3,5 V) fällt.

Beobachtungen der Herzschlagwelle zeigen, dass die ansteigende Flanke der Welle nahezu linear verläuft und eine hohe Steigrate aufweist. Daher reicht es aus, das Abtastzeitintervall zu verlängern, um sicherzustellen, dass die Spannung einen ausreichenden Anstieg aufweist. Wenn der Spannungsanstieg größer ist als der maximale Unterschied der Messunsicherheit benachbarter Abtastwerte, d. h. das Doppelte der Messunsicherheit, kann sichergestellt werden, dass die Spannung beim nächsten Abtastschritt definitiv über 3,5 V liegt, wodurch das Risiko einer mehrfachen Auslösung beseitigt wird.

Um die Spannungszunahme bei unterschiedlichen Abtastintervallen zu berechnen, müssen zunächst die Abtastpunkte entlang der ansteigenden Flanke durch lineare Regression angepasst werden, um eine Funktion zu erhalten. Anschließend kann durch Einsetzen verschiedener Zeitintervalle die Spannungszunahme ermittelt werden.

Die MATLAB-Code oben extrahiert die Spannungsdaten entlang der ansteigenden Flanke und führt eine lineare Regression dieser Datenpunkte durch, basierend auf dem aktuellen Modell mit einer Abtastzeit von 1 ms. Die Ausführung des obigen Programms ergibt ΔU = 0,065. Dies zeigt, dass das Spannungsinkrement bei einem Abtastzeitintervall von 1 ms kleiner als das Doppelte der Messunsicherheit ist, was bedeutet, dass das Risiko mehrfacher Auslösungen tatsächlich besteht. Daher sollte das Simulink-Abtastzeitintervall neu eingestellt werden. Um das Risiko vollständig zu eliminieren, sollte das Abtastzeitintervall auf 3 ms bzw. 0,003 s festgelegt werden.



  • Einfluss des Abtastzeitintervalls auf die BPM-Genauigkeit

Da das Modul zur Berechnung der Herzschlagintervalle vorzeitig oder verspätet ausgelöst wird, beträgt der maximale Fehler zwischen dem tatsächlich gemessenen und dem idealen Intervallzeitpunkt: Δ t = 2*3 = 6 ms.

Durch das Hinzufügen dieses Zeitfehlers zur Zeitdauer und das Einsetzen in die Herzfrequenzberechnungsformel kann festgestellt werden, dass die Herzfrequenz dadurch geringfügig schwankt. Da Herzschläge diskret und positive Ganzzahlen sind, muss das Berechnungsergebnis gerundet werden. Bei der Rundung wird in der Regel das mathematische Verfahren „kaufmännisch Runden“ angewendet. Durch den Zeitfehler kann jedoch beim Rundungsverfahren statt aufrunden abgerundet werden und umgekehrt. Daher führt der Spannungsabnahmefehler des Messsystems letztendlich zu einer Herzfrequenzmessunsicherheit von ± 1 BPM.

Herzfrequenzberechnungsformel:



  • Endmodell

Modelleinstellungen: Arduino Uno, Solver: Fixed-step, discrete, Abtastrate: 0,003 s

Das Modell zur Datenverarbeitung wurde gemäß Abb. 16 in Simulink aufgebaut.

       
Abb. 16: Simulink-Modell

Das endgültige Modell besteht aus drei Teilen: Das erste Modul dient zur Echtzeit-Herzfrequenzmessung, die zuvor ausführlich beschrieben wurde. Das zweite Modul steuert das Buzzer. Da in diesem Projekt ein passiver Buzzer verwendet wird, muss dieser mit einem PWM-Signal angesteuert werden. Daher wurde ein PWM-Modul hinzugefügt und ein Constant-Modul liefert ein 1-Signal (100 % Duty Cycle) an das PWM-Modul, um den Buzzer mit voller Leistung zu betreiben. Das PWM-Modul wird bei jedem Herzschlag ausgelöst, sodass der Buzzer bei jedem Herzschlag ertönt. Das dritte Modul ist zur Hilfsanzeige gedacht. Dieses Modul kann Dezimalzahlen in Binärzahlen umwandeln und über das Digitale Output-Modul ausgeben.

Da es in Simulink schwierig ist, das LCD 16x02 I2C zu konfigurieren, wird ein zweites Arduino UNO R3 verwendet, um das LCD anzusteuern. Dieses Anzeigemodul, bestehend aus dem zweiten Arduino UNO R3 und dem LCD 16x02 I2C, wird über die Arduino IDE konfiguriert. Das Anzeigemodul erhält die binären Herzfrequenzdaten vom ersten Arduino UNO R3 und wandelt diese wieder in Dezimalzahlen um, die auf dem LCD angezeigt werden.


  • Die Konfiguration für Darstellung - Modell mit Arduino IDE

Das folgende Fenster zeigt die Konfiguration des Anzeigemoduls in der Arduino IDE. Dieses Konfigurationsprogramm wurde von ChatGPT erstellt und vom Autor getestet und angepasst.

#include <Wire.h>

#define LCD_ADDR 0x27
#define LCD_CMD  0
#define LCD_DATA 1
#define LCD_BACKLIGHT 0x08  
#define LCD_NOBACKLIGHT 0x00 
#define En 0b00000100  
#define Rw 0b00000010  
#define Rs 0b00000001 


 int Alt_Wert;
 int Neu_Wert;

void lcd_init();
void lcd_send_byte(uint8_t, uint8_t);
void lcd_write_command(uint8_t);
void lcd_write_data(uint8_t);
void lcd_set_cursor(uint8_t, uint8_t);
void lcd_print(String);
int readBinaryValue();
int binaryToDecimal(int binary);

void setup() {
  Wire.begin();
  lcd_init();
  for (int pin = 6; pin <= 13; pin++) {
    pinMode(pin, INPUT);
  }
}

void loop() {
  int binaryValue = readBinaryValue();
  Neu_Wert  = binaryToDecimal(binaryValue);
  if (Alt_Wert != Neu_Wert){
  lcd_send_byte(0x01, LCD_CMD); 
  delay(5);
  }
  lcd_set_cursor(0, 0);
  lcd_print("BPM:  ");
  lcd_print(String(Neu_Wert));
  Alt_Wert = Neu_Wert;
}



int readBinaryValue() {
  int value = 0;
 for (int pin = 13; pin >= 6; pin--) { 
    value <<= 1;          
    value |= digitalRead(pin); 
  }
  return value;
}

int binaryToDecimal(int binary) {
  return binary; 
}

void lcd_init() {
  lcd_send_byte(0x33, LCD_CMD); 
  lcd_send_byte(0x32, LCD_CMD); 
  lcd_send_byte(0x28, LCD_CMD); 
  lcd_send_byte(0x0C, LCD_CMD); 
  lcd_send_byte(0x06, LCD_CMD); 
  lcd_send_byte(0x01, LCD_CMD); 
  delay(5);
}


void lcd_send_byte(uint8_t val, uint8_t mode) {
  uint8_t highnib = val & 0xf0;
  uint8_t lownib = (val << 4) & 0xf0;
  lcd_write_4_bits((highnib) | mode);
  lcd_write_4_bits((lownib) | mode);
}


void lcd_write_4_bits(uint8_t val) {
  Wire.beginTransmission(LCD_ADDR);
  Wire.write(val | LCD_BACKLIGHT);
  Wire.endTransmission();
  lcd_pulse_enable(val);
}


void lcd_pulse_enable(uint8_t val) {
  Wire.beginTransmission(LCD_ADDR);
  Wire.write(val | En | LCD_BACKLIGHT);
  Wire.endTransmission();
  delayMicroseconds(1);
  Wire.beginTransmission(LCD_ADDR);
  Wire.write((val & ~En) | LCD_BACKLIGHT);
  Wire.endTransmission();
  delayMicroseconds(50);
}


void lcd_write_command(uint8_t cmd) {
  lcd_send_byte(cmd, LCD_CMD);
}


void lcd_write_data(uint8_t data) {
  lcd_send_byte(data, LCD_DATA);
}


void lcd_set_cursor(uint8_t col, uint8_t row) {
  static uint8_t offsets[] = {0x00, 0x40, 0x14, 0x54};
  lcd_write_command(0x80 | (col + offsets[row]));
}


void lcd_print(String s) {
  for (int i = 0; i < s.length(); i++) {
    lcd_write_data(s[i]);
  }
}


Versuchsbeobachtung

Aus der Darstellung der rohren BPM-Änderungskurve kann man erkennen, dass die Herzfrequenz nicht konstant ist und starke Schwankungen aufweist. Diese Schwankungen sind jedoch nicht durch Messfehler verursacht. Tatsächlich wird die Herzfrequenz von verschiedenen Faktoren beeinflusst, darunter körperliche Aktivität, emotionaler Zustand, Atemmuster, Umweltveränderungen und physiologische Schwankungen im Körper, wie die Regulierung durch das autonome Nervensystem, was zu natürlichen Schwankungen in kurzer Zeit führt.[15]

Um eine repräsentativere Herzfrequenzanzeige zu erhalten, sollten die gemessenen Daten verarbeitet werden, indem mehrere aufeinanderfolgende Messungen durchgeführt und deren Mittelwert bestimmt wird, um zufällige Messfehler zu minimieren. Aus der Darstellung der rohren BPM-Änderungskurve kann man auch einige Extremwerte erkennen. Diese sind auf die Bewegung des Fingers während der Messung zurückzuführen, was zu Veränderungen im Kontakt zwischen dem Pulssensor und der Fingeroberfläche führt (siehe Abb. 18 für die anomale Veränderung der Herzschlagwellenform), was zu anomalen Lichtreflexionen und fehlerhaften Berechnungen der Herzschlagintervalle führt und schließlich zu Extremwerten.

Um diese beiden Probleme zu lösen, wird der rekursive Medianfilter verwendet, da der Medianfilter die zentrale Position einer Gruppe von Messdaten bewerten und die Auswirkungen von Extremwerten verhindern kann. Darüber hinaus ermöglicht der rekursive Medianfilter durch das gleitende Fenster, vergangene Daten zu speichern und sofort die neuesten Messdaten aufzunehmen und zu verarbeiten, was die Echtzeitmessung der Herzfrequenz in gewissem Maße gewährleistet.


       
Abb. 17: Darstellung der rohren BPM-Änderungskurver
        
Abb. 18: Darstellung der Herzschlagkurve

Auswertung

Das Herzfrequenzmesssystem kann zuverlässige Messungen durchführen. Benutzer können ihre Echtzeit-Herzfrequenz schnell über das LCD-Display abrufen und die Herzschlagfrequenz anhand des Buzzersounds abschätzen, um die Zuverlässigkeit der angezeigten Herzfrequenz zu bewerten.

Der Pulse Sensor gibt analoge Signale aus, hat jedoch keine spezifische Kennlinie zur Darstellung der Beziehung zwischen Spannung und Herzfrequenz. Daher müssen Benutzer einen eigenen Algorithmus zur Berechnung der Herzfrequenz entwickeln. Die Messgenauigkeit hängt vom Sensor, dem Algorithmus und der Abtastrate des Systems ab. Bei minimaler Fingerbewegung beträgt die Messunsicherheit des Systems ±1 BPM, wodurch die Messhypothese für das System unter den gegebenen Bedingungen gültig ist.

Zusammenfassung und Ausblick

Zusammenfassung

Beim Einsatz eines unbekannten Sensors und anderer Geräte ist das Lesen des Datenblatts sehr wichtig, da es Informationen über das Kommunikationsprotokoll, die Sensoreigenschaften und die Art der Ausgangsdaten liefert.

Das Auslesen der Daten aus dem Sensor ist der erste Schritt, aber die Datenverarbeitung ist entscheidend. Sensordaten enthalten oft Rauschen und Störungen, die durch Datenverarbeitung gefiltert werden können, um sinnvolle Messwerte zu extrahieren.

Die Bewertung der Messunsicherheit wird ebenfalls erläutert. Diese Daten helfen, die Genauigkeit der Messergebnisse zu beurteilen, die Vertrauenswürdigkeit der Messwerte zu klären und den Nutzern zu helfen, zuverlässigere Entscheidungen zu treffen.


Diskussion der Ergebnisse

Der Pulsesensor erfordert für präzise Herzfrequenzmessungen hohe Anforderungen. Ohne die Hilfe eines Filters führen kleinste Änderungen im Kontakt zwischen Sensor und Finger zu Messfehlern. Durch die Anwendung eines Medianfilters auf die Ausgabedaten können jedoch die negativen Auswirkungen dieser Kontaktänderungen verringert werden. Diese Filtermethode glättet die Daten, entfernt Ausreißer, die durch kurzfristige Kontaktveränderungen entstehen, und verbessert dadurch die Stabilität und Zuverlässigkeit der Herzfrequenzmessungen.


Ausblick

Aufgrund fehlender professioneller Ausrüstung während des Experiments wurde der Pulsesensor direkt auf den Finger geklebt, was eine unzuverlässige Fixierung darstellt. Zur Erhöhung der Messgenauigkeit sollte ein Gehäuse entworfen und produziert werden, das den Sensor fixiert und mit einem wiederverwendbaren Band am Finger befestigt wird. Zudem wurden die Geräte mittels Jumperkabel verbunden, was ebenfalls instabil ist und Rauschen verursachen kann. Um dies zu beheben, sollte eine PCB entwickelt werden, die den Mikrocontroller, Pulsesensor, Summer und das LCD integriert, um die Stabilität und Aussicht des Messsystems zu verbessern.


Selbstreflexion/Lessons learned

Durch den Kurs Angewandte Informatik habe ich die Bedeutung der Daten- und Signalverarbeitung erkannt. Darüber hinaus vereinfacht die Rapid Control Prototyping-Methode, basierend auf dem "Simulink Support Package for Arduino Hardware", die Komplexität der Entwicklung. Sie hilft Entwicklern, den Entwicklungszyklus zu verkürzen und ermöglicht es, Algorithmen schnell auf Hardware zu testen und zu validieren.

Ergebnisvideo

Dieses Video handelt von der Messung der Herzfrequenz. Die Echtzeit-Herzfrequenz kann nicht nur auf einem LCD angezeigt, sondern auch im Simulink-Fenster gelesen werden. Außerdem kann man das Piepen des Buzzers hören.

Ergebnisvideo über Herzfrequenzmessung

Lernzielkrontrolle

Beantworten Sie in Ihrem Artikel die Lernzielkontrollfragen.

Literatur

[1]Amazon:Arduino UNO SMD REV3. URL: https://www.amazon.de/A000073-ARDUINO-UNO-SMD-Edition/dp/B007R9TUJE, 16. Juli 2024
[2] Arduino® uno r3: A000066-datasheet. URL: https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf, 17. Juli 2024
[3] Atmel® : ATmega328P. URL:https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf, 17. Juli 2024
[4] Openbci online Store : PULSE SENSOR. URL: https://shop.openbci.com/products/pulse-sensor, 17. Juli 2024
[5] Pulsesensor : Open Hardware. URL: https://pulsesensor.com/pages/open-hardware, 17. Juli 2024
[6] Sunsky: Arduino IIC/12C+1602. URL: https://www.sunsky-online.com/zh_CN/p/DIY4006/New-IIC-I2C-with-1602-LCD-Display-Screen-Board-Module-for-Arduino.htm, 17. Juli 2024
[7] Hitachi : HD44780U. URL: https://www.sparkfun.com/datasheets/LCD/HD44780.pdf, 17. Juli 2024
[8] Texas Instruments : PCF8574. URL: https://www.ti.com/lit/ds/symlink/pcf8574.pdf, 17. Juli 2024
[9] Smartkits: Buzzer Ativo 5V 12mm. URL: https://www.smartkits.com.br/buzzer-ativo-5v, 17. Juli 2024
[10] Positiverecords: MathWorks MATLAB for Mac R2023b. URL: https://positiverecords.ru/pages/photoshop/3d_811.html, 17. Juli 2024
[11] Digikey: Pulse Sensor Datasheet by Adafruit Industries LLC . URL: https://www.digikey.pl/htmldatasheets/production/3024658/0/0/1/pulse-sensor-datasheet.html, 17. Juli 2024
[12] Avagotech: Miniature Surface-Mount Ambient Light Photo Sensor. URL: https://www.mouser.com/datasheet/2/678/av02-1169en-1828127.pdf, 17. Juli 2024
[13] Aicdata: Pulse Sensor Getting Started Guide . URL: https://www.allicdata.com/pdf/sen-11574-datasheet/2718390.html, 18. Juli 2024
[14] Teachmephysiology: Pressures Within the Heart. URL: https://teachmephysiology.com/cardiovascular-system/cardiac-cycle-2/cardiac-cycle/, 18. Juli 2024

[15] L ivestrong: What Causes a Fluctuating Heart Rate. URL: https://www.livestrong.com/article/350761-fluctuating-heart-rate/, 18. Juli 2024

Zitieren Sie nach DIN ISO 690:2013-10.

Anhang

  • Datenblätter
  • Simulink-Modell

Datei:Pulsesensor SE50.zip


  • Originaldateien (PAP, Schaltplan,... )



→ zurück zum Hauptartikel: BSE Angewandte Informatik SoSe24 | Hausarbeit SoSe24