Bewässerung Teil 7 – ESP8266 Breakout Board

Beim Layouten meiner Leiterplatte für die Sensoreinheit wurde mir bewusst welchen Vorteil Aufsteckplatinen, so genannte “Breakout Boards”, haben. Sie sind nicht nur praktisch zum Entwickeln, sie haben auch den Vorteil das man sich über wiederkehrende Elemente (z.B. Pull-Up Widerstände) nicht den Kopf zerbrechen muss. Darüber hinaus machen sie das Layouten einfacher da sie praktisch zwei zusätzliche Lagen darstellen. Damit ist die Platine am Ende nicht nur schlanker sondern hat auch eine kleinere Grundfläche.

Beim Layouten meiner Leiterplatte für die Sensoreinheit wurde mir bewusst welchen Vorteil Aufsteckplatinen, so genannte “Breakout Boards”, haben. Sie sind nicht nur praktisch zum Entwickeln, sie haben auch den Vorteil das man sich über wiederkehrende Elemente (z.B. Pull-Up Widerstände) nicht den Kopf zerbrechen muss. Darüber hinaus machen sie das Layouten einfacher da sie praktisch zwei zusätzliche Lagen darstellen. Damit ist die Platine am Ende nicht nur schlanker, sondern hat auch eine kleinere Grundfläche.

Eine wichtige Anforderung beim Design war die Größe. Die Größe ist nicht nur ihrer selbst wegen ein Thema, sie bestimmt auch den Preis für das Fertigen des Breakout Boards. Neben den Pull-Up Widerständen für CH_PD, GPIO_0, GPIO_2 und RESET sowie den obligatorischen Tastern zu GND an RESET und GPIO_0 (PROG) habe ich auch eine Steckleiste zum Aufstecken für meinen XCSOURCE FT232RL USB<->TTL eingeplant. Die Spannungsversorgung über den USB zu TTL Konverter kann über einen Jumper optional aktiviert oder deaktiviert werden. Außerdem habe ich Lötjumper für die Verbindung von CTS->REST und DTR->GPIO_0 eingeplant. Ich habe das zwar noch nicht versucht aber bei einigen erübrigt sich dadurch das manuelle Betätigen der Taster da der FTDI232 über die Pins den ESP in den Programmiermodus versetzt. Zu guter letzt habe ich auch einen Lötjumper für die Verbindung GPIO_16 zu RESET geplant sowie einen Kondensator zur Spannungsstabilisierung. Andere Boards wie das Huzzah verwenden hier einen Spannungswandler aber ich habe mit dem Elko gute Erfahrungen gemacht.

Meine Follower auf Twitter wissen dass ich mehrere Anläufe benötigt habe (besonderen Dank hier nochmal an @ccxx72, @i_grr, @bdcatalin und @tzapulica für die Hilfe) und dass  Fritzing mich einiges an Nerven gekostet hat aber das Resultat könnt ihr auf meiner Github Seite downloaden: https://github.com/Stromspielplatz/misc/tree/master/ESP8266%20ESP-12%20Breakout

ESP8266-ESP12 Breakout Board Circuit Diagram
ESP8266-ESP12 Breakout Board Circuit Diagram
ESP8266-ESP12 Breakout Board PCB
ESP8266-ESP12 Breakout Board PCB

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 5: Kleines Software Refactoring

Nach den ersten Erkenntnissen meiner kleinen Versuchsreihe habe ich nun die Software etwas umgebaut. Nachdem der DHT11 selten aber doch immer wieder mal unplausible Werte liefert werde ich an der Logik ein bißchen schrauben. Ich werde mir drei Werte einlesen und jeweils für Temperatur und Luftfeuchtigkeit den mittleren nehmen. Für die Bodenfeuchtigkeit werde ich einen Mittelwert aus drei Messungen bilden.

Außerdem habe ich etwas am Ablauf gefeilt und den Code etwas besser strukturiert.

Tricky waren dabei vor allem 2 Sachen:

  • Ich erstelle mit für meine Werte ein Array of Struct. Die typedef für den Struct Typen muss in einer Header Datei erfolgen.
  • Der ESP8266 untersützt die std nicht von Haus aus. Deshalb verwende ich für die Funktion min ein Makro.

Das Ergebnis sieht so aus.