Steuerung des Computers durch Handgesten mit Arduino

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

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.

Abbildung 1: V-Modell 15:59, 02. Okt. 2022 Quelle:[1]

Anforderungen

Tabelle 1: Anforderungen an das System
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.

Komponentenspezifikation

Tabelle 2: 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

Tabelle 3: Stückliste
ID Anzahl Kosten pro Stück € Summe Bezeichnung / Komponente technische Bezeichnung Abbildung
1 3x 3,20 € 9,60 € Ultraschallsensoren HY-SRF04 [1]
Ultraschallsensor HC-SR04
2 1x 37,39€ 37,39€ Mikrocontroller Arduino UNO R3 [2]
Arduino Uno Board
3 1x 0,00€ 0,00€ Breadboard, Jumperkabel Breadboard [3], Jumperkabel
Breadboard

Verdrahtungsplan

Abbildung 4: 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
Abbildung 5: Arduino PAP
Abbildung 6:Python PAP.png

Programmcode

Der Code für den ESP8266 01 wurde auf Plattform Visual Studio Code entwickelt.

/**********************************************************************
%                    Hochschule Hamm-Lippstadt                        *
%**********************************************************************
% Modul           : WIFIDashboard.INO                                 *
%                                                                     *
% Datum           : 01. Dezember 2022                                 *
%                                                                     *
% Funktion        : WIFI Dashboard für das Projekt Regelung des       *
%                   Radschlupfes eines Modellautos                    *
%                                                                     *
% Implementation  : Arduino 1.8.19                                    *
%                                                                     *
% Autor           : Lukas Honerlage                                   *
%                                                                     *
% Bemerkung       :                                                   *
%                                                                     *
% Letzte Änderung : 23. Dezember 2022                                 *
%                                                                     *
%*********************************************************************/




// Libraries einbinden 
  #include <Arduino.h>
  #include <ESP8266WiFi.h>
  #include <ESPAsyncWebServer.h>
  #include <FS.h>



//Wlan Daten
const char* ssid = "**********";
const char* password = "*****************";


//Funktion um den String zu trennen
String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = { 0, -1};
  int maxIndex = data.length()-1;
  for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
      found++;
      strIndex[0] = strIndex[1]+1;
      strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  }
  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}


AsyncWebServer server(80);

//Variablen anlegen 
String Loeschen = "0";
String Drehzahl_1 = "1";
String Drehzahl_2 = "2";
String Stellgroesse  = "3";
String P = "14";
String I = "15";
String Steuerung = "0";


char Byte;              // Byte einlesen
bool Strf =0;           //Nach kompletter Übergabe String den Variablen zuordnen 
static char buffer[64]; //Speicher reservieren 
char pos = 0;           //Zähler für Postion im Array


// Funktionen für zur Übergabe der Zeichenketten an die HTML-Seite    
String eins() { return String(Drehzahl_1);};
String zwei() { return String(Drehzahl_2);};
String drei() { return String(Stellgroesse);};
String vier() { return String(P);};
String fuenf() { return String(I);};
String sechs() { return String(Steuerung);};
String sieben() { String data = "{\"P\":\""+String(P)+"\", \"I\":\""+ String(I) +"\", \"Steuerung\":\""+ String(Steuerung) +"\"}"; 
                  return String(data);};

