Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektesose17:cakecutterpublic:start

CakeCutter 9000™

Projektdokumentation

Beteiligte: Leonie, Luc, Antonia und Jakob

Der CakeCutter 9000™ soll mithilfe einer Webcam die Form eines Kuchens erkennen und damit bestimmen, ob er rund oder eckig ist. Sollte es sich um einen eckigen Kuchen handeln, soll ebenfalls die Länge ermittelt werden. Dank der Konstruktion kann der Roboter eine Platte um 180° drehen und eine weitere Platte vor- und zurückbewegen. Damit ist er in der Lage, sowohl runde als auch eckige Kuchen ideal in die gefragte gerade Stückzahl zu schneiden.


Ein Beispiel für den Ablauf des CakeCutters 9000

Themenfindung/Einleitung

Die Idee den CakeCutter 9000™ zu bauen entstand aus unseren Erfahrungen beim Kuchenschneiden, denn dabei kommt es oft zu Unzufriedenheiten, da die Stücken nicht immer gleich groß sind. Dieses Problem wollten wir gerne lösen. Dabei mussten wir uns Gedanken dazu machen, ob und wie es denn möglich ist, diese Idee umzusetzen. Nachdem wir uns über verschiedene Modellvariationen ausgetauscht haben, beschlossen wir, ein stationäres Konstrukt zu wählen. Kurz darauf fiel die Entscheidung zu einem gewissen Schneidemechanismus und so konnte unsere Arbeit beginnen, die aus folgenden Punkten bestand:

  1. Konstruktion des Gehäuses & der Plattformen
    Im Gehäuse soll für alle Bauteile Platz sein. Die Plattformen sollen bewegbar sein.
  2. Anbringen der Motoren & der Klinge
    Klinge und Motoren sollen in das gesamte System integriert werden.
  3. Kuchenerkennungssoftware
    Die Form des Kuchens soll ermittelt werden.
  4. Bewegungssoftware
    2 Plattformen sollen sich unterschiedlich bewegen können.
  5. Klingensoftware & Höhenerkennung
    Die Höhe des Kuchens soll ermittelt werden. Eine Klinge soll den Kuchen schneiden.
  6. Kommunikation zwischen PC & Arduino
    Daten sollen vom Arduino zum PC und vom PC zum Arduino übermittelt werden können.
  7. Konstruktion & Software testen
    Es wird überprüft, ob alle Teile zusammen funktionieren.
  8. Kuchen essen
    Die harte Arbeit wird mit einem vom CakeCutter 9000™ geschnittenen Kuchen belohnt!


1. Konstruktion des Gehäuses und der Plattformen

Für das Gehäuse haben wir 12 Holzbalken zu einer Art Würfel zusammengebaut. In diesem Würfel findet mittig oben ein 13. Balken Platz, an dem die Kamera befestigt ist. Oberhalb dieses 13. Balkens verläuft der Bewegungsmechanismus für die Klinge.
Auf den unteren Balken des Würfels finden 2 Schienen links und rechts Platz, auf denen sich die Trägerplatte befindet. Auf der Trägerplatte ist die Drehscheibe mit Hilfe einer Achse gelagert. Durch geschicktes Einbauen kann die Trägerplatte über eine Zahnstange vor und zurück bewegt werden und die Drehscheibe mithilfe eine Zahnrades um 180° gedreht werden.

Als Hauptmaterial haben wir uns für Holz entschieden, da es einfach und schnell zu bearbeiten ist während es eine hohe Stabilität aufweist. Außerdem ist es preiswert und in jedem Baumarkt verfügbar.

Gehäuse

Für den Aufbau des Gehäuses haben wir uns für einen Würfel entschieden. Diese Konstruktion gibt uns die Möglichkeit, viele Dinge an den Außenbalken anzubringen. Für die Größe des Würfels haben wir uns an einer durchschnittlichen Kuchengröße orientiert (~8cm Höhe, ~24cm Länge oder Durchmesser). Der 13. Balken liegt auf dem Gehäuse auf, gibt uns die Möglichkeit, die Kamera mittig über dem Kuchen anzubringen und bietet ebenfalls den Gewindestäben für die Klinge eine zusätzliche Führung.

Plattformen

