Bettwaage

Sun 10 September 2017

Arduino, Elektronik, Haushalt, Mechanik, Raspi

Übersetzungen: EN

Hier wird die Funktionsweise einer in ein Bett integrierten Waage demonstriert.

**Hinweis:**Dies ist noch eine Baustelle und das Gerät noch nicht fertig, Wer mag, darf gern ab und zu vorbei schauen.

HINWEIS: Bei diesem Hobbyprojekt handelt es sich um einen Prototypen einer Idee und nicht um ein fertiges Produkt. Ich kann keinerlei Verantwortung für den Nachbau und die Benutzung eines solchen Geräts übernehmen. Nachbau und Verwendung erfolgen auf eigenes Risiko!!!

Allgemeines

Im alltäglichen Gebrauch ist eine Waage heute meist immer noch sehr primitiv. Man muss sich Gewichte merken oder aufschreiben. Einen graphischer Verlauf der eigenen Gewichtsentwicklung kann man auch nicht automatisch erhalten. Im Allgemeinen ist es schwer, alle Haushaltsmitglieder regelmäß freiwillig einer Gewichtsmessung zu unterziehen.

So kam es dazu, dass das Bettgestell eines großen, weltweit agierenden skandinavischen Möbelkonzerns zum Zwecke der Gewichtsmessung modifiziert wurde.

Funktionsbeschreibung

Das Bettgesell "MALM" war vorhanden und bereits in Benutzung, sodass dieses Projekt auf diesem aufbaut, jedoch mit einfachen Modifikationen auf anderen Schlafgelegenheiten oder gar Sitzmöbeln umzusetzen ist.

Als Gewichtssensoren dienen Wägezellen chinesischen Ursprungs mit der Modellbezeichnung TAS-606. Diese werden unter anderem von Sparkfun in den USA vertrieben und haben jeweils eine nominale Maximallast von 200 kg. Besonders praktisch an diesen Messzellen ist, dass sie bereits intern als Vollbrücke geschaltet sind und somit Themokompensation und andere lästige Notwendigkeiten schon erledigt sind. Diese Messzellen bilden mit speziellen U-Profilen aus Aluminium und passenden Aufnahmen die vier Füß des Betts.

Die Schnittstelle zu einem Microprozessor stellen A/D-Wandler dar, in diesem Fall wurden HX711 verwendet, die mitteln einer einfachen synchronen seriellen Schnittstelle (ähnlich SPI) mit dem Prozessor kommunizieren. Dieser bietet bereits die notwendige Vorverstärkung um die schwachen Signale der Wheatstone-Brücke in den Sensoren auszuwerten. Da es vier Messzellen gibt, sind auch die A/D-Wandler vierfach ausgeführt um das Schalten sehr kleiner Signale (ΔU = ~1mV) zu vermeiden.

