====== Projektdokumentation Cocktail'o'mat ====== ===== Projektbeschreibung ===== Der Cocktail'o'mat ist ein Automat der verschiedene Cocktails mischt und serviert. Der Benutzer kann sich ein Cocktail über eine Menüsteuerung auswählen, welchen der Cocktail'o'mat dann ohne weiteres zutun des Benutzers serviert. Dazu muss der Automat die einzelnen Bestandteile eines Drinks zusammenfügen, mischen und in ein Glas füllen können. Die Zutaten aus denen der Automat einen Drink mischen kann sind Flüssigkeiten, Zucker und Eis. Diese Zutaten sollten das mischen der meistens Drinks ermöglichen. Das Menü wird auf einem 16x2 LCD Bildschirm angezeigt und mit Knöpfen bedient.
{{ :projektewise20:cocktailroboter:cocktail_o_mat.jpg|}}Cocktail'o'mat mit einzelnen Systemgruppen
\\ \\ ===== Methoden/Umsetzung: ===== Der Automat besteht im wesentlichen aus zwei Baugruppen, wobei in jeder Baugruppe drei Subsysteme verbaut sind. Die obere Baugruppe besteht aus dem Deckel des Automaten und der Kiste, welche die Flaschen hält. In dieser Baugruppe sind die Ventilsteuerung, der Zuckerspender und die Bedienung verbaut. Die untere Baugruppe ist der Rahmen und hat den Eisspender, den Mischbecher und den Kippmechanismus zum Befüllen eines Glases verbaut. Mithilfe eines **Kistenverschlusses** ist es optimal durchführbar diese Baugruppen zu trennen, um leere Flaschen auszutauschen.
{{ :projektewise20:cocktailroboter:kistenverschluss.jpg?130|}}Kistenverschluss
Unsere Mindestanforderungen an den Automaten waren, dass er mehrere verschiedene Flüssigkeiten in ein Gefäß füllen kann und das dem Benutzer mindestens zwei Drinks zur Auswahl stehen. Was unser Roboter können **sollte**: * Zucker und Eis hinzufügen * Den Drink mixen * Drink-Auswahl per LCD und Drehregler ===== Einzelne Abschnitte zur Beschreibung von Details der einzelnen Systembestandteile ===== \\ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\\ ==== 1. Ventil Steuerung ==== Die Ventile sind mit **Silikonschlauch** an einem **Belüftungsdeckel** montiert. Wenn keine Spannung auf dem **Ventil** ist, bleibt es geschlossen und der Flüssigkeitsbehälter dicht. Das Arduino regelt über Mosfets die Ventile, so können die sechs Ventile individuell geschaltet werden. Silikonschlauch ist auch verwendet um die Flüssigkeiten in den Shaker-Becher zu leiten, ein **Flaschenhals** dient als Befestigung der Schläuche.
{{ :projektewise20:cocktailroboter:ventil_halz.jpg |}}Ventil Aufbau
Für die Ventilsteuerung haben wir eine Funktion namens Ventil() geschrieben. Unsere ursprüngliche Idee war eine Ventil-Funktion zu schreiben, bei welcher man mithilfe eines Parameters das zu öffnende Ventil auswählen kann. Da wir auch den Anspruch hatten, dass sich mehrere oder alle Ventile gleichzeitig öffnen lassen mussten wir die Ventil()-Funktion so programmieren, das jedes geöffnete Ventil einen eigenen Timer hat. Das kann man umsetzen indem man Pointer definiert. Pointer sind eine Variable die für eine andere Variable, Funktion oder Klasse einsteht, also ich schreibe in mein Programm den Pointer, aber wenn das Programm von dem Arduino ausgeführt wird, dann wird die Variable, Funktion oder Klasse ausgeführt, auf welche der Pointer zeigt. Wir haben es auch geschafft alles so zu programmieren, das der Code ohne Fehler kompiliert, aber leider funktioniert die Timer-Bibliothek welche wir benutzten anscheinend nicht richtig mit einem Pointer oder einem Pointer-Array und somit hat auch der Code nicht funktioniert. Da wir keine Fehlermeldungen hatten um nach Lösungen zu suchen haben wir den einfacheren Weg gewählt und für jedes Ventil eine eigene Funktion geschrieben. So konnten die verschiedenen Timer-Namen direkt in den Code schreiben und konnten auf Pointer verzichten. Das war aber leider auch nicht die einzige Hürde die uns diese Timer-Bibliothek bereitet hat, denn wenn ein Timer abläuft, dann wird ''TimerName.justFinished'' einmal auf True gesetzt. Allerdings funktioniert diese ''.justFinished'' Funktion nur in ''loop()'', womit man für jede Funktion die einen Timer benutzt etwas Code in ''loop()'' schreiben muss um die Funktion die die Funktion ausführt entweder zu beenden oder man muss die Funktion so schreiben, dass man sie bei Ablauf des Timers nochmal mit ähnlichen Parametern aufruft und sie ihre Funktion weiter ausführen kann. Beide Optionen sind unserer Meinung nach relativ unschön, aber wir haben keinen besseren Weg gefunden und wir haben beide Optionen für verschiedene Funktionen benutzt. Bei der Ventil Funktion haben wir uns dazu entschieden die Funktion mit veränderten Parametern nochmals aufzurufen, da wir denn Code der Funktionen möglichst an einer Stelle im Sketch sammeln wollten. ==Ventil Funktion:== void Ventil1(int ms, bool schliessen) { if (schliessen == false) { VentilDelay1.start(ms); digitalWrite(2, HIGH); Ventiloffen[1] = true; //schliessen = true; } if (schliessen == true) { digitalWrite(2, LOW); Ventiloffen[1] = false; Serial.print("Ventil1 ");Serial.println(" zu"); } } ==Der Interrupt nach ablauf des Timers:== if (VentilDelay1.justFinished()) { // Da die Pointer nicht funktioniert haben haben wir für jedes Ventil eine eigene if-funktion bei ablauf des Timers benutzt. Serial.println("Timer1 Abgelaufen"); Ventil1(0, true); // Der zweite parameter sorgt dafür das das Ventil wieder geschlossen wird. //Ventiloffen[i] = false; //Serial.print("i: "); Serial.println(i); } Die Version mit einem Pointer-Array ist in dem Zip-Archiv bei den alten Versionen \\ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\\ ==== 2. Zuckerspender==== Der Zucker wird separat von den Flüssigkeiten mithilfe eines **Flaschenhalses** in den Shaker befördert. Dieser befindet sich genau über dem Shaker, so dass der Zucker optimal in diesen fällt. Eine Mühle die durch einen Elektromotor angetrieben wird, dosiert die Menge. Da der Motor von dem **Zuckerspender** 9V Spannung benötigt gibt die Zuckerspender-Funktion ''Zucker()'' ein PWM-Signal auf Pin 6 aus, welches die Spannung am Motor von 12V auf 9V senkt. Wenn der Zuckerspender-Timer abläuft wird Pin 6 wieder auf ''LOW'' gesetzt.
{{ :projektewise20:cocktailroboter:zuckerspender.jpg?600 |}}Zuckerspender
\\ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\\ ==== 3. Bedienung ==== Die Bedienung des Automaten erfolgt über vier Taster und ein LCD-Display. Ursprünglich wollten wir ein Menü programmieren in dem sich alle Parameter verändern und einstellen lassen, aber uns hat es nicht gefallen, dass man mehrere Knopfdrücke braucht um den Mischvorgang auszulösen. Deswegen haben wir uns entschieden die Rezepte direkt auf die Tasten zu legen. Das bedeutet das der Automat sofort anfängt ein Drink zuzubereiten, wenn man eine Taste drückt. Zusätzlich wollten wir trotzdem noch ein Menü programmieren, welches sich öffnet wenn man eine der Tasten gedrückt hält. In dem Menü hätte man dann die Zusammenstellung des Rezeptes, von der Taste die man gedrückt hat, verändern können. Leider hatten wir am Ende keine Zeit mehr um dieses Menü zu implementieren. Die Tasten selbst funktionieren genau wie die Tasten auf einem LCD-Keypad-Shield, sie sind alle über Wiederstände an Pin A6 angeschlossen und wenn eine Taste gedrückt wird liegt an Pin A6 eine bestimmte Spannung an. Diese Spannung wird vom Arduino gemessen und mithilfe von ''getButton()'' der richtigen, gedrückten, Taste zugeordnet. Jeder Taste ist in ''loop()'' ein Rezept zugeordnet, welches diese auslöst und in welchem gespeichert ist wie die verschiedenen Funktionen ausgeführt werden müssen um den richtigen Drink zu mischen. Die Rezepte haben wir als Funktion umgesetzt, damit ''loop()'' übersichtlich bleibt und da man auf diesem Weg einfach die Datei mit den Rezepten austauschen kann ohne an dem Code etwas zu verändern. ==Die Tasten Funktion:== #define BUTTON_RIGHT_ANALOG_VALUE 60 #define BUTTON_UP_ANALOG_VALUE 250 #define BUTTON_DOWN_ANALOG_VALUE 485 #define BUTTON_LEFT_ANALOG_VALUE 650 unsigned long buttonSampleTime = 0; int getButton () { if (millis() - buttonSampleTime >= 20) { buttonSampleTime = millis(); int button = analogRead(BUTTON_PIN); //Serial.print("button :");Serial.println(button); if (button < BUTTON_RIGHT_ANALOG_VALUE) return 0; if (button < BUTTON_UP_ANALOG_VALUE) return 1; if (button < BUTTON_DOWN_ANALOG_VALUE) return 2; if (button < BUTTON_LEFT_ANALOG_VALUE) return 3; if (button > BUTTON_LEFT_ANALOG_VALUE) return 4; } } ==Das Starten der Rezepte in loop():== btn = getButton(); if (btn == 0) { //Diese if-funktionen starten die Rezept funktion nachdem die dazugehörige Taste gedrückt wurde. if (Rezeptlauft[0] == false) { Rezept1(); lcd.clear(); lcd.print("Mixe Rezept1"); //Serial.println(Rezeptlauft[0]); } }
{{ :projektewise20:cocktailroboter:bedienung.jpg |}}Bedienelement
\\ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ==== 4. Mischen==== Für die Funktion des Mischens haben wir ursprünglich überlegt, ob wir den ganzen Behälter schütteln können oder ob wir uns eine möglichkeit ausdenken um die Zutaten zu verrühren. Glücklicherweise hatte Johannes die Idee einen Selbstrührenden Trinkbecher zu benutzen. Da dieser ein fertiges Produkt ist mussten wir uns keine komplizierte Konstruktion ausdenken die den Shaker abdichtet, waren Motor und Rühraufsatz schon im Becher befestigt und der Becher lässt sich einfach zerlegen und in der Spülmaschine waschen.
{{ :projektewise20:cocktailroboter:shaker-becher.jpg|}}Shaker-Becher
Verschiedene Flüssigkeiten werden mit Hilfe der Ventilsteuerung, durch Schläuche aus den Behältnissen, in den Mixer dosiert. Der Mixer verfügt über einen Elektromotor auf den ein Rührelement angebracht ist. Nach dem die gewünschten Flüssigkeiten eingefüllt sind, wird der Elektromotor aktiviert und die Flüssigkeiten werden durchrührt und ordentlich gemixt.
{{ :projektewise20:cocktailroboter:shaker_spuelen_shaken.jpg?700 |}}Shaker-Becher Waschen und Mixen
Der Code für den Mixer funktioniert genau so wie der Code für den Zuckerspender, mit dem Unterschied, dass das PWM-Signal auf Pin 11 ausgegeben wird und das die Spannung auf 3V gesenkt wird. Sowohl die Mixer-Funktion ''Mixer()'' als auch ''Zucker()'' und alle anderen Funktionen des Cocktailomaten schreiben während sie ablaufen eine Variable auf ''HIGH'', um zu verhindern, dass die Funktion nochmal ausgeführt werden kann während sie bereits läuft. Des weiteren schreiben alle Funktionen die eine Funktion des Cocktailomaten steuern eine zweite Funktion ''HIGH'', wenn sie ihre Aufgabe erfüllt haben. Diese Variablen sorgen dafür, dass die Rezepte warten können bis eine Funktion fertig ist bevor die nächste ausgeführt wird. \\ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ==== 5. Kippen==== Der **Shaker-Becher** ist in einem **MDF Rahmen** befestigt, welcher mit einem **Servo** verbunden ist, der fest in einem Gestell sitzt. Auf der anderen Seite wird der Rahmen durch eine **Maschinenschraube**, als **Achse**, beweglich gestützt. Wenn der Shaker fertig gemischt hat, wird der **Servo** aktiviert und der **Shaker Becher** in eine Richtung gekippt. Nun läuft das gemischte Getränk in eine dafür gemachte Aussparung, in dem das Glass steht.
{{ :projektewise20:cocktailroboter:kippen.jpg?420|}}Shaker-Becher kippmechanismus
Da ''.justFinished'' nur in ''loop()'' funktioniert haben wir zuerst beinahe die gesamte Funktion nach ''loop()'' verschoben, aber jetzt wird ''Shakerleeren()'' jedes mal wenn der Timer ''ShaServDelay()'' gestartet und somit konnten wir den Code in der Funktion lassen. Die ''Shakerleeren()''-Funktion starte zuerst den Timer und bewegt dann den Servo jedes mal wenn der Timer abläuft einen Schritt weiter, bis der Shaker in seiner ausguss-Position ist.\\ In dieser Position wartet die Funktion ein paar Zyklen und bewegt sich dann Schritt für Schritt wieder zurück in die Ausgangsposition. ''Shakerleeren()'' hat nur einen Parameter, welcher die länge von dem Timer vorgibt. Damit kann also die Geschwindigkeit des ganzen Vorganges verändert werden. \\ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ==== 6. Eis==== Das Eis wird ebenfalls über eine **Rampe** ("Magazin") angeordnet. Über einen **Servo** wird je ein Eiswürfel angeschoben, wodurch er in den Behälter rutscht. Die ''Eis''-Funktion kontrolliert einen **Servo**, welcher pro Eiswürfel einmal den Weg freigibt. Damit die richtige Anzahl an Eiswürfel ausgegeben wird zählt die Funktion mit wie viele Eiswürfel sie bereits Ausgegeben hat und beendet sich sobald die gewünschte Anzahl an Eiswürfeln erreicht ist.
{{ :projektewise20:cocktailroboter:eisspender.jpg?300|}} Eisspender mit Rampe und PET Behältnis
\\ ==== Technische Daten, Bauteile, Pins, etc. ==== ^ Bauteil ^ Quantität ^ Preis ^ | [[https://www.ebay.de/itm/164200271338?chn=ps&norover=1&mkevt=1&mkrid=707-134425-41852-0&mkcid=2&itemid=164200271338&targetid=1112151200096&device=c&mktype=pla&googleloc=9061132&poi=&campaignid=10203814485&mkgroupid=101937405357&rlsatarget=pla-1112151200096&abcId=1145989&merchantid=138407965&gclid=Cj0KCQiAv6yCBhCLARIsABqJTjZKhI-g115sxzHqnAnYSZajDsJjDxNj3ZdcML78mxh5zFidswA5smsaAoffEALw_wcB|Ventile]] | 6 | 9,69€ | | [[https://www.pearl.de/a-NX7521-3017.shtml?query=selbstr%C3%BChrend|Shaker]] | 1 | 9,99€ | | [[https://www.lidl.de/de/silvercrest-elektrische-salz-pfeffermuehle/p359729|Salzmühle für Zucker]] | 1 | 11,99€ | | [[https://www.barstuff.de/glaserschiene-kupferfarben-verschiedene-langen.html|Rampe für Eis]] | 1 | 11,69€ | | [[https://shop.rewe.de/p/berliner-kindl-jubilaeums-pilsener-11x0-5l/888612?groupId=Berliner_Kindl_Jubilaeums_Pilsener&variantArticleId=4100080100938|leerer 11er Kasten]] | 1 | - | | [[https://de.aliexpress.com/item/1005001621790470.html?spm=a2g0o.productlist.0.0.6689329ePL91Ne&algo_pvid=daaf2fb9-f1e2-4566-9e38-d2c16d3cd40c&algo_expid=daaf2fb9-f1e2-4566-9e38-d2c16d3cd40c-14&btsid=0b0a119a16156537322637049e24dc&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_|großer Servomotor]] | 1 | 1,05€ | | [[https://de.aliexpress.com/item/33052740204.html?spm=a2g0o.productlist.0.0.77b65f317xng8V&algo_pvid=71c2a50b-4cf6-4613-a403-6bc33c0fa3a6&algo_expid=71c2a50b-4cf6-4613-a403-6bc33c0fa3a6-11&btsid=0b0a119a16156535491624922e24dc&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_|kleiner Servomotor]] | 1 | 0,99€ | | [[https://www.hornbach.de/shop/Kistenverschluss-ohne-Schliesshaken-49-x-13-mm-Galv-gelb-verzinkt/8063003/artikel.html?wt_cc2=101925457420&wt_cc3=434920549645&gclid=CjwKCAiA4rGCBhAQEiwAelVtiyPj4ztBsIl0gWd8HnRAOhmuz5LaRiVH-2CdA6aUIr9PNAWSKg16fxoCaU0QAvD_BwE&wt_cc6=8063003&wt_mc=de.paid.sea.google.alwayson_assortment.eis.pla.766104886.101925457420.&wt_cc1=766104886|Kistenverschluss]] | 2 | 2,25€ | | [[https://www.amazon.de/Rehau-Quality-Original-Water-Metre/dp/B075Z35149/ref=sr_1_1_sspa?dchild=1&keywords=2m+10+mm+schlauch&qid=1615654040&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUE0U0tQSDY3OTcySEgmZW5jcnlwdGVkSWQ9QTA4MDM2OTUxSlVOQTA3SE1FOTJBJmVuY3J5cHRlZEFkSWQ9QTEwMTY4NjAzRlo0TDVOSU1BVEwzJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==|Plastik Schlauch]] | 1 | 3,38€ | | [[https://shop.rewe.de/p/spreequell-mineralwasser-medium-1l/7723920?groupId=spreequell_mineralwasser_medium&variantArticleId=4015732029058|1L PET Flaschen]] | 7 | 0,55€ | | MDF | 1 | - | | [[https://www.hornbach.de/shop/Holzduebel-6-mm-50-Stueck/7571907/artikel.html|Holz-Dübel]] | 7 | 1,80€ | | [[https://www.amazon.de/-/en/super-adhesive-seconds-quick-drying-repair/dp/B07MQ7RBT9/ref=sr_1_6?dchild=1&keywords=ca+kleber&qid=1615654159&sr=8-6|CA-Kleber]] | 1 | 2,99€ | | [[https://www.hornbach.de/shop/Spruehlack-Maston-Color-glanz-schwarz-400-ml/6005606/artikel.html|Lack]] | 2 | 4,95€ | | [[https://www.amazon.de/Ring-Rubber-Assortment-Pieces-Rings/dp/B07PFJY7ZZ/ref=sr_1_1_sspa?crid=3ULWCUETVP0MA&dchild=1&keywords=o+ringe+dichtungsset&qid=1615654277&sprefix=o+ringe+%2Caps%2C186&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzRkhZSlk1TEZDNzZEJmVuY3J5cHRlZElkPUEwMzg3OTYzM0NLN0JETEw3NFZTUSZlbmNyeXB0ZWRBZElkPUEwMTk0NjQ1MVlGUjFNSVBBUE9WRCZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=|O-Ringe]] | 6 | 10,99€ | | [[https://www.amazon.de/gp/product/B07S842LFF/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1|Metall Strohhalm]] | 6 | 6,98€ | | 40x40mm Holz | 1 | - | | [[https://www.hornbach.de/shop/Stuhlwinkel-25-x-25-x-14-mm-galv-gelb-verzinkt-1-Stueck/735091/artikel.html|kleiner Metallwinkel]] | 2 | 0,25€ | | 100 Ohm Wiederstand | 8 | * | | 1000 Ohm Wiederstand | 8 | * | | Dioden | 8 | * | | Mosfet | 8 | - | | Breadboard | 1 | * | | [[https://de.aliexpress.com/item/32323945639.html?spm=a2g0o.productlist.0.0.4f0f2551hL2onk&algo_pvid=d1ea839b-5319-438b-befd-b8ee7b0ab896&algo_expid=d1ea839b-5319-438b-befd-b8ee7b0ab896-0&btsid=2100bdcf16156530354852832e56d6&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_|Arduino Nano]] | 1 | 1,79€ | | [[https://de.aliexpress.com/item/307308861.html?src=google&albch=shopping&acnt=494-037-6276&isdl=y&slnk=&plac=&mtctp=&albbt=Google_7_shopping&aff_platform=google&aff_short_key=UneMJZVf&&albagn=888888&isSmbAutoCall=false&needSmbHouyi=false&albcp=1705854617&albag=67310370915&trgt=743612850874&crea=de307308861&netw=u&device=c&albpg=743612850874&albpd=de307308861&gclid=CjwKCAiA4rGCBhAQEiwAelVti2On7ZVnt4PRfRlO46TnSB0dafBe6hdX3czp7G2LX-TvjCW1816WChoC-HoQAvD_BwE&gclsrc=aw.ds|16x2 LCD Bildschirm]] | 1 | 1,27€ | | Knöpfe | 4 | * | | Kabel | 1 | - | | 2.54 mm Pin female | 57 | * | | 2.54 mm Pin male | 27 | * | | [[https://www.amazon.de/gp/product/B07QB694DB/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1| (Elektronik Set)]] | 1 | *17,99€ | | Gummipropfen | 6 | - |
{{ :projektewise20:cocktailroboter:cocktailomat_platine_schaltplan.png |}} Schaltplan der Hauptplatine
^ Pin ^ Funktion ^ | D2-D5,D7-D8 | Ventile 1-6 | | D6 | Zucker Spender | | D9 | Kipp-Servo | | D10 | Eis-Servo | | D11 | Mixermotor | | A4 | LCD SDA | | A5 | LCD SCL | | A6 | Taster-Knöpfe | | GND | 12V GND | | Vin | 12V Plus | ==== Ergebnis und Diskussion ==== Der Cocktail'o'mat ist fertig gebaut, aber nicht fertig optimiert und es gibt noch einige Möglichkeiten die Programmierung zu erweitern. Wir haben alle wichtigen Funktionen verbaut und funktional Programmiert, aber wir hatten nicht die Zeit um alle Timings so zu schreiben, dass alle Abläufe schön flüssig sind und wir hatten leider auch nicht mehr genug Zeit um wirklich alle Funktionen zu schreiben die der Automat können sollte. Die offensichtlichsten Punkte an denen der Automat verbessert werden könnte sind zum einen das fehlende Menü welches Kurz in dem Abschnitt über die Bedienung beschrieben wird und die fehlende Füllstands-Kontrolle.
{{:projektewise20:cocktailroboter:mdf_problems.jpg|}} Löcher müssen fein vorgebohrt werden und reißen trotzdem. Ganz rechts zu erkennen, Lack zieht ungleichmäßig ein.
==== Fazit und Ausblick ==== \\ Für ca. 80€ ist es möglich sein eigenen DIY Cocktailautomaten zu bauen. Unser Arbeitsprozess ging zügig voran, es gab hin und wieder Schwierigkeiten, welche aber durch intensive Diskussionen gelöst werden konnten. So haben die Holz und Löt-arbeiten ziemlich spaß gemacht und waren schnell fertig, wohingegen das Programmieren länger dauerte. Oft hatten wir auch Glückliche Zufälle, z.B. dass die Bierkiste genau unser Maß hat und wir so direkt eine Lösung als Flaschenhalterung fanden; Oder dinge rumliegen hatten die wir für den Bau verwenden konnten. ==== Code und Rohdaten ==== {{:projektewise20:cocktailroboter:cocktail_o_mat_daten.zip| Cocktail'o'mat Daten}} \\