Kontaktloses Thermometer: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(486 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Kategorie:ArduMower]]
[[Kategorie:Projekte]]  
[[Datei:Fahrzeugmodell_kinematisch_Skizze_3Rad.JPG|rechts|mini|400px|Skizze eines 3-rädrigen Fahrzeugs mit Geschwindigkeiten, Ortsvektoren und Koordinatensystemen zur Herleitung des kinematischen Fahrzeugmodells. ]]
[[Kategorie:ProjekteET MTR BSE WS2020]]
'''Autor:''' [[Benutzer:Mirekgoebel|Prof. Dr. Mirek Göbel]]  
'''Autoren:''' [[Benutzer:Alexander_Gossen|Alexander Gossen]], [[Benutzer: Markus_Esjutin|Markus Esjutin]]<br/>
'''Betreuer:''' [[Benutzer:Ulrich Schneider|Prof. Schneider]] <br/>


→ zurück zur Übersicht: [[:Kategorie:ProjekteET_MTR_BSE_WS2020|WS 20/21: Angewandte Elektrotechnik (BSE)]]
[[Datei: Kontaktloses_Thermometer_Hauptbild.png|500px|thumb|right|Absatz|Kontaktloses Thermometer]]


== Einleitung ==
== Einleitung ==
Dieser Artikel beschreibt den Aufbau eines Simulationsmodells für ein dreirädriges Fahrzeug, um dieses für die Entwicklung von Steuerungs- und Regelungsalgorithmen zum autonomen Fahren zu verwenden. Damit stellt es die Basis dar, um ohne Hardware die Algorithmen in einer closed-loop-Simulationsumgebung entwickeln und vor allem testen zu können. Der Anstoß zur Entwicklung dieses Modell lieferte das Projekt "ArduMower", in dem der Kollege Prof. Schneider und der Autor dieses Artikels mit Studierenden gemeinsam einen autonomen Rasenmäher entwickeln, siehe [[Projekt_ArduMower]].
Im Rahmen des Teilmoduls Angewandte Elektrotechnik im Masterstudiengang Business and Systems Engineering ist es im Wintersemester 20/21 vorgesehen, dass sich die Studierenden mit einem Microcontroller-Projekt auseinandersetzen, indem das theoretische Wissen aus den folgenden Themengebieten angewendet wird:


Das systematische Vorgehen bei der Entwicklung des Modells orientiert sich am V-Prozessmodell.
*Schaltungstechnik
*Elektrotechnik
*Mess- und Regelungstechnik
 
Die Studierenden sind aufgefordert ein angemessenes Projekthema mit einem Funduino Uno R3 zu recherchieren und auszuwählen. Hierbei besitzen die Studierenden bezüglich des Lösungskonzepts jegliche Freiheiten und sind nicht eingeschränkt.
 
Ausschlaggebend für das Projektthema "Kontaktloses Thermometer" war der ausgebrochene Virus Sars-CoV-2 oder besser bekannt als der Coronavirus. Durch die hohen Infektionszahlen seit Anfang des Jahres 2020 sind viele medizinische Hilfsmittel wie z.B. Fieberthermometer schnell ausverkauft oder werden zu überhöhten Preisen angeboten. Zudem bietet ein kontaktloses Thermometer in vielen Bereichen der Temperaturmessung eine große Hilfe. Deshalb wird dieses Projekt als Motivation gesehen, sein eigenes kontaktloses Thermometer zu entwickeln und anderen die Möglichkeit zu bieten dies nachzubauen.
 
== Projektsteckbrief==
Im Rahmen der Projektvorgehensweise wird die Funtkion des kontaklosen Thermometers anhand eines kurzen Steckbriefs erläutert. Die kontaktlose Temperaturmessung wird durch einen Infrarotsensor ermöglicht. Dieser agiert zusammen mit dem Ultraschallsensor und zwei LED's für eine korrekte Messung. Der Ultraschallsensor prüft, ob die angegebene Entfernung stimmt und zeigt dies anhand zwei verschiedenfarbiger LED's an. Liegt die Entfernung bei 2-5cm, leuchtet die LED grün. Ist die Entferung zu weit, leuchtet sie rot. Bei Betätigung eines Taster muss ein Signal ertönen und ein Temperaturwert festgehalten werden. Der aufgenommene Temperaturwert muss auf einem Display auslesbar sein. Bei erneuter Betätigung des Tasters, soll das Thermometer in die Ausgangsstellung gebracht und für eine neue Messung bereitgestellt werden.


== Anforderungen an das Projekt==
== Anforderungen an das Projekt==
Die nachfolgende Liste beschreibt die Anforderungen an das Projekt "Kontaktloses Thermometer", die erfüllt werden müssen.
# Die Temparatur muss in Grad Celsius angezeigt werden und einen Bereich von -40 C° bis 125 C° abdecken.
# Das Thermometer muss im Entfernungsbereich von zwei bis fünf Zentimeter bei einer Auflösung von 0,1 C° messen können.
# Eine grüne LED muss leuchten, sobald sich das Thermometer im Entfernungsbereich befindet. Ansonsten leuchtet sie rot.
# Bei Betätigung des Tasters muss die aufgenommene Temperatur festgehalten werden, solange sie sich im Entfernungsbereich befindet.
# Die Messergebnisse müssen visuell per Display und akustisch durch einen Signalton kenntlich gemacht werden.
# Die Ergebnisse müssen auslesbar sein bis der Taster wieder gedrückt wird.
# Die Stromversorgung soll alternativ über eine Batterie laufen.
# Die Temparaturmessung muss in Echtzeit erfolgen.
# Das Thermometer soll handlich und transportabel sein.


== Funktionaler Systementwurf / Technischer Systementwurf ==
== Funktionaler Systementwurf / Technischer Systementwurf ==
Bei der Größe des zu erstellenden Modells werden die Schritte Funktionaler Systementwurf / Technischer Systementwurf des V-Modells zusammen gelegt und bereits Schnittstellen zwischen den einzelnen Blöcken definiert.


Das Fahrzeugmodell wird unterteilt in
===Funktionale Systemstruktur===
* ein Block "Gieren und Geschwindigkeit in Achsmitte", in dem die Position und Geschwindikeit der Punkte M und D in Fahrzeugkoordinaten K bestimmt werden.
Das Thermometer misst die Temperatur eines Objektes mithilfe eines Infrarotsensors. Aufgrund von Herstellerangaben (Zuverlässigkeitsbereich der Messungen) wurde der Messbereich des Sensors auf 2 cm - 5 cm festgelegt. Dies bedeutet, das in diesem Distanzbereich korrekte Messungen durchgeführt werden können. Sobald der entsprechende Messbereich erreicht ist, wird dies anhand von LED's signalisiert. Ein Display gibt den entsprechenden Text aus. Eine Messung wird durch die Betätigung eines Tasters durchgeführt. Die Stromversorgung und Mobilität des Thermometers ist über eine Batterie gewährleistet.
* und zwei Blöcke "Transformation und Integration Punkt M/D", in denen Position und Geschwindikeit der Punkte M und D in Inertialkoordinaten I bestimmt werden.
[[Datei: Funktionaler_Systementwurf_AE.png|800px|thumb|links|Abbildung 1: Funktionale Systemstruktur des kontaktlosen Thermometers]]
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
 
===Technischer Systementwurf===
Im Folgendem werden die Schaltpläne und die technischen Zeichnungen des Projekts dargestellt. Der elektrische Schaltplan aus der Abbildung 2 wurde mit der Software Multisim von National Instruments erstellt. Die Verschaltung hingegen mit dem Breadboard in Abbildung 3 wurde mittels Fritzing dargestellt. Die technischen Zeichnungen konnten durch die Software Solid Works bereitgestellt werden.
====Schaltbilder====
[[Datei: SP-Multisim.png|555px|thumb|links|Abbildung 2: Schaltplan des kontaktlosen Thermometers]]
[[Datei: Fritzing_Schaltplan.png|525px|thumb|rechts|Abbildung 3: Fritzing-Schaltplan des kontaktlosen Thermometers]]
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
[[Datei: Schaltpläne.zip|450px|thumb|links]]<br/>
 
====CAD-Zeichnungen====
 
[[Datei: Hauptteil_und_Deckel.png|530px|thumb|links|Abbildung 4: Abmessungen Hauptteil und Deckel]]
[[Datei: Sensorhalter_und_Bildschirmhalter.png|545px|thumb|rechts|Abbildung 5: Abmessungen Sensor- und Bildschirmhalterungen]]
[[Datei: Griff_und_Deckel.png|530px|thumb|links|Abbildung 6: Abmessungen Griff und Deckel]]
[[Datei: Kontakloses_Thermometer.png|540px|thumb|rechts|Abbildung 7: Zusammenbau-Zeichnung]]
<br/> <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>