Die Maße der Plattformen sind an die Maße des Gehäuses angepasst. Die Trägerplatte (eckig) ist mit Schienen auf den unteren Balken des Gerüstes gelagert und kann damit einfach rein- und rausfahren. Die Schienen entsprechen Schubladenvorrichtungen. Die Drehscheibe ist für die Rotation des Kuchens zuständig. Dafür befindet sie sich mittig auf der Trägerplatte. In ihrem Mittelpunkt haben wir eine Achse befestigt, diese wird durch ein Aluminiumrohr geführt, welches mit der Trägerplatte verklebt ist.

2. Anbringen der Motoren & der Klinge

Der Motor für die runde Drehscheibe ist in die eckigen Trägerplatte eingelassen und kann sich so mit ihr mit bewegen. Durch eine Achse, die durch den Mittelpunkt der beiden Platten geht, auf der ein Zahnrad sitzt, kann der Motor diese Drehscheibe drehen. Neben der Trägerplatte sitzt ein Motor, der durch eine sich auf der Platte befindende Zahnstange die Platte vor und zurück bewegen kann, soweit die Schienen es erlauben.
Die Klinge sitzt, wie zuvor erwähnt, mittig, unter dem 13. Balken. Die Gewindestäbe sind links und rechts unter den äußeren Balken, auch mittig angebracht. Sie münden in erhöhte, geölte Lager, damit wir möglichst wenig Reibung haben und werden durch den 13. Balken und die oberen Balken mit Hilfe einer Bohrung geführt. An jedem Gewindestab sitzen 2 Muttern, die an die Klinge gelötet wurden.
Der Motor des Klingenkonstrukts ist mit einem Zahnrad verbunden, welches die eine Gewindestange dreht, unterhalb dieses Zahnrads sitzen an beiden Gewindestangen weitere Zahnräder, die durch einen Zahnriemen verbunden sind. Somit drehen sie sich gleichzeitig.

Bewegungsmotor Rotationsmotor

Rotationsmotor

Der Motor ist in die Trägerplatte eingelassen. Mit Hilfe einer Aussparung in Größe des Motors passt er perfekt hinein. Der Motorboden ist an eine dünne Holzplatte geklebt, welche größer als Motorboden und Aussparung ist. Somit hält die Holzplatte den Motor an seinem Platz.

Bewegungsmotor

Damit das Zahnrad perfekt in die Zahnstange, welche auf der Trägerplatte angeklebt ist greift haben wir diesen Motor auf einem Holzblock mit der passenden Größe befestigt.

Klingenmotor

Der Motor zur Bewegung der Klinge ist ein Getriebemotor mit einer Übersetzung von 1 zu 20,4. Dadurch kann gewährleistet werden, dass die Klinge mit genügend Kraft bewegt wird und auch etwas härtere Kuchen geschnitten werden können. Damit der Motor sich auch unterschiedlich schnell und in zwei Richtungen drehen kann, verwenden wir das Monster Motor Shield VNH2SP30. So lassen sich auch größere Motoren betreiben, ohne das die Platine warm wird.

Klinge

Wir waren zunächst am Überlegen, ob wir einen Draht zum Schneiden verwenden würden und brachten einen Kuchenschneidedraht und Kuchen mit. Es hat funktioniert, doch für härtere Kuchen war er ungeeignet, deshalb haben wir uns dagegen entschieden. Für die Klinge verwenden wir ein dünnes Blech, welches mithilfe eines Heißluftföhns an vier Muttern gelötet wurde. Die Muttern wiederum sind auf die Gewindestäbe aufgeschraubt.


Klingenmotor und Zahnriemen

Klingenfürung
Kontaktleiste Widerstände

3. Kuchenerkennungssoftware

Eine Webcam macht ein Bild A von der Plattform ohne Kuchen und anschließend ein Bild B mit Kuchen. Mithilfe von Background Subtraction wird Bild A von Bild B abgezogen. Anschließend wenden wir einen Threshold Filter an, um ein schwarz-weißes, binäres Bild zu erhalten.

Dies war unser ursprüngliche Inspiration: http://www.pyimagesearch.com/2016/02/08/opencv-shape-detection/

