MediBot

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche
MediBot

MediBotLogo.png

Entwickler

Sebastian Punsmann, Lukas Wagner, Niklas Günther, Sara Salha

Verwendete Programmiersprache

C#, C++, Angular

Eingesetzte Software

Shapr 3D, Cura, TinkerCad, Visual Studio, Visual Studio Code, Smartgit, Gitlab, Unraid

Eingesetzte Hardware

Creality Ender 5 Plus, TTGO ESP 32 OLED, ESP8266


MediBot ist ein intelligenter Medikamentendosierer, welcher den Patienten zur Tabletteneinnahme auffordert und die richtige Dosierung zur Verfügung stellt. Gesteuert wird MediBot über eine Webanwendung, wo sich Tabletten und Dosierung einstellen lassen. Außerdem informiert MediBot die Angehörigen bei fehlender Einnahme der Tabletten und auch beim Nachfüllbedarf.


Motivation[Bearbeiten]

Da es zurzeit wichtig ist, einen Abstand zu den Menschen zu halten, insbesondere zu den Menschen, die zu den Corona-Risikogruppen gehören und die gleichzeitig nicht in der Lage sind, selbstständig ihre Medikamenten einzunehmen (z.B. ältere Menschen mit einer Demenzerkrankung). Deshalb haben wir uns entschieden, ein eingebettetes System zu entwickeln, welches die Anwender an ihre Mediakmenteneinnahme erinnert und das Medikament in der richtigen Dosierung zur richtigen Zeit bereitstellt. Dadurch werden unnötige Kontakte durch Kontrollbesuche reduziert und somit wird das Risiko, dass ältere Menschen an Corona erkranken minimiert. Die Angehörigen werden informiert, falls die Tabletten trotz der Erinnerung nicht eingeommen wurden.

Idee[Bearbeiten]

Der MediBot wird durch einen ESP32 gesteuert und kommuniziert über das MQTT-Protokoll mit der Servereinheit. Auf dem Server können über eine Website Medikamente hinzugefügt, dosiert und wieder entfernt werden. Steht zu einer bestimmten Zeit die Einnahme an, so sendet der Server eine Nachricht an den MediBot, welcher die Tabletten bereitstellt, wenn der Patient zur Ausgabe kommt. Sollten die Medikamente nicht abgeholt werden, schickt der MediBot eine Benachrichtigung an das Kontaktmodul und informiert die Angehörigen über die verpasste Einnahme.

Umsetzung[Bearbeiten]

Kontrolleinheit vom MediBot System

Das System MediBot besteht aus drei Komponenten: Dem MediBot, einem Server (mit einer Website), und einer (oder mehreren) Kontrolleinheiten. Im Folgenden wird die Funktionsweise in Form einer Kurzanleitung erklärt.

Setup & Inbetriebnahme[Bearbeiten]

Im ersten Schritt kann der MediBot auf der Webseite konfiguriert werden. Für jedes Rad im MediBot kann ein bestimmtes Medikament eingetragen und dosiert werden. Die eingestellten Daten werden sofort in die Datenbank übernommen. Wenn sich zum Beispiel eine Dosierung ändert oder das Medikament nicht mehr genommen wird, kann dies ganz einfach über die Webseite angepasst werden.


Anschließend kann der MediBot angeschlossen und aktiviert werden. Bei jedem Start des Systems überprüft der MediBot den aktuellen Stand des Servers. So werden eventuelle Änderungen sofort übernommen. Im nächsten Schritt muss der MediBot befüllt werden: Dies geschieht über das Drücken des Befüllknopfes auf der Vorderseite vom MediBot. Wenn der Befüllmodus aktiviert ist, leuchtet die gelbe LED auf und man kann anfangen einzelne Tablette einwerfen. Hat der MediBot die maximale Kapazität von 20 Tabletten pro Rad erreicht, blinkt die grüne LED mehrmals auf, was dem Bentuzer zeigt, dass der Befüllmodus beendet wurde. Alternativ kann der Nutzer auch durch ein erneutes Drücken des Befüllknopfes den Vorgang manuell beenden.

Nach Abschluss des Befüllvorgangs befindet sich der MediBot im Normalzustand (Gründe LED leuchtet). Nun ist der MediBot einsatzbereit.

Tablettenausgabe[Bearbeiten]

Durch Drücken des Ausgabeknopfes wird die Ausgaberoutine aktiviert: Wenn es nicht die richtige Zeit zum Einnehmen von Tabletten ist, blinkt die gelbe LED kurz auf und Signalisiert dem Nutzer, dass er noch warten muss. Wird der Befüllknopf zur richtigen Zeit gedrückt, blinkt die grüne LED mehrmals auf und der Nutzer erhält die Tabletten für die Einnahme.

Füllstand & Nachfüllen[Bearbeiten]

