Bewegungsmessung mit RaspberryPI+PI CAM und MATLAB/SIMULINK

Vor ein paar Tagen habe ich bereits erwähnt dass mir die Idee mit den Netflix Socken gefällt. Mir geht es leider oft so dass ich am Tag danach Folge um Folge meiner Serie (zur Zeit schaue ich gerade “The Man in the High Castle, nach dem Buch von Philip K. Dick) durchzappe um die Stelle zu finden an der ich eingeschlafen bin, nur um nach ein paar Minuten drauf zu kommen, dass das doch nicht die richtige Stelle war. Also wären solche Netflix Socken ein echtes Gimmick für mich, wären da nicht einige Zweifel am Konzept.

Erstmal habe ich kein Problem mit kalten Füßen, im Gegenteil, meine Füße sind beim Fernsehen immer sehr warm also ziehe ich eher Socken aus als Socken an. Dann ist da der Punkt mit den Akkus. Ich will wirklich nicht noch irgendein Gadget haben das ich die ganze Zeit aufladen muss. Zu guter Letzt sehe ich Filme meist mit meiner Frau also würde ich sogar zwei Paar Socken benötigen. Und um ehrlich zu sein: Ich bin nicht mal Netflix Kunde denn meiner Meinung nach ist Amazon Prime in Verbindung mit einem Fire TV Stick  die bessere Wahl 😉 . Also habe ich die Idee das ganze Video-basiert zu machen. Ich bin mir zwar nicht sicher ob das funktionieren wird, vermutlich hätte mein Samsung Fernseher das bereits wenn es einfach wäre, aber ich will die Flinte nicht voreilig ins Korn werfen und mache mal eine kleine Machbarkeitsstudie.

Alle Schlaf-Tracker arbeiten nach dem gleichen Prinzip: Sie messen Körperbewegungen. Die Tracker machen das mittels Beschleunigungssensoren, ich möchte das mit meinem Raspberry mit Raspberry PI Cam machen. Für die Programmierung werde ich MATLAB/SIMULINK verwenden. Im Grunde handelt es sich dabei mehr um eine Programmier-Plattform als um eine Programmiersprache. Was auch immer es ist, ich mag es und es ist meiner Meinung nach das ideale Werkzeug für Ingenieure. Mathworks verfolgt mit ihrer Software dabei einen gängigen Marketingansatz. Für Studenten sind die Lizenzen sehr billig, dafür sind sie für den kommerziellen Einsatz sehr teuer (wirklich sehr teuer). Seit ein paar Jahren bieten sie aber auch eine Home Edition für Bastler an. Eigentlich sollte ich dafür keine Werbung machen denn ich finde diese “Home Edition” immer noch sehr teuer, für das System und ein paar Toolboxen ist mal schnell mehr als 200€ los (Also echt wieso muss es teuer sein als die Studentenversion!?!). Aber nachdem ich das System von der Arbeit kenne und schätze und sie viele Plattformen wie Raspberry, Arduino, Lego Mindstorms u.v.m unterstützen, will ich das als ambitionierter Hobbyist unbedingt auszuprobieren.

Nachdem man der Installationsprozedur gefolgt ist muß man noch das Hardware Support Package für Raspberry installieren. Ein Wizard führt durch den Prozess und am Ende hat man eine SD Karte mit Raspbian und der MATLAB Runtime drauf. In meinem Fall konnte das Setup die Netzwerkeinstellungen auf dem RasPI nicht durchführen also habe ich kurzerhand Maus, Tastatur und Monitor angeschlossen und das manuell gemacht. Will man sein Programm dauerhaft ausführen und den Raspberry nicht nur als Messsystem für den PC nutzen muß man SIMULINK verwenden. Ich werde nicht genauer auf das Handling und die Programmiersprache eingehen. Auf dem Mathworks Webseite findet man haufenweise Tutorials und Beispiele und auch das Internet in mittlerweile voll davon. Damit die RaspberryPI Cam funktioniert muß man nach den Installation ein paar zusätzliche Schritte ausführen.

simulink model
SIMULINK model for motion measurement