void setup(){
  // Serial port für die Kommunikation
  Serial.begin(57600);

  // Initialize SPIFFS
  if(!SPIFFS.begin()){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }


  // Print IP Adresse
  Serial.println(WiFi.localIP());


  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/index.html");
  });
  server.on("/drehzahlvorne", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", eins().c_str());
  });
  server.on("/drehzahlhinten", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", zwei().c_str());
  });
  server.on("/stellgroesse", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", drei().c_str());
  });
  server.on("/readADC", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", sieben().c_str());
  });
  // Start server
  server.begin();
}


 
void loop() {


  // Zeichen einlesen und in buffer Speichern    
  if (Serial.available()) {
      Byte = Serial.read();    
      if(Byte == 'F') Strf = true;
      else if(Byte == 'A') pos = 0;  
      else 
      { 
        buffer[pos++] = Byte;
      };
    
    };

    // String auf die Variablen aufteilen 
    // String bei \n trennen 
    if(Strf == true){

    Loeschen = getValue(buffer, 'A', 1);   
    Drehzahl_1 = getValue(buffer, '\n', 1);   
    Drehzahl_2 = getValue(buffer, '\n', 2);
    Stellgroesse  = getValue(buffer, '\n', 3);
    P = String(getValue(buffer, '\n', 4));
    I = String(getValue(buffer, '\n', 5));
    Steuerung = String(getValue(buffer, '\n', 6));

    //Entfernen unerwünschter Zeichen   
    P.trim();
    I.trim();
    Steuerung.trim();
      
    Serial.println(Drehzahl_1);
    Serial.println(Drehzahl_2);
    Serial.println(Stellgroesse);
    Serial.println(P);
    Serial.println(I);
    Serial.println(Steuerung);
       
    Strf = false;
  } 

   
}  

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.

Abbildung 7: Rückseite
Abbildung 8: Stirnseite


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 LEDs Die LEDs sollen leuchten. Die LEDs leuchten.
2 Peltier-Element Das Peltier-Element soll warm werden und als Heizung dienen. Beim anschließen des Peltier-Element wird dieses warm.
3 LCD-Display Das Display soll verschiedene Werte anzeigen können. Das Display kann beliebige Texte oder Werte der Sensoren anzeigen.
4 DHT11 Sensor Der Sensor soll die Temperatur und die Luftfeuchtigkeit messen. Der Sensor reagiert auf Körperwärme oder den "feuchten" Atem.
5 Helligkeitssensor Der Helligkeitssensor soll den Lichteinfall messen. Der Sensor reagiert auf Licht bzw. das Abdunkeln durch die Hand.
6 Taster Der Taster soll ein "durchschalten" des Displays ermöglichen. Der Tasterdruck wird erkannt und kann mitgezählt werden.
7 Lüfter Der Lüfter soll sich drehen. Der Lüfter kann angesteuert werden. Allerdings beeinflusst dieser die gemessene Luftfeuchtigkeit nicht.

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.

Tabelle 5: Überprüfung der formulierten Anforderungen
Anforderungs-ID Testinhalt Testergebnis
001 Wenn die beide Hände in einer bestimmten Entfernung vor dem mittleren Sensor gehalten werden, sollte das Video abgespielt/angehalten werden. erfolgreich
002 Wenn der Hand in einem bestimmten Abstand vor dem rechten Sensor platziert wird, sollte das Video einen Schritt vorwärts laufen. erfolgreich
003 Wenn der Hand in einer bestimmten Entfernung vor dem linken Sensor platziert wird, sollte das Video um einen Schritt zurückgespult werden. erfolgreich
004 Wenn der Hand in einem bestimmten Nahbereich vor dem rechten Sensor platziert wird und dann in Richtung des Sensors bewegt wird, sollte das Video vorgespult werden, und wenn es wegbewegt wird, sollte das Video zurückgespult werden. erfolgreich
005 Wenn der Hand in einem bestimmten Nahbereich vor dem linken Sensor platziert wird und dann in Richtung des Sensors bewegt wird, sollte die Lautstärke des Videos zunehmen und wenn sie wegbewegt wird, sollte die Lautstärke abnehmen. erfolgreich
006 Wenn die beide Hände in einer bestimmten Entfernung vor den mittleren Sensor gehalten werden, sollte das Video Vollbildschirm sein. erfolgreich
007 Wenn der Hand in einer bestimmten Entfernung vor dem rechten Sensor platziert wird, sollte das Video stumm oder widerrufen werden. erfolgreich
008 Wenn der Hand in einer bestimmten Entfernung vor dem mittleren Sensor platziert wird, sollte das letztes oder nächstes Video abgespielt werden. erfolgreich

Zusammenfassung

Lessons Learned

Projektunterlagen

Projektplan

Abbildung 9: ProjektPlan_GETPraktikum


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)