Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektewise24:projekt4:doku

Einleitung:

Mr. Take-a-Shot ist ein interaktiver Roboter, der auf den verschiedensten Partys sowohl für Unterhaltung, als auch verantwortungsvollen Alkoholkonsum sorgt. Die Idee hinter dem Projekt ist es, den Gästen personalisierte Getränke zu servieren und gleichzeitig ein Bewusstsein für ihren Alkoholpegel zu schaffen. Der Roboter misst den Promillewert mit einem integrierten Sensor und entscheidet auf Basis dieser Daten, welche Getränkemischung serviert wird. Wir haben besonders viel Wert auf die Präsentation gelegt. Ein 3D-gedruckter Dschinn „schenkt“ die Getränke aus und auch das Alkoholmessgerät wurde in einer Wunderlampe verkleidet. Außerdem soll der Dschinn dem Nutzer Anweisungen geben oder einen passenden Spruch parat haben. Unser Ziel war es, einen Roboter zu entwickeln, der nicht nur funktional Getränke ausgibt, sondern auch durch Interaktion und Humor ein Highlight jeder Party wird.

Mr. Take-a-Shot ist im Wesentlichen eine Kombination aus einem „Getränkespender“, einem Alkoholtester und einem Lautsprecher. Wir haben unsere Ansätze von vergleichbaren Projekten, (https://www.youtube.com/watch?v=2EF3Mgs9CSU), (https://www.hackster.io/ShawnHymel/diy_breathalyzer-1efe13) inspirieren lassen.

Ausschenkfunktion:

Bei der Umsetzung der Ausschenkfunktion waren wir uns zu Beginn nicht einig, wie wir sie umsetzten sollten. Nach ein wenig Recherche wurde uns klar, dass ein 12V Luftdruckerzeuger, den wir schon im Labor zur Verfügung haben völlig ausreicht. Diese sollten Druck in geschlossenen Behältern erzeugen, die mit Getränken gefüllt sind, in dem wir Pumpe und Behälter mit einem Schlauch verbinden. Der steigende Luftdruck drückt das Getränk aus einer Öffnung durch einen zweiten Schlauch heraus. Außerdem haben wir ein L298N DC-Motortreiber verwendet, um die Luftpumpen mit dem Arduino zu verbinden, da der Arduino selbst nicht genug Strom liefern kann, um die Pumpe direkt zu betreiben. Der L298N dient als Leistungsverstärker und ermöglicht eine sichere Steuerung der Pumpe über den Arduino, aber er braucht eine eigene Stromversorgung. Zumindest haben wir keine Möglichkeit gefunden den Arduino über die H-Brücke zu versorgen. Deshalb hat unser Roboter zwei Netzteile. Die Schaltung der Pumpen sieht wie folgt aus:

Alkoholtestfunktion:

Der MQ-3 Sensor ist am besten geeignet, um Alkoholrückstände in der Luft zu messen. Der Sensor erkennt Alkohol durch eine spezielle metalloxidbasierte Halbleiterschicht, die ihre elektrische Leitfähigkeit verändert, wenn sie mit Alkoholmolekülen in Kontakt kommt. Diese Veränderung wird vom Sensor erfasst und als analoger Spannungswert ausgegeben. Der MQ-3 ist besonders praktisch, weil er empfindlich auf Ethanol reagiert und eine hohe Genauigkeit bietet. Um die Spannungswerte interpretieren zu können haben Freiwillige sich bereitgestellt beim Konsum von Alkohol immer wieder in den MQ3 zu pusten und die Messwerte und wie betrunken sie sich fühlen zu notieren. Die Schaltung ist relativ simpel, weil man den MQ-3 direkt mit dem Arduino verbinden kann.

Lautsprecherfunktion:

Für die Lautsprecherfunktion war der DFPlayer Mini das entscheidende Bauteil. Mit dem SD-Kartenslot können viele größere Audiodateien gespeichert werden, was mit einem Aduino Uno z.B nicht möglich wäre. Außerdem übernimmt er die gesamte Dekodierung und Wiedergabe von Audiodateien, sodass der Arduino nur einfache Steuerbefehle senden muss. Ein Kondensator nahe dem DFPlayer Mini kann Hochfrequenzstörungen filtern und für saubereren Sound sorgen. Der Dschinn soll dem Nutzer Anweisungen geben und mit ihm interagieren, deshalb haben wir alle Audios über unsere Handys aufgenommen, mit einem Filter bearbeitet und sie auf die SD-Karte hochgeladen.

Optik:

Die meisten Teile der Technik haben wir in einer großen schwarzen Box verkleidet. So simpel wie das sein mag, war dieser Schritt doch viel aufwendiger als erwartet. Wir haben Sperrholz geschnitten, alle Kanten geschliffen und mit Winkeln zusammengeschraubt. Damit sie nicht ausfranzt haben wir alle Kanten mit Kleber versiegelt und die Spalten mit einem Kleberspänemix geschlossen und am Ende die Box schwarz besprüht.

Zusätzlich wollten wir einen „Bartender“ für unseren Roboter 3D-drucken. Wir suchten also nach potentiellen 3D Modellen bis wir, dass Open-Source Modell „The Genie“ von Robert Livingston gefunden haben. Bevor die Figur gedruckt werden konnte mussten einige Änderungen vorgenommen werden. Die Unterseite von seinem Schwanz musste abgeflacht werden, damit der Dschinn auf der Box stehen konnte ohne umzukippen. Zusätzlich haben wir zwei passende Löcher in das Modell eingebaut, damit wir ihn auf die Box festschrauben können.

Wir haben für die beiden Flaschen, die er in seinen Händen hält, eigene 3D Modelle erstellt. Damit sie auf die Hände passen haben wir mit der Boolesh-Mesh-Funktion benutzt, die jeweilige Flasche auf seine Hand platziert, wie er sie halten sollte und das gemeinsame Volumen mit dem Dschinn von der Flasche abgezogen.

Den MQ3-Sensor haben wir in einer Wunderlampe verkleidet. Für die Wunderlampe haben wir auch ein Open-Source Modell gefunden. Die Idee war, dass man also in die Wunderlampe pustet und die Luft in den MQ-3 Sensor weitergeleitet wird. Aus Hygienegründen sollten Shishamundstücke auf die Lampe befestigbar sein, damit jeder Nutzer seinen eigenen Mundstück benutzen kann. Das Loch der Lampe wurde also auf die Maße der bestellten Mundstücke vergrößert und wir bauten in der Lampe einen Luftkanal ein, der die gepustete Luft bis zum Sensor weiterleitet und dann rauslässt. Zusätzlich sollte in der Wunderlampe eine LED eingebaut werden, die angeschaltet ist, während der MQ-3 nach Alkohol misst, um dem Nutzer zu signalisieren wann er pusten soll.

Programmcode:

Komponenten:

Arduino-Pin Verbindung Funktion
A0 MQ-3 Sensor Misst Alkoholgehalt
2 Taster Startet Mess- und Mischvorgang
5 LED Zeigt vorgegebene Länge zum Pusten
8 Saftpumpe Dosiereinheit Saft
9 Alkoholpumpe Dosiereinheit Alkohol
10 DFPlayer Mini RX empfängt Befehle vom Arduino zum Abspielen der Audios
11 DFPlayer Mini TX sendet Statusmedlungen an den Arduino (wird von uns nicht aktiv genutzt)

1.: Initialisierung (Setup-Methode)

Beim Einschalten des Systems führt der Arduino zunächst eine Initialisierung durch. Dazu gehört die Konfiguration der einzelnen Pins für die Sensoren, Aktoren und Kommunikationsmodule. Der Button wird als Eingang mit Pull-up-Widerstand definiert, damit er zuverlässig erkannt wird. Die LED sowie die Pumpen für Alkohol und Saft werden als Ausgang konfiguriert, um sie später gezielt ansteuern zu können.

Zusätzlich wird eine serielle Kommunikation mit dem DFPlayer Mini über SoftwareSerial hergestellt, um Sprachansagen auszugeben. Der DFPlayer wird initialisiert und die Lautstärke auf den Wert 28 gesetzt.

void setup() {

pinMode(button, INPUT_PULLUP);
pinMode(LED, OUTPUT); 
pinMode(saftpumpe, OUTPUT);
pinMode(alkoholpumpe, OUTPUT);
Serial.begin(9600);
mySoftwareSerial.begin(9600);
myDFPlayer.begin(mySoftwareSerial);
myDFPlayer.volume(28);
myDFPlayer.setTimeOut(500);
myDFPlayer.EQ(0);

}

2.: Start des Vorgangs

Das System überprüft kontinuierlich, ob der Startknopf gedrückt wurde. Um Fehlbedienungen oder versehentliches Auslösen durch kleine Störungen zu vermeiden, wird die Betätigung des Knopfes doppelt geprüft: Zunächst wird erkannt, ob der Knopf gedrückt wurde. Anschließend wird eine kurze Verzögerung eingefügt, bevor erneut überprüft wird, ob der Knopf noch immer gedrückt ist. Erst wenn beide Prüfungen positiv ausfallen, startet der Prozess.

Sobald der Knopf gedrückt wurde, gibt das System eine Sprachausgabe über den DFPlayer Mini aus, um den Benutzer darauf hinzuweisen, dass er den Becher positionieren soll und die Messung durchgeführt wird, solange die rote LED leuchtet. Gleichzeitig wird eine Wartezeit von fünf Sekunden eingehalten, da der MQ-3 Sensor einige Zeit benötigt, um eine möglichst stabile Messung des Alkoholgehalts durchzuführen.

if (digitalRead(button) == HIGH) {

delay(50); 
if (digitalRead(button) == HIGH) {  
  Serial.println("Knopf gedrückt. Messung ...");
  playSound(1);  // Startansage
  delay(9000); // Zeit für Benutzer Becher zu positionieren und Lampe zu greifen

3.: Alkoholmessung

Nach der Wartezeit beginnt das System mit der Messung des Alkoholgehalts. Dazu wird die Funktion getalkohollevel() aufgerufen, die über eine Schleife fünf Messwerte aufnimmt. Um Messfehler zu minimieren, wird der höchste der fünf erfassten Werte als endgültiger Messwert ausgewählt.

Der Sensor gibt einen analogen Wert aus, der eine grobe Schätzung des Alkoholgehalts darstellt. Je höher der Wert, desto höher ist die gemessene Alkoholkonzentration. Dieser Wert wird in der seriellen Konsole ausgegeben, um den Messvorgang nachverfolgen zu können.

int getalkohollevel() {

int maxWert = 0;
for(int i = 0; i < 5; i++) {
  int wert = analogRead(mq3);
  if (wert > maxWert) {
    maxWert = wert;
  }
  delay(10);
}
return maxWert;

}

4.: Entscheidung über das Mischverhältnis

Basierend auf dem gemessenen Alkoholwert entscheidet das System, wie das Mischungsverhältnis zwischen Alkohol und Saft ausfallen soll. Es gibt drei mögliche Szenarien:

Niedrige Alkoholkonzentration (< 400):

  • Das Getränk wird stärker gemischt, mit einem höheren Anteil an Alkohol.
  • Eine Sprachausgabe informiert den Benutzer über die „starke Mischung“.
  • Das Mischverhältnis beträgt 10,5 Sekunden Alkohol + 5,5 Sekunden Saft.

Mittlere Alkoholkonzentration (400 – 550):

  • Das Getränk enthält eine ausgewogene Mischung aus Saft und Alkohol.
  • Eine Sprachausgabe gibt die „mittlere Mischung“ aus.
  • Das Mischverhältnis beträgt 9 Sekunden Alkohol + 7 Sekunden Saft.

Hohe Alkoholkonzentration (> 550):

  • Das Getränk wird mit einer hohen Menge Saft gemischt.
  • Der Benutzer wird durch eine Sprachausgabe über die „niedrige Mischung“ informiert.
  • Das Mischverhältnis beträgt 6 Sekunden Alkohol + 10 Sekunden Saft.

Beide Pumpen haben durch die unterschiedliche Luftdichten eine unterschiedlich lange Vorlaufzeit. Diese beträgt 6 Sekunden bei der Alkohol- und 3 Sekunden bei der Saftpumpe. Das gewählte Mischverhältnis wird anschließend an die Funktion mixDrink() übergeben, welche die Pumpensteuerung übernimmt.

if (alkoholLevel < 400) {

Serial.println("Starke Mischung");
playSound(2);
delay(3000);
mixDrink(10500, 5500);

} else if (alkoholLevel >= 400 && alkoholLevel < 550) {

Serial.println("Mittlere Mischung");
playSound(3);
delay(4000);
mixDrink(9000, 7000);

} else {

Serial.println("Niedrige Mischung");
playSound(4);
delay(4000);
mixDrink(6000, 10000);

}

5.: Steuerung der Pumpen zur Getränkeausgabe

In der Funktion mixDrink() werden die Pumpen für die jeweils berechneten Zeiträume aktiviert. Zunächst wird die Pumpe für den Alkohol aktiviert und bleibt für die vorgegebene Zeit eingeschaltet. Nach Ablauf der Zeit wird sie wieder deaktiviert. Anschließend wird die Pumpe für den Saft eingeschaltet, die ebenfalls für die vorgegebene Dauer aktiv bleibt.

Sobald beide Flüssigkeiten ausgegeben wurden, gibt das System eine weitere Sprachausgabe aus, die signalisiert, dass das Getränk fertig ist. Gleichzeitig wird eine entsprechende Nachricht in die serielle Konsole geschrieben.

void mixDrink(int alkohol, int saft) {

digitalWrite(alkoholpumpe, HIGH);
delay(alkohol);
digitalWrite(alkoholpumpe, LOW);
digitalWrite(saftpumpe, HIGH);
delay(saft);
digitalWrite(saftpumpe, LOW);

playSound(5);
Serial.println("Getränk ausgegeben.");

}

6.: Soundausgabe

Die Soundausgaben erfolgen über die Funktion playSound(int sound). Der DFPlayer Mini spielt MP3-Dateien von einer SD-Karte ab.

void playSound(int sound) {

myDFPlayer.play(sound);
Serial.print("Sound wird abgespielt: ");
Serial.println(sound);

}

Kompletter Programmcode:

mr-take-a-shot.zip

Mögliche Ausgabe im seriellen Monitor:

Knopf gedrückt. Messung …

Sound wird abgespielt: 1

Gemessener Alkoholwert: 316

Niedrige Mischung

Sound wird abgespielt: 2

Sound wird abgespielt: 5

Getränk ausgegeben.

Rohdaten zur Kalibrierung der Messwerte des MQ-3 Sensor:

Anton Elias Annika Lana Anouk Giovanni Chris
218 211 246 239 225 230 264 257 248 272 245 211 214 223
256 247 352 318 293 309 415 449 437 428 392 368
254 269 354 342 329 364 454 470 400 417 362 364
355 369 383 382 405 429 456 478 453 458
409 386 448 458 461 489
500 539

Anhand dieser Messwerte, die über einen gesamten Abend von verschiedenen Testpersonen, jeweils nach dem Konsum eines alkoholischen Getränks gemessen wurden, haben wir uns für die finalen Grenzwerte für die Funktion des Roboters entschieden.

Schwierigkeiten:

Eine der größten Schwierigkeiten war unser Zeitmanagement. Spätestens als wir 3 Wochen damit verbrachten unsere Box zu bauen merkten wir, dass es nicht ausreichen wird sich ein Mal pro Woche im Labor zu treffen. Deswegen haben wir entschieden uns regelmäßiger zu Treffen bevor das Labor schließt.

Wir haben auch grob Unterschätzt wie viel Arbeit hinter einem 3D-Druck tatsächlich hinter steckt. Man lädt nicht ein Modell einfach runter und druckt es aus. Wie man ein 3D-Modell bearbeitet, welche Druckeinstellungen man vornimmt, wie das Modell ausgerichtet sein muss, wie man die Datei so exportiert, dass der Drucker sie überhaupt erkennt, waren alles Sachen die wir von Grund auf lernen mussten.

Eine weitere Schwierigkeit entstand durch die Wahl unseres Behälters. Wir haben uns für 2L Tetra Paks entschieden. Sie hatten viel Volumen und ihre Deckel waren so groß, dass zwei Bohrlöcher problemlos rein passten um die Schläuche einzubauen. Es stellte sich heraus, dass die Tetra Paks nach einiger Zeit nicht mehr besonders luftdicht waren, besonders das linke Tetra Pak. Dadurch wurde das Verhältnis von dem Zeitraum, wie lang die Pumpen an waren, und der Menge an ausgepumpter Flüssigkeit inkonstant. Zum Beispiel musste die Pumpe des linken Tetra paks immer zwei Sekunden länger laufen, weil es schneller Luft verliert als das rechte. Wir sind zum Glück mit viel Trial und Error auf ein Ergebnis gekommen was zufriedenstellend ist.

Endstand:

Im Großen und Ganzen sind wir mit der Umsetzung des Projektes sehr zufrieden. Selbstverständlich gibt es Kleinigkeiten die man hätte besser machen können. Zum Beispiel hätte man einen lauteren Lautsprecher einbauen können oder eine Lösung finden können um mit nur einem Netzteil auszukommen und man hätte luftdichte Behälter benutzen können, aber letzten Endes funktioniert der Roboter und wir haben alles umgesetzt was wir uns vorgenommen haben.

Schaltung des gesamten Roboters:

Vorführung des Roboters:

Durchlauf im nüchternen zustand:

Durchlauf mit wenig getrunkenen Alkohol:

Durchlauf mit viel getrunkenen Alkohol:

projektewise24/projekt4/doku.txt · Zuletzt geändert: 2025/03/30 19:58 von a.streeck