EM2017SSP06

Aus Verteilte Systeme - Wiki
Wechseln zu: Navigation, Suche

Projektbeschreibung

Einleitung

Im Rahmen dieses Projekts wird Musik analysiert und damit ein System aus Hue Lights angesteuert. Das Projekt wird durchgeführt im Fach Embedded Systems an der Hochschule Rhein-Main. Es ist als Einzelarbeit ausgelegt und spiegelt 10 Creditpoints des 4.Semesters im Rahmen des Bachelorstudiums Angewandte Informatik wieder. Als Platform auf der entwickelt wird, wird ein Smartphone mit min. Android 6.0.1 Marshmallow (Release:7.12.2015, API Level 23) verwendet - nachfolgend mit einem Samsung Galaxy S7 oder Emulator - und gesteuert über eine App. Als Software und Entwicklungsumgebung wird Android Studio 1.5.1 benutzt.

Projektziele

Zum abschluss des Projektes sollen akustische Informationen (insbsonders Musik) so analysiert und aufbereitet werden, dass Hörern ein dem momentanen Charakteristika der akustischen Informationen angepasstes Lichtszenario präsentiert werden kann.

1. Einrichtung der Zielumgebung

2. Vertraut machen mit der Ansteuerung eines Phillips Hue Systems

3. Anforderungen analysieren und dokumentieren

4. Wichtige akustische Kennwerte festlegen

5. Recherche zu bisher verfügbaren Bibliotheken zur Soundanalyse

6. Konzept zur Lösung überlegen

7. Festlegen welche Kennwerte welche Aktion bei den Lampen auslöst

8. Implementierung

9. Fallstudio über Nutzbarkeit aufstellen

10. Abschliessend Fazit ziehen und Ergebnisse darstellen

Projektaufbau

Für die Umsetzung des Projektes kann entweder ein Raspberry Pi oder ein Androidfähiges Smartphone benutzt werden. Im nachfolgendem benutze ich als Zielplatform ein Samsung Galaxy S7 mit derAndroid Version 7.0.

App Bedienoberfläche

Zur Lichtsteuerung nutze ich ein Phillips Hue System das ich ursprünglich mit JSON-Pakete angesteuert habe (siehe früheren Vorträge). Nachfolgend habe ich das APK der Phillips Hue Developer Seite[1] benutzt


Zur Entwicklung nutze ich Android Studio und programmiere "Java for Android" und xml.

-> Codebeispiel <-

Hardware

Ursprünglich

Phillips Hue Lights:

Zur Ansteuerung werden Befehle in Form von JSON an folgende Adresse geschickt: http://<bridge IP address>/api. Befehle können folgende sein:

 /lights resource which contains all the light resources
 /groups resource which contains all the groups
 /config resource which contains all the configuration items
 /schedules which contains all the schedules
 /scenes which contains all the scenes
 /sensors which contains all the sensors
 /rules which contains all the rules