Sinkt der Füllstand vom MediBot unter ein kritisches Level (5/20 Tabletten) fängt die rote LED an zu blinken und signalisiert, dass ein baldiges Nachfüllen erforderlich ist. Wenn alle Tabletten ausgegeben wurden (Füllstand = 0) leuchtet die rote LED dauerhaft.

Der Nachfüllmodus wird durch Drücken des Nachfüllknopfes gestartet. Der Befüllvorgang ist gleich der Erstbefüllung (siehe oben).

Hardware[Bearbeiten]

Beschreibung Kosten in € Anzahl
Filament PLA 25,99 1 kg
Laser-Dioden, Fotowiderstände 9,99 30
Schrauben 12,59 600
Komperator, OR-Gatter und Inverter IC’s 13,86 24



3D-Modell[Bearbeiten]

Das 3D-Modell wurde mit dem CAD-Programm Shapr3D entworfen. Die Grundidee ist ein Tablettenrad mit mehreren Kammern, bei der in jeder Kammer eine Tablette liegt. Um die Ausgabe der Tabletten genau zu bestimmen und Überdosierungen auf jeden Fall zu verhindern gibt es genau ein Fach für jede Tablette. Die Ausgabe erfolgt an der Unterseite des Rades und das Nachfüllen an der Oberseite. Zusätzlich wird der Ausgang durch eine Klappe geöffnet und geschlossen, um ungewollte Ausgaben zu verhindern. Im Eingabe- und Ausgabeslot des Modells sind Röhren für Lichtschranken angebracht, mit denen die Ein- und Ausgabe kontrolliert werden kann.

Das Modell besteht aus mehreren Einzelteilen, welche am Ende genau zusammenpassen müssen, um die richtige Arbeitsweise vom MediBot zu gewährleisten. Dieser Prozess hat einen Großteil der Entwicklungszeit eingenommen, da in vielen Testphasen die Teile aufeinender abgestimmt werden mussten. Im Folgenden sind einige Bilder der einzelnen Entwicklungsstufen zu sehen und ein Bild des fertigen Gesamtmodells.

Elektronik[Bearbeiten]

Lichtschranken: Um die Eingänge und Ausgänge am MediBot zu kontrollieren wurden Lichtschranken an der Ober- und Unterseite befestigt. Da der Eingabe- und Ausgabeslot zu groß sind um von einer Lichtschranke komplett abgedeckt zu werden, mussten mehrere Lichtschranken verwendet werden. Jeweils drei am Eingang und am Ausgang. Um die Belastung am ESP zu minimieren wurden mehrere Analoge Pins zu weniger digitalen Pins zusammengeschaltet. Hierzu wurde ein Komparator und ein OR-Gatter.

Lichtschranken[Bearbeiten]

Ein weiteres Problem, welches sich erst beim Testen des gesamten Aufbaus herausstellte, war die Lesefrequenz des ESP32. Zu Beginn des Projekts, als nur die Lichtschranke am ESP32 getestet wurde, funktionierte alles einwandfrei. Als der Microcontroller allerdings auch die anderen Funktionen des MediBots übernehmen musste, hat die Abtastrate nicht mehr ausgereicht, um das Durchfallen der Tablette zu erkennen. Um diesem Problem entgegenzuwirken, wurde ein weiterer ESP8266 nur für die Kontrolle der Lichtschranken eingebaut, mit diesem war es möglich die Eingabe und Ausgabe der Tabletten genau zu kontrollieren. Damit der ESP am Ende das Signal an den TTGO übermitteln konnte, wurden dazwischen zwei Optokoppler geschaltet. Wenn nun der Lichtschranken-ESP das Durchfallen einer Tablette bemerkt, schließt er für eine Sekunde den Stromkreis am Optokoppler, um der Steuerungsschaltung des TTGOs genügend Zeit zu geben, um das Signal zu lesen.

Motoren[Bearbeiten]

Im Projekt wurden mehrere Motoren verwendet. Zum einen wurde ein Schrittmotor, um das Rad zu drehen, und ein Servomotor, um die Ausgabe zu öffnen und zu schließen, verwendet. Der Schrittmotor muss mit einer externen Spannungsquelle versorgt werden.

UI-Elemente[Bearbeiten]

Bei den UI-Elementen wurden Buttons und LEDs verwendet. Bis zuletzt war außerdem geplant ein LCD-Display zu verwenden, um genauere Daten über den Füllstand und die Tablettenausgabe anzeigen zu lassen, leider hat die Stromversorgung des TTGOs am Ende nicht ausgereicht, um die verschiedenen Bauteile alle mit Spannung zu versorgen. Am Ende wurde die Steuerung nur mit den Knöpfen und drei LEDs umgesetzt. Eine genaue Beschreibung der Funktionsweise ist im Punkt Umsetzung zu finden.

