**Projektdokumentation: Cantina-Bot**
Ein Projekt von: Dennis Claußner und Jan-Niclas Rump.
__Einleitung:__
Am Anfang unseres Projektes stand die Idee einen Roboter zu erschaffen, welcher nicht nur nützlich sein sollte sondern auch ein gewisses Maß an Unterhaltung zu bieten hat. Und so entstand das Konzept des Cantina-Bots. Der Cantina-Bot soll hierbei in der Lage sein, auf Abruf, verschiedene Cocktails zubereiten zu können.
Diese Aufgabe soll der Roboter in einer angebrachten Zeit absolvieren. Der wohl entscheidenste Punkt ist jedoch, dass die Cocktails wohlschmeckend sein sollen, dies bedeutet wiederum, dass der Roboter in der Lage sein muss relativ präzise Mengen der Zutaten abfüllen zu können.
__Funktionsweise:__
Die Benutzung des Roboters läuft wie folgt ab: als Erstes stellt man ein Glas auf die Drehscheibe (1) und wählt dann über die Bedienobefläche (2) ein Getränk aus. Danach fährt das Glas, entgegen des Uhrzeigersinns, unter die Schläuche des Flüssigkeitssystems (3), über diese gelangen die Zutaten aus den Behältern dann ins Glas. Als letzter Schritt rotiert das Glas unter den Rührarm(4), dieser wird dann abgesenkt und vermischt die Zutaten im Glas. Am Ende fährt die Scheibe wieder auf ihre Ausgangsposition und das Getränk kann entnommen werden.
{{:projektewise1718:barkeeper:roboter3.jpg?200|}}
Der Cantina-Bot (finale Version)
__Konstruktion:__
//1.Ansatz//
Als Ausgangsbasis für unseren Cantina-Bot wollten wir das Grundgerüst, sowie den Drehteller des Cakecutter-Projektes ([[projektesose17:cakecutterpublic:start|Cakecutter]]) verwenden. Im Verlauf des Projekts mussten wir jedoch viele Modifikationen an dem Grundgerüst des Cake-Cutters vornehmen; hierbei haben wir besonders die Stabilität erhöht, zudem haben wir eine Halterung für den Rührarm des Catina-Bots geschaffen, sodass dieser seine Bewegungen ungestört ausführen kann.
{{:projektewise1718:barkeeper:barkeeper2.png?200|}}
Erstes Konzept des Cantina-Bots
Im weiteren Verlauf des Projekts haben wir uns jedoch von der Idee distanziert den Drehteller des Cake-Cutters zu nutzen, da dieser nicht nur umständlich beim Einbau gewesen wäre, sondern auch für unsere Zwecke zu unpräzise gefertigt war.
//2.Drehteller//
Eine bessere Alternative stellt hierbei der Drehteller eines alten Plattenspielers da. Dieser war nicht nur präzise gefertigt sondern ließ sich auch ohne große Umstände einbauen. Jedoch musste auch dieses Bauteil modifiziert werden, da es standartmäßig mit einem Elektromotor betrieben wird. Der Elektromotor wäre jedoch für unsere Zwecke unpraktisch gewesen, weshalb ein Schrittmotor als neuer Antrieb eingebaut wurde.
Während des Programms wird der Drehteller 8 verschiedene Positionen abfahren, welche jeweils einem Arbeitsschritt entsprechen. Hierbei werden die Positionen durch Neodymmagnete makiert, welche wiederum von einem Hall-Effekt-Sensor erkannt werden. Des weiteren wird eine Position als "Null-Position" markiert. Diese Position wird durch das zusätzliche Auslösen eines Tasters von den anderen Positionen unterschieden.
Ein weiteres Merkmal des Drehtellers ist eine eingebaute Lichtschranke, welche dazu dient zu erkennen ob sich ein Glas auf dem Drehteller befindet.
{{:projektewise1718:barkeeper:foto_4.jpg?200|}}
Der Drehteller mit der Halterung für das Glas(1) und mit dem Hall-Effekt-Sensor(2)
//3.Rührarm//
Bei dem Rührarm handelt es sich um eine Arbeitsstation, bei der die Zutaten, welche sich im Glas befinden, umgerührt werden und somit der Cocktail fertiggestellt wird. Hierbei muss der Rührarm insgesammt 3 verschiedene Bewegungsabläufe ausführen: Zum einen muss er den Rührkopf in das Glas absenken können, desweiteren muss er in der Lage sein durch Rotation den Cocktail zu vermischen und zuletzt muss er, aus hygenischen Gründen, in der Lage sein den Rührkopf über ein Säuberungsgefäß zu fahren. Da für das Absenken sowie für das Auslenken, relativ genaue sowie leistungsstarke Motoren von Nöten waren, haben wir uns entschieden Schrittmotoren zu verwenden. Diese übertragen ihre Bewegung auf Zahnstangen, welche dann den Rührarm bewegen. Beim Rührkopf haben wir uns für einen Standard-Elektromotor entschieden, da bei dieser Tätigkeit nur eine relativ schnelle Rotation erreicht werden muss. Desweiteren haben wir Taster eingebaut welche dazu dienen ein Feedback zu geben, wenn der Rührarm seine jeweilige Endposition erreicht hat.
{{:projektewise1718:barkeeper:foto_1neu.jpg?200|}}
//4.Flüssigkeitssystem//
Das Flüssigkeitssystem besteht aus 6 1l-Flaschen welche sich kopfüber in der Konstruktion befinden und von welchen der Boden entfernt wurde. Dies wurde getan, um die Füllhöhe mit insgesammt 6 Ultraschallsensoren zu messen. Die Ultraschallsensoren sind hierbei auf einer Platte montiert, welche durch Schaniere beweglich gelagert ist. Dies wurde getan, um ein Befüllen der Flaschen zu erleichtern.
{{:projektewise1718:barkeeper:foto_2.jpg?200|}}
Die Flaschen sowie die Ultraschallsensoren
Das Dosieren der Flüssigkeiten wird über 6 Magnetventile gesteuert, welche sich unterhalb der Flaschen befinden.
{{:projektewise1718:barkeeper:wp_20180302_15_21_47_pro_scaled.jpg?200|}}
Die Magnetventile und das Schlauchsystem
//5.Bedienoberfläche//
Die Bedienoberfläche besteht aus einem LCD und 9 Tastern, welche auf einer Holzplatte an der Front des Roboters befestigt sind. 8 der Taster erfüllen hierbei die Funktion der Rezeptauswahl, diese sind links und rechts vom Display positioniert. Der letzte Taster befindet sich unterhalb des Displays und dient der Abfrage der Füllstande sowie zur Bestätigung des gewählten Rezepts.
{{:projektewise1718:barkeeper:foto_3.jpg?200|}}
Die Bedienoberfläche im ausgeschaltenem Zustand
__Code (https://github.com/XFactHD/CantinaBot):__
Das Programm des Cantina-Bots wurde in 8 Tabs organisiert:
//Cocktailmaschine.ino//
Dieser Programmteil dient der Implementierung und dem Aufruf der State Machine. Desweiteren speichert dieser Programmteil die Rezepte-und Zutatendaten während das Gerät läuft und verarbeitet eingehende Tastendrücke.
//DisplayHandler.ino//
Die Kommunikation mit dem LCD erfolgt in diesem Programmteil, zudem werden hier spezielle Schriftzeichen erzeugt und Hilfsmethoden für z.B. das Hauptmenü und die Füllstandanzeige ausgeführt.
//FillLevelReader.ino//
Das Auslesen der Füllstände der Zutatenbehälter erfolgt in diesem Programmteil. Hierbei erfolgt das Auslesen: nach Start des Roboters, auf Tastendruck oder nach der Herstellung eines Cocktails.
//GlassChecker.ino//
Dieser Programmteil überpfrüft ob sich ein Glas auf der Drehscheibe befindet.
//ProcessHandler.ino//
Der ProcessHandler bringt den Drehteller und den Rührarm am Anfang des Programms in ihre Ausgangspositionen und steuert den Mischprozess. Zudem wird hier überprüft ob alle Zutaten vorhanden sind.
//RecipeHandler.ino//
Der RecipeHandler enthält Methoden zum Lesen und Manipulieren der Rezepte.
//SerialCom.ino//
Dieser Programmteil dient dazu, Kontakt mit der Konfigurationssoftware auf dem PC aufzunehmen, um die Zutaten- und Rezeptlisten auszulesen und zu verändern.
//StorageHandler.ino//
Auf dem EEPROM werden mit Hilfe des StorageHandlers die Rezepte und Zutaten nach der Bearbeitung durch den PC gespeichert. Desweiteren liest der StorageHandler die Rezepte und Zutaten beim Start aus dem EEPROM aus.
//Ablauf://
Beim Start des Geräts wird zu aller erst die serielle Schnittstelle aktiviert. Dann wird der DisplayHandler initialisiert, um dem Nutzer möglichst schnell Statusinformationen geben zu können. Daraufhin folgt die Initialisierung des FillLevelReaders, GlassCheckers und ProcessHandlers. Danach werden die Pins für die Taster konfiguriert. Im Anschluss liest der StorageHandler die Rezept- und Zutatendaten aus dem EEPROM aus und der SerialCom überprüft, ob das Gerät an einen PC angeschlossen ist und die Konfigurationssoftware versucht, auf das Gerät zuzugreifen. Ein Zugriffsversuch kennzeichet sich dadurch, dass die Konfigurationssoftware den String START sendet. Ist dies der Fall, werden weitere Initialisierungsschritte übersprungen. Andernfalls wird die Initialisierung fortgesetzt: Der ProcessHandler bringt den Rührarm und die Scheibe in die Ausgangsposition, der Hardwareinterrupt für die Taster wird aktiviert und die Füllstände der Zutatenbehälter werden von dem FillLevelReader überprüft. Zum Schluss werden die derzeitigen Füllstände auf dem LCD angezeigt.
Wenn sich das Gerät nach der Initialisierung im STATE_SERIAL_COM befindet, wird auf Daten von der Konfigurationssoftware auf dem PC gewartet. Sendet der PC den String GETRECIPES oder GETINGREDIENTS, werden entsprechend die Rezepte oder Zutaten an den PC gesendet. Sendet der PC einen String, der mit RECIPES oder INGREDIENTS beginnt und mit END endet, werden anhand der Daten zwischen diesen beiden Markern die Rezepte oder Zutaten verändert. Sendet der PC den String TERMINATE, beendet das Gerät das aktive Zuhören auf der seriellen Schnittstelle und speichert Veränderungen der Rezepte und/oder Zutaten im EEPROM des Mikrocontrollers.
Befindet sich das Gerät nicht im STATE_SERIAL_COM, wird auf Eingaben über die Taster gewartet. Wird der Taster für die Füllstandsanzeige gedrückt, werden die Füllstände angezeigt. Über den ersten Wahltaster kann eine erneute Messung der Füllstände durch den FillLevelReader erzwungen werden und über die Wahltaster 3-8 kann das Ventil für die an der jeweiligen Stelle auf dem Display angezeigte Zutat geöffnet und geschlossen werden, um die Schläuche mit Flüssigkeit zu füllen, damit die Dosierung später präziser ist. Ein weiterer Druck auf den Taster für die Füllstandsanzeige bringt das Gerät wieder ins Hauptmenü. Wird jetzt eine Wahltaste für ein Rezept gedrückt, wird vom ProcessHandler überprüft, ob für das jeweilige Rezept die Zutaten vorhanden sind. Wenn ja, dann wird vom GlassChecker überprüft, ob ein Glas auf der Scheibe steht. Ist dies nicht der Fall, wird bis zu 10 Sekunden gewartet, bevor der Vorgang abgebrochen wird. Steht ein Glass auf der Scheibe, wird weitere 2 Sekunden darauf gewartet, dass der Nutzer die Starttaste (Füllstandstaste) drückt. Ab diesem Punkt übernimmt der ProcessHandler die Kontrolle und sorgt für die Herstellung des Cocktails. Dafür wird das Glas von der Scheibe Station für Station unter den Schläuchen durchbewegt und die entsprechenden Zutaten eingefüllt. Zum Schluss wird der Cocktail von dem Rührarm vermischt, der Rührarm danach in einem Reinigungsgefäß gereinigt und das Glas wieder in die Ausgangsposition transportiert. Danach wird für die verwendeten Zutaten der Füllstand erneut gemessen, um bei dem nächsten Rezept sicherzustellen, dass der Cocktail entsprechend hergestellt werden kann.
//Lösungen://
* Füllstandsermittlung:
* Der FillLevelReader gibt einen kurzen Impuls über den jeweiligen Trigger-Pin an das Ultraschallmodul ab, wartet 250 Mikrosekunden und misst dann die Zeit, bis der Echo-Pin ausgelöst wird. Anhand dieser "Rundkurszeit" kann dann mithilfe der Schallgeschwindigkeit die Entfernung zwischen Modul und Flüssigkeitsoberfläche errechnet werden
* Positionsbestimmung der Scheibe:
* Neben der Drehscheibe befindet sich ein Hall-Effekt-Sensor und an der Scheibe an acht Positionen befindet sich jeweils ein Neodym-Magnet. Bewegt sich ein Magnet an dem Hall-Effekt-Sensor vorbei, wird dieser ausgelöst, wodurch die Software die abgefahrenen Positionen zählen kann.
* Glasdetektion:
* Um zu überprüfen, ob ein Glass auf der Scheibe steht, befindet sich an der Ausgangsposition unter der Scheibe eine Reflektionslichtschranke. Stellt man nun ein Glas auf die Scheibe, wird der Ausgang der Lichtschranke aktiviert und die Software weiß, dass ein Glass auf der Scheibe steht.
//Pinbelegung://
^ Pin ^ Bezeichnung ^ Beschreibung ^
| 2 | BUTTON_INTERRUPT | Hardware-Interrupt für Taster |
| 5 | BUTTON_START_OR_FILL_INFO | Füllstands- und Starttaster |
| 6 | BUTTON_SELECT_1 | Wahltaster 1 |
| 7 | BUTTON_SELECT_2 | Wahltaster 2 |
| 8 | BUTTON_SELECT_3 | Wahltaster 3 |
| 9 | BUTTON_SELECT_4 | Wahltaster 4 |
| 10 | BUTTON_SELECT_5 | Wahltaster 5 |
| 11 | BUTTON_SELECT_6 | Wahltaster 6 |
| 12 | BUTTON_SELECT_7 | Wahltaster 7 |
| 13 | BUTTON_SELECT_8 | Wahltaster 8 |
| A10 | LCD_RS | LCD - Register Select |
| A11 | LCD_EN | LCD - Enable |
| A12 | LCD_D4 | LCD - Datenpin Bit 4 |
| A13 | LCD_D5 | LCD - Datenpin Bit 5 |
| A14 | LCD_D6 | LCD - Datenpin Bit 6 |
| A15 | LCD_D7 | LCD - Datenpin Bit 7 |
| 22 | TRIGGER_PINS | Ultraschallmodul 1 - Trigger |
| 23 | ECHO_PINS | Ultraschallmodul 1 - Echo |
| 24 | TRIGGER_PINS | Ultraschallmodul 2 - Trigger |
| 25 | ECHO_PINS | Ultraschallmodul 2 - Echo |
| 26 | TRIGGER_PINS | Ultraschallmodul 3 - Trigger |
| 27 | ECHO_PINS | Ultraschallmodul 3 - Echo |
| 28 | TRIGGER_PINS | Ultraschallmodul 4 - Trigger |
| 29 | ECHO_PINS | Ultraschallmodul 4 - Echo |
| 30 | TRIGGER_PINS | Ultraschallmodul 5 - Trigger |
| 31 | ECHO_PINS | Ultraschallmodul 5 - Echo |
| 32 | TRIGGER_PINS | Ultraschallmodul 6 - Trigger |
| 33 | ECHO_PINS | Ultraschallmodul 6 - Echo |
| A0 | GLASS_SENSOR | Lichtschranke (Glass-Sensor) |
| 34 | VALVE_INGREDIENT_1 | Ventil 1 |
| 35 | VALVE_INGREDIENT_2 | Ventil 2 |
| 36 | VALVE_INGREDIENT_3 | Ventil 3 |
| 37 | VALVE_INGREDIENT_4 | Ventil 4 |
| 38 | VALVE_INGREDIENT_5 | Ventil 5 |
| 39 | VALVE_INGREDIENT_6 | Ventil 6 |
| 4 | MOTOR_STIR | Rührmotor |
| 40 | STEPPER_DISC_DIR | Schrittmotor - Scheibe - Richtung |
| 41 | STEPPER_DISC_STEP | Schrittmotor - Scheibe - Schrittsignal |
| 42 | STEPPER_DISC_ENABLE | Schrittmotor - Scheibe - Aktivieren |
| 43 | STEPPER_ARM_HOR_DIR | Schrittmotor - Rührarm (horizontal) - Richtung |
| 44 | STEPPER_ARM_HOR_STEP | Schrittmotor - Rührarm (horizontal) - Schrittsignal |
| 45 | STEPPER_ARM_HOR_ENABLE | Schrittmotor - Rührarm (horizontal) - Aktivieren |
| 46 | STEPPER_ARM_VERT_DIR | Schrittmotor - Rührarm (vertikal) - Richtung |
| 47 | STEPPER_ARM_VERT_STEP | Schrittmotor - Rührarm (vertikal) - Schrittsignal |
| 48 | STEPPER_ARM_VERT_ENABLE | Schrittmotor - Rührarm (vertikal) - Aktivieren |
| A7 | SWITCH_DISC_ZERO | Endschalter - Scheibe - Nullposition |
| A2 | SWITCH_DISC_POS | Hall-Effekt-Sensor - Scheibe - Positionsbestimmung |
| A3 | SWITCH_ARM_HOR_IN | Endschalter - Rührarm (horizontal) - innerer Anschlag |
| A4 | SWITCH_ARM_HOR_OUT | Endschalter - Rührarm (horizontal) - äußerer Anschlag |
| A5 | SWITCH_ARM_VERT_TOP | Endschalter - Rührarm (vertikal) - oberer Anschlag |
| A6 | SWITCH_ARM_VERT_BOTTOM | Endschalter - Rührarm (vertikal) - unterer Anschlag |
__Ergebnis:__
Als Resümee für dieses Projekt kann man sagen, dass es ein ambitioniertes Projekt war; welches wir im Rahmen unserer Möglichkeiten, gut, zu einem Ende führen konnten. Denn es ist uns gelungen einen sehr soliden Roboter zu entwickeln, welcher seiner Bestimmung, dem Coktailmischen, ohne große Einschränkungen nachgehen kann.
__Diskussion:__
Als einen diskussionswürdigen Punkt sehen wir die Wahl des Drehtellers, denn es wäre auch möglich gewesen einen Cocktail zumischen ohne, dass das Glas hätte bewegt werden müssen. Dies hätte zwar zu einer Vereinfachung des Projektes geführt; jedoch wäre damit aber auch ein Teil des "Showeffektes" verloren gegangen, welcher einen durchaus wichtigen Teil beim Cocktailmixen hat.
__Aussichten:__
Als Aussichten für dieses Projekt könnte man die Verfeinerung des Arbeitsablaufes sehen. Es könnte auch der Einbau einer Schüttelvorrichtung oder auch eine Station für die Zugabe von Eis installiert werden.