[[Datei:Fahrzeugmodell_kinematisch_3Rad_FunktionalerSystementwurf.JPG|rechts|mini|800px|Funktionaler Systementwurf für die Modellierung eines 3-rädrigen Fahrzeugs mit Geschwindigkeiten, Ortsvektoren und Koordinatensystemen.]]
[[Datei: Hauptteil und Deckel.pdf|450px|thumb|links]]<br/>
[[Datei: Sensorhalter und Bildschirmhalter.pdf|450px|thumb|links]]<br/>
[[Datei: Griff und Deckel.pdf|450px|thumb|links]]<br/>
[[Datei: Kontakloses Thermometer.pdf|450px|thumb|links]]


== Komponentenspezifikation ==
== Komponentenspezifikation ==
Das Modell wird insgesamt als Komponente aufgefasst, d. h. die einzelnen Blöcke aus dem Systementwurf werden als Bestandteil der Komponente "Fahrzeugmodell" definiert. An dieser Stelle wäre es selbstverständlich möglich, die Komponente weiter aufzuteilen (damit würde die Komponente in Teilsystem umbenannt) und auch beim Testen diese einzelnen Komponenten dann zu berücksichtigen.
Die Komponenten für die Umsetzung des Projekts sind in der unten stehenden Tabelle aufgelistet und bezüglich der Funktionen spezifiziert. Zudem liefert die Tabelle einen Überblick über die Kosten, um einen möglichen Nachbau zu erleichtern. Die meisten Komponenten wurden beim Anbieter funduino.de bestellt. Teile, wie der Infrarotsensor, OLED-Display und Anschlussleitungen wurden auf Amazon eingekauft. In der Tabelle sind die genauen Adressen verlinkt.