Um mit der Entwicklung schnell ans Ziel zu kommen, nicht zuletzt zur Erhaltung des WAF, wurde ein "Arduino Nano" Clone eingesetzt. Um alle vier Eingangswerte der Sensoren möglichst gleichzeitig wandeln zu lassen, sind die alle Clock-Leitungen der HX711-Module parallelgeschaltet. Sodass alle Wandler-Ausgangsbits in erster Näherung gleichzeitig anliegen sollten. Eine modifizierte Bibliothek für den Arduino ermöglicht das Auslesen solch parallel geschalteter A/D-Wandler (http://www.github.com/ptwz/HX711). Die Wandlungszeit beträgt etwas 100ms, damit wird bei einer Mittelung über zehn Messzyklen im Code des Arduino in etwa jede Sekunde ein Messwertmittel der vier Kanäle übermittelt. Im Moment wird die Umrechnung in konventionelle Einheiten (kg) im Host (RaspberryPI) durchgeführt.

Schaltplan der Module

Schaltplan der ModuleMontierte Platine / Circuit board installed

Mechanischer Aufbau

Folgende Eckpunkte waren für die mechanische Umsetzung relevant:

  1. Einfache Montage: Keine größeren Holzarbeiten, da es dem Autor an Erfahrung fehlt und das nicht-nutzen der Schlafgelegenheit potentiell den Haussegen gefährden kann.
  2. Stabilität: Das Konstrukt soll weder bei normaler Nutzung den Geist aufgeben, noch wackelig oder sonstwie störend auffallen.
  3. Wasserfestigkeit: Beim Putzen sollte man nicht auf die Anbauten des Bettes aufpassen müssen.

  • A U-shaped aluminium profile, which slides on the bed frame. M3x16 counter sunk bolts fasten it to the sensor module.

  • The sensor module itself is fastened onto the underside of the U-shaped profile. The force is measured by the stub (diameter 2.5mm), to avoid damage to the fooring it sits in the cup below.

  • The cup serves multiple purposes. First of all it gives the sensors stub a guidance which will prevent the whole contraption from sliding around uncontrolled. Furthermore to some extent prevents water from reaching the sensor.

Der Aufbau sieht dann so aus: Aussenansicht

Code für die Microrechner

Der Arduino hat, wie oben beschrieben eigentlich nur die einfache Aufgabe, je zehn Samples vom ADC zu holen und deren Mittelwerte per UART an den Host weiterzugeben. Der Host wird durch einen Raspberry PI dargestellt, der ohnehin andere Funktionen im Haushalt hat.

Für den Arduino wurde die HX711-Bibliothek welche von SparkFun empfohlen wird, dahingehend abgeändert, dass man nun bis zu acht Wandler an den Arduino anschließen kann. Dies werden dann zeitgleich abgefragt, was die erreichbare Abtastrate um ein Vielfaches erhöht. Bei vier Sensoren währe dann weder sichergestellt, dass die Messwertgruppe von einer Lastverteilung stammt, noch eine Abtastrate von 10 Werten pro Sekunde aller Sensoren haltbar.

Die Software auf dem Raspberry Pi ist wesentlich elaborierter. Der erste Schritt ist die Umwandlung der eingelesenen Werte in Kg skaliert. Es werden alle fünf Kanäle in Ringpuffern zu jeweils 20 Werten gespeichert, für jeden dieser Puffer wird bei jedem neu eingehenden Messwert dieser zunächst in den Ringpuffer eingefügt. Anschließend wird ein Mittelwert gebildet und die Standardabweichung über den Inhalt des Puffers gebildet.

Ist die Summe der Standardabweichungen der Kanäle kleiner als ein Schwellwert von 50g, so wird dieser Messwert als stabil angesehen. Den eigentlichen Messwert stellt einfach die Summe der Messwerte der Einzelkanäle dar. Hat sich dies seit dem letzten Sample-Eingang dahingehend verändert, dass der letzte Messwert noch nicht als stabilisiert galt und jetzt eine Stabilität unterstellt werden kann, so wird der Wert als aktuell übernommen. Hat sich der Messwert gerade stabilisiert wird geprüft, ob eine Veränderung um mehr als zwei Kg stattgefunden hat. Wenn ja, so wird die Wert mitsamt Zeitstempel und Standardabweichung in ein Logfile geschrieben.

Nun hat man einen Satz von Gewichtsveränderungen des Betts, doch wie kommt man nun zu den Einzelgewichten oder Bewohner? In einer für Programmierer idealen Welt würden alle Bewohner in ausreichend zeitlichem Abstand nach einander das Bett aufsuchen und dann jegliche Bewegung sofort einstellen.
Die Realität sind dagegen anders aus: Manchmal gehen die Frau des Autors und der Autor gleichzeitig schlafen, was den häufigeren Fall darstellt. Ferner verlassen die Katzen meist sofort beim ersten Anzeichen des Aufstehens das Bett fluchtartig, sodass auch beim Aufstehen keine eineindeutige Gewichtszuweisung garantiert ist.

Um die Änderungen des Gesamtgewichts den einzelnen Bewohnern zuzuordnen, wird eine Datei geführt, welche die individuellen Gewichte speichert. Nun wird bei jedem neuen Gewichtsänderungssatz für jede Kombination der Personen/Haustiere die Summe der Netto-Gewichtsveränderung gebildet. Der betragsmäßig am nächsten am aktuellen Gewichtsschritt gelegene Wert wird dann als Kandidat behandelt, wenn der Schritt nur maximal drei Prozent der errechneten Kombination beträgt und der absolute Unterscheid kleiner 500g ist.
Der sodann übernommene Gewichstsschritt wird dann aktuell gleichmäßig auf die Beteiligten aufgeteilt. Dies ist nicht ganz optimal, da so u.U. den Katzen eine Geschäftsessen von Herrchen/Frauchen angelastet wird. Dies sollte sich jedoch aber auch schnell heraus mitteln.
Auf diese Weise arbeitet sich er Algorithmus durch den Datenbestand und erzeugt dabei jeweils validierte Gewichtswerte mit Zeitstempel. Diese können dann z.B. mittels gnuplot oder wenn es moderner sein soll per flott.js oder plot.ly ausgegeben werden. Es folgt ein Beispiel, wie es bei uns aus realen Daten entstanden ist. Hierbei ist zu beachten das die Y-Achse aus Gründen der Privatsphähre nichtlinear verzerrt wurde.

Downloads

Alle Quellcodes stehen unter https://github.com/ptwz/bedscale zur Verfügung. All sources are available from https://github.com/ptwz/bedscale.