(Entnommen von: https://developers.meethue.com/documentation/core-concepts)

Werte für die Lichter Zur Lichtdarstellung werden folgende Parameter benötigt:

 Hue: Farbton (von 0 bis 65535)
 Satturation: Sätigung der Farbe (0 bis 254)
 Brightness: Helligkeit (0 bis 254)

Farbton 0 entspricht beispielsweise rot, 12750 gelb und 46920 blau (vergleiche HLS bzw. CIE color space).

Letzliche Finale Ansteuerung

Zur Ansteuerung benutze ich das SDK das vom Entwickler publiziert wird. Damit ist es einfacher auf eine Reihe von Rückgabe werte adäquat zu reagieren. Hierzu werden einige Funktionen geliefert mit deren Hilfe die Lichter oder die Bridge angesteuert werden kann. Zusätzlich werden noch ein sog. PHSDKListener und ein sog. PHLightListener mitgeliefert. Hiermit kann darauf reagiert werden was passiert bei Erfolg, Fehlern, Errors, bei gefundener Bridge etc. Der PHSDKListener hört hierbei auf alles was die Verbindung zur Bridge angeht: onAccessPointsFound, onCacheUpdated, onBridgeConnected, onAuthenticationRequired, etc..

Software

Als Software wird lediglich Android Studio benutzt.

Android Studio Oberfläche



















Hintergrund

Bei Audioerkennung soll das Licht sich der Musik anpassen und ein harmonisches Gesamtbild erzeugen. Dafür wird ein analoges Eingangssignal genommen und zyklisch wird der Dezibel Ausschlag abgetastet. Daraus soll ein ungefähres Abbild der Geschwindigkeit erzeugt werden. Spezielle Funktionen zur Berechnung des BPM(Beats per Minutes) sind implementiert und ergeben so durch dividieren durch 60 die Ausschläge pro Sekunde. Um nun zu wissen wann das Licht sich ändern soll, rechnen wir 1000/BPM/60. Damit erhalten wir die Millisekunden die wir warten müssen zur nächsten zyklischen veränderung.

Algorithmische Implementierung

Implementationshierarchie

Als verbindung zum SDK wird die Klasse "LibReference.java" benutzt darüber kann sowohl die Verbindung herrgestellt werden, als auch auf rückmeldungen mithilfe der Listener reagiert werden. Zudem kann über die folgenden public Attribute darauf reagieren (wenn darauf in der Überklasse reagiert werden soll, werden zyklisch diese über einen Timer überprüft):

   boolean setupDone                ;
   boolean bridgeconnected          ;
   boolean AuthentificationRequired ;
   boolean connectionLost           ;
   boolean onError                  ;

Zusätzlich existiert in der Klasse LibReference zusätzlich noch einenbPHLightListener und ein PHSDKListener. Ersteres reagiert je Licht auf alle Zustände wie:

onSuccess
onStateUpdate
onError
onReceivingLightDetails
onReceivingLights
onSearchComplete

Der PHSDKListener hört aufs gesamte SDK, die Verbindung zum AccessPoint (Ap), der Bridge etc. Folgende Functionen sind dort vorhanden

onAccessPointsFound
onCacheUpdated
onBridgeConnected
onAuthenticationRequired
onConnectionResumed
onConnectionLost
onError
onParsingErrors

Eine Verbindung kann entweder herrgestellt wereden mit gespeicherten Attributen, die aus einer lokal gespeicherten Datei gelesen und geschrieben werden können, mithilfe der Funktion newOldAccessPoint() oder eine neue Verbindung kann initalisiert werden mithife von SearchForBridges() wobei bei gefundener Verbindung diese direkt aufgebaut wird und die Attribute in die lokal gespeicherte Datei geschrieben wird. Wenn eine Authentifizierung nötig ist (im allgemeinem beim initalisieren einer neuen Verbindung) wird jeweils in der Überklasse ein Toast mit der Anweisung gemacht das der Push Link Button gedrückt werden soll. DieFunktion phHueSDK.startPushlinkAuthentication(AccessPoint accessPoint) startet die durchführung. Bei erfolgreicher durchführung wird sich verbunden. Bei fehlerhafter durchführung bspw. durch drücken nach 60 Sekunden muss der vorgang wiederholt werden.



Beats berechnung

Zur Geschwindigkeitsberechnung wurde u.a. folgendes Interpretiert.

public void bpm(){

       int posi=0;
       long wert;
       //Werte werden eingereiht und bei einem ausschlag von über 1.3fache wird dies al beat gewertet min 3 schlagwellen sollen vorhanden sein
       if (recorder != null && seconds!=0) {
           energyBuffer.offer(wert = mRecorder.getMaxAmplitude());
           samples++;
           if (energyBuffer.size() > bufferLength) {
               energyBuffer.poll();
               double averageEnergy = 0;
               for (long l : energyBuffer)
                   averageEnergy += l;
               averageEnergy /= bufferLength;
               double C = 1.3;
               boolean beat = wert > C * averageEnergy;
               if (beat) {
                   count++;
                   if (++beatTriggers == beatThreshold)
                       beats++;
               } else {
                   beatTriggers = 0;
               }


               if (samples > frequency * 5 / sampleSize) {
                   bpmList.add(getInstantBPM());
                   beats = 0;
                   samples = 0;
               }
           }
       }
   }

Dabei beherbergt energyBuffer alle Abtastwerte und die bpmListe alle Ausschläge. Zunächst werden soviele Werte gesammelt bis die bufferlength überschritten ist, dann wird darüber itteriert und ein Mittelwert errechnet. Wenn nun der Auschlag mehr als 30% größer ist als der Mittelwert, wird geschaut ob der beatTriggers Wert gleich dem beatThreshold ist. Dies soll verhindern das bei einer zu schnellen abtastrate ausschläge mehrfach gezählt werden. Letztlich werden erfolgreiche Beats der bpmListe hinzugefügt.

Fazit

Als Fazit des Projekts lässt sich schließen, dass das Projekt vollständig umgesetzt wurde, dennoch einige Sachen erreicht hätte werden können, die auch Seminarthema waren. So hätte zum Beispiel eine Filterung und Fouriertransformation genutzt werden können, um Bässe, Höhen oder Tiefen zu analysieren und darauf zu reagieren.

Allgemein lässt sich aber sagen, dass das Projekt funktioniert und intuitiv zu bedienen ist. So wie es aktuell funktioniert, ist es einfach zu bedienen das Ergebnis zufriedenstellend und kaum Fehleranfällig.

Erreichte Ziele

Modus 1: Harmonische Reaktion auf Peaks in der Musiklautstärke(Musik ändert sich bei jedem Ausschlag siehe Codebeispiel) Modus 2: Modus 1 + Sättigung errechnet sich aus Gesamtmittel der Lautstärke Modus 3: „Party Modus“ optionaler Ausarbeitungspunkt Ausserdem eine Testingactivity, in der man Parameter wie Helligkeit, Sättigung und Farbton selber einstellen kann.

Fallstudie

Die Fallstudie wurde zum Ende des Projekts durchgeführt. Dazu haben mehrere Testpersonen die Intuitivität der App und die genauigkeit der Farbänderung am System getestet. Das Ergebnis daraus war weitgehenst positiv, lediglich eine Aufforderung beim Start das Setup auszuführen wurde gwünscht. Auch bei unterschiedlichen Testumgebungen was Lautstärke, Umgebungsgeräusche und Bässe anging war sehr positiv.

Aufgefallen ist das es keine Rückmeldung gibt wenn man sich im falschem Netzt befindet oder die Bridge offline/aus ist, ein Lösungsansatz mithilfe des SDK konnte ich leider nicht finden, dennoch wird dies in den seltesten Fällen vorkommen, da der Anwendungsfall im eigenem Haus liegt und dort meist nur ein Netz verfügbar ist. Zudem wird man wohl auch daran denken die Bridge einzuschalten.


In weiteren Tests wurde ebenfalls noch die Ausfallsicherheit überprüft. Getestet wurden im Detail der Ausfall des WLANs, was dazu führt, das eine Verbindung neu aufgebaut werden muss, da dies lediglich einige Sekunden in Anspruch nimmt wurde dies nicht debuggt.


Anleitung, Dokumente und Quellen

Anleitung zur Bedienung wurde in der Abschlussdemonstration gegeben. Beim initalisieren eines neuen Systems oder eines System das zwischenzeitlich aus war, muss zu Beginn Setup gedrückt werden und letzlich die Taste gedrückt werden um eine einmalige Authetifizierung zu haben. Danach kann frei in der App navigiert werden. Unter testing können Werte eingegeben werden dieim zulässigen angegebenen Bereich befinden und die jeweiligen Modien brauche ca. eine 7 sekündliche Startsequenz nach drücken des Buttons.

Alle gebrauchten Bilder und Dokumente für die Ausarbeitung sind hier zu finden: Datei:Dokumente und Dateien.zip

Hilfreich für die Ausarbeitung war vor allem die Developer Seite von Philips die unter meethue.com[2] zu finden ist.

Vorträge und Präsentationen


Seminarvortrag über das Thema "Konzepte und Beispiele für digitale Signalverarbeitung mit Fokus Audiodaten"

  • Vortragsfolien exklusiv Tafelanschreibe

Datei:SeminarthemaLicht885.pdf

  • Handout

Datei:HandoutLicht885.odt

Alle anderen per Email o.ä. geliefert

Quellcode

Datei:Code885.zip