Das Ziel der Kuchenerkennungssoftware ist es, die Stückzahleingabe entgegen zu nehmen, zu erkennen ob der Kuchen rund oder eckig ist und im zweiten Fall die Länge des Kuchens zu berechnen. Dafür greifen wir auf die OpenCV Bibliothek für Processing zurück. Ursprünglich dachten wir, man könne die Form und Länge auch über vorgeschriebene Funktionen der OpenCV Bibliothek berechnen, aber es stellte sich raus, dass nicht alle Funktionen von OpenCV auch in der Bibliothek für Processing enthalten sind.
Daher nutzen wir die OpenCV Bibliothek für Processing nur, um zwei Kameraaufnahmen miteinander abzugleichen und für einen Filter, der aus dem bunten Bild ein binäres macht. Ein binäres Bild ist ein Bild, welches nur durch zwei Farbwerte beschrieben wird, weiß(255) und schwarz(0). Der Filter, den wir benutzen, um das Bild zu einem binären zu machen, heißt Threshold. Bevor wir allerdings diesen Filter auf unseren Kuchen anwenden können, müssen wir ihn von unserem Hintergrund abgrenzen. Dies machen wir mit einem Verfahren, das sich Background Subtraction nennt. Die Background Subtraction funktioniert so:
Es wird ein Bild vom Hintergrund (bei uns also von der Platte) ohne den Kuchen aufgenommen. Anschließend wird ein Bild mit dem Kuchen (siehe Bild unten links) auf der Platte aufgenommen. Unsere Software zieht dann den Hintergrund von dem Bild mit dem Kuchen ab, sodass wirklich nur der Hintergrund des Kuchens weg ist. Übrig bleibt dann der Kuchen allein. Das Ergebnis mit Backround Substraction ud dem Filter sieht man im Bild unten rechts.

4. Bewegungssoftware

Die Trägerplatte soll auf Schienen vor- & zurückbewegt werden. Die runde Drehscheibe soll um 360° gedreht werden können. Die Software soll, nachdem sie über die Kuchenform benachrichtigt wurde, entweder Trägerplatte für den eckigen Kuchen bewegen, oder die Drehscheibe für den runden Kuchen drehen.
Bewusst haben wir weggelassen, dass der Kuchen von dem Roboter positioniert wird, wir gehen davon aus, dass der Kuchen mittig eingelegt wird.

Die Bewegungssoftware soll dazu in der Lage sein, die Trägerplatte und die Drehscheibe von gegebenen Daten zu bewegen. Sobald klar ist ob der Kuchen rund oder eckig ist, wie lang er ist und wie viele Stücke gefordert werden, unterscheidet die Software zwischen zwei verschiedenen Abläufen. Die Funktion soll ebenfalls vor und nach dem Schneidevorgang die Trägerplatte hinausfahren, damit der Kuchen auf die Drehscheibe gestellt werden kann bzw. wieder entnommen werden kann.

Ansteuern der Steppermotoren: Um die von uns verwendeten Stepper Motoren ansteuern zu können, muss man sie über einen driver oder auch Treiber an die Stromquelle und an den Arduino anschließen:

Der Motor wird durch zwei digitale Pins angesteuert. Der eine gibt an in welche Richtung der Motor sich dreht und der andere gibt an ob er sich dreht oder nicht. Damit sich der Motor um einen Step bewegen kann, muss der Pin, welcher den Motor an- oder ausschaltet einmal an- und einmal ausgeschaltet werden. Um mehrere Steps hintereinander zu schalten haben wir diesen Vorgang in eine For-Schleife gepackt und wiederholen ihn so oft, wie wir Steps brauchen. Um das berechnen zu können braucht man das Verhältnis von Stepperrevolution zu dem Zahnrad, bzw. zu den Zahnrädern, die an den Motor greifen. Die Stepperrevolution der Motoren die wir verwendet haben beträgt 200, das heißt, dass der Motor 200 mal an- und ausgeschaltet werden muss, damit er sich einmal um sich selbst dreht. All diese Berechnungen müssen nur einmal angestellt werden, die Ergebnisse werden dann in dem Code integriert.
whatsapp_image_2017-08-18_at_18.21.21_1_.jpegwhatsapp_image_2017-08-18_at_18.21.21.jpeg
Wie auf den Fotos gezeigt(links und rechts) muss der Motor mit dem Motor driver und dem Arduino verbunden werden. in der mitte ist ein Schaltplan des drivers gezeigt.