Die Spezifikation besteht aus den theoretischen Grundlagen zur Beschreibung von der ebenen Fahrzeugbewegung.
{|class="wikitable center"
|+ id="Ü-id"| Verwendete Komponenten
|-
! Bauteil || Funktion || Preis € (inkl. Mehrwertsteuer) || Hyperlink
|-
| Arduino Uno R3 (alternativ Nano) || Mikrocontroller zur Ansteuerung der Schaltkreise || 13,90 || [https://www.funduinoshop.com/epages/78096195.sf/de_DE/?ObjectPath=/Shops/78096195/Products/A-2-2/ Arduino Uno R3]
|-
| MLX90614/5 Contactless Temperature Sensor || Infrarot-Temperaturmessung || 11,99 || [https://www.amazon.de/Vaorwne-Mlx90614Esf-Ber%C3%BChrungsloses-Temperatur-Mlx90614/dp/B08CDTGVM8/ref=asc_df_B08CDTGVM8/?tag=googshopde-21&linkCode=df0&hvadid=473975668716&hvpos=&hvnetw=g&hvrand=7564606233969028316&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9044294&hvtargid=pla-1045326774200&psc=1&th=1&psc=1/ MLX90614]
|-
| Ultrasonic Sensor HC-SR04  || Abstandsmessung zur Einhaltung des Messbereichs || 2,40 || [https://www.funduinoshop.com/epages/78096195.sf/de_DE/?ObjectID=50294801/ Ultraschallsensor]
|-
| Experimentelles Breadboard || Verbindung aller Schaltkreise || 0,47 || [https://www.reichelt.de/ch/de/experimentier-steckboard-170-kontakte-transparent-breadboard1-170-p282595.html?search=experimentier&&r=1/ Breadboard]
|-
| Jumper Wires || Verbindung aller Schaltkreise || 7,29 || [https://www.amazon.de/gp/product/B07D7XMGP7/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1/ Jumper Wires]
|-
| OLED-Display (128x64) || Anzeigebildschirm || 5,79 || [https://www.amazon.de/gp/product/B01L9GC470/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1/ OLED-Display]
|-
| Taster || Betätigung zur Aufnahme einer Temperaturmessung || 0,29 || [https://www.funduinoshop.com/epages/78096195.sf/de_DE/?ObjectPath=/Shops/78096195/Products/KT-1/ Taster]
|-
| LED (2x) || Indikator für Mindestabstand (rot) und Maximalabstand (grün) || 4,40 || [https://www.funduinoshop.com/epages/78096195.sf/de_DE/?ObjectPath=/Shops/78096195/Products/A-1-2/ LED]
|-
| Filament (3D-Druck) || Herstellung eines Gehäuses für das Thermometer || 24,99 || [https://www.amazon.de/gp/product/B06XY6B6XC/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1/ 3D-Druck Filament]
|-
| Lötkolben || Herstellung einer festen Verbindung zwischen den Wires || 18,22 || [https://www.reichelt.de/loetstation-regelbar-50-w-vel-vtss5-p289558.html?&nbc=1/ Lötkolben]
|-
| Löt-Zinn || Verbindungsmaterial || 6,43 || [https://www.reichelt.de/loetzinn-mit-kupferanteil-1-0-mm-100-g-rnd-560-00169-p226633.html?&nbc=1/ Löt-Zinn]
|}
<br />


=== Ansatz ===
== Umsetzung (HW/SW) ==
Bei der Bestimmung der Geschwindigkeit in M wird mit dem Satz "räumliche Bewegung" die bekannte Geschwindigkeit in R, der Relativdrehvektor der Koordinatensysteme K gegenüber I sowie der Ortsvektor zwischen R und M verwendet (siehe <ref> M. Göbel: Formelsammlung Mehrkörpersysteme und Robotik, HSHL, Version 29.06.2017</ref>):
In diesem Kapitel wird die Umsetzung des Thermoters anhand der verwendeten Hard- und Software-Tools verdeutlicht. Für die Programmierung des Mikrocontrollers wurde die Arduino IDE verwendet. Die CAD-Konstruktionen und Zeichnungen wurden mit Solidworks erstellt. Das Gehäuse des Thermometers wurde mit einem Creality Ender 3 Pro mit rotem 1.75 mm Filament 3D-gedruckt. Die Verbindungen der Widerstände zwischen den LED's und dem Taster wurden mit Lötzinn und einem Lötkolben hergestellt. Alle anderen Verbindungen sind über das Breadboard erfolgt.<br/>  


<math>\vec{v}_M = \vec{v}_R + ^{IK} \vec{\omega} \times \vec{r}_{RM}</math>
Im Folgendem ist ein Auschnitt aus dem Code des Thermometers zu sehen. Der vollständige Code steht unter dem Ausschnitt zum Download zur Verfügung.<br/>


Im körperfesten Koordinatensystem K beschrieben folgt eine Beschreibung, in der jeder Term selbst 3 Komponenten (x, y, z) enthält und mit denen jetzt im jeweiligen Koordinatensystem gerechnet werden kann (das ging bei der vektoriellen Schreibweise oben noch nicht!).
<div style="width:1120px; height:400px; overflow:auto; border: 2px solid #088">


<math>_K \underline{v}_M = _K \underline{v}_R + ^{IK} _K \underline{\omega} \times _K \underline{r}_{RM}</math>
void setup() {<br/>
 
Wire.begin();                                //Initialisierung der I2C-Kommunikation<br/>
Serial.begin(9600);                          //Initialisierung der seriellen Kommunikation <br/>                   
mlx.begin();                                  //Initialisierung der Kommunikation mit dem Infrarotsensor<br/>
oled.begin(&Adafruit128x64, I2C_ADDRESS);    //Initialisierung der seriellen Kommunikation<br/>
pinMode(LED_GRUEN, OUTPUT);                  //Input/Output-Konfiguration<br/>
pinMode(LED_ROT, OUTPUT);                    //Input/Output-Konfiguration<br/>
pinMode(SPEAKER, OUTPUT);                    //Input/Output-Konfiguration<br/>
pinMode(TRIG, OUTPUT);                        //Input/Output-Konfiguration<br/>
pinMode(ECHO, INPUT);                        //Input/Output-Konfiguration<br/>
pinMode(TASTER, INPUT_PULLUP);                //Internen Pull-Up-Widerstand aktivieren<br/>


}<br/>


=== x-y-z-Komponenten einsetzen und Geschwindigkeit in M bestimmen ===
void loop() {<br/>
Mit den eingetragenen Komponenten sieht die Gleichung wie folgt aus:
 
oled.setFont(ZevvPeep8x16);                  //Konfiguration der Schriftart des OLED-Displays<br/>


<math>_K \underline{v}_M =
digitalWrite(TRIG, LOW);                      //Triggerpin wird auf 0 V gesetzt (Ultraschallsensor)<br/>
\begin{bmatrix}
delay(5);                                    //Verzögerung 0,005 Sekunden<br/>
v_{Rx}\\
digitalWrite(TRIG, HIGH);                    //Triggerpin wird auf 5 V gesetzt (Ultraschallsensor)<br/>
0\\
delay(10);                                    //Verzögerung 0,010 Sekunden<br/>
0
digitalWrite(TRIG, LOW);                      //Triggerpin wird auf 0 V gesetzt (Ultraschallsensor)<br/>
\end{bmatrix} +
dauer = pulseIn(ECHO, HIGH);                  //Berechnet die Dauer bis das Echo ein High-Signal erhält (Ultraschalsensor)<br/>
\begin{bmatrix}
entfernung = (dauer/2) / 29.1;                //Berechnung der Entfernung<br/>
0\\
   
0\\
Serial.print("Entfernung: ");<br/>
\dot{\psi}
Serial.print(entfernung);<br/>
\end{bmatrix} \times
Serial.print(" cm\n\n");<br/>
\begin{bmatrix}
-l/2\\
b/2\\
0
\end{bmatrix} =
\begin{bmatrix}
v_R - b/2 \cdot \dot{\psi}\\
-l/2 \cdot \dot{\psi}\\
0
\end{bmatrix}
</math>


=== Bestimmung der Gierrate===
if ((entfernung >= 2) && (entfernung <= 5)) {         //if-Bedingung: Wenn die gemessene Entfernung größer als 2 cm und kleiner als 5 cm ist
Zur Bestimmung der Gierrate wird obiger Ansatz erneut verwendet, um von der bekannten Geschwindigkeit in R auf die ebenfalls bekannte Geschwindikeit in L "zu schließen", sodass der Relativdrehvektor der Koordinatensysteme K gegenüber I in K-Koordinaten bestimmt werden kann (jetzt mit Komponenten besser Spaltenmatrix genannt: <math>^{IK} _K \underline{\omega}</math>). Es folgt:


<math>_K \underline{v}_L = _K \underline{v}_R + ^{IK} _K \underline{\omega} \times _K \underline{r}_{RL}</math>.
    digitalWrite(LED_ROT, LOW);                      //Rote LED wird auf 0 V gesetzt
    digitalWrite(LED_GRUEN, HIGH);                    //Grüne LED wird auf 0 V gesetzt
 
    //oled.clear();
    oled.setCursor(24, 0);                                              //OLED-Display Textstartposition auf Spalte 24 und Zeile 0 gesetzt
    oled.print("Bitte Taster                                ");        //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
    oled.setCursor(24, 2);                                              //OLED-Display Textstartposition auf Spalte 24 und Zeile 2 gesetzt
    oled.print("betaetigen...                                ");        //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
    oled.setCursor(23, 4);                                              //OLED-Display Textstartposition auf Spalte 24 und Zeile 4 gesetzt
    oled.print("Entfernung                                  ");        //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
    oled.setCursor(23, 6);                                              //OLED-Display Textstartposition auf Spalte 24 und Zeile 6 gesetzt
    oled.print(entfernung);                                            //Textausgabe berechnete Entfernung
    oled.print(" cm");                                                  //Textausgabe
   
    delay(500);                                                        //Verzögerung 0,5 Sekunden


Mit eingesetzten Komponenten ergibt sich im körperfesten System K:
    Serial.print("Bitte Taster betaetigen...");                        //Serielle Textausgabe


<math>
    if (digitalRead(TASTER) == HIGH) {                                  //if-Bedingung: Wenn der Zustand des Taster auf 5 V gesetzt wurde
\begin{bmatrix}
     
v_{Lx}\\
        digitalWrite(SPEAKER, HIGH);                                    //Buzzer wird auf 5 V gesetzt
0\\
        delay(50);                                                      //Verzögerung 0,05 Sekunden
0
        digitalWrite(SPEAKER, LOW);                                    //Buzzer wird auf 0 V gesetzt
\end{bmatrix}
       
=  
        i = true;                                                      //Buzzer Hilfsvariable wird auf true gesetzt
\begin{bmatrix}
       
v_{Rx}\\
    }  
0\\
   
0
    t:                                                                  //Ankerpunkt für goto-Befehl
\end{bmatrix}
                     
+
    while (digitalRead(TASTER) == HIGH) {                               //while-Schleife: Solange der Zustand des Taster 5 V beträgt
\begin{bmatrix}
           
0\\
        if (i == true) {                                               //if-Bedingung: Wenn der Wert der Buzzer Hilfsvariable auf true gesetzt wurde                                       
0\\
         
\dot{\psi}
            digitalWrite(SPEAKER, HIGH);                                //Buzzer wird auf 5 V gesetzt
\end{bmatrix}
            delay(50);                                                  //Verzögerung 0,05 Sekunden
\times
            digitalWrite(SPEAKER, LOW);                                //Buzzer wird auf 0 V gesetzt
\begin{bmatrix}
0\\
-l\\
0
\end{bmatrix}
=
\begin{bmatrix}
v_{Rx} + b \cdot \dot{\psi}\\
0\\
0
\end{bmatrix}
</math>.


Aus Zeile 1 der obigen Gleichung kann die Gierrate (selbstverständlich im körperfesten System K) mit nachstehendem Zusammenhang ermittelt werden.
            i = false;                                                  //Buzzer Hilfsvariable wird auf false gesetzt
           
        }   
                           
        Temperatur = mlx.readObjectTempC();                            //Gemessene Infrarotsensor-temperatur wird in Variable Temperatur gespeichert
        //oled.clear();
        oled.setCursor(23, 0);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 0 gesetzt
        oled.print("Temperatur                                ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
        oled.setCursor(23, 2);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 2 gesetzt
        oled.print(Temperatur);                                        //Textausgabe gemessene Temperatur
        oled.print(" C                                        ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
        oled.setCursor(23, 4);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 4 gesetzt
        oled.print("Entfernung                                ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
        oled.setCursor(23, 6);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 6 gesetzt
        oled.print(entfernung);                                        //Textausgabe berechnete Entfernung
        oled.print(" cm                                      ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)


<math>v_{Lx} = v_{Rx} + b \cdot \dot{\psi}</math>
        Serial.print("Temperatur ");                                    //Serielle Textausgabe
        Serial.print(Temperatur);                                      //Serielle Textausgabe gemessene Temperatur
        Serial.print(" C");                                            //Serielle Textausgabe
           
        tasterZeit = millis();                                          //Zeitmessung solange der Taster auf 5 v gesetzt wurde und Speicherung des Wertes in der variable tasterZeit
   
           
            if (tasterGedrueckt == true) {                             //if-Bedingung: Wenn der Wert der variable Hilfsvariable tasterGedrueckt auf true gesetzt wurde
   
                tasterGedrueckt = false;                                //Taster-Entprell Hilfsvariable wird auf false gesetzt
             
            }
   
            else {                                                      //else: wenn if-Bedingung nicht zutrifft
   
                tasterGedrueckt = true;                                //Taster-Entprell Hilfsvariable wird auf true gesetzt
                       
            }
                                                                 
        }
       
        if ((digitalRead(TASTER) == LOW) && (tasterZeit >= 1000)) {   //if-Bedingung: Wenn der Zustand des Taster 0 V beträgt und die Wert in der Variable tasterZeit größer-gleich 1000 beträgt
         
          goto g;                                                      //Springe zu Ankerpunkt g
         
        }


Umgestellt folgt daraus:


<math>\dot{\psi} = \frac{v_{Rx} - v_{Lx}}{b}</math>
    while ((tasterGedrueckt == true) && (millis() - tasterZeit > entprellZeitTaster)) {   //while-Schleife: Solange tasterGedrueckt = true ist und die gemessene Tasterzeit kleiner der vorgegeben entprellzeit ist
       
        g:                                                              //Ankerpunkt für goto-Befehl


=== Position der Punkte M und D in Inertialkoordinaten ===
        //oled.clear();
Um die Position des Punktes M in Inertialkoordinaten zu berechnen, wird seine Geschwindigkeit in Intertialkoordinaten I benötigt, da diese dann durch eine einfache Integration in die Position überführt werden kann. Im körperfesten System ist dies nicht erlaubt bzw. möglich, da dieses sich dreht! Mit Hilfe einer Transformationsmatrix kann diese Umrechnung in einem Schritt erfolgen.
        oled.setCursor(23, 0);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 0 gesetzt
        oled.print("Temperatur                                ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
        oled.setCursor(23, 2);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 2 gesetzt
        oled.print(Temperatur);                                        //Textausgabe gemessene Temperatur (Zuletzt angezeigter Wert wird festgehalten)
        oled.print(" C                                        ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
        oled.setCursor(23, 4);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 4 gesetzt
        oled.print("Entfernung                                ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
        oled.setCursor(23, 6);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 6 gesetzt
        oled.print(entfernung);                                        //Textausgabe gemessene Entfernung
        oled.print(" cm                                      ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)


<math>_I \underline{v}_M = ^{IK}\textbf{A} \cdot _K \underline{v}_M =
        Serial.print("Temperatur ");                                    //Serielle Textausgabe
\begin{bmatrix}
        Serial.print(Temperatur);                                      //Serielle Textausgabe gemessene Temperatur
\cos{\psi} & -\sin{\psi} & 0\\
        Serial.print(" C");                                            //Serielle Textausgabe
\sin{\psi} & \cos{\psi} & 0\\
         
0 & 0 & 1
        delay(500);                                                    //Verzögerung 0,5 Sekunden
\end{bmatrix}
       
\cdot _K \underline{v}_M
        if (digitalRead(TASTER) == HIGH) {                             //if-Bedingung: Wenn der Zustand des Taster auf 5 V gesetzt ist
</math>
         
            digitalWrite(SPEAKER, HIGH);                                //Buzzer wird auf 5 V gesetzt
            delay(50);                                                  //Verögerung 0,05 Sekunden
            digitalWrite(SPEAKER, LOW);                                //Buzzer wird auf 0 V gesetzt
           
            goto t;                                                    //Springe zu Ankerpunkt t
               
        }
       
    }


}


Der über den Ortsvektor <math>\vec{r}_{RD}</math> von R nach D beliebig wählbare Punkt D kann genauso wie oben der Mittelpunkt M behandelt werden. Die Gleichungen in Kurzform dazu sind wie folgt.
else {                                                                   //else: Wenn die if-Bedingung nicht zutrifft


<math>\vec{v}_D = \vec{v}_R + ^{IK} \vec{\omega} \times \vec{r}_{RD}</math>
    tasterZeit = 0;                                                      //Variable tasterZeit wird auf 0 gesetzt
   
    digitalWrite(LED_GRUEN, LOW);                                        //Grüne LED wird auf 0 V gesetzt                                                                     
    digitalWrite(LED_ROT, HIGH);                                          //Rote LED wird auf 5 V gesetzt
   
    //oled.clear();
    oled.setCursor(24, 0);                                                //OLED-Display Textstartposition auf Spalte 24 und Zeile 0 gesetzt
    oled.print("Nicht in                                        ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
    oled.setCursor(24,2);                                                //OLED-Display Textstartposition auf Spalte 24 und Zeile 2 gesetzt
    oled.print("Reichweite!                                      ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
    oled.setCursor(23, 4);                                                //OLED-Display Textstartposition auf Spalte 23 und Zeile 4 gesetzt
    oled.print("Entfernung                                      ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
    oled.setCursor(23, 6);                                                //OLED-Display Textstartposition auf Spalte 23 und Zeile 6 gesetzt
    oled.print(entfernung);                                              //Textausgabe gemessene Entfernung
    oled.print(" cm                                              ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)


Im körperfesten Koordinatensystem K beschrieben folgt eine Beschreibung, in der jeder Term selbst 3 Komponenten (x, y, z) enthält und mit denen jetzt im jeweiligen Koordinatensystem gerechnet werden kann (das ging bei der vektoriellen Schreibweise oben noch nicht!).
    Serial.print("Nicht in Reichweite!");                                //Serielle Textausgabe


<math>_K \underline{v}_D = _K \underline{v}_R + ^{IK} _K \underline{\omega} \times _K \underline{r}_{RD}</math>
    delay(500);                                                          //Verzögerung 0,5 Sekunden


Das Ergebnis für D lautet:
}


<math>_K \underline{v}_D =
}  
\begin{bmatrix}
v_{Rx} - r_{RDy} \cdot \dot{\psi}\\
r_{RDx} \cdot \dot{\psi}\\
0
\end{bmatrix}
\quad
</math>
mit dieser zuvor ausgemessenen Spaltenmatrix
<math>
\quad
_K \underline{r}_{RD} =
\begin{bmatrix}
r_{RDx}\\
r_{RDy}\\
0
\end{bmatrix}
</math>.


</div>


== Programmierung ==
Die Programmierung ist nun auf Basis der oben ermittelten Gleichungen möglich und erfolgt in Matlab/Simulink.


[[Datei: Kontaktloses_Thermometer_Final.ino]]


=== Matlab ===
== Komponententest ==
Über ein Start-Skript werden alle relevanten Parameter gesetzt und das Modell geöffnet.
Zuerst wurden alle benötigten Komponenten am großen Breadboard mit dem Arduino verbunden. Die Verschaltung aus der Abbildung 8 wurde so übersichtlich wie möglich aufgebaut, um  möglichst schnell fehlerhafte Verbindungen zu korrigieren und Verbesserungen aufzunehmen. Die Verbesserungen wurden dann bei der Verkabelung und den Aufbau des Endprodukts umgesetzt.
<source line lang="matlab" style="font-size:tiny">
Wie aus den Abbildungen 9 und 10 zu entnehmen wurde der Ultraschallsensor zusammen mit den LEDs programmiert und auf korrekter Funktion mittels Geodreieck überprüft. Es wurde darauf geachtet, dass die LED's und der Ultraschallsensor fehlerfrei zum richtigen Abstand reagieren, da diese die Bedingungen im Programmcode vorgeben und somit das Grundgerüst bilden. Im Anschluss wurde der Infrarotsensor in den Programmcode implementiert. Er wurde für den Anfang mit den Ultraschallsensor so programmiert, dass er nur bei einem Abstand von zwei bis fünf Zentimetern arbeitet und Temperaturen aufzeichnet. Als Beispiel dient die Abbildung 11 mit den Temperaturaufzeichnungen. Dort hat sich eine Hand dem Ultraschallsensor genähert und erst bei dem vorgegebenen Abstand die Temperatur der Hand aufgezeichnet. Die anderen Komponenten wie Schater, Piezo Speaker und OLED wurden nach und nach in den Code implementiert.  
%%%
[[Datei: Komponenten_Breadboard.png|400px|thumb|links|Abbildung 8: Komponententest auf dem großen Breadboard]]
%%% Simulation des Ardumower-Fahrzeugs
[[Datei: Komponententest_LED_Abstand_i.o.png|400px|thumb|zentriert|Abbildung 9: Test des Ultraschallsensors & der LED's (i.O.)]]
%%%
<br/>
%%% Prof. Mirek Göbel, 08.06.2017
[[Datei: Komponententest_LED_Abstand_n.i.o.png|400px|thumb|links|Abbildung 10: Test des Ultraschallsensors & der LED's (n.i.O)]]
[[Datei: Temperaturtest.png|500px|thumb|zentriert|Abbildung 11: Temperaturaufzeichnung der Hand]]
<br/><br/>


%% Initialisierung
== CAD-Entwurf ==
clc; clear; close all;
In diesem Kapitel wird der Entwurf des Thermometergehäuses mithilfe der CAD-Software Solidworks veranschaulicht und die Dateien zum Download zur Verfügung gestellt. Die finale Konstruktion des Gehäuses ist mit allen seinen Bauteilen zusammengefügt in den Abbildung 12 zu sehen.


[[Datei: Kontaktloses_Thermometer_CAD_Entwurf.PNG|500px|thumb|links|Abbildung 12: CAD-Entwurf des kontaklosen Thermometers]] <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>


%% Einstellungen
Die CAD-Daten dieses Projekts finden sich in den unten stehenden Links.
PAR_Darstellung_Schalter_EIN_bit = 1;
Simulinkmodus = 1;
addpath ../Hauptprogramm/funktionen/;
addpath ../Hauptprogramm/libraries/;
addpath ../Hauptprogramm/parameter/;


[[Datei:Kontakloses_Thermometer_Griff_Deckel.zip]] <br/>
[[Datei:Kontakloses_Thermometer_Halterungen.zip]] <br/>
[[Datei:Kontakloses_Thermometer_Hauptteil_Deckel.zip]] <br/>


%% Parameter
== Ergebnis ==
PAR_FZG_spurweite_f64 = 0.4; % in m
PAR_FZG_radstand_f64 = 0.4; % in m
PAR_FZG_abstand_sensor_VA_f64 = 0.23; % Abstand des Perimeter-Sensors von der Vorderachse in m
T = 0.01; % Schrittweite für die Simulation (gilt für das ganze Modell)
PAR_VIS_Anzahl_Schritte_n = 10; % Angabe, alle wieviel Schritte etwas dargestellt werden soll


% Startwinkel
== Zusammenfassung ==
PAR_FZG_psi0_I_f64 = 0; % Start-Gierwinkel in rad
cospsi = cos(PAR_FZG_psi0_I_f64); % zur Abkürzung / Vermeidung von Schreibarbeit (s. u.)
sinpsi = sin(PAR_FZG_psi0_I_f64); % zur Abkürzung / Vermeidung von Schreibarbeit (s. u.)


% Startweg des Mittelpunktes M
=== Lessons Learned ===
PAR_FZG_x0_I_f64 = 0; % Start-x-Weg in m
Während des Projekts traten Komplikationen in unterschiedlichen Bereichen an. Die größte Hürde stellte der Arduino Uno selbst dar. Dieser war für das Projekt aufgrund seiner technischen Abmessungen wenig geeignet. Wegen der Größe des Mikrocontrollers mussten die Komponenten auf engstem Raum platziert werden, um gleichzeitig die Größe des Gehäuses möglichst gering zu halten. Die Handlichkeit des Thermometers sollte gegeben sein. Dies hatte auch zur Folge, dass viel mehr Filament zur Herstellung für den 3D-Drucker benötigt wurde aufgrund von Optimierungsarbeiten. Zugleich stellte sich die Wahl des Arduino Uno's kostentechnisch als suboptimal heraus, da es günstigere Alternativen für dieses Projekt gab. <br/>
PAR_FZG_y0_I_f64 = 0.5; % Start-y-Weg in m


&#9679; Verbesserungsvorschlag: Arduino Nano oder ähnlichen Mikrocontroller konnten für dieses Projekt verwendet werden!


% Startweg des Punktes D
Weitere Komplikationen traten in der Umsetzung der Software und der Wahl des Temperatur-Sensors auf. Durch unklare Dokumentationen bezüglich des Sensors in der Literatur und im Internet wurde viel Zeit dafür aufgewendet die passenden Bibliotheken zu finden. Auch der Sensor selbst, der MLX90614, stellte sich zwar als besondere kostengünstige Variante der kontaklosen Temperaturmessung heraus, konnte aber nicht durch seine Leistung überzeugen. Ernsthafte Messungen, wie beispielsweise Fiebermessungen, können mit diesem Sensor nur schwer realisiert werden.
r_MDx_K = PAR_FZG_radstand_f64/2 + PAR_FZG_abstand_sensor_VA_f64;
r_MDy_K = PAR_FZG_spurweite_f64/2 + 0;
PAR_FZG_xD0_I_f64 = PAR_FZG_x0_I_f64 + cospsi*r_MDx_K + sinpsi*r_MDy_K; % Start-x-Weg des Punktes D in m
PAR_FZG_yD0_I_f64 = PAR_FZG_y0_I_f64 - sinpsi*r_MDx_K + cospsi*r_MDy_K; % Start-y-Weg des Punktes D in m


&#9679; Verbesserungsvorschlag: Umfassendere Dokumentation der Software gewährleisten und gegebenfalls höherwertigen Temperatur-Sensor verwenden!


%% Modell auf!
Die Temperaturmessung eines kleinen Objektes wird erschwert.
open('fahrzeugmodell2017a.slx');
</source>


=== Simulink ===
&#9679; Verbesserungsvorschlag: Zusätzlicher Einbau eines Lasers, um so kleine Objekte anzuvisieren, wo die Temperatur gemessen werden soll.
In Simulink werden die o. g. Gleichungen verwendet, um die in der Funktionsstruktur genannten Blöcke mit Leben zu füllen. Das Simulink liegt hier: [[Datei:Fahrzeugmodell2017a.zip]].  


Das Thermometer wird über eine Batterie betrieben. Um das Gerät auschzuschalten, muss die Batterie im Griff entfernt werden. Alternativ kann das Anschlusskabel der Batterie vom Arduino getrennt werden. Dazu muss der Deckel auf der Oberseite entfernt werden. Beide Varianten sind umständlich und nicht praktisch.


&#9679; Verbesserungsvorschlag: Einbau eines externen Stromversorgungsmoduls mit Batterieanschluss und An/Aus-Schalter zum einfachen ein- und ausschalten des Geräts (erfordert Neukonzipierung des Gehäuses).


Abbildung [Programmierung 1] zeigt die Subkomponente zur Berechnung der Gierrate, aus der mittels Integration (1) der Gierwinkel berechnet wird. [[Datei:Fahrzeugmodell_kinematisch_psip_v_K_bestimmen.JPG|rechts|mini|600px|[Programmierung 1] Simulink-Modell zur Bestimmung der Gierrate und körperfesten Geschwindigkeit in den Punkten M und D]]
==Projektunterlagen==
Dies ist der Winkel zwischen den x-Achsen der Koordinatensysteme I und K. Die Parameter in blau (4) werden den beiden Blöcken (3) und (4) zur Verfügung gestellt, worin die Geschwindigkeit in K-Koordinaten in den Punkten M und D bestimmt wird.
===Projektplan===
[[Datei: Projektphase1.PNG|700px|thumb|links|Abbildung 13: Erste Hälfte des Projektplans]]<br/>
[[Datei: Projektphase2.PNG|700px|thumb|links|Abbildung 14: Zweite Hälfte des Projektplans]]
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>


===Projektdurchführung===
Bei der Umsetzung des Projekts wurde sich an das V-Modell von Barry Boehm orientiert. Durch die Anwendung des V-Modells wurden Meilensteine im Projektplan gesetzt, die für eine fristgerechte Abgabe und Dokumentation sorgten. Den Beginn machte dabei eine Anforderungsliste mit den notwendigen und optionalen Anforderungen. Auf eine Ideenfindung, beispielsweise anhand eines morphologischen Kastens, wurde verzichtet da die Vorstellungen über die endgültigen Funktionen des Thermometers schon sehr früh existierten. Bei der Entwicklung des Gehäuses hingegen musste oft auf frühere Schritte zurückgesprungen werden da die Platzierung des Arduino Uno und der weiteren Komponenten auf engstem Raum eine Neukonzipierung der CAD-Konstruktionen erforderte.


===Datenblätter===
Die Datenblätter der wichtigsten Komponenten des Thermometers können im folgendem eingesehen und heruntergeladen werden. <br/>


Diese beiden körperfesten Geschwindigkeiten werden in der nächsten Subkomponente aufgegriffen, siehe Abbildung [Programmierung 2].
[[Datei: Infrarotsensor MLX90614 Datenblatt.pdf|thumb|links]]<br/>
[[Datei:Fahrzeugmodell_kinematisch_Bestimmung_v_I.JPG|rechts|mini|600px|[Programmierung 2] Simulink-Modell zur Bestimmung der Inertial-Geschwindigkeit in den Punkten M und D und Integration zur Positionsbestimmung]]
[[Datei: OLED Bildschirm Datenblatt.pdf|thumb|links]]<br/>
Hier wird mittels des Gierwinkels die aktuelle Transformationsmatrix zwischen den Koordinatensystemen I und K ermittelt (Transformation von K nach I, Block (1)). Damit ist nun die Transformation der körperfesten Geschwindigkeiten in das Intertialsystem mölglich (2). Die reine Integration ohne Berücksichtigung von Drehtermen ist nur im I-System erlaubt, sodass nun diese Inertialgeschwindigkeiten durch Integration (3) und (4) in absolute Positionen in I-Koordinaten umgerechnet werden können!
[[Datei: Ultraschallsensor HC SR04 Datenblatt.pdf|thumb|links]]<br/>
[[Datei: Ultraschallsensor HC SR04 Anleitung.pdf|thumb|links]]


== Komponententest ==
==YouTube Video==
Da es sich bei dieser Entwicklung um die einer einzelnen Komponente handelt, schließt der Komponententest mit dem Testbericht die Entwicklung ab.
Das Youtube Video des Projekts kann unter folgendem Link angesehen werden:
{| class="mw-datatable"
[https://www.youtube.com/watch?v=fWgFoosHiRg/ Kontaktloses Thermometer]
! style="font-weight: bold;" | ID
! style="font-weight: bold;" | Testfallbeschreibung
! style="font-weight: bold;" | Eingang <math>_Kv_{Lx} [\mbox{m/s}]</math>
! style="font-weight: bold;" | Eingang <math>_Kv_{Rx}[\mbox{m/s}] </math>
! style="font-weight: bold;" | Erwartetes Ergebnis
! style="font-weight: bold;" | Testergebnis
! style="font-weight: bold;" | Testperson
! style="font-weight: bold;" | Datum
|-
| 1
| Das Fahrzeugmodell steht.
| 0
| 0
| Alle Ausgänge sind Null.
| OK
| Prof. Göbel
| 10.06.2017
|-
| 2
| Das Fahrzeugmodell fährt eine Rechtskurve.
| 1
| 0
| Rechtskurve: Negative Gierrate, negativer Gierwinkel.
| OK
| Prof. Göbel
| 10.06.2017
|-
| 3
| Das Fahrzeugmodell fährt eine Linkskurve.
| 0
| 1
| Linkskurve: Positive Gierrate, positiver Gierwinkel.
| OK
| Prof. Göbel
| 10.06.2017
|-
| 4
| Das Fahrzeugmodell fährt geradeaus.
| 1
| 1
| Keine Gierrate und Gierwinkel, <math>_Kv_M = _Kv_L = _Kv_R</math>.
| OK
| Prof. Göbel
| 10.06.2017
|-
|}


Als Abschluss zeigt die letzte Abbildung dieses Artikels eine Ergebnisdarstellung der Fahrzeugbewegung in I-Koordinaten (Draufsicht).
==Weblinks==
[[Datei:Fahrzeugmodell_kinematisch_3Rad_Ergebnis.pdf|rechts|mini|400px|Ergebnisdarstellung für die Modellierung eines 3-rädrigen Fahrzeugs in einer x-y-Draufsicht]]


== Fazit ==
== Literatur ==
Das Modell ist fertig und funktioniert wie gewünscht! Somit ist die Entwicklung von Algorithmen möglich, ohne ein Fahrzeug in Hardware zur Verfügung zu haben. Dadurch eröffnen sich ernorme Möglichkeiten wie z. B. simultanes Entwickeln, automatisiertes Testen, simulative Auslegung von Reglern u. s. w.!
 
== Literaturverzeichnis ==
<references />
<references />




----
----
→ zurück zum Hauptartikel: [[Projekt_ArduMower|Projekt ArduMower]]
→ zurück zum Hauptartikel: [[Kategorie:Projekte]]

Aktuelle Version vom 14. Februar 2021, 13:53 Uhr

Autoren: Alexander Gossen, Markus Esjutin
Betreuer: Prof. Schneider

→ zurück zur Übersicht: WS 20/21: Angewandte Elektrotechnik (BSE)

Kontaktloses Thermometer

Einleitung

Im Rahmen des Teilmoduls Angewandte Elektrotechnik im Masterstudiengang Business and Systems Engineering ist es im Wintersemester 20/21 vorgesehen, dass sich die Studierenden mit einem Microcontroller-Projekt auseinandersetzen, indem das theoretische Wissen aus den folgenden Themengebieten angewendet wird:

  • Schaltungstechnik
  • Elektrotechnik
  • Mess- und Regelungstechnik

Die Studierenden sind aufgefordert ein angemessenes Projekthema mit einem Funduino Uno R3 zu recherchieren und auszuwählen. Hierbei besitzen die Studierenden bezüglich des Lösungskonzepts jegliche Freiheiten und sind nicht eingeschränkt.

Ausschlaggebend für das Projektthema "Kontaktloses Thermometer" war der ausgebrochene Virus Sars-CoV-2 oder besser bekannt als der Coronavirus. Durch die hohen Infektionszahlen seit Anfang des Jahres 2020 sind viele medizinische Hilfsmittel wie z.B. Fieberthermometer schnell ausverkauft oder werden zu überhöhten Preisen angeboten. Zudem bietet ein kontaktloses Thermometer in vielen Bereichen der Temperaturmessung eine große Hilfe. Deshalb wird dieses Projekt als Motivation gesehen, sein eigenes kontaktloses Thermometer zu entwickeln und anderen die Möglichkeit zu bieten dies nachzubauen.

Projektsteckbrief

Im Rahmen der Projektvorgehensweise wird die Funtkion des kontaklosen Thermometers anhand eines kurzen Steckbriefs erläutert. Die kontaktlose Temperaturmessung wird durch einen Infrarotsensor ermöglicht. Dieser agiert zusammen mit dem Ultraschallsensor und zwei LED's für eine korrekte Messung. Der Ultraschallsensor prüft, ob die angegebene Entfernung stimmt und zeigt dies anhand zwei verschiedenfarbiger LED's an. Liegt die Entfernung bei 2-5cm, leuchtet die LED grün. Ist die Entferung zu weit, leuchtet sie rot. Bei Betätigung eines Taster muss ein Signal ertönen und ein Temperaturwert festgehalten werden. Der aufgenommene Temperaturwert muss auf einem Display auslesbar sein. Bei erneuter Betätigung des Tasters, soll das Thermometer in die Ausgangsstellung gebracht und für eine neue Messung bereitgestellt werden.

Anforderungen an das Projekt

Die nachfolgende Liste beschreibt die Anforderungen an das Projekt "Kontaktloses Thermometer", die erfüllt werden müssen.

  1. Die Temparatur muss in Grad Celsius angezeigt werden und einen Bereich von -40 C° bis 125 C° abdecken.
  2. Das Thermometer muss im Entfernungsbereich von zwei bis fünf Zentimeter bei einer Auflösung von 0,1 C° messen können.
  3. Eine grüne LED muss leuchten, sobald sich das Thermometer im Entfernungsbereich befindet. Ansonsten leuchtet sie rot.
  4. Bei Betätigung des Tasters muss die aufgenommene Temperatur festgehalten werden, solange sie sich im Entfernungsbereich befindet.
  5. Die Messergebnisse müssen visuell per Display und akustisch durch einen Signalton kenntlich gemacht werden.
  6. Die Ergebnisse müssen auslesbar sein bis der Taster wieder gedrückt wird.
  7. Die Stromversorgung soll alternativ über eine Batterie laufen.
  8. Die Temparaturmessung muss in Echtzeit erfolgen.
  9. Das Thermometer soll handlich und transportabel sein.

Funktionaler Systementwurf / Technischer Systementwurf

Funktionale Systemstruktur

Das Thermometer misst die Temperatur eines Objektes mithilfe eines Infrarotsensors. Aufgrund von Herstellerangaben (Zuverlässigkeitsbereich der Messungen) wurde der Messbereich des Sensors auf 2 cm - 5 cm festgelegt. Dies bedeutet, das in diesem Distanzbereich korrekte Messungen durchgeführt werden können. Sobald der entsprechende Messbereich erreicht ist, wird dies anhand von LED's signalisiert. Ein Display gibt den entsprechenden Text aus. Eine Messung wird durch die Betätigung eines Tasters durchgeführt. Die Stromversorgung und Mobilität des Thermometers ist über eine Batterie gewährleistet.

Abbildung 1: Funktionale Systemstruktur des kontaktlosen Thermometers












Technischer Systementwurf

Im Folgendem werden die Schaltpläne und die technischen Zeichnungen des Projekts dargestellt. Der elektrische Schaltplan aus der Abbildung 2 wurde mit der Software Multisim von National Instruments erstellt. Die Verschaltung hingegen mit dem Breadboard in Abbildung 3 wurde mittels Fritzing dargestellt. Die technischen Zeichnungen konnten durch die Software Solid Works bereitgestellt werden.

Schaltbilder

Abbildung 2: Schaltplan des kontaktlosen Thermometers
Abbildung 3: Fritzing-Schaltplan des kontaktlosen Thermometers























Datei:Schaltpläne.zip

CAD-Zeichnungen

Abbildung 4: Abmessungen Hauptteil und Deckel
Abbildung 5: Abmessungen Sensor- und Bildschirmhalterungen
Abbildung 6: Abmessungen Griff und Deckel
Abbildung 7: Zusammenbau-Zeichnung































Datei:Hauptteil und Deckel.pdf
Datei:Sensorhalter und Bildschirmhalter.pdf
Datei:Griff und Deckel.pdf
Datei:Kontakloses Thermometer.pdf

Komponentenspezifikation

Die Komponenten für die Umsetzung des Projekts sind in der unten stehenden Tabelle aufgelistet und bezüglich der Funktionen spezifiziert. Zudem liefert die Tabelle einen Überblick über die Kosten, um einen möglichen Nachbau zu erleichtern. Die meisten Komponenten wurden beim Anbieter funduino.de bestellt. Teile, wie der Infrarotsensor, OLED-Display und Anschlussleitungen wurden auf Amazon eingekauft. In der Tabelle sind die genauen Adressen verlinkt.

Verwendete Komponenten
Bauteil Funktion Preis € (inkl. Mehrwertsteuer) Hyperlink
Arduino Uno R3 (alternativ Nano) Mikrocontroller zur Ansteuerung der Schaltkreise 13,90 Arduino Uno R3
MLX90614/5 Contactless Temperature Sensor Infrarot-Temperaturmessung 11,99 MLX90614
Ultrasonic Sensor HC-SR04 Abstandsmessung zur Einhaltung des Messbereichs 2,40 Ultraschallsensor
Experimentelles Breadboard Verbindung aller Schaltkreise 0,47 Breadboard
Jumper Wires Verbindung aller Schaltkreise 7,29 Jumper Wires
OLED-Display (128x64) Anzeigebildschirm 5,79 OLED-Display
Taster Betätigung zur Aufnahme einer Temperaturmessung 0,29 Taster
LED (2x) Indikator für Mindestabstand (rot) und Maximalabstand (grün) 4,40 LED
Filament (3D-Druck) Herstellung eines Gehäuses für das Thermometer 24,99 3D-Druck Filament
Lötkolben Herstellung einer festen Verbindung zwischen den Wires 18,22 Lötkolben
Löt-Zinn Verbindungsmaterial 6,43 Löt-Zinn


Umsetzung (HW/SW)

In diesem Kapitel wird die Umsetzung des Thermoters anhand der verwendeten Hard- und Software-Tools verdeutlicht. Für die Programmierung des Mikrocontrollers wurde die Arduino IDE verwendet. Die CAD-Konstruktionen und Zeichnungen wurden mit Solidworks erstellt. Das Gehäuse des Thermometers wurde mit einem Creality Ender 3 Pro mit rotem 1.75 mm Filament 3D-gedruckt. Die Verbindungen der Widerstände zwischen den LED's und dem Taster wurden mit Lötzinn und einem Lötkolben hergestellt. Alle anderen Verbindungen sind über das Breadboard erfolgt.

Im Folgendem ist ein Auschnitt aus dem Code des Thermometers zu sehen. Der vollständige Code steht unter dem Ausschnitt zum Download zur Verfügung.

void setup() {

Wire.begin(); //Initialisierung der I2C-Kommunikation
Serial.begin(9600); //Initialisierung der seriellen Kommunikation
mlx.begin(); //Initialisierung der Kommunikation mit dem Infrarotsensor
oled.begin(&Adafruit128x64, I2C_ADDRESS); //Initialisierung der seriellen Kommunikation
pinMode(LED_GRUEN, OUTPUT); //Input/Output-Konfiguration
pinMode(LED_ROT, OUTPUT); //Input/Output-Konfiguration
pinMode(SPEAKER, OUTPUT); //Input/Output-Konfiguration
pinMode(TRIG, OUTPUT); //Input/Output-Konfiguration
pinMode(ECHO, INPUT); //Input/Output-Konfiguration
pinMode(TASTER, INPUT_PULLUP); //Internen Pull-Up-Widerstand aktivieren

}

void loop() {

oled.setFont(ZevvPeep8x16); //Konfiguration der Schriftart des OLED-Displays

digitalWrite(TRIG, LOW); //Triggerpin wird auf 0 V gesetzt (Ultraschallsensor)
delay(5); //Verzögerung 0,005 Sekunden
digitalWrite(TRIG, HIGH); //Triggerpin wird auf 5 V gesetzt (Ultraschallsensor)
delay(10); //Verzögerung 0,010 Sekunden
digitalWrite(TRIG, LOW); //Triggerpin wird auf 0 V gesetzt (Ultraschallsensor)
dauer = pulseIn(ECHO, HIGH); //Berechnet die Dauer bis das Echo ein High-Signal erhält (Ultraschalsensor)
entfernung = (dauer/2) / 29.1; //Berechnung der Entfernung

Serial.print("Entfernung: ");
Serial.print(entfernung);
Serial.print(" cm\n\n");

if ((entfernung >= 2) && (entfernung <= 5)) { //if-Bedingung: Wenn die gemessene Entfernung größer als 2 cm und kleiner als 5 cm ist

   digitalWrite(LED_ROT, LOW);                       //Rote LED wird auf 0 V gesetzt
   digitalWrite(LED_GRUEN, HIGH);                    //Grüne LED wird auf 0 V gesetzt
  
   //oled.clear();
   oled.setCursor(24, 0);                                              //OLED-Display Textstartposition auf Spalte 24 und Zeile 0 gesetzt
   oled.print("Bitte Taster                                 ");        //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
   oled.setCursor(24, 2);                                              //OLED-Display Textstartposition auf Spalte 24 und Zeile 2 gesetzt
   oled.print("betaetigen...                                ");        //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
   oled.setCursor(23, 4);                                              //OLED-Display Textstartposition auf Spalte 24 und Zeile 4 gesetzt
   oled.print("Entfernung                                   ");        //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
   oled.setCursor(23, 6);                                              //OLED-Display Textstartposition auf Spalte 24 und Zeile 6 gesetzt
   oled.print(entfernung);                                             //Textausgabe berechnete Entfernung
   oled.print(" cm");                                                  //Textausgabe
   
   delay(500);                                                         //Verzögerung 0,5 Sekunden
   Serial.print("Bitte Taster betaetigen...");                         //Serielle Textausgabe
   if (digitalRead(TASTER) == HIGH) {                                  //if-Bedingung: Wenn der Zustand des Taster auf 5 V gesetzt wurde
     
       digitalWrite(SPEAKER, HIGH);                                    //Buzzer wird auf 5 V gesetzt
       delay(50);                                                      //Verzögerung 0,05 Sekunden
       digitalWrite(SPEAKER, LOW);                                     //Buzzer wird auf 0 V gesetzt
       
       i = true;                                                       //Buzzer Hilfsvariable wird auf true gesetzt
       
   } 
   
   t:                                                                  //Ankerpunkt für goto-Befehl
                     
   while (digitalRead(TASTER) == HIGH) {                               //while-Schleife: Solange der Zustand des Taster 5 V beträgt
           
       if (i == true) {                                                //if-Bedingung: Wenn der Wert der Buzzer Hilfsvariable auf true gesetzt wurde                                        
         
           digitalWrite(SPEAKER, HIGH);                                //Buzzer wird auf 5 V gesetzt
           delay(50);                                                  //Verzögerung 0,05 Sekunden
           digitalWrite(SPEAKER, LOW);                                 //Buzzer wird auf 0 V gesetzt
           i = false;                                                  //Buzzer Hilfsvariable wird auf false gesetzt
           
       }     
                            
       Temperatur = mlx.readObjectTempC();                             //Gemessene Infrarotsensor-temperatur wird in Variable Temperatur gespeichert
       //oled.clear();
       oled.setCursor(23, 0);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 0 gesetzt
       oled.print("Temperatur                                ");       //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
       oled.setCursor(23, 2);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 2 gesetzt
       oled.print(Temperatur);                                         //Textausgabe gemessene Temperatur
       oled.print(" C                                        ");       //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
       oled.setCursor(23, 4);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 4 gesetzt
       oled.print("Entfernung                                ");       //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
       oled.setCursor(23, 6);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 6 gesetzt
       oled.print(entfernung);                                         //Textausgabe berechnete Entfernung
       oled.print(" cm                                       ");       //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
       Serial.print("Temperatur ");                                    //Serielle Textausgabe
       Serial.print(Temperatur);                                       //Serielle Textausgabe gemessene Temperatur
       Serial.print(" C");                                             //Serielle Textausgabe
           
       tasterZeit = millis();                                          //Zeitmessung solange der Taster auf 5 v gesetzt wurde und Speicherung des Wertes in der variable tasterZeit
   
           
           if (tasterGedrueckt == true) {                              //if-Bedingung: Wenn der Wert der variable Hilfsvariable tasterGedrueckt auf true gesetzt wurde 
   
               tasterGedrueckt = false;                                //Taster-Entprell Hilfsvariable wird auf false gesetzt
             
           }
   
           else {                                                      //else: wenn if-Bedingung nicht zutrifft
   
               tasterGedrueckt = true;                                 //Taster-Entprell Hilfsvariable wird auf true gesetzt
                        
           }
                                                                 
       }
       
       if ((digitalRead(TASTER) == LOW) && (tasterZeit >= 1000)) {    //if-Bedingung: Wenn der Zustand des Taster 0 V beträgt und die Wert in der Variable tasterZeit größer-gleich 1000 beträgt
         
         goto g;                                                      //Springe zu Ankerpunkt g
         
       }


   while ((tasterGedrueckt == true) && (millis() - tasterZeit > entprellZeitTaster)) {   //while-Schleife: Solange tasterGedrueckt = true ist und die gemessene Tasterzeit kleiner der vorgegeben entprellzeit ist
       
       g:                                                              //Ankerpunkt für goto-Befehl
       //oled.clear();
       oled.setCursor(23, 0);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 0 gesetzt
       oled.print("Temperatur                                ");       //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
       oled.setCursor(23, 2);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 2 gesetzt
       oled.print(Temperatur);                                         //Textausgabe gemessene Temperatur (Zuletzt angezeigter Wert wird festgehalten)
       oled.print(" C                                        ");       //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
       oled.setCursor(23, 4);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 4 gesetzt
       oled.print("Entfernung                                ");       //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
       oled.setCursor(23, 6);                                          //OLED-Display Textstartposition auf Spalte 23 und Zeile 6 gesetzt
       oled.print(entfernung);                                         //Textausgabe gemessene Entfernung
       oled.print(" cm                                       ");       //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
       Serial.print("Temperatur ");                                    //Serielle Textausgabe
       Serial.print(Temperatur);                                       //Serielle Textausgabe gemessene Temperatur
       Serial.print(" C");                                             //Serielle Textausgabe
          
       delay(500);                                                     //Verzögerung 0,5 Sekunden
       
       if (digitalRead(TASTER) == HIGH) {                              //if-Bedingung: Wenn der Zustand des Taster auf 5 V gesetzt ist
         
           digitalWrite(SPEAKER, HIGH);                                //Buzzer wird auf 5 V gesetzt
           delay(50);                                                  //Verögerung 0,05 Sekunden
           digitalWrite(SPEAKER, LOW);                                 //Buzzer wird auf 0 V gesetzt
           
           goto t;                                                     //Springe zu Ankerpunkt t
                
       }
       
   }

}

else { //else: Wenn die if-Bedingung nicht zutrifft

   tasterZeit = 0;                                                       //Variable tasterZeit wird auf 0 gesetzt
   
   digitalWrite(LED_GRUEN, LOW);                                         //Grüne LED wird auf 0 V gesetzt                                                                       
   digitalWrite(LED_ROT, HIGH);                                          //Rote LED wird auf 5 V gesetzt
   
   //oled.clear();
   oled.setCursor(24, 0);                                                //OLED-Display Textstartposition auf Spalte 24 und Zeile 0 gesetzt
   oled.print("Nicht in                                         ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
   oled.setCursor(24,2);                                                 //OLED-Display Textstartposition auf Spalte 24 und Zeile 2 gesetzt
   oled.print("Reichweite!                                      ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
   oled.setCursor(23, 4);                                                //OLED-Display Textstartposition auf Spalte 23 und Zeile 4 gesetzt
   oled.print("Entfernung                                       ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
   oled.setCursor(23, 6);                                                //OLED-Display Textstartposition auf Spalte 23 und Zeile 6 gesetzt
   oled.print(entfernung);                                               //Textausgabe gemessene Entfernung
   oled.print(" cm                                              ");      //Textausgabe (Leerzeichen zum Löschen des Textes aus vorherigen Textausgaben)
   Serial.print("Nicht in Reichweite!");                                 //Serielle Textausgabe
   delay(500);                                                           //Verzögerung 0,5 Sekunden

}

}


Datei:Kontaktloses Thermometer Final.ino

Komponententest

Zuerst wurden alle benötigten Komponenten am großen Breadboard mit dem Arduino verbunden. Die Verschaltung aus der Abbildung 8 wurde so übersichtlich wie möglich aufgebaut, um möglichst schnell fehlerhafte Verbindungen zu korrigieren und Verbesserungen aufzunehmen. Die Verbesserungen wurden dann bei der Verkabelung und den Aufbau des Endprodukts umgesetzt. Wie aus den Abbildungen 9 und 10 zu entnehmen wurde der Ultraschallsensor zusammen mit den LEDs programmiert und auf korrekter Funktion mittels Geodreieck überprüft. Es wurde darauf geachtet, dass die LED's und der Ultraschallsensor fehlerfrei zum richtigen Abstand reagieren, da diese die Bedingungen im Programmcode vorgeben und somit das Grundgerüst bilden. Im Anschluss wurde der Infrarotsensor in den Programmcode implementiert. Er wurde für den Anfang mit den Ultraschallsensor so programmiert, dass er nur bei einem Abstand von zwei bis fünf Zentimetern arbeitet und Temperaturen aufzeichnet. Als Beispiel dient die Abbildung 11 mit den Temperaturaufzeichnungen. Dort hat sich eine Hand dem Ultraschallsensor genähert und erst bei dem vorgegebenen Abstand die Temperatur der Hand aufgezeichnet. Die anderen Komponenten wie Schater, Piezo Speaker und OLED wurden nach und nach in den Code implementiert.

Abbildung 8: Komponententest auf dem großen Breadboard
Abbildung 9: Test des Ultraschallsensors & der LED's (i.O.)


Abbildung 10: Test des Ultraschallsensors & der LED's (n.i.O)
Abbildung 11: Temperaturaufzeichnung der Hand



CAD-Entwurf

In diesem Kapitel wird der Entwurf des Thermometergehäuses mithilfe der CAD-Software Solidworks veranschaulicht und die Dateien zum Download zur Verfügung gestellt. Die finale Konstruktion des Gehäuses ist mit allen seinen Bauteilen zusammengefügt in den Abbildung 12 zu sehen.

Abbildung 12: CAD-Entwurf des kontaklosen Thermometers
























Die CAD-Daten dieses Projekts finden sich in den unten stehenden Links.

Datei:Kontakloses Thermometer Griff Deckel.zip
Datei:Kontakloses Thermometer Halterungen.zip
Datei:Kontakloses Thermometer Hauptteil Deckel.zip

Ergebnis

Zusammenfassung

Lessons Learned

Während des Projekts traten Komplikationen in unterschiedlichen Bereichen an. Die größte Hürde stellte der Arduino Uno selbst dar. Dieser war für das Projekt aufgrund seiner technischen Abmessungen wenig geeignet. Wegen der Größe des Mikrocontrollers mussten die Komponenten auf engstem Raum platziert werden, um gleichzeitig die Größe des Gehäuses möglichst gering zu halten. Die Handlichkeit des Thermometers sollte gegeben sein. Dies hatte auch zur Folge, dass viel mehr Filament zur Herstellung für den 3D-Drucker benötigt wurde aufgrund von Optimierungsarbeiten. Zugleich stellte sich die Wahl des Arduino Uno's kostentechnisch als suboptimal heraus, da es günstigere Alternativen für dieses Projekt gab.

● Verbesserungsvorschlag: Arduino Nano oder ähnlichen Mikrocontroller konnten für dieses Projekt verwendet werden!

Weitere Komplikationen traten in der Umsetzung der Software und der Wahl des Temperatur-Sensors auf. Durch unklare Dokumentationen bezüglich des Sensors in der Literatur und im Internet wurde viel Zeit dafür aufgewendet die passenden Bibliotheken zu finden. Auch der Sensor selbst, der MLX90614, stellte sich zwar als besondere kostengünstige Variante der kontaklosen Temperaturmessung heraus, konnte aber nicht durch seine Leistung überzeugen. Ernsthafte Messungen, wie beispielsweise Fiebermessungen, können mit diesem Sensor nur schwer realisiert werden.

● Verbesserungsvorschlag: Umfassendere Dokumentation der Software gewährleisten und gegebenfalls höherwertigen Temperatur-Sensor verwenden!

Die Temperaturmessung eines kleinen Objektes wird erschwert.

● Verbesserungsvorschlag: Zusätzlicher Einbau eines Lasers, um so kleine Objekte anzuvisieren, wo die Temperatur gemessen werden soll.

Das Thermometer wird über eine Batterie betrieben. Um das Gerät auschzuschalten, muss die Batterie im Griff entfernt werden. Alternativ kann das Anschlusskabel der Batterie vom Arduino getrennt werden. Dazu muss der Deckel auf der Oberseite entfernt werden. Beide Varianten sind umständlich und nicht praktisch.

● Verbesserungsvorschlag: Einbau eines externen Stromversorgungsmoduls mit Batterieanschluss und An/Aus-Schalter zum einfachen ein- und ausschalten des Geräts (erfordert Neukonzipierung des Gehäuses).

Projektunterlagen

Projektplan

Abbildung 13: Erste Hälfte des Projektplans


Abbildung 14: Zweite Hälfte des Projektplans













































Projektdurchführung

Bei der Umsetzung des Projekts wurde sich an das V-Modell von Barry Boehm orientiert. Durch die Anwendung des V-Modells wurden Meilensteine im Projektplan gesetzt, die für eine fristgerechte Abgabe und Dokumentation sorgten. Den Beginn machte dabei eine Anforderungsliste mit den notwendigen und optionalen Anforderungen. Auf eine Ideenfindung, beispielsweise anhand eines morphologischen Kastens, wurde verzichtet da die Vorstellungen über die endgültigen Funktionen des Thermometers schon sehr früh existierten. Bei der Entwicklung des Gehäuses hingegen musste oft auf frühere Schritte zurückgesprungen werden da die Platzierung des Arduino Uno und der weiteren Komponenten auf engstem Raum eine Neukonzipierung der CAD-Konstruktionen erforderte.

Datenblätter

Die Datenblätter der wichtigsten Komponenten des Thermometers können im folgendem eingesehen und heruntergeladen werden.

Datei:Infrarotsensor MLX90614 Datenblatt.pdf
Datei:OLED Bildschirm Datenblatt.pdf
Datei:Ultraschallsensor HC SR04 Datenblatt.pdf
Datei:Ultraschallsensor HC SR04 Anleitung.pdf

YouTube Video

Das Youtube Video des Projekts kann unter folgendem Link angesehen werden: Kontaktloses Thermometer

Weblinks

Literatur



→ zurück zum Hauptartikel: