Deutsch English

Bed with a scale

Waage im Bett

Zusammenfassung und Inhaltsverzeichnis

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!!!

Summary and table of contents

This web site shows the progress of integrating a digital scale into a bed frame. This is only a hobbyist project and as such cannot be compared with commercial offerings.


Note:This is currently a work in progress, so stay tuned. DISCLAIMER: This is a hobbyist project that is not meant for use as a medial instrument. This is a purely informational assistant system that does not guarantee for accuracy. I cannot claim any liability for its use, if you choose to replicate this build, you are doing so at your own risk!!

Allgemeines

About

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.

Even today a scale is still pretty primitive, yes you can hook it up to your phone and upload even more of your private data to the cloud, but this is about it. Most of the time you end up jotting down your weight and dates and try to keep on schedule doing so. Then getting everything plotted right is another disaster to happen if you don't want to push everything to the internet. Also getting everybody in the household to get the weight measured on a regular basis can be challenging, especially when you have cats.

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

This led the author to the idea to fit an automated digital scale to a bed frame of a large internationally acting Scandinavian furniture distributor.

Funktionsbeschreibung

Functional description

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.

The MALM series bed frame was already in use and therefore lend itself to be fitted in the project. The project itself should be pretty easy to be transferred to different beds or even other furniture.

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.

Four load cells of chinese origin going under the name of "TS-606", distributed by SparkFun amongst others, make the sensors for this build. These little puck type compression load cells are supposed to withstand up to 200 kg each. It is especially practical, that these are in full bridge configuration which makes thermal compensation and part-to-part variations basically a non-issue. Custom brackets fit around the bed frame and are fastened to the load cells.

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.

The interface for sampling these cells consists of an Arduino Nano Clone and four HX711 A/D-Converters that are purpose build to use in digital scales. These offer integrated preampfification, 24bit of resolution and have a very simple two wire practically quasi mono directional synchronous serial interface. Using four A/D converters avoid having to switch low differential voltages (ΔU = ~1mV).

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.

To quickly reach a working prototype stage, because of potential harm to the WAF Arduino Nano was used. Sampling all HX711 at once required some rewrite of the aptly named library thankfully provided by SparkFun. My parallized version is available on (http://www.github.com/ptwz/HX711). The sampling rate is approximately ten samples per second, the Arduino taking 10 averages leads to an effective sample rate of about one sample set (four sensors) per second.

Schaltplan der Module

Overall schematic

Schaltplan der Module Montierte 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.

Mechanical structure

The following criteria where elevant to the mechanical design:

  1. Easy assembly: No need for a lot of woodworking, which the author lacks the experience in and minimize the unavailability of a sleeping place at home which could potentially lead to unwanted friction with the wife.
  2. Stability: The whole contraption should not fail under normal loading conditions. Furthermore it should not be wobbly or somehow uncomfortable.
  3. Water resitant: When cleaning, contact with water should not make the system fail.

To fulfill the above mentioned critera each foot consists of three major parts:

Der Aufbau sieht dann so aus:

The finished assembly looks like this:

Aussenansicht

Code für die Microrechner

Code for the micro computers

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.

The Arduino's job is rather simple, take a ten samples per ADC, calculate their individual averages and relay this information to the host via UART over USB. In this case the host is implemented using a Raspberry PI that was in the home network anyway.

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.

The HX711 library that SpakFun recommends using has been modified to accommodate for up to eight load cells that can be queried in parallel. This ensures all load cells are sampled at the same time, so shifting loads are properly measured. Also this enable a constant sample rate of ten samples per second. The original library would have required reading each ADC individually which would have slowed down things by a factor of 1/4th.

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.

The Raspberry Pi's software is much more elaborate. First of all, the values read from the UART are converted to floating point numbers in kg units. These four resulting values are inserted into ring buffers (dequeues) with a length of twenty samples each. Then after inserting the new value into the buffer, an average and standard deviation is calculated per channel.

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.

If the sum of all channels standard deviations is below a threshold of 50g, the value is considered stable. If the last round was considered unstable and has just stabilized the sum of all sensors is taken as the newest weight reading. If this in turn has changed less than two kilogram the new value is saved but not output. This makes for an automatic drift compensation. If the step is more than two kilograms in turn, the value is output to a log file with a timestamp and its standard deviation.

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.

Fine, so now we have the weight changes on the bed over time, but how to determine whose weight has been observed. In a perfect world (at last from a programmers view), every inhabitant will enter and leave the bed in appropriately spaced intervals and not go to bed on the same time. Going to bed at the same time unfortunately is quite often practiced by the author and its wife, so this is not a perfectly simple world. Even worse, the cats tend to flee the bed whenever it is evident that someone is about to get up, so getting up is not a good time to determine individual weights

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.

To assign the weight changes amongst all people and animals living at home, the current weights are kept in a file. When processing a new weight change, all possible combinations of the inhabitant are made into sum of current weights. The closest of these values is considered realistic if the difference is below 500g absolute and three percent relative.
If there is more than one individual observed, the weight gain/loss is distributed evenly among them. This might offload some of the humans weight gain after e.g. a work dinner to the cats but this effect will cancel itself out quite quickly.
This way the algorithm works itself through the dataset and spits out names and their weights at certain time points. This data can then finally be processed using e.g. gnuplot or flott.js/plot.py when feeling up to something more modern. See the gnuplot generated sample below, note that the y axis is distorted in a non linear way for privacy reasons.

Downloads

Alle Quellcodes stehen unter https://github.com/ptwz/bedscale zur Verfügung. All sources are available from https://github.com/ptwz/bedscale.
$Revision: 1.4 $, $Date: 2017/09/10 16:55:54 $