Day by Day
(EN google-translate)
(PL google-translate)
Nachfolgend wird chronologisch verzeichnet, welche Inhalte in den Einzellehrveranstaltungen im Entwurf fehlertoleranter Software für eingebettete Echtzeitsysteme für den Master Maschinenbau im Wintersemester 2021/22 behandelt wurden.
#1 Dienstag 28.09.2021
Einführung: Welche Eigenschaften sollte ein engebettetes Echtzeitsystem haben?
|
Echtzeit im Sinne von "zeitlich korrekt": 67_Echtzeitsysteme/01_Einfuehrung/02_Korrektheit #aeint 67_Echtzeitsysteme/01_Einfuehrung/03_Hardware 67_Echtzeitsysteme/01_Einfuehrung/03_Hardware Hardware-Plattformen: 67_Echtzeitsysteme/01_Einfuehrung/03_Hardware
State-machine / Zustandsmmaschine: 67_Echtzeitsysteme/12_Zustandsmaschine
Einführung: Was sind Voraussetzungen für die effiziente Entwicklung engebetteter Echtzeitsysteme?
|
Beispiele eingebetteter Echtzeitsysteme (Prototypen / Funktionsstudien aus vergangenen Lehrveranstaltungen)
15_Einachser -- Einachser auf kramann.infoElektrokutsche, Personenkutschfahrt auf kramann.info
Physikalische Echtzeitsimulation einer mechanischen Rassel mit einem Smartphone
Vernetztes Smartphone zur Steuerung einer Elektromechanischen melodischen Trommel
KIBA (Kamerasystem segmentiert Spielchips auf Leuchttisch, absolute Positionen werden als Tonereignis in einer zyklischen Phrase interpretiert)
Lichtharfe: Handpositionen der Benutzer erzeugen Klangereignisse
Masken: elektronische Skulpturen
mechatronical_mantra.mp4
Beispiele eingebetteter Echtzeitsysteme (Professionelle Produkte)
|
"Rocket Lab"
Teil 1: Überblick zum Ablauf des Kurses
|
Teil 2: Einblick in die drei Bereiche: Begriff der Lebenswelt, Fehlertoleranter Software-Entwurf, Java-Programmierung
kramann.info/kaleidophoneTeil 3: Entwicklung einer Wasserwaage auf der Grundlage eines Android-Devices
processing.org -- Bitte laden Sie sich die Java-Entwicklungsumgebung Processing herunter und installieren se
|
#1 Dienstag 05.10.2021
TEIL 1: Theorie -- Einführung in die Software-Muster für fehlertoleranten Software-Entwurf
81_FTSD (Einführendes Beispiel)81_FTSD/05_Fehlertoleranz (Übersicht der Muster)
81_FTSD/06_Seriell_Audio/06_Fehlertoleranz (Hinweise zu einer sauberen Codierung)
TEIL 2: Praxis -- Gemeinsame Umsetzung einer Android-App, die als Wasserwaage funktioniert
FRAGEN
|
78_Processing (Einführung in Processing))
93_Android_Proc (Einführung zu Android-Processing)
Im Verlauf der LV entstandene Software
Wasserwaage001.zipWasserwaage002.zip
Wasserwaage003.zip
Wasserwaage004k.zip
Wasserwaage005k.zip (bitte auf Ihr Android Device übertragen)
#3 Dienstag 12.10.2021
TEIL 1: Theorie -- Fortsetzung zur Einführung in die Software-Muster für fehlertoleranten Software-Entwurf
81_FTSD (Einführendes Beispiel)81_FTSD/05_Fehlertoleranz (Übersicht der Muster)
81_FTSD/06_Seriell_Audio/06_Fehlertoleranz (Hinweise zu einer sauberen Codierung)
|
TEIL 2: Praxis -- Fortsetzung der Einführung in Android Processing -- Erste Gehversuche ;-)
Übung
Aufgabe 1 -- Verwendung von Sensoren
Nehmen Sie sich aus der Ketai-Library die Beispiele Accelerometer und MultipleSensors vor, um zu ergründen, wie Sensordaten verschiedener Art benutzt werden können.
Achtung: Bei der Verwendung des Mikrofons, der Kamera oder Internet-Funktionalität muß bei Android->Sketch Permissions erst für die App erlaubt werden.
Prüfen Sie nach, welche Sensoren Ihr Device zur Verfügung hat.
Sprechen Sie mindestens zwei andere, als die in den Beispielen an und überprüfen die dann hereinkommenden Daten.
Aufgabe 2 -- Datenaustausch über WiFi
|
Audgabe 3 -- Android VR
Es gibt eine besondere Library um Android-Smartphones unter Verwendung einer entsprechenden Optik als VR-Brillen einsetzen zu können.
Insbesondere wird dort Headtracking auf einfache Weise bereit gestellt.
Eine Einführung und einige einführende Beispiele finden sich hier:
Um Ihre Möglichkeiten für Ihr Projekt etwas aufzuweiten, sollten Sie den Zusatz-Mode VR mit diesen Beispielen einmal ausprobieren und im Idealfall etwas variieren.
Objektorientierte Programmierung
|
#4 Dienstag 19.10.2021
Teil 1: Besprechung der Pattern Mitigation, Redundancy und Recovery-Block
Teil 2: Brainstorming und Sammlung möglicher Projektthemen und dabei denkbarer fehlertoleranter Programmstrukturen
Teil 3: Vertiefung der Programmierkenntnisse mit Processing und Processing-Android anhand von Beispiel-Snippets
Übung 1 Bilder anzeigen
Folgender Sketch zeigt, wie Bilder geladen und angezeigt werden können:
|
Hinweise:
//Laden einer Datei in ein Array, das die Zeilen der Datei dann enthält: String[] werte = loadStrings("meinedatei.txt"); //Umwandeln eines Strings in eine Zahl: double zahl = Double.parseDouble("56.5"); int z = (int)Double.parseDouble("56.5");
Code 0-1: Hinweise
Übung 2 Call-Back-Methoden
Folgender erster Sketch definiert einen quadratischen Bereich als Button.
|
Übung 3 Vernetzung / UDP
UDP ist ein gegenüber TCP/IP wesentlich schlankeres Internet-Protokoll und eignet sich gut für Streaming, aber auch dazu, Daten zwischen Geräten auszutauschen.
Installieren Sie die UDP-Library und testen das Library-Beispiel mit dem Namen "udp".
Versuchen Sie das Programm auf zwei Devices so zu verteilen, dass zuerst das eine Sender und das andere Empfänger ist und schließlich, dass sich beide Geräte wechselseitig Nachrichten schicken können.
Verwenden Sie als Zielplattformen einen PC und ein Android-Gerät.
Anstatt keyPressed() können Sie auf der Android-Seite mousePressed() verwenden und einen Wechsel der gesendeten Nachrichten mit Hilfe eine Zähler bewerkstelligen.
Übung 4 Modularisierung
Die folgende komplexe Anwendung ermöglicht den Datenaustausch diverser Geräte untereinander. Insbesondere wurde eine Klasse "Briefkasten" implementiert, die es dem Anwendungsprogrammierer ein wenig erleichtern soll, Geräte miteinander zu vernetzen.
|
Teil 4: Interfaces in Java als mögliche Methode zur Trennung zwischen Fähigkeiten und Implementierung und als Grundlage für Recovery-Blocks
Bei Recovery-Blocks kann es Sinn machen mehrere Entwicklerteams möglichst unabhängig voneinander mit der Implementierung der gleichen Programmmodule zu beauftragen.
Damit die Module auch untereinander ausgetauscht werden können, wäre ein praktischer Ansatz, Interfaces für die geforderte Funtionalität zu vereinbaren.
Dies soll hier an einem konkreten Beispiel durchgespielt werden.
Bild 0-1: Screenshot einer Warnapp, die reagiert, wenn mit der Maus die verbotene Zone betreten wird.
Vorarbeit -- Verwendung eines Interfaces, um zwei Varianten der Warnung implementieren zu können, die untereinander leicht austauschbar sind.
Vorarbeit -- 3. Implementierung mit Warnton ergänzt.
Aufgaben
|
Warnapp4_pde.zip -- Beispielhafte studentische Lösung, bei der die Zusatzwarnung durch Vibration bei einem Android-Gerät erfolgt (Processing-Android).
Nachfolgend finden Sie ergänzende Beispiele zur Verwendung von Interfaces (Schnittstellen) in Java:
30_Informatik3/15_Rasterlayout/02_interfaces -- komplexes Beispiel
30_Informatik3/07_Modifikatoren -- ergänzende Hinweise zu Modifikatioren
HAUSAUFGABE: Lesen Sie zu den Pattern Minimize Human Intervention, Maximize Human Participation, Escalation
#5 Dienstag 26.10.2021
Heute die LV läuft hybrid. Dies ist aber in Zukunft nicht möglich, weil ich Einblick in den Fortgang Ihrer Projektarbeiten erhalten muß, um Ihre Leistung in diesem Fach bewerten zu können.
Zudem sollten Sie sich bitte mit Headset anmelden, um aktiv teilnehmen zu können.
Teil 1: Ergänzende Basics zu Java
30_Informatik3/09_Java -- Vergleich zwischen Java und C++30_Informatik3/09_Java/02_GettingStarted -- Elementare Datentypen in Java und main-Methode.
Teil 2: Weitere Beispiele zur Verwendung von Sensoren mit Android-Geräten
Demonstrationen zur Verwendung von
|
Verwendung von Headtracking mit Hilfe von Android-Processing-VR:
weitere interessante Möglichkeiten:
|
CameraGettingStarted3.zip
if (cam!=null && cam.isStarted()) { cam.read(); cam.updatePixels(); cam.loadPixels(); int[] newpix = cam.pixels; if(newpix!=null) for(int i=0;i<newpix.length;i++) pix[i] = newpix[i]; ... }
Code 0-2: pixels aus Kamerabild -- Siehe beispielsweise in die Klasse CamAndroid der Library ComposingForEveryone
public void step() { int count = 0; for(int i=0;i<pix.length;i++) { int c = pixsource[i]; int RED = c >> 16 & 0xFF; int GREEN = c >> 8 & 0xFF; int BLUE = c & 0xFF; int REDCOMP = 2*RED - GREEN - BLUE; int GREENCOMP = 2*GREEN - RED - BLUE; int BLUECOMP = 2*BLUE - RED - GREEN; int YELLOWCOMP = RED+GREEN - 2*BLUE; int RC = REDCOMP; int GC = GREENCOMP; int BC = BLUECOMP; if(RC<0) RC=0; if(RC>255) RC=255; if(GC<0) GC=0; if(GC>255) GC=255; if(BC<0) BC=0; if(BC>255) BC=255; int GREYCOMP = (RC+GC+BC)/3; if(GREYCOMP<threshold) { pix[i]=0; count++; } else { if(YELLOWCOMP>BLUECOMP+YOFF && YELLOWCOMP>GREENCOMP+YOFF && YELLOWCOMP>REDCOMP+YOFF) { pix[i] = 4; } else if(BLUECOMP>YELLOWCOMP+BOFF && BLUECOMP>GREENCOMP+BOFF && BLUECOMP>REDCOMP+BOFF) { pix[i] = 3; } else if(GREENCOMP>YELLOWCOMP+GOFF && GREENCOMP>BLUECOMP+GOFF && GREENCOMP>REDCOMP+GOFF) { pix[i] = 2; } else if(REDCOMP>YELLOWCOMP+ROFF && REDCOMP>BLUECOMP+ROFF && REDCOMP>GREENCOMP+ROFF) { pix[i] = 1; } else { pix[i] = 0; count++; } } } if(successor!=null) successor.step(); }
Code 0-3: pixel in Farbanteile umwandeln -- Siehe beispielsweise in die Klasse RGBY der Library ComposingForEveryone
94_VSI/06_Erweitern/01_sprich
92_Soundinstallation/03_material/11_Snippets/05_VR_Playing_Sound/01_Soundsource_Android -- Erzeugen eines Sinustones.
Teil 3: Neben Schnittstellen stellen Exceptions ein weiteres Sprachelement von Java dar, das wir zur Implementierung fehlertoleranter Pattern nutzen wollen
|
//Selber Exceptions schreiben: public class LeereDateiException extends RuntimeException { public LeereDateiException() { super("Datei ist leer!"); } } String[] data; public void laden() throws LeereDateiException { data = loadStrings("test.txt"); if(data==null || data.length==0) throw new LeereDateiException(); } public void setup() { try { laden(); } catch(Exception e) { println(e.toString()); } }
Code 0-4: Kleines Beispiel
Übung NEU
|
//Selber Exceptions schreiben: int i=0; public class zuweitLinks extends RuntimeException { public zuweitLinks() { super("Maus zu weit links!"); } } String[] data; public void laden() throws zuweitLinks { line(mouseX, 20, mouseX, 80); if(mouseX<width/2) throw new zuweitLinks(); } public void setup() { size(1000,1000); } int ROT = 0; public void draw() { ROT = 0; try { laden(); } catch(Exception e) { i++; println(e.toString()); println(i); ROT = 255; } background(ROT, 30, 30); }
Code 0-5: Studentische Lösung.
S001 Someone in Charge -> Verantwortlicher bekommt eine Meldung per Exception und kümmert sich um den Fehler z.B. "schiebt Maus in richtige Position" S002 Minimize human interaction -> Möglich: Fehler wird durch Maschine behoben, statt durch Menschen, wenn Exception auftritt. S003 Escalation -> if else if else if else -Struktur oder ineinander geschachtelte Exceptions S004 Recovery-Blocks -> Exception... um Modul zu testen und zu reagieren, also hier ein alternatives Modul zu verwenden. Schnittstellen, um die Module zusammenzufassen S005 Software-Update -> 1. Mögl.: Redundanz, ein System herunterfahren und Code austauschen. 2. Skriptsprache verwenden, hier Code-Tausch on-the-fly möglich. 3. Klassen in Java austauschen und von der virtual Machine neu laden lassen. S006 Fault Observer -> Fehler erkennen und weiterleiten, Exception wichtiges Element dafür Konzept-Beispiel: Berichterstatter-Klasse, von der alle Exception-Klassen erben. S007 Maximize human participation -> Informationen zum Systemzusatnd auf Bildschirm beispielsweise S008 Correcting Audits -> static .. / dynamic ..
Code 0-6: Anwendbarkeit von Exception oder Schnittstellen zur Implementierung der Pattern.
Übung
Nennen Sie Anwendungsbeispiele, in denen Software-Teile vorstellbar sind, die nicht immer fehlerfrei ablaufen, aber dies auch nicht durch besseren Code behoben werden kann.
Hier folgen Verweise auf vorhandene Darstellungen zu Exceptions:
67_Echtzeitsysteme/09_Internetprogrammierung/04_Java -- Einsatz von Exceptions im Bereich Internet-Programmierung
77_Android/11_Tonerkennung/03_Java_Threads -- Thread.sleep(...) als Beispiel einer Methode im Bereich Threadding, die eine Exception auswirft.
Saalübung: Steuerung der Warnmodule mit Hilfe selbst geschriebener Exceptions
Warnapp5_TimeoutException.zip -- beispielhafte Lösung.Teil 5: Durchgang durch alle Entwurfspattern zu fehlertolerantem Software-Entwurf
In diesem Teil stellen die Studierenden die einzelnen Pattern für ihre Mitstudierenden dar. Vorab wurde vereinbart, wer für welches Pattern verantwortlich ist.
Diskutieren Sie für welche Fehlertoleranz-Pattern try-catch-Blöcke eine gute Grundlage bilden könnten.
Teil 6: Wie lassen sich die Fehlertoleranz-Pattern praktisch mit Android (Java)-Processing umsetzen?
|
#6 Dienstag 02.11.2021
Teil 1: Ergänzung zu Java: Threads
Verwendung nebenläufiger Prozesse, welche Typen es gibt und was bei ihrer Verwendung beachtet werden sollte.
77_Android/04_Threads -- Threads mit Hilfe der Schnittstelle Runnable erstellen
67_Echtzeitsysteme/02_Threads/02_Synchronisierung -- Bedeutung des Modifikators synchronized
92_Soundinstallation/03_material/11_Snippets/05_VR_Playing_Sound/01_Soundsource_Android -- Echtzeit-Thread mit ScheduledExecutorService
94_VSI/05_OSC/02_i2audiolab -- weiteres Beispiel zu Echtzeit-Thread, siehe Klasse Performance in Code 0-3.
Teil 2: Übung -- Wie lassen sich die Fehlertoleranz-Pattern praktisch mit Android (Java)-Processing umsetzen?
Beispiele mit Code-Skizzen zu jedem einzelnen Pattern als Übung:
|
Thread003.zip -- 1. Beispiel zu Thread mit Vererbung
Thread004_Runnable.zip -- 2. Beispiel mit Schnittstelle Runnable
Thread005_Echtzeit.zip -- 3. Beispiel Echtzeitprozess
Thread006_sync.zip -- 4. Beispiel: Vermeiden eines verschränkten Aufrufs einer Methode mit synchronized
#7 Dienstag 09.11.2021
Um weiter in die Praxis zu kommen, werden wir die konkrete Umsetzung der Fault-tolerant Pattern an kleinen Beispielen fortsetzen. Doch zuvor soll ein Anwendungsfall auf Fehlertoleranz-Möglichkeiten hin untersucht werden:
Während in diesem Jahr die Wahl eines Systems, das umgesetzt wird bei den Studierenden liegt, wurde in den vergangenen Jahren verlangt, dass Fehlertoleranz-Pattern in einem Sprachsynthesizer für eine in ihrer Bewegung beeinträchtigte Person entwickelt werden sollte.
Teil 1: Fehlertoleranz für bei einem Sprachsynthesizer für eine in ihren Bewegungen beeinträchtigte Person
Für eine Person mit spastischen Lähmungen, die nur ihren Kopf kontrolliert bewegen kann, soll ein Sprachsynthesizer entwickelt werden. Der soll durch Kopfbewegungen gesteuert werden: Die Person schaut mittels einer 3D-Brille (Halterung für eingesetztes Smartphone) auf eine Tafel mit Buchstaben. Das längere Anblicken eines Buchstaben, wählt diesen aus.
Sprachsynth004.zip
94_VSI/03_TTS -- einfache Version eines Android-Smartphone basierten, Kopf gesteuerten Sprachsynthesizers
94_VSI/09_Hybrid/05_Uebung -- etwas elaboriertere Version, bei der durch Blick nach rechts abgerufene Buchstaben als Wort ausgesprochen werden, aber mit Blick nach rechts die gemerkten Buchstaben wieder vergessen werden.
Ergänzende Hinweise:
https://android.processing.org/tutorials/vr_advanced/index.html -- Hinweise zu Android-Processing-VR auf processing.org "advanced"
94_VSI/06_Erweitern/01_sprich -- vereinfachte Benutzung von Text-to-Speech (TTS) durch Entwicklung einer Klasse mit der Methode "sprich(...)".
94_VSI/01_Snippets -- einführende Beispiele zu Headtracking und Android-VR
Teil 1B: Übung
Stellen Sie sich die Lebensumstände einer Person vor, die nur ihren Kopf kontrolliert bewegen kann und identifizieren Sie vor diesem Hintergrund sinnvolle Fehlertoleranz-Features für den Sprachsynthesizer. Die Ideen werden im großen Kreis diskutiert.
Teil 2: Übung 2 -- Entwicklung kleiner Beispiele zu jedem Fehlertoleranz-Pattern
Fortsetzung der Umsetzung konkreter Beispiele für Fehlertoleranz.
Wichtig: Bei der Erfindung von Anwendungsbeispielen ist es wichtig, sich in eine lebensnahe Situation zu versetzen und sich die Möglichkeiten zu vergegenwärtigen, die Smartphones mit all ihren Sensopren und ihrer Vernetzungsmöglichkeit bieten. Zur Demonstration kann eine vereinfachte Version implementiert werden, die auch auf einem PC läuft.
81_FTSD/05_Fehlertoleranz -- Variante
Im Unterricht entstandene Programme:
MultipleSensors2_licht.zip -- Smartphone als Umgebungslicht-empfindliche LampeMultipleSensors3_licht.zip -- ... mit Fehlertoleranz-Verhalten: TTS / unwirksame Lampe, weil umgedreht
#7 Dienstag 16.11.2021
Prolog: Fehlertoleranz im All, siehe Moodle
Themen:
|
Thema 1: Datenübertragung per W-LAN / Maintenance-Interface / Someone in Charge ...
Neue Technik: Hotspot auf Android-Gerät einrichten, PC dort anmelden, PC und Android-Gerät benutzen beide die Broadcast-Adresse.
Vorteile dieses Vorgehens:
|
Bild 0-2: Screenshot zur Aktivierung des W-LAN-Hotspots (keine Internetverbindung nötig, d.h. W-LAN selbst darf aus sein!)
Ein wichtiges Thema in der derzeitigen technischen Entwicklung ist IoT, also "Internet of Things".
Gebrauchsgegenständen werden neue Fähigkeiten verliehen, wenn sie in ein Funknetzwerk eingebunden und über dieses überwacht und gesteuert werden können. Besonders wichtig ist dabei, dass diese Einbindung einfach erfolgt und keiner großen Anstrengungen von Seiten des Benutzers bedarf.
Beispiel: Leuchtmittel mit integriertem W-LAN. Hier einige Anbieterseiten dazu:
https://www.highlight-web.de/3464/praktisch-led-lampe-mit-wlan-repeater/
https://de.sengled.com/de/produkte/connectivity/boost/index.html
Dabei scheinen folgende Funktionserweiterung der Leuchtmittel auf:
|
Projekt: Winkel der Smartphone-Drehung am PC visualisieren / Helligkeitsregelung ferngesteuert
In einem minimalistischen Projekt, soll einerseits der Winkel um eine der möglichen Achsen, um die ein Smartphone gedreht am PC angezeigt werden. Zum zweiten soll vom PC aus mit der Maus die Helligkeit des Bildschirmhintergrundes beim Smartphone eingestellt werden können. Das Beispielprojekt fasst verschiedene Features noch einmal zusammen, die Smartphones bieten und soll als Anregung für eigene Projektideen dienen.
Wie bereits zuvor erfolgt die Umsetzung in mehreren aufeinander aufbauenden Stufen.
Stufe 1: Helligkeit einstellen
Für den Datenaustausch über W-LAN dienen die Beispiele oscP5massage und oscP5parsing aus der Processing-Library oscP5. Diese funktioniert auf dem PC und auf dem Smartphone gleichermaßen.
ACHTUNG: Vergessen Sie nicht bei dem Sketch für das Smartphone "INTERNET" bei den Sketch-Permissions zu aktivieren!
Bild 0-3: Sketch-Permission INTERNET.
//PC seitig import oscP5.*; import netP5.*; OscP5 oscP5; NetAddress myRemoteLocation; int hell=0; int hellandroid=0; public void setup() { size(400,400); frameRate(25); /* start oscP5, listening for incoming messages at port 12000 */ oscP5 = new OscP5(this,12000); /* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters, * an ip address and a port number. myRemoteLocation is used as parameter in * oscP5.send() when sending osc packets to another computer, device, * application. usage see below. for testing purposes the listening port * and the port of the remote location address are the same, hence you will * send messages back to this sketch. */ myRemoteLocation = new NetAddress("192.168.252.255",12000); //senden an Broadcast-Adresse meines Hotspots! } public void draw() { fill(hell); noStroke(); rect(0,0,width/2,height); fill(hellandroid); noStroke(); rect(width/2,0,width/2,height); fill(255,0,0); stroke(255,0,0); strokeWeight(height/150); line(width/2,0,width/2,height); textSize(32); text("PC",50,50); text("ANDROID",width/2+50,50); } public void mouseDragged() { hell = (int)(255.0*mouseY/height); OscMessage myMessage = new OscMessage("/hellpc"); myMessage.add(hell); /* add an int to the osc message */ oscP5.send(myMessage, myRemoteLocation); } /* incoming osc message are forwarded to the oscEvent method. */ void oscEvent(OscMessage theOscMessage) { /* print the address pattern and the typetag of the received OscMessage */ print("### received an osc message."); print(" addrpattern: "+theOscMessage.addrPattern()); println(" typetag: "+theOscMessage.typetag()); if(theOscMessage.checkAddrPattern("/hellandroid")==true) { hellandroid = theOscMessage.get(0).intValue(); } }
Code 0-7: IOT001pc -- PC-seitiges Programm. Sendet Helligkeitswert an Broadcast-Adresse unter dem Namen "hellpc" und empfängt als Rückmeldung "hellandroid".
//ANDROID seitig import oscP5.*; import netP5.*; OscP5 oscP5; NetAddress myRemoteLocation; int hell=0; int hellalt=0; public void setup() { fullScreen(); orientation(LANDSCAPE); frameRate(25); /* start oscP5, listening for incoming messages at port 12000 */ oscP5 = new OscP5(this,12000); /* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters, * an ip address and a port number. myRemoteLocation is used as parameter in * oscP5.send() when sending osc packets to another computer, device, * application. usage see below. for testing purposes the listening port * and the port of the remote location address are the same, hence you will * send messages back to this sketch. */ myRemoteLocation = new NetAddress("192.168.252.255",12000); //senden an Broadcast-Adresse meines Hotspots! } public void draw() { fill(hell); noStroke(); rect(0,0,width/2,height); if(hell!=hellalt) { //testweise Wert zurück senden hellalt = hell; OscMessage myMessage = new OscMessage("/hellandroid"); myMessage.add(hell); /* add an int to the osc message */ oscP5.send(myMessage, myRemoteLocation); } } /* incoming osc message are forwarded to the oscEvent method. */ void oscEvent(OscMessage theOscMessage) { /* print the address pattern and the typetag of the received OscMessage */ print("### received an osc message ANDROID."); print(" addrpattern ANDROID: "+theOscMessage.addrPattern()); println(" typetag ANDROID: "+theOscMessage.typetag()); if(theOscMessage.checkAddrPattern("/hellpc")==true) { hell = theOscMessage.get(0).intValue(); } }
Code 0-8: IOT001android -- Android-seitiges Programm. Empfängt "hellpc" und sendet "hellandroid" zur Kontrolle zurück.
Projekt zweiter Teil: Erweiterung des vorangehenden Programms um die Übertragung eines Winkels
Nun weiß man bereits, dass die bidirektionale Datenübertragung funktioniert und kann sich auf Anderes konzentrieren.
Die neuen Programmteile lehnen sich an dem beispiel "Accelerometer" aus der Ketai-Library an.
Bild 0-4: Screenshot der Programmerweiterung PC-seitig.
//PC seitig import oscP5.*; import netP5.*; OscP5 oscP5; NetAddress myRemoteLocation; int hell=0; int hellandroid=0; float phi; public void setup() { size(400,400); frameRate(25); /* start oscP5, listening for incoming messages at port 12000 */ oscP5 = new OscP5(this,12000); /* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters, * an ip address and a port number. myRemoteLocation is used as parameter in * oscP5.send() when sending osc packets to another computer, device, * application. usage see below. for testing purposes the listening port * and the port of the remote location address are the same, hence you will * send messages back to this sketch. */ myRemoteLocation = new NetAddress("192.168.252.255",12000); //senden an Broadcast-Adresse meines Hotspots! } public void draw() { fill(hell); noStroke(); rect(0,0,width/2,height); fill(hellandroid); noStroke(); rect(width/2,0,width/2,height); fill(255,0,0); stroke(255,0,0); strokeWeight(height/150); line(width/2,0,width/2,height); textSize(32); text("PC",50,50); text("ANDROID",width/2+50,50); text("phi="+(180.0*phi/PI),width/2+10,150); } public void mouseDragged() { hell = (int)(255.0*mouseY/height); OscMessage myMessage = new OscMessage("/hellpc"); myMessage.add(hell); /* add an int to the osc message */ oscP5.send(myMessage, myRemoteLocation); } /* incoming osc message are forwarded to the oscEvent method. */ void oscEvent(OscMessage theOscMessage) { /* print the address pattern and the typetag of the received OscMessage */ print("### received an osc message."); print(" addrpattern: "+theOscMessage.addrPattern()); println(" typetag: "+theOscMessage.typetag()); if(theOscMessage.checkAddrPattern("/hellandroid")==true) { hellandroid = theOscMessage.get(0).intValue(); } if(theOscMessage.checkAddrPattern("/phiandroid")==true) { int PHI = theOscMessage.get(0).intValue(); phi = (float)PHI/100.0; } }
Code 0-9: PC-seitige Erweiterung
//ANDROID seitig import oscP5.*; import netP5.*; import ketai.sensors.*; OscP5 oscP5; NetAddress myRemoteLocation; int hell=0; int hellalt=0; int PHI=0; KetaiSensor sensor; float accelerometerX, accelerometerY, accelerometerZ; public void setup() { sensor = new KetaiSensor(this); sensor.start(); fullScreen(); orientation(LANDSCAPE); frameRate(25); /* start oscP5, listening for incoming messages at port 12000 */ oscP5 = new OscP5(this,12000); /* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters, * an ip address and a port number. myRemoteLocation is used as parameter in * oscP5.send() when sending osc packets to another computer, device, * application. usage see below. for testing purposes the listening port * and the port of the remote location address are the same, hence you will * send messages back to this sketch. */ myRemoteLocation = new NetAddress("192.168.252.255",12000); //senden an Broadcast-Adresse meines Hotspots! } public void draw() { fill(hell); noStroke(); rect(0,0,width/2,height); if(hell!=hellalt) { //testweise Wert zurück senden hellalt = hell; OscMessage myMessage = new OscMessage("/hellandroid"); myMessage.add(hell); /* add an int to the osc message */ oscP5.send(myMessage, myRemoteLocation); } } /* incoming osc message are forwarded to the oscEvent method. */ void oscEvent(OscMessage theOscMessage) { /* print the address pattern and the typetag of the received OscMessage */ print("### received an osc message ANDROID."); print(" addrpattern ANDROID: "+theOscMessage.addrPattern()); println(" typetag ANDROID: "+theOscMessage.typetag()); if(theOscMessage.checkAddrPattern("/hellpc")==true) { hell = theOscMessage.get(0).intValue(); } } void onAccelerometerEvent(float x, float y, float z) { accelerometerX = x; accelerometerY = y; accelerometerZ = z; // Drehung in xy-Ebene: // cos phi = v1*v2 / (|v1|*|v2|) // v1 = [x,y] // v2 = [1,0] float[] v1 = new float[] {x,y}; float[] v2 = new float[] {1,0}; float betragV1 = sqrt(v1[0]*v1[0]+v1[1]*v1[1]); float betragV2 = sqrt(v2[0]*v2[0]+v2[1]*v2[1]); float phi = acos( x / (betragV1*betragV2) ); if(y<0) phi = -phi; PHI = (int)(phi*100.5); OscMessage myMessage = new OscMessage("/phiandroid"); myMessage.add(PHI); /* add an int to the osc message */ oscP5.send(myMessage, myRemoteLocation); }
Code 0-10: Android-seitige Erweiterung
ÜBUNG in Gruppenarbeit
|
Ideenfindung: Exkurs in die Phänomenologie als Vorbereitung der Ideenfindung für Projektthemen
Folien: Siehe Moodle!
Im Verlauf unserer Arbeit tauchte die Schwierigkeit auf, zu sinnvollen Projektthemen zu gelangen. Hierzu soll im folgenden versucht werden, etwas Unterstützung zu geben.
2a -- Das Problem, ein einführendes Video
https://www.youtube.com/watch?v=qHhhjuVp9R0 -- Vorfilm: Philosophie für Anfänger - HeideggerFragen zum Video:
|
2b -- Der Begriff der Lebenswelt und seine Konstitution
|
2c -- Von Abstraktionen und Kategorisierungen absehen: Auf dem Weg zur phänomenologischen Epoché
2d -- Fazit
|
2e -- ÜBUNG
|
|
#7 Dienstag 23.11.2021
Festlegen der Zweiergruppen und der Projektthemen
Grundlage bildet die Übung von letzter Woche, die als Hausaufgabe gestellt wurde:
2e -- ÜBUNG (gleich wie oben)
|
|
Entscheidung über Format für den Rest des Semesters: Online / Offline
Ab KW 48 / Dienstag 30.11. findet innerhalb der LV eine individuelle Betreuung der Projekte statt.
Ein Projekt kann nur bewertet werden, wenn eine regelmäßige Vorstellung des Projektstandes in der zweiten Semesterhälfte stattfindet.
Hinweise zur Prüfungsleistung
|
Um eine Prüfung in Form einer Projektarbeit benoten zu können, muss ich im Verlauf der Lehrveranstaltungen beteiligt sein an der Entwicklung Ihrer Arbeit. Nur so ist für mich gewährleistet, dass Ihre Abgabe am Ende auch Ihr eigenes Werk ist.
Letzter Abgabetermin das Ende der Lehrveranstaltung am Tag der Präsentation, das ist: Dienstag der 18.01.2022 um 16:00Uhr.
Über den Upload in Moodle sind abzugeben:
|
Hinweise zum Video
Empfehlung: Video auch zusätzlich ungelistet auf youtube hochladen und dann über den youtube-Link präsentieren in BBB.
|
Hinweise zur Benotung
In die Benotung fließt folgendes ein:
|