Das SIMULINK Modell selbst ist wirklich einfach. Man muß nur den Kamera Block mit “Sum of absolute metrics”, einmal direkt und einmal durch einen Delay Block, verbinden. Dann folgt eine Typ Konvertierung und ein UDP Send. Zusätzlich habe ich einen Video Viewer eingebunden damit ich die Kamera später auf meine Couch ausrichten kann. Zum Testen verwende ich einen fertigen Socket Server den ich  aus dem Internet heruntergeladen habe.

Matlab
Testing the model

Zur Datenaufzeichnung verwende ich meinen Server den ich auch für mein Bewässerungsprojekt verwende. Zum Speichern meiner Daten lege ich dazu Tabelle namens tblmotion an.

Neben dem Bewegungsmesswert speichere ich auch noch die Bytes die mir SIMULINK schickt roh ab denn als ich das gemacht habe war es schon spät und ich war mir ehrlich gesagt nicht sicher ob die Umrechnung funktionieren würde. So hätte ich auch die Rohdaten gehabt und hätte die Umrechnung noch ausbessern können ohne mein Experiment zu wiederholen.

For die Programmierung des Socket Servers verwende ich mal wieder PHP. Um ein PHP Skript in der Shell direkt ausführen zu können benötigt man das Packet PHP-CLI.

Nach einem genüßlichen “Fernschläfchen” kann ich die Datenanalyse angehen. Dazu verwende ich auch MATLAB. Da ich die 30€ für die Database Toolbox gespart habe, exportiere ich meine Query einfach in eine CSV Datei und importiere diese in MATLAB. Da ich stolzer Besitzer eines Garmin Vivosmart bin, weiß ich auch dass ich irgendwann gegen eins eingeschlafen bin und tatsächlich ist um diese Zeit auch ein leichter Trend in den Daten zu erkennen.

Motion value
Motion value

Zur besseren Analyse mache ich ein bißchen Statistik. Ich bilde mir Standardabweichung, Mittelwert und Varianz für verschiedene Zeitperioden (1min, 5min, 10min, 20min) mittels SQL Abfragen, importiere das in MATLAB und plotte die Trends.

Das Ergebnis stimmt mich zuversichtlich.

aggregate data

Die Daten zeigen eine deutliche Änderung in der Zeit zwischen 00:30 und 01:00. Jetzt liegt es also daran einen verlässlichen Algorithmus zu finden. Ich denke ich werde mir demnächst man die Neuronal Network Toolbox herunterladen und damit ein bißchen spielen.

Wenn ihr wissen wollt wie es weiter geht dann bleibt dran!

 

Bewässerung – Teil 6: Fuzzy Regelung

Der einfachste Weg für die Steuerung der Bewässerung wäre sicher die Bodenfeuchtigkeit als Schwellwert zu verwenden und damit die Wasserzufuhr zu starten. Ich denke aber nicht dass das ein guter Ansatz ist da die Bodenfeuchtigkeitsmessung wohl eher ein Anhaltspunkt als ein wirklicher Messwert ist. Außerdem möchte ich sowieso einen Regler implementieren um eine einigermassen konstante Wasserzufuhr zu erreichen. Der meist-eingesetzte Regler und damit auch der bekannteste ist wohl der PI-Regler. Dieser hat für hier aber den Nachteil dass er nur eine Eingangsgröße zu einer Ausgangsgröße verarbeiten kann. Natürlich könnte man jetzt mit ein paar Tricks (Störgrößenaufschaltung oder Kaskadierung) weitere Messgrößen in den Regler bekommen aber das werde ich hier nicht machen. Ich werde statt dessen einen Fuzzy Regler verwenden.

Der Fuzzy Regler ist ein Multi-Input-Multi-Output (MIMO) Regler, der mit unscharfen Größen arbeitet. Das klingt sehr innovativ, tatsächlich ist die Geschichte der Fuzzy Regelung aber schon eine ziemlich alte und begann 1965. In der 1990ern erfuhr sie einen richtigen Hype und verschwand dann ein bißchen in der Versenkung. Meiner Meinung nach findet sie viel zu wenig Beachtung da man mit ihr der Problematik der meisten Regelkreise (kein exaktes Modell, empirisches Wissen über den Algorithmus) am besten begegnen kann.