Code[Bearbeiten]

Die Software in unserem Projekt verteilt sich auf drei unterschiedliche Systeme: Server + Datenbank, MediBot und Kontrolleinheit, welche alle über unterschiedliche Weise miteinander kommunizieren. Im folgenden werden die einzelnen Bestandteile genauer erläutert. Bei der Implementierung wurde darauf geachtet, dass der Code generisch ist und auch auf mehrere Räder erweitert werden kann. Desweiteren wurde vor allem auf den Einsatz von Objekten und Klassen geachtet, so kann mit nur wenigen Zeilen Code ein weiteres Rad dem System hinzugefügt werden.

Server & Datenbank[Bearbeiten]

Der Server stellt die zentrale Kontrolleinheit im System des MediBot dar. Für die Implementierung wurde C# und das Angular Framework für die verbundene Webseite verwendet. Auf der Webseite kann zu jedem Rad ein Medikament zugeordnet werden und zu jeder Tageszeit(morgens, mittags, abends, nachts) eine bestimmte Anzahl an Tabletten ausgewählt werden.

Struktur MediBotDatenbank

MediBot[Bearbeiten]

Die Software für den MediBot wurde mit Visual Studio Code und PlattformIO umgesetzt. Im ersten Schritt wurde die Kommunikation zwischen dem MediBot und dem Server mit dem HTTP-Protokoll umgesetzt. Bei jedem Start sendet der MediBot ein GET-Request an die REST-API des Servers um so den aktuellen Zustand des Systems zu erhalten. Außerdem wird bei jedem Betätigen des Knopfes zur Tablettenentnahme eine Anfrage an den Server geschickt, welcher zu einer bestimmten Uhrzeit die Anzahl der Tabletten zurückgibt, die eingenommen werden müssen. Wird außerhalb dieser Zeit der Knopf betätigt bekommt der Nutzer durch ein Aufleuchten der roten LED signalisiert, dass es zur Zeit keine Tabletten gibt. Der Hauptcontroller vom MediBot ist mit sehr vielen unterschiedlichen Bauteilen verbunden: Servo, Motor, Lichtschranken, mehrere Köpfe und LEDs. Da der Code mit einer erhöhten Anzahl sehr komplex und unübersichtlich werden kann, wurden für die einzelnen Bausteine jeweils eine eigene Klasse im Projekt angelegt. Des Weiteren wurde für die Kommunikation der einzelnen Bauteile die Bibliothek arduino-EventManager verwendet. Mit dieser Bibliothek können die einzelnen Signals und Slots klar definiert werden, um eine gute Datenkapselung zu ermöglichen.

Kontrolleinheit[Bearbeiten]

Die Kontrolleinheit besteht aus einem ESP32 und einem I2C-Display. Das Gerät ermöglicht es auch in der Ferne die Tablettenentnahme vom MediBot zu überwachen. Das Gerät kommuniziert über das MQTT-Protokoll mit dem Server. Jedes mal, wenn eine Tablette ausgegeben wird, erscheint für die entsprechende Tageszeit ein 'X' für die Einnahme der Dosis. Wird eine Dosierung nicht eingenommen, so bleibt die entsprechende Anzeige leer und der Angehörige muss eingreifen. Durch die Arbeit mit MQTT können sehr einfach weitere Kontrolleinheiten integriert werden, welche alle die gemeinsame Publish-Nachricht erhalten.

Kontrolleinheit vom MediBot System

Erweiterungs-Möglichkeiten[Bearbeiten]

Sound Benachrichtigung[Bearbeiten]

Wenn die Einnahme von Medikamenten ansteht, gibt der MediBot alle fünf Minuten einen Ton aus, welcher dem Nutzer signalisiert, dass es Zeit für die Einnahme der Medikamente ist.

Gehäuse mit optischen Bedienelementen[Bearbeiten]

Da es im zeitlichen Rahmen des Moduls nicht möglich war ein Gehäuse für den MediBot zu bauen und die Bedienelemente passend zu positionieren, ist dies der nächste Schritt in der Entwicklung.

Überarbeitete Sensorik[Bearbeiten]

Bis zuletzt haben die Lichtschranken bei der Ausgabe im MediBot Probleme bereitet, da oftmals die Tablette viel zu schnell durch die Lichtschranke gefallen ist. Ein erster Lösungsansatz für dieses Problem war den Trichter bei der Eingabe zu verengen, um somit die Fallgeschwindigkeit der Tablette zu reduzieren. Dieser Ansatz hat bereits eine spürbare Verbesserung herbeigeführt, ist allerdings noch ausbaufähig. Alternativ ist auch ein Microcontroller mit einer höheren Taktfrequenz und/oder mehreren Kernen(z.B.: Raspberry Pi) denkbar, welcher die Lichtschranke schneller lesen kann.