Der runde Kuchen

Durch die Gegebenheit der Klinge ist es uns nur möglich eine gerade Anzahl an Stücken zu schneiden. Ist die Stückzahl n gegeben sind, demnach n/2 Schnitte von Nöten, damit die gewünschte Stückzahl geschnitten wird. Aus diesem Grund dreht die Drehscheibe sich (n/2)-1 mal zwischen den Schnitten um (360°/n). Um die gewünschte Gradzahl pro Drehung zu erlangen muss man die Übersetzung der verwendeten Zahnräder kennen. In unserem Fall hat das Zahnrad an der Achse der Drehscheibe 60 Zähne und das Zahnrad, an dem der Steppermotor angebracht ist, welcher in das erste Zahnrad greift, hat 12 Zähne. Somit muss der Motor sich 5-mal um sich selbst drehen damit die Drehscheibe einmal um 360° gedreht wird. Mit diesen Zahlen haben wir errechnet, dass ein Step des Motors 0,36° entspricht & kennen die Zahl der Steps, die für den Motor festgelegt werden.

Der eckige Kuchen

Der Kuchen wird zunächst einmal in der Mitte geschnitten, danach fährt die Trägerplatte um die Stückbreite (Länge des Kuchen/ Stückzahl) in eine Richtung und schneidet auf der neuen Position erneut den Kuchen, das wird (Stückzahl/2)-1 mal wiederholt, danach dreht sich die Drehscheibe um 180° und der Kuchen wird von der anderen Seite von außen nach innen auf dieselbe Art geschnitten. Um die Strecke für den Motor zu berechnen, bzw. um festzustellen wie viele Steps von Nöten sind um die Trägerplatte um eine bestimmte Länge zu bewegen braucht man das Verhältnis von Zähnen auf dem Zahnrad des Motors zu seiner Stepperrevolution.


Hier ein Überblick wo was geschieht

5. Klingensoftware & Höhenerkennung

Die Software soll einen Motor betreiben, der 2 Gewindestangen drehen soll, an denen eine Klinge hoch und runter bewegt werden kann. Ein Infrarotsensor soll den Abstand des Kuchens zum oberen Balken messen. Anhand dieser Daten soll die Software die Klinge nur auf eine bestimmte Höhe hochfahren lassen um Zeit und Aufwand zu sparen. Die Höhe soll anhand von verschieden Widerständen seitlich eines Gewindestabs festgelegt werden.

Schaltplan, Daten zum Motor & zu den Zahnrädern/-riemen (Erwähnung bzgl. des Riemens, dass er zusammengenäht wurde), wie wir auf die Ideen kamen, Lösungsansätze, Verweis zum Code

Klingensoftware

Die Software zur Steuerung der Klinge ist in zwei Funktionen (void cutCake() und void moveBladeUp()) unterteilt. Die Funktion void moveBladeUp() wird bereits am Anfang des Programmes aufgerufen, sodass die Klinge in die höchst mögliche Position gefahren wird. So kann der Kuchen eingelegt werden, ohne das die Klinge stört. Außerdem dient diese Klingenstellung als Ausgangsposition für die void cutCake() Funktion, da sie zum schneiden auf eine Klinge angewiesen ist, die sich schon über dem Kuchen befindet.

Die zweite Funktion wird immer dann aufgerufen, wenn der Kuchen geschnitten werden soll. Die Klinge wird dabei solange nach unten bewegt, bis sie die Drehscheibe berührt. Damit der Kuchen für den nächsten Schnitt positioniert werden kann, muss die Klinge allerdings wieder nach Oben. Um nicht unnötig viel Zeit zu verschwenden, wird die Klinge nur so weit nach Oben gefahren, wie auch nötig. dafür wird wieder die Klingenposition mit der Kuchenhöhe verglichen.


Aber wie ermitteln wir die Position der Klinge? Dafür haben wir eine Lösung gefunden, die gerademal ein analogen Pin des Arduinos, einige Widerstände (Bild rechts) und ein paar Kabel benötigt. An der Klinge haben wir dafür einen Kupferdraht befestigt, der sich mit der Klinge hoch- und runter bewegt und über kleine Kupferkontakte geschoben wird. Berührt der Draht einen dieser Kontakte, kann ein Strom über einen Widerstand zu einem analogen Pin des Arduinos fließen. Jede Kontaktfläche hat dabei einen charakteristischen Widerstandswert, wodurch die Klingenposition ermittelt werden kann.