Da wir unseren Webserver schon im Einsatz haben werde ich den Fuzzy Regler in PHP implementieren und verwende dazu eine Klasse von Wojtek Jarzecki. In weiterer Folge wird später der uC für die Ansteuerung der Pumpen das PHP Script aufrufen und bekommt einen Änderungsanforderung(-10% … +10%) für die Sollwerte der Wasserpumpen  (0-100%) zurück. Der uC wird damit jeweils den aktuellen Sollwert für jede Pumpe anpassen und diesen in ein PWM Signal übersetzen.

Für die Parametrierung der Regelung ermittle ich erstmal den Wert für nasse Erde (bei mir ca. 400) und trockene Erde (bei mir ca. 800). Durch googlen finde ich heraus dass die Luftfeuchte bei uns in der Steiermark etwa zwischen 50% und 90%  und die durchschnittliche Temperatur in den Sommermonaten zwischen 8°C und 36°C liegt. Mit diesen Werten definiere ich meine Input Membership Funtions wie folgt:

Fuzzy Parameter

Der Code für mein Script sieht so aus:

 

 

Bewässerung – Teil 3: Datenvisualisierung

Mich interessieren natürlich die Messwerte meiner Bewässerungsanlage. Aber es ist etwas umständlich dafür jedesmal in die Datenbank zu sehen. Deshalb werde ich eine kleine Visualisierung für meine Messdaten machen.In dieser möchte ich  jeweils die letzten gemessenen Daten als Text sowie zwei Trend-Grafiken, einmal mit den Daten der letzten 24h und einmal die Daten der letzten Woche anzeigen.

Das Mittel der Wahl für mich, nachdem ich sowieso schon einen Webserver konfiguriert habe, ist natürlich die Visualisierung mittels einer kleinen Website. Aber das ist nicht der einzige Grund, es ist ein genereller Trend Front-Ends in Webtechnologien umzusetzen denn die Vorteile liegen auf der Hand: einfaches Deployment und weite Unabhängigkeit der Clientplattform (speziell auch im mobilen Bereich). Darüber hinaus haben sich in den letzten Jahren die Möglichkeiten dieser Technologie rapide gesteigert (Websockets, HTML5+SVG) und auch die Performance der Engines reicht mittlerweile aus um Trends und Grafiken flüssig zu rendern.

Die Querys die ich für die Abfrage der Daten verwende, habe ich vorher in der Workbench ausprobiert und zur besseren Lesbarkeit unten separat eingefügt. Damit die Daten gut interpretierbar sind, werden die Daten für die 24h auf Stunden, die Daten für die Wochenanzeige auf Vierteltage gemittelt. Den Wert für die Bodenfeuchtigkeit rechne ich zur besseren Darstellung auf einen Prozentwert (100%=1024) um.

Normalerweise würde ich die Querys in Stored Procedures kapseln aber leider mag die mysqli Extension Stored Procedure mit mehreren Rowsets nicht besonders, deshalb findet ihr die Querys hartkodiert im Code.

Für die Anzeige der Trenddaten greife ich auf eine fertige Charting Libary zurück. In dem Fall verwende ich Chart.js. Es ist sicher nicht die umfangreichste Libary, aber sie ist einfach, schnell und vor allem Open Source und gratis (MIT License).

Der Code für meine Webseite sieht wie folgt aus.

Das Ergebnis ist eine, wie ich meine, recht ansehnliche Website die auch auf Mobilgeräte einen guten Eindruck hinterlässt.

Datenanzeige

Bewässerung – Teil 2: Datenaufzeichnung

Die “Kommandozentrale” bildet ein Raspberry PI 2.  Ihr braucht dazu noch eine Speicherkarte, eine Stromversorgung (ich versorge den PI mittels USB von meinem Access Point) und eventuell einen WLAN Stick. Auf alle Fälle empfehle ich euch ein einfaches Gehäuse wie z.B. das hier.

Zuerst muß für den Raspberry ein Betriebssystem (Raspbian) installiert werden. Images und Anleitungen findet ihr hier. Wie man im Arduino Projekt schon sehen kann, sende ich meine Daten an einen Webserver. Einen einfachen Socket-Server zu schreiben wäre zwar eine leichtgewichtigere Lösung aber man stellt es sich viel einfacher vor einen Dienst zu machen der wirklich 24/7 stabil, robust und zuverlässlich läuft. Deshalb setze ich gerne auch vernünftige Middleware auf. Für Datenaufzeichnung ist die Kombination aus Apache Webserver, PHP und MySQL (LAMP) ideal. Für die Installation gibt es massenweise Tutorials, ich habe dieses hier verwendet. Anstatt des “echten” MySQL verwende ich allerdings den OpenSource Nachfolger MariaDB. Dazu verwendet ihr einfach statt

