Steuerung des Computers durch Handgesten mit Arduino: Unterschied zwischen den Versionen
(→Aufbau) |
|||
(51 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 17: | Zeile 17: | ||
== Anforderungen == | == Anforderungen == | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ style = "text-align: left"|Tabelle 1: | |+ style = "text-align: left"|Tabelle 1: Anforderungen an das System | ||
! style="font-weight: bold;" | ID | ! style="font-weight: bold;" | ID | ||
! style="font-weight: bold;" | Inhalt | ! style="font-weight: bold;" | Inhalt | ||
Zeile 25: | Zeile 25: | ||
! style="font-weight: bold;" | Datum | ! style="font-weight: bold;" | Datum | ||
|- | |- | ||
| 1 | |||
| Der Laptop muss das Video abspielen/angehalten, Wenn ein Hande vom mittleren Sensor in einer Entfernung zwischen 40-50cm erfasst wird. | |||
| 1 | |||
|- | |||
| Lihui Liu | | Lihui Liu | ||
| 02.10.2022 | | 02.10.2022 | ||
Zeile 50: | Zeile 32: | ||
| 02.10.2022 | | 02.10.2022 | ||
|- | |- | ||
| | | 2 | ||
| | | Der Laptop muss das Video rückspulen, Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 3-15cm erfasst wird. | ||
| Lihui Liu | | Lihui Liu | ||
| 02.10.2022 | | 02.10.2022 | ||
Zeile 57: | Zeile 39: | ||
| 02.10.2022 | | 02.10.2022 | ||
|- | |- | ||
| | | 3 | ||
| | | Der Laptop muss das Video vorspulen, Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 25-40cm erfasst wird. | ||
| Lihui Liu | | Lihui Liu | ||
| 02.10.2022 | | 02.10.2022 | ||
Zeile 64: | Zeile 46: | ||
| 02.10.2022 | | 02.10.2022 | ||
|- | |- | ||
| | | 4 | ||
| Laptop | | Der Laptop muss die Lautstärke vom Video abnehmen, Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 3-15cm erfasst wird. | ||
| Lihui Liu | | Lihui Liu | ||
| 02.10.2022 | | 02.10.2022 | ||
| Junjie Lyu | | Junjie Lyu | ||
| 02.10.2022 | | 02.10.2022 | ||
|- | |- | ||
| | | 5 | ||
|- | | Der Laptop muss die Lautstärke vom Video zunehmen, Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 25-40cm erfasst wird. | ||
| Lihui Liu | | Lihui Liu | ||
| 02.10.2022 | | 02.10.2022 | ||
Zeile 80: | Zeile 60: | ||
| 02.10.2022 | | 02.10.2022 | ||
|- | |- | ||
| 3. | | 6 | ||
| Der Laptop muss in das letzte Video springen, Wenn ein Hand vom mitten Sensor in einer Entfernung zwischen 3-15cm erfasst wird. | |||
| Lihui Liu | | Lihui Liu | ||
| 02.10.2022 | | 02.10.2022 | ||
Zeile 87: | Zeile 67: | ||
| 02.10.2022 | | 02.10.2022 | ||
|- | |- | ||
| | | 7 | ||
| | | Der Laptop muss in das nächste Video springen, Wenn ein Hand vom mitten Sensor in einer Entfernung zwischen 25-40cm erfasst wird. | ||
| Lihui Liu | | Lihui Liu | ||
| 02.10.2022 | | 02.10.2022 | ||
Zeile 94: | Zeile 74: | ||
| 02.10.2022 | | 02.10.2022 | ||
|- | |- | ||
| | | 8 | ||
| Der Laptop muss in den Anfang des Videos springen, Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 40-50cm erfasst wird. | |||
| Wenn | |||
| Lihui Liu | | Lihui Liu | ||
| 02.10.2022 | | 02.10.2022 | ||
Zeile 103: | Zeile 81: | ||
| 02.10.2022 | | 02.10.2022 | ||
|- | |- | ||
| | | 9 | ||
| Wenn | | Der Laptop muss das Videos Stumm/Widerrufung einstellen, Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 40-50cm erfasst wird. | ||
| Lihui Liu | | Lihui Liu | ||
| 02.10.2022 | | 02.10.2022 | ||
Zeile 110: | Zeile 88: | ||
| 02.10.2022 | | 02.10.2022 | ||
|- | |- | ||
| | | 10 | ||
| Der Laptop muss das Videos Vollbildschirm/Widerrufung einstellen, Wenn die zwei Hände vom linken und rechten Sensoren in den Entfernungen zwischen 30-50cm erfasst wird. | |||
| | |||
| Lihui Liu | | Lihui Liu | ||
| 02.10.2022 | | 02.10.2022 | ||
Zeile 135: | Zeile 99: | ||
== Funktionaler Systementwurf/Technischer Systementwurf == | == Funktionaler Systementwurf/Technischer Systementwurf == | ||
Die Abb. 2 und 3 stellen einen funktionalen Systementwurf dar, mit dem die Zuschauer beim Video durch Handgesten die Lautstärke ändern oder vor-/rückwärtsspulen können. Auf dem Monitor werden drei Ultraschallsensoren angelegt, mit denen die Entfernung zwischen Monitor und Hand erfasst wird. Die Messsdaten werden über die serielle Schnittstelle (USB) an den Computer gesendet und mittels der Python Module pyautogui | Die Abb. 2 und 3 stellen einen funktionalen Systementwurf dar, mit dem die Zuschauer beim Video durch Handgesten die Lautstärke ändern oder vor-/rückwärtsspulen können. Auf dem Monitor werden drei Ultraschallsensoren angelegt, mit denen die Entfernung zwischen Monitor und Hand erfasst wird. Die Messsdaten werden über die serielle Schnittstelle (USB) an den Computer gesendet und mittels der Python Module pyautogui und pyserial mit dem Video player verknüpft. | ||
<gallery widths="750" heights="550"> | <gallery widths="750" heights="550"> | ||
Zeile 176: | Zeile 140: | ||
===Stückliste=== | ===Stückliste=== | ||
{| class=" | {| class="wikitable" | ||
|+ style = "text-align: left"|Tabelle 3: Stückliste | |+ style = "text-align: left"|Tabelle 3: Stückliste | ||
! style="font-weight: bold;" | ID | ! style="font-weight: bold;" | ID | ||
Zeile 215: | Zeile 179: | ||
====Verdrahtungsplan==== | ====Verdrahtungsplan==== | ||
[[Datei:Verdrahtungsplan_Gruppe1_4_Aktualisieren.png|thumb|500px|none|Abbildung 4: Verdrahtungsplan]] | |||
==Programmierung== | ==Programmierung== | ||
Zeile 233: | Zeile 199: | ||
===Programmcode=== | ===Programmcode=== | ||
'''Der Code dient zur Realisierung der Steuerung des Computers durch Handgesten mit Arduino Uno''' | |||
<div style="width:950px; height:500px; overflow:auto; border: 1px solid #000"> | |||
<pre> | |||
/**************************************************************\ | |||
* | |||
* Modul : Arduino_SteuerungdesComputerdurchHandgesten.ino | |||
* | |||
* Datum : 28. November 2022 | |||
* | |||
* Beschreibung : zur Realisierung der Steuerung des Computers | |||
* durch Handgesten mit Arduino Uno | |||
* | |||
* Implementierung : Arduino1.8.17 | |||
* | |||
* Autor : Lihui,Liu; Junjie,Lyu | |||
* | |||
* Bemerkung : Bereit zur Durchführung | |||
* | |||
* Letzte Änderung : 08. Januar 2023 | |||
* | |||
\************************************************************/ | |||
/**Variablen definieren**/ | |||
const int trigger1 = 2; //Trigger pin von 1. Sesnor (links) | |||
const int echo1 = 3; //Echo pin von 1. Sesnor (links) | |||
const int trigger2 = 4; //Trigger pin von 2. Sesnor (mitten) | |||
const int echo2 = 5;//Echo pin von 2. Sesnor (mitten) | |||
const int trigger3 = 6; //Trigger pin von 2. Sesnor (rechts) | |||
const int echo3 = 7;//Echo pin von 2. Sesnor (rechts) | |||
long Zeit; | |||
int dist,distL,distM,distR; | |||
/**Pin-Zustand Definieren**/ | |||
void setup() { | |||
Serial.begin(9600); | |||
pinMode(trigger1, OUTPUT); | |||
pinMode(echo1, INPUT); | |||
pinMode(trigger2, OUTPUT); | |||
pinMode(echo2, INPUT); | |||
pinMode(trigger3, OUTPUT); | |||
pinMode(echo3, INPUT); | |||
} | |||
/***********************************************************\ | |||
* | |||
* Funktion : Berechnung_Distanz(int trigger, int echo) | |||
* | |||
* Beschreibung der Funktion : | |||
* Basierend auf das Funktionsprinzip des Ultraschallsensors | |||
* | |||
* Eingangsparameter : | |||
* int trigger,int echo | |||
* | |||
* Übergebeparameter : | |||
* long Zeit | |||
* | |||
* Rückgabeparameter : | |||
* int dist | |||
\***********************************************************/ | |||
void Berechnung_Distanz(int trigger, int echo) | |||
{ | |||
digitalWrite(trigger, LOW); | |||
delayMicroseconds(2); | |||
digitalWrite(trigger, HIGH); | |||
delayMicroseconds(10); | |||
digitalWrite(trigger, LOW); | |||
Zeit = pulseIn(echo, HIGH); | |||
dist= Zeit*0.034/2; | |||
if (dist>50) | |||
dist = 50; | |||
} | |||
void loop() { | |||
// Distanz Messung | |||
Berechnung_Distanz(trigger1,echo1); | |||
distL =dist; //Distanz zwischen Hand und links Sensor | |||
Berechnung_Distanz(trigger2,echo2); | |||
distM =dist; //Distanz zwischen Hand und mitten Sensor | |||
Berechnung_Distanz(trigger3,echo3); | |||
distR =dist; //Distanz zwischen Hand und rechts Sensor | |||
//Funktion 1: Pause/laufen | |||
if ((distM >40 && distM<50)) // mitten Sensor (40 50) | |||
{Serial.println("Pause/laufen"); delay (500);} | |||
//Funktion 8: Rücksprung am t = 0s | |||
if ((distL>40&& distL<50)) // links Sensor (40 50) | |||
{Serial.println("Suche");delay(500);} | |||
//Funktion 9: Stumm/Widerrufung | |||
if ((distR >40 && distR<50)) // rechts Sensor (40 50) | |||
{Serial.println("Stumm/Widerrufung"); delay(500);} | |||
//Funktion 10:Vollbildschirm/Widerrufung | |||
if ((distL >30 && distL<50)&&(distR >30 && distR<50)) | |||
{Serial.println("Vollbildschirm/Widerrufung"); delay(500);} | |||
// Distanz Messung | |||
Berechnung_Distanz(trigger1,echo1); | |||
distL =dist; //Distanz zwischen Hand und links Sensor | |||
Berechnung_Distanz(trigger2,echo2); | |||
distM =dist; //Distanz zwischen Hand und mitten Sensor | |||
Berechnung_Distanz(trigger3,echo3); | |||
distR =dist; //Distanz zwischen Hand und rechts Sensor | |||
//Funtion 2 und 3: Rückspulen und Vorspulen | |||
if (distL>=15 && distL<=25) | |||
{ | |||
delay(100); //Hand halten zeit | |||
Berechnung_Distanz(trigger1,echo1); | |||
distL =dist; | |||
if (distL>=15 && distL<=25) | |||
{ | |||
Serial.println("links Locked"); | |||
while(distL<=40) | |||
{ | |||
Berechnung_Distanz(trigger1,echo1); | |||
distL =dist; | |||
if (distL<15) //Hand vorne schieben | |||
{Serial.println ("Rückspulen"); delay (300);} | |||
if (distL>25) //Hand hinter schieben | |||
{Serial.println ("Vorspulen"); delay (300);} | |||
} | |||
} | |||
} | |||
//Funktion 4 und 5: leiser und lauter | |||
if (distR>=15 && distR<=25) | |||
{ | |||
delay(100); //Hand halten Zeit | |||
Berechnung_Distanz(trigger3,echo3); | |||
distR =dist; | |||
if (distR>=15 && distR<=25) | |||
{ | |||
Serial.println("rechts Locked"); | |||
while(distR<=40) | |||
{ | |||
Berechnung_Distanz(trigger3,echo3); | |||
distR =dist; | |||
if (distR<15) //rechts Hand nach vorne schieben | |||
{Serial.println ("leiser"); delay (300);} | |||
if (distR>25) //rehcts Hand nach hinter schieben | |||
{Serial.println ("lauter"); delay (300);} | |||
} | |||
} | |||
} | |||
//Funktion 6 und 7: L. Video und N. Video | |||
if (distM>=15 && distM<=25) | |||
{ | |||
delay(100); | |||
Berechnung_Distanz(trigger2,echo2); | |||
distM =dist; | |||
if (distM>=15 && distM<=25) | |||
{ | |||
Serial.println("Mitten Locked"); | |||
while(distM<=40) | |||
{ | |||
Berechnung_Distanz(trigger2,echo2); | |||
distM =dist; | |||
if (distM<15) //Right hand pushed in | |||
{Serial.println ("L. Video"); delay (300);} | |||
if (distM>25) //Right hand pulled out | |||
{Serial.println ("N. Video"); delay (300);} | |||
} | |||
} | |||
} | |||
delay(200); | |||
} | |||
</pre> | |||
</div> | |||
'''Der Code dient zur Realisierung der Steuerung des Computers durch Handgesten mit Python''' | |||
<div style="width:950px; height:500px; overflow:auto; border: 1px solid #000"> | |||
<pre> | |||
############################################################## | |||
# | |||
# Modul : Python_SteuerungdesComputerdurchHandgesten.py | |||
# | |||
# Datum : 03. Dezember 2022 | |||
# | |||
# Beschreibung : zur Verknüpfung zwischen Arduino und | |||
# Video-Spieler-Software | |||
# | |||
# Implementierung : Pycharm 02.2022 | |||
# | |||
# Autor : Lihui,Liu; Junjie,Lyu | |||
# | |||
# Bemerkung : bereit zur Durchführung | |||
# | |||
# Letzte Änderung : 08. Januar 2023 | |||
# | |||
############################################################## | |||
import serial # Seriell importiert für serielle Kommunikation | |||
import time # Erforderlich für die Verwendung von Verzögerungsfunktionen | |||
import pyautogui | |||
Arduino_Serial = serial.Serial('com4', 9600) | |||
time.sleep(2) # wait for 2 seconds for the communication to get established | |||
while 1 : | |||
incoming_data = str(Arduino_Serial.readline()) # liest die seriellen Daten und druckt sie als Zeile | |||
print(incoming_data) | |||
if 'Pause/laufen' in incoming_data: | |||
pyautogui.typewrite(['space'], 0.2) | |||
if 'Rückspulen' in incoming_data: | |||
pyautogui.hotkey('left') | |||
if 'Vorspulen' in incoming_data: | |||
pyautogui.hotkey('right') | |||
if 'leiser' in incoming_data: | |||
pyautogui.hotkey('down') | |||
if 'lauter' in incoming_data: | |||
pyautogui.hotkey('up') | |||
if 'L. Video' in incoming_data: | |||
pyautogui.hotkey('shift','p') | |||
if 'N. Video' in incoming_data: | |||
pyautogui.hotkey('shift','n') | |||
if 'Suche' in incoming_data: | |||
pyautogui.hotkey('/') | |||
if 'Stumm/Widerrufung' in incoming_data: | |||
pyautogui.hotkey('m') | |||
if 'Vollbildschirm/Widerrufung' in incoming_data: | |||
pyautogui.hotkey('f') | |||
incoming = ""; | |||
</pre> | |||
</div> | |||
==Aufbau== | ==Aufbau== | ||
Die folgenden Abbildungen zeigt die Stirn- und Rückseite des Aufbaus. Auf der Rückseite sind 3 Ultraschallsensor auf dem oberen Seite des Laptops zu sehen. Während die Stirnseite sind mit Arduino und Breadboard zu verbinden. | |||
[[Datei:AufbauRückseite.png|thumb|left|Absatz|400px|Abbildung 7: Rückseite]] | [[Datei:AufbauRückseite.png|thumb|left|Absatz|400px|Abbildung 7: Rückseite]] | ||
[[Datei:AufbauStirnseite.png|thumb|left|Absatz|400px|Abbildung 8: Stirnseite]] <br clear=all> | [[Datei:AufbauStirnseite.png|thumb|left|Absatz|400px|Abbildung 8: Stirnseite]] <br clear=all> | ||
===Sensorik=== | ===Sensorik=== | ||
Die Sensorik erfasst die Messwerte und bildet somit die Berechnungsgrundlage der Ausgangsvariablen des Mikrocontrollers. Der Ultraschallsensor strahlt zyklisch einen kurzen, hochfrequenten Schallimpuls aus. Dieser pflanzt sich mit Schallgeschwindigkeit in der Luft fort. Wenn der Ultraschall Sensor auf das Hand trifft, wird er dort reflektiert und gelangt als Echo zurück. Die verwendete | Die Sensorik erfasst die Messwerte und bildet somit die Berechnungsgrundlage der Ausgangsvariablen des Mikrocontrollers. Der Ultraschallsensor strahlt zyklisch einen kurzen, hochfrequenten Schallimpuls aus. Dieser pflanzt sich mit Schallgeschwindigkeit in der Luft fort. Wenn der Ultraschall Sensor auf das Hand trifft, wird er dort reflektiert und gelangt als Echo zurück. Die verwendete 3 Sensoren sind Ultraschall Sensor HC SR04. Sie dienen zur Ermittlung der Abstandswerte zwischen der Hände. Arduino liest diese Werte ab und basierend auf diesem Abstandswerte werden die bestimmte Aktionen ausgeführt. | ||
== Komponententest == | == Komponententest == | ||
Zeile 246: | Zeile 605: | ||
! Nr. !! Komponente !! Erwartete Funktion !! Ergebnis | ! Nr. !! Komponente !! Erwartete Funktion !! Ergebnis | ||
|- | |- | ||
| 1 || | | 1 || Arduino Uno || LED on Board leuchtet || LED on Board leuchtet | ||
|- | |||
| 2 || Sensor (links) || Objekt von Distanz zwischen 3-60 erkennen || Objekt von Distanz zwischen 3-60 erkennen | |||
|- | |||
| 3 || Sensor (mitten) || Objekt von Distanz zwischen 3-60 erkennen || Objekt von Distanz zwischen 3-60 erkennen | |||
|- | |||
| 4 || Sensor (rechts)|| Objekt von Distanz zwischen 3-60 erkennen || Objekt von Distanz zwischen 3-60 erkennen | |||
|- | |||
|} | |||
== Ergebnis == | |||
Das Projekt konnte erfolgreich durchgeführt werden und wir konnten alle gesetzten Anforderungen erreichen. Eine Überprüfung der einzelnen Anforderungen aus Tabelle 1 lässt sich in Tabelle 5 einsehen. | |||
{| class="wikitable" | |||
|+ style = "text-align: left"|Tabelle 5: Überprüfung der formulierten Anforderungen | |||
! style="font-weight: bold;" | Anforderungs-ID | |||
! style="font-weight: bold;" | Testinhalt | |||
! style="font-weight: bold;" | Testergebnis | |||
|- | |||
| 001 | |||
| Wenn ein Hande vom mittleren Sensor in einer Entfernung zwischen 40-50cm erfasst wird, kann der Laptop das Video abspielen/angehalten. | |||
| erfolgreich | |||
|- | |||
| 002 | |||
| Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 3-15cm erfasst wird, kann der Laptop das Video rückspulen. | |||
| erfolgreich | |||
|- | |||
| 003 | |||
| Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 25-40cm erfasst wird, kann der Laptop das Video vorspulen. | |||
| erfolgreich | |||
|- | |||
| 004 | |||
| Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 3-15cm erfasst wird, kann der Laptop die Lautstärke vom Video abnehmen. | |||
| erfolgreich | |||
|- | |- | ||
| | | 005 | ||
| Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 25-40cm erfasst wird, kann der Laptop die Lautstärke vom Video zunehmen. | |||
| erfolgreich | |||
|- | |- | ||
| 3 | | 006 | ||
| Wenn ein Hand vom mitten Sensor in einer Entfernung zwischen 3-15cm erfasst wird, kann der Laptop in das letzte Video springen. | |||
| erfolgreich | |||
|- | |- | ||
| | | 007 | ||
| Wenn ein Hand vom mitten Sensor in einer Entfernung zwischen 25-40cm erfasst wird, kann der Laptop in das nächste Video springen. | |||
| erfolgreich | |||
|- | |- | ||
| | | 008 | ||
| Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 40-50cm erfasst wird, kann der Laptop in den Anfang des Videos springen. | |||
| erfolgreich | |||
|- | |- | ||
| | | 009 | ||
| Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 40-50cm erfasst wird, kann der Laptop das Videos Stumm/Widerrufung einstellen. | |||
| erfolgreich | |||
|- | |- | ||
| | | 010 | ||
| Wenn die zwei Hände vom linken und rechten Sensoren in den Entfernungen zwischen 30-50cm erfasst wird, kann der Laptop das Videos Vollbildschirm/Widerrufung einstellen. | |||
| erfolgreich | |||
|- | |- | ||
|} | |} | ||
== | == Zusammenfassung == | ||
Das Projekt Steuerung des Computers durch Handgesten mit Arduino wurde erfolgreich umgesetzt. Ziel des Projekts war HMI zu entwickeln, welche die Objekt der Distanzen erfasst,entsprechend Viodeo-Player durch Handgesten steuern. werden. | |||
=== Lessons Learned === | === Lessons Learned === | ||
Im Rahmen dieses Projekts wurden die wissenschaftlichen Vorgehensweisen für die Projektentwicklung wiederholt und vertieft. Dazu gehören die Projektplanung, das Zeitmanagement, die Projektdokumentation und eine kollaborative Teamarbeit. Mittlerweile wurden mit den Arbeitswerkzeugen wie Fritzing, GanttProjekt und PAP-Designer vertraut. Außerdem wurden die Erkenntnisse von Sensoren und Mikrocontroller in Praxis umgesetzt werden. | |||
== Projektunterlagen == | == Projektunterlagen == | ||
Dem [[:Datei:158_Steuerung_des_Computers_durch_Handgesten_mit_Arduino.zip| ZIP-Archiv]] sowie dem [https://svn.hshl.de/svn/Elektrotechnik\_Fachpraktikum/trunk/Projekte/151-175/158\_Steuerung\_des\_Computers\_durch\_Handgesten\_mit\_Arduino SVN] Ordner können die relevanten Projektunterlagen entnommen werden. | |||
=== Projektplan === | === Projektplan === | ||
[[Datei:Abbildung ProjektPlan_GETPraktikum.PNG|left|mini|1200px| | [[Datei:Abbildung ProjektPlan_GETPraktikum.PNG|left|mini|1200px|Abbildung 9: ProjektPlan_GETPraktikum]] <br clear=all> | ||
=== Projektdurchführung === | === Projektdurchführung === | ||
Zu Beginn haben wir die Sensoren und Arduino sowie Breadboard und Jump Kabel bestellt. Nach dem Einsetzen der entsprechenden Bibliothek und werden die in Anforderungen geschriebene Funktionen mit den Hotkey bestimmt. Dann war die Implementierung mit Arduino und Python. Abschließend war der Test mit dem YouTube Videos | |||
== YouTube Video == | == YouTube Video == | ||
{{#ev:youtube|https://www.youtube.com/watch?v=qGLouISsMhw|450px|left}} | |||
{{#ev:youtube|https:// | |||
<br clear=all> | <br clear=all> | ||
Aktuelle Version vom 10. Januar 2023, 15:37 Uhr
Autoren: Lihui Liu, Junjie Lyu
Betreuer: Marc Ebmeyer
→ zurück zur Übersicht: WS 22/23: Angewandte Elektrotechnik (BSE)
Einleitung
Bei dem vorliegenden Artikel handelt es sich um ein Projekt aus dem Praktikum angewandte Elektrotechnik des Studiengangs Business and Systems Engineering (BSE). Ziel des Projektes ist es, die bestimmten Funktionen auf dem Computer durch Handgesten zu realisieren. Hierfür werden die Ultraschallsensoren (US) eingesetzt, um die Entfernung zwischen Monitor und Hande zu erfassen. Die Messdaten werden über die serielle Schnittstelle (USB) an den Computer gesendet, die von Python eingelesen werden. Während des Laufs der Pythonprogrammierung auf dem Computer werden die bestimmten Aktionen ausgeführt. Die Umsetzung des Projektes erfolgt nach dem V-Modell.
Anforderungen
ID | Inhalt | Ersteller | Datum | Geprüft von | Datum |
---|---|---|---|---|---|
1 | Der Laptop muss das Video abspielen/angehalten, Wenn ein Hande vom mittleren Sensor in einer Entfernung zwischen 40-50cm erfasst wird. | Lihui Liu | 02.10.2022 | Junjie Lyu | 02.10.2022 |
2 | Der Laptop muss das Video rückspulen, Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 3-15cm erfasst wird. | Lihui Liu | 02.10.2022 | Junjie Lyu | 02.10.2022 |
3 | Der Laptop muss das Video vorspulen, Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 25-40cm erfasst wird. | Lihui Liu | 02.10.2022 | Junjie Lyu | 02.10.2022 |
4 | Der Laptop muss die Lautstärke vom Video abnehmen, Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 3-15cm erfasst wird. | Lihui Liu | 02.10.2022 | Junjie Lyu | 02.10.2022 |
5 | Der Laptop muss die Lautstärke vom Video zunehmen, Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 25-40cm erfasst wird. | Lihui Liu | 02.10.2022 | Junjie Lyu | 02.10.2022 |
6 | Der Laptop muss in das letzte Video springen, Wenn ein Hand vom mitten Sensor in einer Entfernung zwischen 3-15cm erfasst wird. | Lihui Liu | 02.10.2022 | Junjie Lyu | 02.10.2022 |
7 | Der Laptop muss in das nächste Video springen, Wenn ein Hand vom mitten Sensor in einer Entfernung zwischen 25-40cm erfasst wird. | Lihui Liu | 02.10.2022 | Junjie Lyu | 02.10.2022 |
8 | Der Laptop muss in den Anfang des Videos springen, Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 40-50cm erfasst wird. | Lihui Liu | 02.10.2022 | Junjie Lyu | 02.10.2022 |
9 | Der Laptop muss das Videos Stumm/Widerrufung einstellen, Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 40-50cm erfasst wird. | Lihui Liu | 02.10.2022 | Junjie Lyu | 02.10.2022 |
10 | Der Laptop muss das Videos Vollbildschirm/Widerrufung einstellen, Wenn die zwei Hände vom linken und rechten Sensoren in den Entfernungen zwischen 30-50cm erfasst wird. | Lihui Liu | 02.10.2022 | Junjie Lyu | 02.10.2022 |
Funktionaler Systementwurf/Technischer Systementwurf
Die Abb. 2 und 3 stellen einen funktionalen Systementwurf dar, mit dem die Zuschauer beim Video durch Handgesten die Lautstärke ändern oder vor-/rückwärtsspulen können. Auf dem Monitor werden drei Ultraschallsensoren angelegt, mit denen die Entfernung zwischen Monitor und Hand erfasst wird. Die Messsdaten werden über die serielle Schnittstelle (USB) an den Computer gesendet und mittels der Python Module pyautogui und pyserial mit dem Video player verknüpft.
-
Abbildung 2: Systementwurf - Projektskizze
-
Abbildung 3: Systementwurf - Signalfluss
Komponentenspezifikation
ID | Komponente | Eingänge | Ausgänge | Aufgabe | Art der Komponente |
---|---|---|---|---|---|
01 | Mikroprozessor | Signale des Sensors | Durchführung der entsprechenden Aktionen | Steuerung der Komponenten und Signale | Hardware |
02 | Ultraschall Sensor | Spannungsversorgung | Distanz von Händen | Messen der Distanz von den Händen | Hardware |
Umsetzung (HW/SW)
Hardware
Alle verwendeten Hardwarekomponenten können in der Stückliste in Tabelle 3 eingesehen werden.
Stückliste
ID | Anzahl | Kosten pro Stück € | Summe | Bezeichnung / Komponente | technische Bezeichnung | Abbildung |
---|---|---|---|---|---|---|
1 | 3x | 3,20 € | 9,60 € | Ultraschallsensoren | HY-SRF04 [1] | |
2 | 1x | 37,39€ | 37,39€ | Mikrocontroller | Arduino UNO R3 [2] | |
3 | 1x | 0,00€ | 0,00€ | Breadboard, Jumperkabel | Breadboard [3], Jumperkabel |
Verdrahtungsplan
Programmierung
Programmablaufpläne
Die nachfolgenden Programmablaufpläne veranschaulichen die Struktur des Programmcodes. Auf der linken Seite stellt Programmablauf im Arduino und rechte Seite im dar.
Arduino PAP | Python PAP |
---|---|
Programmcode
Der Code dient zur Realisierung der Steuerung des Computers durch Handgesten mit Arduino Uno
/**************************************************************\ * * Modul : Arduino_SteuerungdesComputerdurchHandgesten.ino * * Datum : 28. November 2022 * * Beschreibung : zur Realisierung der Steuerung des Computers * durch Handgesten mit Arduino Uno * * Implementierung : Arduino1.8.17 * * Autor : Lihui,Liu; Junjie,Lyu * * Bemerkung : Bereit zur Durchführung * * Letzte Änderung : 08. Januar 2023 * \************************************************************/ /**Variablen definieren**/ const int trigger1 = 2; //Trigger pin von 1. Sesnor (links) const int echo1 = 3; //Echo pin von 1. Sesnor (links) const int trigger2 = 4; //Trigger pin von 2. Sesnor (mitten) const int echo2 = 5;//Echo pin von 2. Sesnor (mitten) const int trigger3 = 6; //Trigger pin von 2. Sesnor (rechts) const int echo3 = 7;//Echo pin von 2. Sesnor (rechts) long Zeit; int dist,distL,distM,distR; /**Pin-Zustand Definieren**/ void setup() { Serial.begin(9600); pinMode(trigger1, OUTPUT); pinMode(echo1, INPUT); pinMode(trigger2, OUTPUT); pinMode(echo2, INPUT); pinMode(trigger3, OUTPUT); pinMode(echo3, INPUT); } /***********************************************************\ * * Funktion : Berechnung_Distanz(int trigger, int echo) * * Beschreibung der Funktion : * Basierend auf das Funktionsprinzip des Ultraschallsensors * * Eingangsparameter : * int trigger,int echo * * Übergebeparameter : * long Zeit * * Rückgabeparameter : * int dist \***********************************************************/ void Berechnung_Distanz(int trigger, int echo) { digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); Zeit = pulseIn(echo, HIGH); dist= Zeit*0.034/2; if (dist>50) dist = 50; } void loop() { // Distanz Messung Berechnung_Distanz(trigger1,echo1); distL =dist; //Distanz zwischen Hand und links Sensor Berechnung_Distanz(trigger2,echo2); distM =dist; //Distanz zwischen Hand und mitten Sensor Berechnung_Distanz(trigger3,echo3); distR =dist; //Distanz zwischen Hand und rechts Sensor //Funktion 1: Pause/laufen if ((distM >40 && distM<50)) // mitten Sensor (40 50) {Serial.println("Pause/laufen"); delay (500);} //Funktion 8: Rücksprung am t = 0s if ((distL>40&& distL<50)) // links Sensor (40 50) {Serial.println("Suche");delay(500);} //Funktion 9: Stumm/Widerrufung if ((distR >40 && distR<50)) // rechts Sensor (40 50) {Serial.println("Stumm/Widerrufung"); delay(500);} //Funktion 10:Vollbildschirm/Widerrufung if ((distL >30 && distL<50)&&(distR >30 && distR<50)) {Serial.println("Vollbildschirm/Widerrufung"); delay(500);} // Distanz Messung Berechnung_Distanz(trigger1,echo1); distL =dist; //Distanz zwischen Hand und links Sensor Berechnung_Distanz(trigger2,echo2); distM =dist; //Distanz zwischen Hand und mitten Sensor Berechnung_Distanz(trigger3,echo3); distR =dist; //Distanz zwischen Hand und rechts Sensor //Funtion 2 und 3: Rückspulen und Vorspulen if (distL>=15 && distL<=25) { delay(100); //Hand halten zeit Berechnung_Distanz(trigger1,echo1); distL =dist; if (distL>=15 && distL<=25) { Serial.println("links Locked"); while(distL<=40) { Berechnung_Distanz(trigger1,echo1); distL =dist; if (distL<15) //Hand vorne schieben {Serial.println ("Rückspulen"); delay (300);} if (distL>25) //Hand hinter schieben {Serial.println ("Vorspulen"); delay (300);} } } } //Funktion 4 und 5: leiser und lauter if (distR>=15 && distR<=25) { delay(100); //Hand halten Zeit Berechnung_Distanz(trigger3,echo3); distR =dist; if (distR>=15 && distR<=25) { Serial.println("rechts Locked"); while(distR<=40) { Berechnung_Distanz(trigger3,echo3); distR =dist; if (distR<15) //rechts Hand nach vorne schieben {Serial.println ("leiser"); delay (300);} if (distR>25) //rehcts Hand nach hinter schieben {Serial.println ("lauter"); delay (300);} } } } //Funktion 6 und 7: L. Video und N. Video if (distM>=15 && distM<=25) { delay(100); Berechnung_Distanz(trigger2,echo2); distM =dist; if (distM>=15 && distM<=25) { Serial.println("Mitten Locked"); while(distM<=40) { Berechnung_Distanz(trigger2,echo2); distM =dist; if (distM<15) //Right hand pushed in {Serial.println ("L. Video"); delay (300);} if (distM>25) //Right hand pulled out {Serial.println ("N. Video"); delay (300);} } } } delay(200); }
Der Code dient zur Realisierung der Steuerung des Computers durch Handgesten mit Python
############################################################## # # Modul : Python_SteuerungdesComputerdurchHandgesten.py # # Datum : 03. Dezember 2022 # # Beschreibung : zur Verknüpfung zwischen Arduino und # Video-Spieler-Software # # Implementierung : Pycharm 02.2022 # # Autor : Lihui,Liu; Junjie,Lyu # # Bemerkung : bereit zur Durchführung # # Letzte Änderung : 08. Januar 2023 # ############################################################## import serial # Seriell importiert für serielle Kommunikation import time # Erforderlich für die Verwendung von Verzögerungsfunktionen import pyautogui Arduino_Serial = serial.Serial('com4', 9600) time.sleep(2) # wait for 2 seconds for the communication to get established while 1 : incoming_data = str(Arduino_Serial.readline()) # liest die seriellen Daten und druckt sie als Zeile print(incoming_data) if 'Pause/laufen' in incoming_data: pyautogui.typewrite(['space'], 0.2) if 'Rückspulen' in incoming_data: pyautogui.hotkey('left') if 'Vorspulen' in incoming_data: pyautogui.hotkey('right') if 'leiser' in incoming_data: pyautogui.hotkey('down') if 'lauter' in incoming_data: pyautogui.hotkey('up') if 'L. Video' in incoming_data: pyautogui.hotkey('shift','p') if 'N. Video' in incoming_data: pyautogui.hotkey('shift','n') if 'Suche' in incoming_data: pyautogui.hotkey('/') if 'Stumm/Widerrufung' in incoming_data: pyautogui.hotkey('m') if 'Vollbildschirm/Widerrufung' in incoming_data: pyautogui.hotkey('f') incoming = "";
Aufbau
Die folgenden Abbildungen zeigt die Stirn- und Rückseite des Aufbaus. Auf der Rückseite sind 3 Ultraschallsensor auf dem oberen Seite des Laptops zu sehen. Während die Stirnseite sind mit Arduino und Breadboard zu verbinden.
Sensorik
Die Sensorik erfasst die Messwerte und bildet somit die Berechnungsgrundlage der Ausgangsvariablen des Mikrocontrollers. Der Ultraschallsensor strahlt zyklisch einen kurzen, hochfrequenten Schallimpuls aus. Dieser pflanzt sich mit Schallgeschwindigkeit in der Luft fort. Wenn der Ultraschall Sensor auf das Hand trifft, wird er dort reflektiert und gelangt als Echo zurück. Die verwendete 3 Sensoren sind Ultraschall Sensor HC SR04. Sie dienen zur Ermittlung der Abstandswerte zwischen der Hände. Arduino liest diese Werte ab und basierend auf diesem Abstandswerte werden die bestimmte Aktionen ausgeführt.
Komponententest
Nr. | Komponente | Erwartete Funktion | Ergebnis |
---|---|---|---|
1 | Arduino Uno | LED on Board leuchtet | LED on Board leuchtet |
2 | Sensor (links) | Objekt von Distanz zwischen 3-60 erkennen | Objekt von Distanz zwischen 3-60 erkennen |
3 | Sensor (mitten) | Objekt von Distanz zwischen 3-60 erkennen | Objekt von Distanz zwischen 3-60 erkennen |
4 | Sensor (rechts) | Objekt von Distanz zwischen 3-60 erkennen | Objekt von Distanz zwischen 3-60 erkennen |
Ergebnis
Das Projekt konnte erfolgreich durchgeführt werden und wir konnten alle gesetzten Anforderungen erreichen. Eine Überprüfung der einzelnen Anforderungen aus Tabelle 1 lässt sich in Tabelle 5 einsehen.
Anforderungs-ID | Testinhalt | Testergebnis |
---|---|---|
001 | Wenn ein Hande vom mittleren Sensor in einer Entfernung zwischen 40-50cm erfasst wird, kann der Laptop das Video abspielen/angehalten. | erfolgreich |
002 | Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 3-15cm erfasst wird, kann der Laptop das Video rückspulen. | erfolgreich |
003 | Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 25-40cm erfasst wird, kann der Laptop das Video vorspulen. | erfolgreich |
004 | Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 3-15cm erfasst wird, kann der Laptop die Lautstärke vom Video abnehmen. | erfolgreich |
005 | Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 25-40cm erfasst wird, kann der Laptop die Lautstärke vom Video zunehmen. | erfolgreich |
006 | Wenn ein Hand vom mitten Sensor in einer Entfernung zwischen 3-15cm erfasst wird, kann der Laptop in das letzte Video springen. | erfolgreich |
007 | Wenn ein Hand vom mitten Sensor in einer Entfernung zwischen 25-40cm erfasst wird, kann der Laptop in das nächste Video springen. | erfolgreich |
008 | Wenn ein Hand vom linken Sensor in einer Entfernung zwischen 40-50cm erfasst wird, kann der Laptop in den Anfang des Videos springen. | erfolgreich |
009 | Wenn ein Hand vom rechten Sensor in einer Entfernung zwischen 40-50cm erfasst wird, kann der Laptop das Videos Stumm/Widerrufung einstellen. | erfolgreich |
010 | Wenn die zwei Hände vom linken und rechten Sensoren in den Entfernungen zwischen 30-50cm erfasst wird, kann der Laptop das Videos Vollbildschirm/Widerrufung einstellen. | erfolgreich |
Zusammenfassung
Das Projekt Steuerung des Computers durch Handgesten mit Arduino wurde erfolgreich umgesetzt. Ziel des Projekts war HMI zu entwickeln, welche die Objekt der Distanzen erfasst,entsprechend Viodeo-Player durch Handgesten steuern. werden.
Lessons Learned
Im Rahmen dieses Projekts wurden die wissenschaftlichen Vorgehensweisen für die Projektentwicklung wiederholt und vertieft. Dazu gehören die Projektplanung, das Zeitmanagement, die Projektdokumentation und eine kollaborative Teamarbeit. Mittlerweile wurden mit den Arbeitswerkzeugen wie Fritzing, GanttProjekt und PAP-Designer vertraut. Außerdem wurden die Erkenntnisse von Sensoren und Mikrocontroller in Praxis umgesetzt werden.
Projektunterlagen
Dem ZIP-Archiv sowie dem SVN Ordner können die relevanten Projektunterlagen entnommen werden.
Projektplan
Projektdurchführung
Zu Beginn haben wir die Sensoren und Arduino sowie Breadboard und Jump Kabel bestellt. Nach dem Einsetzen der entsprechenden Bibliothek und werden die in Anforderungen geschriebene Funktionen mit den Hotkey bestimmt. Dann war die Implementierung mit Arduino und Python. Abschließend war der Test mit dem YouTube Videos
YouTube Video
Weblinks
Literatur
→ zurück zur Übersicht: WS 21/22: Angewandte Elektrotechnik (BSE)
- ↑ https://www.amazon.de/AZDelivery-HC-SR04-Ultraschall-Entfernungsmesser-Raspberry/dp/B072N473HD/ref=sr_1_1_sspa?keywords=ultraschallsensor&qid=1670091640&s=computers&sprefix=ultascha%2Ccomputers%2C102&sr=1-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&th=1/UHL
- ↑ https://www.amazon.de/Elegoo-Einsteigerset-Stromversorgungsmodul-Servomotor-Erweiterungsplatine/dp/B01ILR6AX4/ref=sr_1_1_sspa?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=2YSD9XEOFZF0B&keywords=arduino+uno&qid=1670089926&sprefix=arduino+uno%2Caps%2C112&sr=8-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1/UHL
- ↑ https://www.amazon.de/Elegoo-Einsteigerset-Stromversorgungsmodul-Servomotor-Erweiterungsplatine/dp/B01ILR6AX4/ref=sr_1_1_sspa?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=2YSD9XEOFZF0B&keywords=arduino+uno&qid=1670089926&sprefix=arduino+uno%2Caps%2C112&sr=8-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1/UHL