Leider brachte dieser Ansatz seine Probleme mit sich. Durch Wackelkontakte wurden die Messwerte unzuverlässig, sodass die Klinge nicht immer die gewünschte Position anfuhr. Da unser Getriebemotor einen Encoder zur Bestimmung der Umdrehungen besaß, entschieden wir uns den Encoder zu verwenden. Zuerst wirkte Dieser Ansatz auch sehr vielversprechend, da wir bei Messungen mit einem Lineal wiederhohlt die gleiche Anzahl von Umdrehungen im Bezug auf die von der Klinge zurückgelegten Strecke erhielten. Als wir für den Encoder dann einen neuen Tab (Klinge_mit_encoder, Arduino Sketch) schrieben und ihn in den Programmablauf einfügten, bemerkten wir, dass die Position der Klinge um wenige Zentimeter von der gewünschten Position unterschied. Bedauerlicherweise war dies der letzte Tag, den wir zu Verfügung hatten.


Kupferkontakte

Höhenerkennung

Die Erkennung von der Höhe des Kuchens haben wir über einen Infrarotsensor bewerkstelligt. Wir brauchen die Höhenangabe um bei der Klingenbewegung Zeit und Aufwand zu sparen. Wir haben diesen Infrarotmesser verwendet: https://www.pololu.com/product/2474 . Damit der IR-Sensor uns jedoch die Entfernung in cm zurückgibt, mussten wir eine Funktion finden, die die Werte, welche der Arduino ausliest, in cm umrechnet. Dazu haben wir Messungen entlang eines Zollstocks gemacht. Von 10cm bis 50cm haben wir unsere ausgemessenen Werte in 2cm Schritten gemessen und in einer Tabelle zusammengetragen. Mithilfe des Programms QtiPlot, welches auf dem TU Server zum Download steht, konnten wir anhand der notierten Werte in der Tabelle eine passende Funktion finden, welche genau das tat, was wir brauchten. Hier sieht man die Kurve die durch die gemessenen Werte entstanden ist (schwarz) und die optimierte Kurve die durch die annähernde Funktion beschrieben wird (rot):

tabelle1.xls

Das Programm hat uns die Konstanten vorgegeben.
Die Formel: Y0+A*exp(-x/t)
Die Konstanten: A = 1.135,0596170341; t = 21,05871719154; Y0 = 45,495760025136
Durch Integration dieser in unseren Arduino Code haben wir es geschafft, dass die Funktion, die wir geschrieben haben, uns den Abstand vom IR-Messer zur nächsten Oberfläche in cm zurückgibt.

6. Kommunikation zwischen PC & Arduino

Damit unsere verschiedenen Programme einander Informationen zuspielen können und auch der zeitliche Ablauf stimmt, mussten wir einen Weg finden, wie sie miteinander Kommunizieren können. Verweis zur Quelle (wo wir den Lösungsansatz her haben), Verweis zum Code Wir haben uns dazu entschieden, dass der Arduino mit dem Processing Programm über ein USB Kabel verbunden ist und damit darüber kommunizieren kann, da wir auf Grund der Bildverarbeitungssoftware so wieso einen Laptop brauchten und durch die Kabelverbindung die Kommunikation recht schnell geht und auch die Stromversorgung von des Arduinos geklärt war. Damit verständigen sich der Arduino und Processing über den Serial Port. Für Arduino müssen keine weiteren Anwendungen Importiert werden, bei Processing hingegen muss jedoch die processing.serial Bibliothek implementiert werden und der benutzte USB Port mit der Baudrate angegeben werden:

import processing.serial.*; 
Serial arduino = new Serial(this, "COM5", 9600);

Für die empfangende Partei ist es immer wichtig auf die Daten die empfangen werden sollen zu warten. Am einfachsten kan man das anhand einer While-Schleife realisieren und der Abfrage ob etwas im Port vorliegt:

Processing:    while(arduino.available()==0);
Arduino:       while(Serial.avalable()==0);

von Arduino zu Processing

Arduino