apt-get install apache2 apache2-utils php5 libapache2-mod-php5 php5-mysql mysql-server mysql-client phpmyadmin -y

diesen Befehl

apt-get install apache2 apache2-utils php5 libapache2-mod-php5 php5-mysql mariadb-server mysql-client phpmyadmin -y

Da MariaDB umfassend zu MySQL kompatibel ist, können alle weiteren Tools die bei MySQL funktionieren auch bei MariaDB verwendet werden.

Für das weitere Arbeiten installiere ich noch einen Samba Server, eine Anleitung gibt’s hier. Da ich mit Windows auf meinem Entwicklungsrechner arbeite kann ich so einfach das wwwroot meines RasPIs als Netzlaufwerk einrichten und kann darin entwickeln, ohne den mühsamen Umweg über FTP. Für die Entwicklung in MariaDB könnt ihr entweder das installierte phpmyadmin verwenden oder ihr installiere auf eurem Entwicklungsrechner die MySQL Workbench. Diese bringt zwar eine Warnmeldung wenn man sich zu einem MariaDB Server verbindet, funktioniert aber tadellos. Welche Variante ihr verwendet ist geschmackssache, ich selber bevorzuge lieber die Workbench Variante da ich es gewohnt bin mit einer DB Entwicklungsumgebung zu arbeiten und mir das phpmyadmin deshalb etwas ungewohnt daherkommt.

Wenn ihr den Raspberry aufgesetzt habt und eure Entwicklungstools beisammen habt könnt ihr in der Datenbank eine Datenbank erzeugen. Ich nenne meine Datenbank einfach “templogg”

Und dann erzeugen wir noch eine Tabelle namens “tbllogging”

Diese hat eine Spalte namens “dt” vom Typ datetime und ist mein Primärschlüssel.  Meine weiteren Spalten heißen “temp”, “humidity” und “soil”, vom Datentyp double. Diese werden meine Meßwerte aufnehmen.

Wie man in meinem Arduino Code sehen kann benötige ich zum Eintragen der Werte noch ein PHP Script namens “newrecord.php”, das ich der Einfachheit halber direkt ins wwwroot lege.

Damit das Script läuft muss auf dem Arduino in der php.ini die Extension für mysql Zugrif aktiviert sein.

Wie zuvor erwähnt, ist die mysqli-Erweiterung nicht standardmäßig aktiviert, daher muss die php_mysqli.dll-DLL in der php.ini aktiviert werden. Um dies zu tun, müssen Sie die php.ini-Datei finden (typischerweise liegt diese unter c:\php) und überprüfen, dass das Kommentarzeichen (ein Semikolon) vom Anfang der Zeile extension=php_mysqli.dll in der Sektion [PHP_MYSQLI] entfernt wurde.- http://php.net/manual/de/mysqli.installation.php

So, wenn das geschafft ist teste ich ob da Script funktioniert und rufe dazu die URL in einem beliebigen Browser mit Testparameter auf um Daten einzutragen.

http://raspberryip/newrecord.php?temp=33.00&humidity=44.00&soil=55.00

Danach könnt ihr prüfen ob die Daten richtig eingetragen wurden.

Nachdem es bei mir funktioniert hat lösche ich die Daten danach aus der Datenbank

Jetzt starte ich meinen Arduino und überprüfe ob auch diese seine Daten richtig einträgt und nachdem auch das funktioniert darf er erstmal ein paar Tage die Daten einer Zimmerpflanze aufzeichnen um zu sehen ob alles gut funktioniert.

Prototype in Aktion

Und damit es nicht langweilig wird werde ich in der Zwischenzeit eine Webseite machen um mir die Aufgezeichneten Daten anzeigen zu lassen ohne jedes Mal auf die Datenbank zu gehen

Adieu meine Magic Karten – Teil 2: Das PHP Script

Nachdem ich das letzte Mal meine Daten aufbereitet habe gehts jetzt an das Script. Ich werde das Script in PHP machen, weil ich die Sprache mag und einigermaßen fit darin bin. Außerdem kann ich sie auf Windows und Linux gleichermaßen benutzen. In dem Fall verwende ich die Netbeans IDE, obwohl natürlich ein einfacher Editor auch reichen würde. Natürlich eignet sich jede andere Programmiersprache auch dafür (so wie Phyton, TCL, was auch immer).

So wie das letzte Mal muß ich mir erst mal den HTML Code ansehen. Ich schaue mir dazu wieder den Quelltext an und suche nach den <TABLE> Tags und werde prompt fündig. Ohne jetzt wieder genauer darauf einzugehen schaue ich mir an woran ich die einzelnen Spalten eindeutig identifizieren kann. Wenn ich so etwas mache dann habe ich immer im Hintergrund eine Textdatei in meinem Notepad++ offen und kopiere mir diese ganzen Infos gleich da rein. Da habe ich alles beieinander und kann mir dann alles Notwendige wieder rauskopieren.

Dann schreibe ich ein Script dass meine CSV Zeile für Zeile durchgeht, die Parameter rausholt. Dann rufe ich die Webseite mit den Parametern auf, parse den Quelltext nach meinen gesuchten Informationen und schreibe diese wieder in eine CSV Datei.

Ich arbeite unten im Code übrigens mit REGEX. Viele mögen das nicht aber ich finde das unheimlich mächtig für solche Aufgaben. Zugegeben es ist ein bißchen kompliziert am Anfang aber es gibt ein paar gute Hilfen. Ich verwende zum Beispiel zum Entwickeln und Testen https://regex101.com/

Damit der unten stehende Code läuft müssen in der php.ini folgende extension aktiviert sein:

  • extension=php_openssl.dll
  • extension=php_curl.dll

außerdem muß “allow_url_fopen = On” gesetzt sein.

 

Als Ergebnis erhaltet ihr eine schöne CSV Datei die ihr wieder in einer Tabellenkalkulation öffnen könnt.

Adieu meine Magic Karten – Teil 1: Ein bißchen Reverse Engineering, Notepad Action und Tabellenkalkulationsmagie

Ich möchte also den Wert meiner Magickarten bestimmen indem ich automatisch mittels Scripting, Daten von einer Webseite abfrage. Dazu habe ich mich erstmal 2 Stunden hingesetzt und die Namen meiner Sammelkarten in eine Tabellenkalkulation abgetippt. Als Knauserer verwende ich privat dazu Openoffice Calc, das reicht für den alltäglichen Bedarf obwohl es leider nicht ganz an den Funktionsumfang von Excel herankommt.

In meiner Tabelle habe ich also den Namen meiner Karte und die Edition eingetragen weil ich gelesen habe dass letztere für den Wert der Karte eine Rolle spielen kann.

OpenOffice Calc Tabellenblatt
OpenOffice Calc Tabellenblatt

Jetzt mache ich mich auf die Suche nach einer geeigneten Seite die mir die Preisdaten liefern soll. Der Einfachheit halber suche ich mir eine Seite die die Daten in der URL übergibt da das für mich einfach zu lesen und sehr transparent ist. Dazu suche ich einfach auf der Seite nach eine x-beliebigen Karte.

In meinem Falls suche ich nach der Karte mit dem malerischen Namen “Holzbrecher” aus der Serie “Nemesis” und erhalte folgendes Ergebnis.

Testabfrage
Testabfrage

Wenn ich mir die übergebenen Parameter nach dem “/?” ansehe dann fällt mir gleich als erstes ins Auge dass der Kartenname im Klartext übergeben wird “cardName=Holzbrecher”. Da die Variablennamen sehr sprechend sind kann sehe ich außerdem dass idExpansion wohl die Serie angiebt, leider aber nicht im Klarnamen sondern diese in eine ID kodiert und die anderen Variablen Suchoptionen sind die man zusätzlich angeben könnte, die für mich aber ohne Belang sind. Außerdem fällt mir auf dass das Suchergebnis in einer schönen Tabelle geliefert wird was mit später das Parsen erleichtert.