Um Signale von dem Arduino an P zu senden, reicht es

Serial.println(x);

mit dem gewünschten Inhalt in den Klammern zu senden. Damit das Auslesen jedoch leichter in P ist, haben wir unseren Wert x in einen String umgewandelt:

Serial.println( (String)(x) );
Processing

Muss in diesem Fall die Daten aus dem Serial Port empfangen. Die Daten kommen als Bytes an und diese muss man dann auslesen. Wir haben uns dazu entschieden zuerst die Bytes in einem String zu speichern und diesen String dann in einen Integer umzuwandeln. Dafür haben wir das Beispiel aus dem WIKI leicht verändert.

Signale von Processing an den Arduino

Processing

Hierfür muss man einfach nur die Werte in dieser Form schicken:

arduino.write(x);
Arduino

Nachdem die zu empfangenden Daten im Port vorliegen, kann man sie über einen einfachen Befehl leicht auslesen und in einer Variable speichern. Wir haben Integers versendet, deshalb sieht unser Code wie folgt aus:

while(Serial.available()==0);
int newValue = Serial.read();


Hier eine Übersicht was wann gesendet wird und wo wann gewartet wird.

7. Konstruktion & Software testen

Um Fehler beim finalen Produkt zu vermeiden, lassen wir die Programme einige Male durchlaufen. Eventuell müssen Kleinigkeiten angepasst werden.

Wir haben unsere einzelnen Konstruktionen und Funktionen im Einzelnen getestet. Für die Ansteuerung von Motoren, die Kommunikation und die Bildauswertung haben wir Probe-Codes geschrieben die nur Teile des schlussendlichen Codes erfüllen aber die wesentlichen Ansteuerungen imitieren. Wichtig war, dass die einzelnen Teilaufgaben immer aufeinander abgestimmt waren und jeder immer ie für sich relevanten Informationen der Anderen hatte. Das Zusammenführen der Konstruktionsteile hat dank guter Planung ziemlich gut funktioniert, die Konstruktion der Klinge hat uns jedoch am meisten Schwierigkeiten bereitet.
.

.
.
.
.
.
.

8. Kuchen essen

Guten Appetit!

Technische Daten, Bauteile,Pins, ect

Ergebnis und Diskussion

Er kann die Stückzahl einlesen.
Er kann Fotos machen und daraus binäre Bilder zaubern.
Er schneidet schweißfrei und ist vor dem Chef im Geschäft.
Er kann die Höhe des Kuchens messen.
Er kann zwischen Arduino und PC (beide Richtungen) kommunizieren.
Er kann zwischen runden und eckigen Kuchen unterscheiden und die Länge eines eckigen Kuchens akkurat berechnen.
Er kann die Platten unabhängig voneinander bewegen.
Die Klinge kann bewegt werden (weitere Ergebnisse offen).

Ausblick

An dem CakeCutter 900 kann noch einiges verbessert und weiterentwickelt werde.

Fehlerbehebung

-Die Klingenbewegung muss optimiert werden, das kann über beide Ansätze geschehen (Widerstände und über die Kontrolle der Umdrehungn).
-Die Formerkennung muss noch ausgebaut werden.
-Die Längenerkennung muss noch ausgebaut werden.

Weiterentwicklung

-Die Motoren können extern mit Stromversorgt werden.
-Ebenfalls der Arduino.
-Die Stückeingabe kann über einen kleinen Distplay geregelt werden.
-Die Programme können so ausgebaut werden, dass der Roboter nach der Eingabe der Stückzahl autonom agiert.
-Es kann ein Startknopf eigebaut werden.
-Es kann eine Blechkuchen Option hinzugefügt werden, dass ab einer bestimmten Breite der Kuchen nicht nur längst sonder auch queer geschnitten wird.
-Es kann alles an Sound- und Specialeffekten noch an den Roboter angebaut werden, ob es ein Sahnespender, eine Portion Streusel oder auch ein Vorhang( welcher während des Scneidevorgangs geschlossen ist und den geschnittenen Kuchen danach präsentiert) ist, der Kreativität sind keine Grenzen gesetzt.

Code und Rodaten

Quellen

projektesose17/cakecutterpublic/start.txt · Zuletzt geändert: 2017/10/09 14:48 von c.jaedicke