Als nächstes muss ich mir also ansehen wie ich an Zuordnung Serienname zu idExpansion komme. Da mir die Seriennamen ja in der HTML Seite angezeigt werden sind diese irgendwo im HTML Quellcode enthalten. Um mir das genauer anzusehen lasse ich mir den Seitenquellcode von der Suchseite anzeigen. Das geht in allen Browsern ähnlich indem man irgendwo auf einen leeren Bereich rechtsklickt und “Seitenquelltext anzeigen” auswählt. Leider erhalte ich den Code fast unformattiert zurück (was nicht unüblich ist) und kann erstmal gar nichts erkennen. Man könnte jetzt mit einem vernünftigen HTML Editor eine Formattierung herstellen lassen, ich gehe aber einen noch einfacheren Weg über mein geliebtes Notepad++.

Ich kopiere also den gesamten Quellcode und füge ihn in ein neues, leeres Dokument ein.Ich suche dann nach dem Namen meiner Serie “Nemesis” und finde dass die Namen in Option Tags eingebettet sind die mir jeweils den Namen und die ID lieferen. (Jedem HTML Programmierer ist das natürlich schon vorher klar 😉 )

Jetzt muß man sich ein bißchen mit HTML auskennen. In HTML sind Formattierung und Elemente immer in Tags eingeschlossen. In meinem Beispiel schauen die Elemente für die auswähbaren Serien so aus:

<option  value=”32″>Nemesis</option>

Es ist also immer <option value=”idExpansion”>Klaxtextname

Ich formatieren den Code jetzt etwas um indem ich mittels suchen Ersetzen nach jedem “</option>” einen Zeilenumbruch (\r\n) einfüge

Umformatieren
Umformatieren

Wenn ich jetzt durch mein Dokument scrolle sehe ich sehr schnell wo meine gewünschten Daten anfangen und wo sie aufhören. Ich lösche jetzt einfach alles vor dem ersten “<option” und=”” nach=”” dem=”” letzten=”” “<=”” option=””>” händisch raus und habe jetzt nur mehr meine Nutzdaten in meiner Datei. Dabei entferne ich auch gleich noch die erste Zeile “Alle” da diese offenbar ohne Nutzen für mich sein wird.

Anfang meiner Nutzdaten
Anfang meiner Nutzdaten

Jetzt muß ich sie nur noch in ein schönes Format bringen um es in meine Tabellenkalkulation importieren zu können. Dazu gehe ich noch ein paar mal mit Suchen&Ersetzen drüber: Ich Ersetze “<option  value=”” durch einen Leerstring, “”>” durch einen Tabulator “\t” und “” wieder durch einen Leerstring und erhalte eine schöne Tabstop getrennte Textdatei.

Tabstopp getrennter Text
Tabstopp getrennter Text

Jetzt mache ich mit ein bißchen Excel-Magic (Jaja ich weiß, es sollte “Openoffice.Calc Magic” oder noch besser “Tabellenkalkulationsmagic”) Ich importiere diese Liste in meine Tabellenkalkulation in ein separates Blatt und füge in meiner Liste mittels “VERWEIS” die IDs zu meinen Klartextnamen ein.

Importierte Zuordnungsliste
Importierte Zuordnungsliste
Liste mit Verweis
Liste mit Verweis

Jetzt speichere ich das erstmal im Originalformat und dann gleich das erste Blatt nochmal als CSV und habe meine Daten für den nächsten Schritt aufbereitet. Das nächste Mal gehts weiter mit dem Script.

Adieu meine Magic Karten – Teil 2: Das PHP Script

Adieu meine Magic Karten…

Es ist so weit. Nachdem sie jahrelang einsam in meinem Kasten verstaubt sind habe ich heute beschlossen meine Magic – The Gathering Sammelkarten zu verkaufen. Meine Frau meinte ja ich solle sie einfach wegwerfen aber nachdem ich meine alte Stereoanlage erfolgreich auf willhaben verkauft habe, hat mich der Kapitalismus in seinen Bann gezogen und ich werde auch mein altes Hobby zu Geld machen. Im Ernst, es ist doch sinnbefreit eine Anschaffung die viel Geld gekostet hat einfach in die Tonne zu werfen. Selbst wenn ich nur ein paar EURO bekomme macht es doch Sinn. Die Frage ist nur: Was ist ein angemessener Preis?

Dazu habe ich mir überlegt ich werde den Preis über einen kleinen Robot (ein Script) bestimmen lassen. Eine kleiner Livehack und nebenbei eine gute kleine Programmierfingerübung.