Legoteil Zählmaschine 2016 2017: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „400px|thumb|top|Abbildung 1: Legoteilzählmaschine im Überblick Bei der HSHL Lego® Zählmaschine handelt es sich …“)
 
 
(319 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Datei:LegoZählmaschine_Wiki_800px.jpg|400px|thumb|top|Abbildung 1: Legoteilzählmaschine im Überblick]]
[[Datei:Legozaehlmaschine V2.png|400px|thumb|top|Abbildung 1: Legoteilzählmaschine im Überblick]]


Bei der HSHL Lego® Zählmaschine handelt es sich um eine Maschine, die automatisch Legoteile zählen und sortieren kann, um gegebenen Falls fehlende Lego®-Steine nachbestellen zu können. Es ist ein studentisches Projekt, welches in Rahmen des System-Entwurf-Praktikums des Studiengangs Mechatronik mit Schwerpunkt System Design Engineering im 7. Semester durchgeführt wurde. <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
Bei der HSHL Lego® Zählmaschine handelt es sich um eine Maschine, die automatisch Legoteile zählen und sortieren kann, um gegebenen Falls fehlende Lego®-Steine nachbestellen zu können. Es ist ein studentisches Projekt, welches in Rahmen des System-Entwurf-Praktikums des Studiengangs Mechatronik mit Schwerpunkt System Design Engineering im 7. Semester durchgeführt wurde. <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
Zeile 6: Zeile 6:
'''Autoren:''' [[Benutzer:Adam_Fankhauser|Adam Fankhauser]], [[Benutzer:Christo_Tsibadze|Christo Tsibadze]], [[Benutzer:Kevin_Penner|Kevin Penner]], [[Benutzer:Niklas_Lingenauber|Niklas Lingenauber]], [[Benutzer:Sergej_Krause|Sergej Krause]], [[Benutzer:Simon_Hanemann| Simon Hanemann]]
'''Autoren:''' [[Benutzer:Adam_Fankhauser|Adam Fankhauser]], [[Benutzer:Christo_Tsibadze|Christo Tsibadze]], [[Benutzer:Kevin_Penner|Kevin Penner]], [[Benutzer:Niklas_Lingenauber|Niklas Lingenauber]], [[Benutzer:Sergej_Krause|Sergej Krause]], [[Benutzer:Simon_Hanemann| Simon Hanemann]]


'''Betreuer:''' [[Benutzer:Ulrich Schneider|Prof. Schneider], Mirek Goebel|Prof. Goebel]]
'''Betreuer:''' [[Benutzer:Ulrich Schneider|Prof. Schneider]], [[Mirek Goebel|Prof. Goebel]]




= Aufgabenstellung =
= Aufgabenstellung =
Die vorhandene Legoteilzählmaschine (siehe [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2015 Legoteilzählmaschine_2015] ) soll Soft- und Hardwaremäßig modifiziert werden, um weitere Anforderungen zu erfüllen.<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>  
Die vorhandene Legoteilzählmaschine (siehe [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016 Legoteilzählmaschine_2016] ) soll Soft- und Hardwaremäßig modifiziert werden, um drei wichtigsten Anforderungen zu erfüllen. Die Vereinzelung bzw. Separierung der Legoteile soll verbessert werden damit in Bildverarbeitungsbox nur einzelne Legoteile zugeführt werden. Für die Bildverarbeitung bzw. Legoteilerkennung soll ein neuer Ansatz entwickelt werden. Bisherige Ansätze konnten Merkmale bei einigen Legoteilen teilweise ungenau ermitteln. Die größten Probleme gab es bei schwarzen und braunen Legoteilen, sowie an Licht-reflektierenden Flächen der Legoteile und bei Schattenbildung. Nach der Legoteilerkennung wurde bisher nur binär sortiert, erkannt und nicht erkannt. In diesem Semester soll ein Konzept aufgestellt und zum Teil realisiert werden.
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>  
<br /><br />
<br /><br />
<br />
<br />
== Liste der offenen Punkten vom letzten Semester ==  
== Aufgabenteilung ==  
Die in der Aufgabenstellung genannten wichtigsten Arbeitspakete wurden wie folgt in drei Teams aufgeteilt:


* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Elektronik_und_Sicherheit '''Neues 24 V Netzteil'''], 24V/10A Netzteil gegen 24V/20A austauschen, um Überlast beim Lauf aller Motoren zu verhindern. Neues Netzteil ist vorhanden.
* [[Benutzer:Adam_Fankhauser|'''Adam Fankhauser''']], [[Benutzer:Niklas_Lingenauber|'''Niklas Lingenauber:''']]
** Separierung:
*** Neues Konzept zur Separierung der Legoteile
**** Umbau der Legoteil-Zählmaschine
**** Erkennung von Legoteil-Gruppen
** Weitere Aufgaben:
*** Entwurf einer Steuerplatine zur Realisierung des neuen Konzeptes
*** Umbau Schaltschrank


* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Bildverarbeitung.2FLegoteil-Erkennung '''Software zur Bildverarbeitung (BV)'''], Die Einbindung einer geeigneten Software zur Teileerkennung steht noch aus. Kommunikation mit Systems sowie Ansteuerung ist fertig. Bildverarbeitung mit 'String' als Output.
* [[Benutzer:Kevin_Penner|'''Kevin Penner''']], [[Benutzer:Christo_Tsibadze|'''Christo Tsibadze:''']]
** Bildverarbeitung: Neuer Ansatz für bessere Farb- und Merkmalerkennung der Teile
*** Ablauf der Bildverarbeitung / Legoteilerkennung
*** Schnittstellen
*** Mechanischer Aufbau Neuer BV-Box
*** Matlabimplementierung
**** Ablaufplan
**** Parametrisierung der Kamera
**** Automatische Kalibrierung der Kamera
**** Legoteilerkennung
** Weitere Aufgaben:
*** "Abflussrohr", Transportsrohr für Legoteile (Bildverarbeitungsbox --> Sortierung)
*** "Drosselklappe", Prototyp für Separierung in Y-Richtung
*** Kommunikation mit Arduino
*** Einteachen von ein paar Legoteilen
*** Modifizierung der Main-Datei


* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Datenbankanbindung.2C_Listen_IN.2FOUT '''Bauteileliste in Excel'''], Die Excel Liste, welche alle Teile eines Baukasten erhält, muss mit dem Ergebnis der BV abgeglichen werden. Erkannte Teile in mindestens zwei möglichen Ausrichtungen müssen erkannt und in der Liste vermerkt werden.
* [[Benutzer:Simon_Hanemann|'''Simon Hanemann''']], [[Benutzer:Sergej_Krause|'''Sergej Krause:''']]
 
** Sortierung:
* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Auswerfer '''Servo für Teilesortierung'''], Identisches Servo wie bisher gegenüberliegend montieren, um drei Sortierfächer (Erkannt/Nicht Erkannt/Fremdteil) zu sortieren, Konstruktion, Bestellung wurde an Fr. König geleitet.
*** Konzepte verschiedener Sortierverfahren
 
*** Realisierung eines Linearläufers
* '''Zeit bis zur Servoöffnung''', Das Delay zwsichen Befehl und öffnen der Servos muss ermittelt und je nach Geschwindigkeit angepasst werden. Es ist problemlos möglich, einen weiteren 'String' - Befehl als Buchstaben für die Verzögerungszeit einzubinden, String auslesen und verarbeiten muss in Arduino Software geschehen.
*** Hardwareaufbau der Sortierungskästen
 
*** Programmierung des Linearläufers mithilfe des GeckoDrive
* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Elektronik_und_Sicherheit '''Kabelkanal montieren'''], Kabelkanal zur ordentlichen Verlegung der Leitungen an den Förderbändern montieren
*** Hardwaresicherung für Linearläufer
 
** Weitere Aufgaben:
* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Kamera.2FBildbox-_und_Auswerferhalterung '''Kamerahalterung'''], Konstruktion einer Kamerahalterung für die Logitech C920 WebCam Vorschlag: Brücke über Förderband.
 
* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Kamera.2FBildbox-_und_Auswerferhalterung '''Bildverarbeitungskasten'''], Für die Bildverarbeitung muss eine der gebauten Bildverarbeitungsbox-Prototypen ausgewählt und montiert werden. Hierfür wurden Lichttests durchgeführt. Ergebnisse sind protokolliert [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/02_Versuchsprotokolle/Lichttests/ SVN Link zu den Lichttests], Prototypen der Lichtboxen vorhanden.
 
* [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Teilezentrierung '''Teilezentrierung'''], Die provisorisch aus Holz gefertigte Teilezentrierung soll in fixierbarer Variante aus Aluminium gefertigt werden. Ergebnisse zu den Tests der Zentrierungsmethoden sind in [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/02_Versuchsprotokolle/Bauteilzentrierung/ diesem SVN Ordner] protokolliert, Prototypen der gewählten Teilezentrierung ist vor der Bildverarbeitungsbox verbaut.
 
* '''Idee Software: Flexible Bildverarbeitungssoftware''', Durch definieren der Schnittstellen könnte in der GUI eine Einbindung frei wählbarer BV Software realisiert werden. Optimal geeignet um kleine Projekte dann an der Legoteilzaehlmaschine zu testen.
** Wird in diesem Projekt nicht bearbeitet.




<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>


== Aufgabenteilung inkl. weiteren Aufgaben aus dem Pflichtenheft ==
= Realisierung =


Es wurden für jede Aufgabe ein oder mehrere Verantwortliche(n) aus der Gruppe festgelegt. Jede Person ist dann dafür zuständig, dass diese Aufgaben erfüllt werden. Bei Bedarf steht dieser Person die ganze Gruppe zur Hilfe zur Verfügung.
== Gruppe: Separierung ==
<br />
Die Separierung ist der erste Schritt für die Sortierung von Legoteilen. Hauptziel dieses Schrittes ist es, dass alle Legoteile einzeln in die folgenden Schritte weitergegeben werden. Die Bildverarbeitung und die Sortierung sind nur möglich, wenn die Teile vereinzelt wurden.


* [[Benutzer:Kevin_Penner|'''Kevin Penner:''']]
Die Ergebnisse des vorausgegangenen Praktikums haben aufgezeigt, dass eine Vereinzelung der Legoteile mit dem vorhandenen Aufbau schwer zu verwirklichen ist (siehe [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Fazit Semester 2016 Fazit]). Durch das Befüllen des Bunkers mit einer Vielzahl an Legoteilen, gestaltet es sich schwierig, die Anzahl der ausgegeben Legoteile auf das Förderband zu regulieren. Es kommt oft dazu, dass sich zu viele Teile auf dem Fließband befinden. Eine Verminderung der Geschwindigkeit des Förderns aus dem Bunker reicht nicht aus, da die Lamellen des Stetigförderers zu viele Teile aufnehmen können. Auch vereinzelte das vorherige Konzept mit unterschiedlich schnell laufenden Bändern die Teile nicht, wenn sich zu viele Teile auf dem Band befanden.
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Separierung_und_Zentrierung_der_Legoteile Separierung und Zentrierung der Lego-Teile]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Pflichtenheft_Dokumentation_in_DOORS Pflichtenheft Dokumentation mit Software "DOORS"]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Bildverarbeitung.2FLegoteil-Erkennung Bildverarbeitung/Legoteil-Erkennung]
* [[Benutzer:Simon_Hanemann|'''Simon Hanemann:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#GUI GUI Programmierung]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016 Dokumentation in HSHL-Wiki]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016# Video-Anleitung]
* [[Benutzer:Adam_Fankhauser|'''Adam Fankhauser:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Elektronik_und_Sicherheit Elektr. Sicherheit]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Kamera.2FBildbox-_und_Auswerferhalterung Bildverarbeitungs-Box Fixierung/Stabilisierung]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016# Video-Anleitung]
* [[Benutzer:Niklas_Lingenauber|'''Niklas Lingenauber:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Datenbankanbindung.2C_Listen_IN.2FOUT Datenbankanbindung IN/OUT und Listen]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Projektplan Projektplan]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016# QM-Tests (nach Rücksprache mit Prof. Schneider auf das nächste Semester verlegt)]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Bildverarbeitung.2FLegoteil-Erkennung Bildverarbeitung/Legoteil-Erkennung]
* [[Benutzer:Sergej_Krause|'''Sergej Krause:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Teach-IN Teach-IN Funktion]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Datenbankanbindung.2C_Listen_IN.2FOUT Datenbankanbindung IN/OUT und Listen]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Separierung_und_Zentrierung_der_Legoteile Separierung und Zentrierung der Lego-Teile]
* [[Benutzer:Christo_Tsibadze|'''Christo Tsibadze:''']]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Projektplan Projektplan]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Bildverarbeitung.2FLegoteil-Erkennung Bildverarbeitung/Legoteil-Erkennung]
** [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Prozessvisualisierung_mit_Visio Visualisierung von Prozessen mit "Visio"]


In Wintersemester 2016/2017 wurde das Konzept umgesetzt, dass Hindernisse am Rand des Förderbandes angebracht werden. Diese sollten nur einzelne Teile durchlassen, wenn sich eine Vielzahl an Teilen auf dem Förderband befinden.Es stellte sich heraus, dass das Anbringen von Hindernissen auf dem ersten Förderband nicht wie gewünscht die Legoteil-Gruppen auseinander zieht und gelegentlich durch verklemmte Teile die Legoteil-Zufuhr zur Bilderkennung verstopft. Dies hat in Kombination mit den Problemen bei der Sortierung von Legoteilen nach dem Erkennungsprozess dazugeführt, dass eine Überarbeitung des Gesamtkonzeptes notwendig war, um die Zuverlässigkeit der Legoteil-Zählmaschine gewährleisten zu können.


<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
= Projektplan =
[[Datei:Aufgabenteilung_Projektplan.jpg|600px|thumb|left|Abbildung 2: Aufgabenstellung und Projektplan]]
[[Datei:Projektplan Legozählmaschine1.png|300px|thumb|right|Abbildung 3: Projektplan]]
<br />
<br />
'''Meilensteine für das 6. Semester mit Deadlines:'''
=== Neues Konzept zur Separierung der Legoteile ===


* 06.06.2016: Hardware und Software Inbetriebnahme
Das neue Konzept zur Separierung besteht aus einer eigenen Bilderkennungsbox, in der erkennt werden soll, ob sich zu viele Legoteile zur selben Zeit auf dem Laufband befinden. Am Ausgang der Bildbearbeitungsbox befinden sich zwei Laufdrückdüsen, die einen Laufstoß ausgeben können wenn sich zu viele Teile auf dem Band befinden. Dabei werden die Teile entgegen der Laufrichtung des Band befördert. Es folgt eine erneute Auswertung der Anzahl der sich auf dem Fließband befindenden Teile. Sollten sie nun vereinzelt sein, können die Box passieren.
** Inbetriebnahme "Erprobung von Sensoren und Aktoren"
** Automatische Sortierung von mind. 30 Teilen
** Sortierung: Erkannt und Nicht-Erkannt
** Bildverarbeitung in "Echtzeit" am PC
** Ausgabe der Inventurliste


* 24.06.2016: Algorithmen:
Bei diesem Konzept der Separierung kann auf ein zweites Förderband zunächst verzichtet werden.
** Optimierung der Bildverarbeitung
** Automatische vollständige Sortierung: NXT-Basis + Erweiterung
** Planung und Beschaffung der Hardware-Änderung (Auswerfer) für die nächste Projektphase


* 14.11.2016: wird noch festgelegt, entweder Auswerfer- oder Separierung vor der BV Optimierung
* 16.01.2016: Algorithmen Optimierung, Teach-In XT/EV3 und Report
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
<br /><br /><br /><br /><br /><br /><br /><br /><br />


= Realisierung =
<br />
== Main-Funktion ==
==== Umbau der Legoteil-Zählmaschine ====


[[Datei:MAIN.jpg|300px|thumb|right|Abbildung 4: Aufbau der Main-Funktion]]
[[Datei:2016 2017 Aufbau Legomaschine V2.jpg|600px|thumb|rechts|Abbildung 2: Neuer Aufbau der Legoteil Zählmaschine]]
Die Mainfunktion ist das Hauptprogramm der Legozählmaschine. Sie ruft nach Start des Programmes alle weiteren Module und Funktionen auf.
Um das neue Konzept des vorherigen Kapitels umzusetzen, mussten einige Komponenten an der Legozählmaschine umgebaut und angepasst werden (siehe Abbildung 2). Zum Einen wurde das erste, kurze Förderband entfernt, sodass nur noch das Lange verwendet wird. Dies war notwendig um Platz für den Anlagenteil zur Sortierung zu schaffen, außderdem ist die Separierung durch zwei unterschiedlich schnell laufende Förderbänder nicht mehr Teil des Separierungskonzepts. Am Anfang des Förderbandes wurde der Bunker platziert, der die Legoteile auf das Band befördert. Die Box zur Bilderkennung befindet sich nach wie vor mittig auf dem langen Förderband. Innerhalb dieser Box wird die Lage der Legoteile erfasst. Am Ausgang der Box wurden zwei Luftdruckdüsen so angebracht, dass diese die Legoteile in der Box auf dem Band zurück pusten können. Mithilfe dieser Düse ist es nun möglich, von der Bilverarbeitung erkannte Häufungen von Legoteilen auseinander zu treiben.  Am Ende des langen Laufbandes wurde eine neue Bildverarbeitungsbox angebracht, in der die Legoteile erkannt werden (weitere Informationen hierzu sind im Kapitel "Gruppe: Bildverarbeitung/Legoteil-Erkennung" zu finden). Diese wurde schräg montiert, sodass Legoteile hineinrutschen können. Über ein Abwasserrohr, welches seitlich an der Box angebracht wurde, können nach der Erkennung die Legoteile per Druckluft in die Sortierung befördert werden (siehe Kapitel "Gruppe: Sortierung"). Für die Sortierung wurde ein Linearläufer mit Gecko-Drive verbaut. Auf dem Linearläufer wurde eine Befestigung für Sortierkästen angebracht. Um Platz zur Umsetzung einer Sortieranlage zu schaffen, wurde der Stromkasten vor Kopf der Anlage platziert. Unter dem Förderband wurde ein Ventilinsel platziert, mit der sich alle Luftdruckdüsen des Systems steuern lassen. Die Ventilinsel ist mit vier Ventilen bestückt, es können aber weitere Ventile nachgerüstet werden. Die Kontakte der Ventilinsel sind in den Schaltschrank geführt. Der Druckluftanschluss kann über ein Schnellspannanschluss an normale Druckluftanschlüsse angeschlossen werden.
Zu Beginn des Programmes startet die Main-Funktion eine Initialisierung. Hier werden allgemeingültige Aspekte, wie globale Variablen, Verbindungen zu Datenbank oder Kamera und Einstellungen vorgenommen. Anschließend wird ein Grafisches User-Interface aufgerufen, welches dem User ermöglicht die Legozählmaschine zu steuern. Sind notwendige Schritte wie die Auswahl von Baukästen oder dem manuellen Zählen von Bauteilen, die die Maschine nicht erkennen kann abgeschlossen, startet die automaische Erkennung der Legoteile. Der Anwender muss hier den Inhalt einer Kiste in den Förderbunker geben, die Maschine befördert die Teile automatisch in den Kamera-Raum und ermittelt durch Bildverarbeitung die enntsprechenden Bauteile. Nach Beendigung des automatischen Zählprozesses werden die Ergebnisse des manuellen und des automatischen Zählens in einer Liste zusammengefasst und die gewonnen Informationen können in einer Inventurliste ausgegeben werden. Fehlende Legoteile werden in einer seperaten Fehlteilliste ausgegeben.
Die Verkabelungen und Verschlauchungen des neuen Aufbaus wurden, soweit möglich, in Kabelkanälen verlegt.


Die Montage von Schutzblechen vor der Bildverarbeitung der Separierung ist aus zeitlichen Gründen noch nicht geschehen. Die Bleche sollen Teile daran hindern, vom Laufband zufallen wenn sie von einem Luftstoß erfasst werden.
Des weiteren bestand ein Konzept, flexible Elemente in Form von Borsten einzusetzen, damit große Gruppen von Legoteilen direkt im Bunker zurückgehalten werden können. Das Konzept wurde aus zeitlichen Gründen nicht umgesetzt, es wurden jedoch bereits verschiedene Besen angeschafft.
<br />


==== Erkennung von Legoteil-Gruppen  ====


'''Quellcode Matlab:''' [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/main.m main.m]
[[Datei:2016 2017 Separierung der Legoteile Programmablauf.png|450px|rechts|thumb|Abbildung 3: Ablaufplan Legoteilerkennung]]
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Krause"> Autor Sergej Krause</ref>
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>


== GUI ==
Zur Umsetzung der Separierung wurde eine Funktion entwickelt, die Gruppen von Legoteilen erkennen soll und die Separierung per Luftdruck durchführt.


Unter '''GUI''' (Graphical User Interface oder auch Grafische Benutzeroberfläche versteht man die Die Schnittstelle eines Programms für einen Menschlichen Nutzer. GUI dienen meist zu Eingabe und Ausgabe von Werten die durch ein Hauptprogramm berechnet werden, dabei haben GUI in der Regel nur wenig Rechenaufwand und dienen dem Benutzer Komfort.
<u>'''Programmablauf'''</u> (siehe Abbildung 3)
Die GUI der HSHL Legoteil-Zählmaschine lässt sich in folgende Bereiche aufteilen:
<br />
* Auswahl des Baukastens
Zu Beginn der Separierungsfunktion müssen zunächst Steuerbefehle zur Betreibung der Anlage erteilt werden. Dazu gehört die Einrichtung einer Seriellen Schnittstelle mit dem steuernden Arduino. Außerdem sind Einstellungen an der Webcam vorzunehmen, um Fehler durch unterschiedliche Kameraparameter zu verhindern. Diese können beispielsweise durch Kalibrierungsfunktionen entstehen. Neben der Definition von weiteren Parametern, mit denen sich beispielsweise der betrachtete Bereich im inneren der Bildverarbeitungsbox einstellen lässt, wird die Anlage automatisch gestartet, d.h. es sind die Laufbänder zu starten und das Licht in der Fotobox einzuschalten.<br />
* Manuelles Zählen der Bauteile
Nach dem die Anlage gestartet wurde, wird die eigentliche Funktion der Legoteil-Gruppenerkennung gestartet. Es wird ein Bild vom Innenraum der Bildverarbeitung aufgenommen (siehe Abbildung 4, oben links) und anhand der zuvor eingestellten Parameter so zugeschnitten, dass Bildränder und weitere uninteressante Bereiche wie der unmittelbare Ein- und Ausgangsbereich entfernt werden. Anschließend wird das Bild so gefiltert, dass nur noch die Legofarben Inhalt des Bildes sind. Das Ergebnis wird dabei in ein Binärbildumgewandelt, die Erkennung der Farben wird durch mehrere Unterfunktionen realisisert. Die entstandenen Bilder werden von kleinen Pixelelementen entfernt, und Lücken im Inneren der Objekte geschlossen. Anschließend werden die Bilder zu einem zusammengeführt. Durch Labeln der Pixelgruppen kann nun die Anzahl der Objekte im Raum bestimmt werden (siehe Abbildung 4, unten links). Anschließend wird ein zweiter Zuschnitt des Bildes vorgenommen, der einen kritischen Bereich betrachtet. Dieser Bereich liegt an einer Stelle, an der die Luftdruckdüsen präzise auf die Legoteile ausgerichtet sind. Außerdem handelt es sich hieberi um einen dünnen Streifen, der die Breite des Förderbandes aber zwingend abdecken muss. Nach dem erneuten Zuschnitt des Bildes wird ausgewertet, wie viele verschiedene Label in diesem Bereich vertreten sind (siehe Abbildung 4, rechts). Befindet sich mehr als ein Objekt im kritischen Bereich, sind die Luftdruckdüsen anzusteuern, da die Legoteile nicht separiert in der Legoteilerkennung ankommen würden. Befindet sich ein oder kein Legoteil in diesem Bereich, werden die Düsen geschlossen und die Teile werden in die Legoteilerkennung befördert. Das Ergebnis der Software wir in Abbildung 4 in der Überschift oben links ausgegeben. Diese Funktion muss während des gesamten Programmablaufs durchgeführt werden. Wird das Programm beendet, wird die Anlage gestoppt, d.h. das Licht und die Motoren werden ausgeschaltet. Das Software-Modul lautet: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren/Separierung/Separierung.m  Separierung.m]<br />
* Autonomes Zählen der Bauteile
* Korrektur des autonomen Zählens
[[Datei:2016 2017 Legozaehlmaschine Ausgabe der Separierung.PNG|600px|zentriert|thumb|Abbildung 4: Bildverarbeitung der Separierungsfunktion]]


<br />
<u>'''Verbesserungsmöglichkeiten der Software'''</u>
<br />
Aufgrund des hohen Zeitaufwandes des Anlagenumbaus und einer später Lieferung der Pneumatik, konnte die Software nicht ausgibig im Betrieb getestet und nicht optimiert werden. Erste Schnelltests haben jedoch gezeigt, dass die Legoteile bei einer großen Anzahl in der Bildverarbeitungsbox durch gegenseitige Behinderung die Box nicht mehr verlassen und gegen den unteren Rand des Eingangsbereiches der Box stoßen. Dadurch werden die Teile nicht ausreichend weit zurückgeworfen. Da in die aktuelle Version der Software noch kein Stoppen des Bunkers integriert ist, sobald mehrere Teile in der Box erkannt werden, werden zeitgleich weitere Teile in die Bildverarbeitung transportiert. Dies führt zu einer durchgängigen Aktivierung der Düsen. Eine Bunkeransteuerung in Abhängigkeit des Auswertungsergebnisses ist durch eine zusätzliche Verwendung der Seriellen Schnittstelle leicht umzusetzen. Weitere Abhilfe sollte die Vergrößerung des Eingangsbereiches schaffen, sodass zurückgepustete Legoteile die Bildverarbeitung wieder verlassen können.<br />
Ein weiterer Aspekt ist, dass über- oder direkt aneinanderliegende Legoteile mit dem aktuellen Algorithmus als ein Teil erkannt und durchgelassen werden. Dies kann dadurch verbessert werden, dass z.B. durch die Verwendung von Besen und Abstreifern das Übereinanderliegen der Legoteile verhindert wird. Außerdem kann beispielsweise ermittelt werden, ob erkannte Objekte aus unterschiedlichen Farben bestehen. Ist dies der Fall, handelt es sich nicht um ein Teil, sondern um mehrere. Dies würde die Wahrscheinlichkeit reduzieren, dass mehrere Legoteile in die Bildverarbeitung der Legoteilerkennung gelangen.<br />
Des Weiteren ist es denkbar, die beiden Luftdruckdüsen einzeln anzusteuern. Dadurch kann möglicherweise erreicht werden, dass bei einer geringen Anzahl an Legoteilen nebeneinander, nicht alle zurückgeworfen werden und eines dennoch durchlaufen kann. Dazu muss jedoch sowohl die Ausrichtung der Luftdüsen als auch die Erkennung der Algorithmen dahingehend angepasst werden, dass erkannt werden kann, welche Düse zu betätigen ist und welche Auswirkungen dies auf die Legoteile hat.
Eine weitere Unterstützung der Separierung wäre möglich, in dem das Fließband und der Bunker angehalten werden, sobald ein Legoteil in der Bildverarbeitungsbox der Legoteilerkennung erkannt wird. Wurde dieses aus der Box entfernt, könnten beide Bänder wieder gestartet werden.<br />


In jedem Schritt gibt es die Möglichkeit auf Hilfe zuzugreifen. Man findet einen „Hilfe“-Knopf in der Taskleiste oben links.<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
=== Weitere Aufgaben ===


<br />
==== Entwicklung einer Steuerplatine zur Realisierung des neuen Konzeptes ====


===Auswahl der Baukästen===
Im ersten Schritt müssen die Baukästen ausgewählt werden, die gezählt werden sollen. Es ist derzeit jedoch nur möglich einen Kasten aus zu wählen. In Zukunft soll es die Möglichkeit geben, zwei Kästen gleichzeitig auswählen zu können (Beispielsweise ein Hauptkasten und Zusatzkasten).
Die Auswahl des Baukastens ist für die folgenden Schritte von Bedeutung.
Sollte mindestens ein Kasten ausgewählt werden, so kann man mit dem nächsten Schritt dem manuellen Zählen fortfahren.<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>


[[Datei:Steuerplatine.jpg|350px|thumb|right|Abbildung 5: Steuerplatine]]
Zur Inbetriebnahme der umgebauten Anlage war es notwendig, die Funktionen der Schaltplatine zu erweitern. Die eingebaute Steuerplatine war auf den Arduino aufgesattelt und bezog Steuersignale sowie die 5 V Versorgungsspannung direkt über die eingesteckten Pins. Mit dieser Platine ist es möglich, drei Motoren mit Strom zu versorgen bzw. durch ein PWM Signal zu steuern. Zusätzlich konnten noch zwei Servomotoren und zwei Infrarotsensoren betrieben werden.
Durch die Konzeptänderung der Separierung und der Bildverarbeitung wurde es notwendig, weitere Schaltfunktionen hinzuzufügen. Die Bildverarbeitung benötigte durch Software schaltbares Licht, um zwischen Durch- und Drauflicht in der Bildverarbeitungsbox umschalten zu können. Die Ansteuerung des Lichts sollte, ebenso wie bei den Motoren, über den Arduino erfolgen. Die Spannungsversorgung der Bildverarbeitungsbox war in der Vergangenheit mit einem eigenen Netzteil erfolgt, welches direkt in eine Steckdose eingesteckt wurde.
Neben der Einrichtung von schaltbaren Licht, wurde die Schaltung der Pneumatik hinzugefügt. Auch diese sollte über den Arduino gesteuert werden. Die Ventilinsel wird mit 24 V Signalen angesteuert.
Die Motoransteuerung musste auch bei der neuen Steuerplatine wieder per MOSFETs umgesetzt werden, da die Geschwindigkeit hier per PWM Signal gesteuert wird. Die Lichtansteuerung der LED Streifen in den Bildverarbeitungsboxen sollte ebenfalls per MOSFET geschehen, da die Schaltfrequenz gegebenfalls recht hoch werden kann und mechanische Relais nicht für höhere Schaltfrequenzen ausgelegt sind. Außerdem benötigen diese eine 12 V Versorgungsspannung. Die Option auf einen weiteres Netzteil, um aus 230 V Netzspannung die 12 V Spannung für die LEDs herzustellen, wurde aufgrund des hohen Kaufpreises für das Netzteil sowie des hohen Aufwandes für den Umbau abgelehnt. Als Alternative wurde sich für die Verwendung von Linearspannungsreglern auf der Steuerplatine entschieden, die aus der vorhandenen Spannung von 24 V, die zur Versorgung der Motoren benötigt werden, 12 V erzeugen sollen.
Bei der Ansteuerung der Ventilinsel gab es ebenfalls zwei Optionen. Die erste Möglichkeit war die Nutzung von Relais, wie z.B. Solid State Relais, durch die Arduino-Ausgänge weniger belastet werden. Die zweite Option war die Nutzung der selben MOSFETs, die schon bei der Ansteuerung der Motoren und des Lichts verwendet wurden. Hier wurde sich aug Grund von bereits vorhandenen Komponenten und der damit verbundenen Einheitlichkeit für die zweite Variante entschieden.
Der Schaltplan der Platine wurde in Multisim erstellt, der Leiterplattenentwurf in Ultiboard. Die Platine wurde anschließend in der Hochschule gefräst und bestückt(siehe Abbildung 5).
Zum Anschluss an den Arduino wurde die Platine mit Schraubklemmen versehen. Der Arduino wurde eine Platine aus dem Zubehör erweitert, welche jeden Anschluss als Schraubklemme zur Verfügung stellt, um Platine und Arduino zu verbinden.


Während der Tests der Platine sind 2 MOSFETs aus unbekannten Gründen zerstört worden. Die Platine ist weiterhin für die aktuellen Funktionen einsatzfähig, für die Hinzunahme weiterer Funktionen, wie beispielsweise der Einbindung einer weiteren Druckluft-Düse, müssen die Bauteile jedoch ausgetauscht werden.


==== Umbau des Schaltschranks ====
[[Datei:2016 2017 Legomaschine Schaltschrank.jpg|350px|thumb|right|Abbildung 6: Schaltschrank der Anlage]]


[[Datei:Schritt1 Auswahl der Baukaesten.JPG|250px|center|thumb|Abbildung 5: GUI Auswahl der Baukästen]]
Aufgrund des Einsatzes der neuen Steuerplatine war es notwendig, den Schaltschrank umzubauen (siehe Abbildung 6). Hierzu wurde die alte Steuerplatine entfenrt und an ihrer Stelle die neue Sattelplatine mit Schraubklemmen auf dem Arduino installiert. Auch wurde der Arduino auf einer Hutschienenhalterung installiert. Ebenso wurde die neue Steuerplatine auf einer solchen Halterung installiert. Die Anschlüsse untereinander wurden verbunden, die Anschlüsse zu den Geräten außerhalb des Schranks wurden auf Reihenklemmen gelegt.
In dem Schaltschrank wurde zusätzlich noch der Gecko-Drive für die Steuerung des Linearläufers installiert. dieser wurde auf eine Seitenwand geschraubt, um Kühlung zu gewährleisten.


===Manuelles Zählen===
<br />
Wenn der im ersten Schritten gewählte Kasten Legoteile besitzt, die für den Zählprozess ungeeignet sind, müsse diese Teile vom Benutzer der Zählmaschine manuell gezählt werden. In diesem Schritt wird eine Tabelle mit den wichtigsten Eigenschaften der manuellen Teile gezeigt. Zudem wird dem Benutzer ein Bild des jeweiligen Bauteils angezeigt was er gerade in der Tabelle markiert.
<br />
Ein Fortfahren ist nur möglich, wenn der Benutzer für jedes Teil eine positive ganze Zahl eingibt.<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<br />
<br />
<br />
<br />
<br />
<br />
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>


 
== Gruppe: Bildverarbeitung/Legoteil-Erkennung ==
 
<br />
[[Datei:Schritt2 Manuelles Zaehlen.JPG|250px|center|thumb|Abbildung 6: GUI Manuelles Zählen]]
<br />
 
Im vorherigen Semester stellte sich heraus, dass bei dem bestehenden Konzept zur Erkennung von Legoteilen Probleme aufgetaucht sind. Darunter die Erkennung von schwarzen und braunen Legoteilen. Aber auch Schattierungen und Lichtrefelxionen an Legoteilen verfälschten die Merkmale so(z.B. Flächeninhalt), dass oftmals keine Klassifikation stattfinden konnte aufgrund von Nichtübereinstimmungen zwischen gemessenen Merkmalen und hinterlegten Merkmalen in der Datenbank (siehe [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Fazit Semster 2016 Fazit]). So wurde ein neues Konzept mit einer neu angefertigten Kamerabox geplant und realisiert, da die Probleme softwaretechnisch nicht zu lösen waren.
===Autonomes Zählen===
<br />
Es taucht nur ein Hinweisfenster Auf welches den Benutzer informiert, dass der Autonome Zählprozess bereits begonnen hat.
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
Man kann den Prozess durch das Drücken von ESC beenden.<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<br />
 
<br />
 
===Korrektur des Autonomen Zählens===
Am Ende des Autonomen Zählprozess werden alle gezählten Teile angezeigt.
Sollten bei autonomen Zählprozess Teile falsch erkannt werden, so hat der Benutzer die Möglichkeit die die Anzahl der Teile noch einmal manuell zu korrigieren. Nicht gezählte Teile können aber auch zurück in den Zählprozess geführt werden.<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
 
== Bildverarbeitung/Legoteil-Erkennung ==


=== Schnittstellen ===
=== Schnittstellen ===


Damit die Bilverarbeitung und damit auch das Erkennen der Legoteile erfolgreich verlaufen kann, müssen zunächst die Legoteile vereinzelt in die Bildverarbeitungsbox gelangen (Link zum Wikiteil mit der Separierung einfügen!!!). Sobald ein Legoteil erkannt wurde, wird es aus der Box per Druckluft gefördert und muss anschließend sortiert werden.
Damit die Bildverarbeitung und damit auch das Erkennen der Legoteile erfolgreich verlaufen kann, müssen zunächst die Legoteile vereinzelt in die Bildverarbeitungsbox gelangen ([http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016_2017#Gruppe:_Separierung Separierung]). Sobald ein Legoteil erkannt wurde, wird es aus der Box per Druckluft gefördert und muss anschließend sortiert werden. Damit das Legoteil richtig sortiert wird, wird dem jeweiligen Legoteil anhand der ID eine Box zugeorndet. Der Schnittstellenplan lässt sich zusammengefasst folgendermaßen darstellen:
<br /><br />
[[Datei:Schnittstellen BV Legoteilzaehlmaschine.png|600px|thumb|zentriert|Abbildung 7: Schnittstellen der Legoteilerkennung]]
<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br />
<br />
<br />
<br />
Zeile 164: Zeile 161:
=== Mechanischer Aufbau ===
=== Mechanischer Aufbau ===


Um die Lichtreflexionen und Schatten an den Legoteilen während der Bilderkennung zu vermeiden, wurde ein neues Konzept entwickelt. Wenn ein Legoteil sich auf einem halb-transparentem Milchglas befindet (siehe Skizze), wird zuerst die untere Beleuchtung eingeschaltet und mittels einem Durchlichtverfahren die genaue Kontur des Legoteils mit der Kamera ermittelt. Hier können bereits einige Merkmale genau extrahiert werden (geometrische) und eine Maske erzeugt werden. Anschließend wird das untere Licht ausgeschaltet und das obere Licht eingeschaltet. Nach diesem Schritt wird mit Hilfe der Maske, nur in dem Bereich wo das Legoteil liegt, die Farbe ermittelt.
<br />
[[Datei:Konzept Skizze.png|800px|thumb|zentriert|Abbildung 8: BV-Box Funktionskonzept Skizze]]
<br />
<br />
Im nächsten Schritt wurde die Idee mit Hilfe eines CAD-Programms ausgearbeitet. Die Konstruktion wurde für den ersten Prototypen einfach gehalten und sich so für miteinander verschraubte Holzbretter entschieden.
In der unteren Box am oberen Rand wurde die halb-transparente Plexiglasplatte angebracht. In einem bestimmten Abstand wurde unter der Plexiglasscheibe eine weitere Ebene mit LEDs platziert. Der Abstand wurde so gewählt, dass bei angeschalteten LEDs das Licht durch das Plexiglas optimal gestreut wird (ohne helle Punkte, ohne Licht-Spots).
In der oberen Box wurde im Deckel eine Bohrung durchgeführt, wo die Stromleitungen der Kamera und der LEDs durchlaufen können. Die LEDs wurden in rechteckiger Form angeordnet und von innen an Deckplatte befestigt (siehe Abbildung 9). Auf einer weiteren halb-transparenten Plexiglasplatte  wurde die Kamera befestigt. Für die Kamera wurde eine weitere Bohrung erzeugt. In der oberen Box wurden Ein- und Ausgänge für die Legoteile erzeugt, sowie eine Aussparung für eine flache Druckluftdüse. Zur besseren Vorstellung befindet sich unter den folgenden Link das CAD-Modell als 3dxml-Datei:
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/05_3D_Modelle/CAD_NEUE_Bildverarbeitung/BV_CAD_2016_2017\BV_Box_Komplett.3dxml BV_Box_Komplett.3dxml]. Der 3dxml viewer ist unter folgenden Link zu finden: [https://www.3ds.com/de/produkte-und-services/3d-xml/download/ Link]
<br />
[[Datei:Mechanik BV-Box.JPG|800px|thumb|zentriert|Abbildung 9: CAD-Konzept BV-Box]]
<br />
<br />
Anhand des CAD-Modells wurde die Bildverarbeitungsbox fertiggestellt und in Gesamtsystem integriert.
Desweiteren wurde eine "Drosselklappe" prototypisch für die Vor-Separierung in Y-Richtung realisiert.
<br />
[[Datei:BV-Box.JPG|400px|thumb|zentriert|Abbildung 10: BV-Box fertiggestellt]]
<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br />
<br />


=== Grober Ablauf der Legoteilerkennung ===
<br />
<br />
[[Datei:Grober Ablaufplan Legoteilerkennung.png|1200px|thumb|zentriert|Abbildung 11: Grober Ablaufplan Legoteilerkennung]]
<br />
<br />
 
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
=== Ablauf der Bildverarbeitung ===
 
 
<br />
<br />
<br />
<br />


=== Matlabimplementierung ===
Das einzelne Programm für die Erkennung von Legoteilen befindet sich hier: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\Bildverarbeitung_Main_V1.m  Bildverarbeitung_Main_V1]. Die einzelne Funktion für ein späteres Gesamtprogramm wurde ebenfalls geschrieben und befindet sich hier: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\AutomatischesZaehlen.m  AutomatischesZaehlen]. der Funktion wird ein kalibriertes Kameraobjekt, die Schnittstelle zur Datenbank, die serielle Schnittstelle zum Arduino und das Kalibrierbild übergeben. Als Rückgabewert wird eine Liste mit den gezählten Legoteil-IDs zurückgegeben. 
<br /><br /><br />


=== Matlabimplementierung ===
<u>'''Ablaufplan:'''</u>
 
'''Ablaufplan:'''<br />
 
'''Parametrisierung der Kamera:'''<br />
 
'''Kamera-Kalibrierung:'''<br />
 
'''Legoteilerkennung:'''<br />
''Vorverarbeitung, Segmentierung & Nachverarbeitung:''<br />
''Legoteilerfassung:''<br />
Stickwort: Legoteil an Kante, Legoteil in Bewegung, Nur ein Legoteil (Labeln)
 
<br />
<br />
<br />
[[Datei:Ablaufplan Legoteilerkennung.png|250px|Ablaufplan Legoteilerkennung]]
<br /><br /><br />


<u>'''Parametrisierung der Kamera:'''</u><br />
Für die Einstellungen der Paramter wurde das Matlabtool '''Image Acquisition Toolbox''' benutzt. Dort wurden einzelne Parameter so ausgetestet/eingestellt, dass sich zum einen die Legoteile beim Durchlichtverfahren gut vom Hintergrund abgrenzen und zum anderen die unterschiedlichen Legofarben beim Auflichtverfahren erkennen lassen. Folgende Einstellungen wurden getroffen:
<source lang=matlab>
cam.BacklightCompensation = 0;
cam.Tilt = 0;
cam.Sharpness = 128;
cam.Pan = 0;
cam.Saturation = 128;
cam.Brightness = 128;
cam.Contrast = 128;
cam.Gain = 0;


cam.ExposureMode = 'manual';
cam.FocusMode = 'manual';
cam.WhiteBalanceMode = 'manual';


=== Bildverarbeitung_Automatisches_Zaehlen ===
cam.WhiteBalance = 4000;
cam.Focus = 10;
cam.Exposure = -3;
</source>
<br /><br /><br />


[[Datei:Bildverarbeitung_Main.jpg|300px|thumb|right|Abbildung 7: Bildverarbeitung_AutomatischesZaehlen]]
<u>'''Kamera-Kalibrierung:'''</u><br />
Die automatische Legoteilerkennung erfolgt mit der Unterfunktion: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\AutomatischesZaehlen.m AutomatischesZaehlen.m] und weiteren kleineren Unterfunktionen. Als Übergabeparameter bekommt die Funktion die Schnittstellen zu Webcam, Datenbank und die serielle Schnittstelle übergegeben und liefert als Rückgabe eine chronologische Liste mit Legoteil-IDs, welche beim automatischen Zählen erkannt wurden. Zu Beginn dieser Funktion werden einmalig diverse Parameter und Variablen angelegt und initialisiert. Anschließend wird in der äußeren Schleife Folgendes wiederholt (bis Betätigung der "Escape"-Taste) durchgeführt:
Obwohl die Parameter der Kamera konstant und unverändert waren, stellte sich heraus, dass das Bild der Kamera bei einigen Programmstarts trotzdem heller war. Um Neustarts des Programms zu vermeiden wurde so eine Kalibrierfunktion geschrieben, welche anhand eines aufgenommenen Bildes erkennt, ob die Kameraeinstellungen korrekt vorgenommen.<br />
<br /><br />'''Bildverbesserung & Vorsegmentierung:'''<br />
Dabei wird in einer Schleife ein Kameraobjekt erzeugt und mit den oben aufgeführten Einstelllungen/Parametern versehen. Nun wird ein Bild mit diesen Einstellungen geschossen (im Auflichtverfahren) und mit einem zuvor gespeicherten Bild (siehe Abbildung 12), welches die richtigen Einstellungen beinhaltet, verglichen. Sollten sich die durchschnittliche Helligkeiten der Bilder Unterschiede aufweisen, wird das Kameraobjekt neu erzeugt und der Vorgang wiederholt sich, bis die richtigen Einstellungen getroffen wurden.<br />
* Bild bzw. Frame wird von der Kamera eingelesen
Zusammenfassend beschreibt folgendes Diagramm den Ablauf der Selbstkalibrierung:
* Ränder werden weggeschnitten (ROI)
* normalverteiltes Rauschen entfernen (Gauß-Filter)
* Bild wird in Rot-, Grün- und Blauanteil zerlegt
* Mehrfache Binarisierung für die Segmentierung der einzelnen Legofarben + kleine Artefakte aus den Binärbilder filtern 
<br />
<br />
'''Nachbearbeitung:'''<br />
[[Datei:Kalibrierbild.png|250px|rechts|thumb|Abbildung 12: Kalibrierbild]]
Bei einigen vorsegmentierten Farb-Binärbildern (z.B. bei einem roten Legoteil mit Bohrungen) wird der Schatten in den Bohrungen als schwarze Pixel bzw. "schwarzes Teil" interpretiert. Diese werden wie folgt aus dem schwarzen Binärbild entfernt:
[[Datei:Kamera Kalibrierung Legoteilerkennung.png|250px|Ablaufplan Kamerakalibrierung]]
# Die Binärbilder (außer das Binärbild, welches die schwarzen Legoteile beinhaltet) werden zusammenaddiert
# Beim entstandenen Binärbild wird die Closing Operation durchgeführt (Füllen von Löchern und Bohrungen) --> BW_CLOSING
# Die Löcher & Bohrungen aus dem schwarzen Binärbild (BW_SCHWARZ) werden entfernt mit:
BW_SCHWARZ = BW_SCHWARZ - BW_CLOSING
<br /><br />
 
Um zu verhindern, dass die nicht optimal ausgeleuchtete Bereiche (z.B. dunkelgrauer Bereich in einem hellgrauen Legoteil) als zwei unterschiedliche Legoteile erkannt werden, wird Folgendes durchgeführt:
# Alle Binärbilder werden addiert, wodurch ein Binärbild mit Objekten verschiedener Farben entsteht
# Leichte Dilatation führt zu Verbindung zweier sehr nah benachbarter Objekte (Schattierungen mit Legoteilen "verschmelzen")
 
<br />
<br />
'''Segmentierung mit folgenden Matlab-Funktionen:'''
Das Kalibrierbild befindet sich im folgenden Ordner: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\Calib_Img.png  Calib_Img] und die Kalibrierfunktion hier: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\Cam_Configuration_Check_V1.m  Cam_Configuration_Check_V1]
* imclearborder: Entfernt alle weißen Pixel, welche eine Verbindung zum Bildrand besitzen (Objekte am Rand des Bildes) --> Objekte, deren Fläche nicht komplett von der Kamera erfasst werden, sind uninteressant
<br /><br /><br />
* bwareaopen: Entfernt kleine zusammenhängende Segmente (Artefakte), deren Pixelanzahl unter einem vorgegebenen Schwellwert liegen.
* Bwlabel: Die noch vorhandenen Objekte (Legoteile) im zusammenhängenden Binärbild werden mit einem Label versehen, damit jedes Objekt für sich betrachtet und ausgewertet werden kann
Die nachfolgenden Schritte werden in einer Schleife auf jedes gelabelte Objekt angewendet.
<br /><br />


'''Klassifikation:'''<br />
<u>'''Legoteilerkennung:'''</u><br />
Merkmalsextraktion von jedem Objekt bzw. Legoteil (Mehr unter: [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Merkmalsextraktion Merkmalsextraktion]):
Die Legoteilerkennung erfolgt in einer Schleife, in welcher jeder einzelne Frame ausgewertet wird. Zum Beenden der Schleife und damit des Programms muss hier die Escape-Taste gedrückt werden.
* SVN-Link: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\Merkmalsberechnung_3.m Merkmalsberechnung_3.m]:
<br /><br /><br />
* Berechnung von Umfang, Fläche, Schwerpunkt, maximaler und minimaler Abstand vom Schwerpunkt zum Objektrand
<br />
Nachdem der Schwerpunkt vom erkannten Teil berechnet wurde, wird Folgendes überprüft:
* Der Flächenschwerpunkt (X-Koordinate) des Objektes befindet sich im mittleren Bildbereich
** Vorteile: Objekt wird nur in mittiger Position analysiert --> Genauigkeit steigt, da die Verzerrungseigenschaften aufgrund des Blinkwinkels auf allen Objekten gleich sind
* Der Flächenschwerpunkt (Y-Koordinate) befindet sich (inklusiver einer kleinen Toleranz) nicht an derselben Stelle, wie bei dem Legoteil, welches zuvor analysiert/gezählt wurde
** Vorteile: Ein Legoteil wird nicht doppelt gezählt, da bei einer genau waagerecht ausgerichteten Kamera, sich die Höhe des Flächenschwerpunktes nicht ändert
<br />
Falls ein Teil erkannt wird (nicht doppelt):
* Binärbild des Objektes wird an die Funktion [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\FARBERKENNUNG_V2.m FARBERKENNUNG_V2.m] übergegeben, wo es einer Legofarbe zugeordnet wird (Mehr unter: [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Farberkennung Farberkennung]).
* Mit Hough-Transformation Kreise im Bild suchen (Matlab-Funktion: '''imfindcircles'''), da die Anzahl der gefunden Kreise als weiteres Merkmal dient
** Minimaler und maximaler Radius muss mit der Höhe der Kamera angepasst werden
* Abgleich der Merkmale des Objektes mit den eingetragenen Werten aus der Datenbank (inklusive modifizierbarer Toleranzen) mit der Funktion: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\Datenbankabgleich.m Datenbankabgleich.m] (Mehr unter: [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Datenbank Datenbank]). Diese erhält die Merkmale des Objektes und die Schnittstelle zur Datenbank als Übergabeparameter und liefert die ID des Legoteils zurück
** falls keine Überschneidung zwischen Merkmalen und Datenbank --> ID = 0
* ID wird in einer Liste gespeichert
* Sollte die ID nicht "0" sein, wird der serieller Schnittstelle (Arduino) signalisiert, dass zu diesem Zeitpunkt ein Teil erkannt wurde. Mithilfe der konstanten und bekannten Bandgeschwindigkeit wird dann der Auswerfer vom Arduino angesteuert (erkannte Legoteile werden gesammelt).


<br />
<u>''Vorverarbeitung, Segmentierung & Nachverarbeitung:''</u><br />
'''Beendigung des automatischen Zählprozesses:'''
Zunächst wird das im Durchlichtverfahren aufgenommene Bild zugeschnitten, damit unnötige Bildregionen nicht bearbeitet werden müssen. Die Anzahl an Pixeln, welche in Höhe und Breite weggeschnitten werden, wurde experimentell ermittelt und so ausgelegt, dass sich das größte Legoteil immer im Blickfeld befindet.<br />
<br />
Daraufhin erfolgt die Binarisierung bzw. Segmentierung. Die Schwellwerte für die jeweiligen Farbkanäle und die Funktion zur Binarisierung wurden mithilfe des Matlabtools '''Color Thresholder''' ermittelt. Sollte sich im Laufe des Projektes die Kamerabox verändern (z.B. mehr LEDs eingebaut oder ein anderer Lichteinfall) muss diese Funktion ersetzt werden, da es sonst zu Segmentierungsfehlern kommen kann.
Falls die "Escape"-Taste betätigt wird:
[[Datei:Thresholder Binaerbild Legoteilerkennung.PNG|500px|thumb|zentriert|Abbildung 13: Segmentierung der Legoteile mithilfe des Color Thresholder Tools]]
* Die Schleife (automatischer Zählprozess) wird unterbrochen
<br />  
* Arduino wird signalisiert, die Laufbänder zu stoppen
Die Funktion zur Segmentierung findet man hier: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\createBinary_V3.m  createBinary_V3]<br />
* Eine Liste mit erkannten und fehlenden Teilen wird als Excel-Tabelle automatisch geöffnet.
Im Anschluss werden noch kleine, einzelne Pixel im Hintergrund und im Legoteil gelöscht. Damit ist das Bild bereinigt und vollständig segmentiert.
<br /><br /><br />


<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<u>''Legoteilerfassung:''</u><br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
Damit ein Legoteil erfasst werden kann, müssen folgende Kriterien eingehalten werden:
<br />
#Legoteil muss sich an der Kante befinden
<br />
#Legoteil muss sich in einer Ruhelage befinden
#Es darf nur ein Legoteil im Bild vorhanden sein
Sollte mehr als ein Legoteil ein Bild sein, werden alle vorhandenen Legoteile in der Box herausgepustet und als "nicht erkannt" deklariert.
<br /><br /><br />


=== Farberkennung ===
<u>''Farbliches Merkmale extrahieren:''</u><br />
[[Datei:Farberkennung.jpg|300px|thumb|right|Abbildung 8: Farberkennung]]
[[Datei:Farberkennung.jpg|200px|thumb|right|Abbildung 14: Farberkennung]]
<br />
Damit die Farbe erkannt werden kann, wird das Auflichtverfahren angewendet.
Die Funktion "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\FARBERKENNUNG_V2.m FARBERKENNUNG_V2.m]" bekommt als Übergabewerte zwei Matrizen:
Die Funktion "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\FARBERKENNUNG_V2.m FARBERKENNUNG_V2]" bekommt als Übergabewerte zwei Matrizen:
* Original-Frame (RGB-Bild) und Binärbild vom erkannten Objekt
* RGB-Bild aus Auflichtverfahren und Binärbild vom erkannten Objekt
* mit Hilfe der Übergabeparameter wird eine 3D-Farbmaske erstellt (3D --> RGB).  
* mit Hilfe der Übergabeparameter wird eine 3D-Farbmaske erstellt (3D --> RGB).  
** Farbmaske: Aus dem Originalbild werden nur die Pixel in die Masken übernommen, die im Binärbild dem Objekt zugeordnet werden können (weiße Pixel)
** Farbmaske: Aus dem Originalbild werden nur die Pixel in die Masken übernommen, die im Binärbild dem Objekt zugeordnet werden können (weiße Pixel)
Zeile 271: Zeile 268:
** Anschließend wird der minimalste Wert von den maximalen Abweichungen ermittelt --> '''Es wird genau die Farbe ermittelt, welches die kleinste Abweichung zu der Legoteil-Farbe hat.'''
** Anschließend wird der minimalste Wert von den maximalen Abweichungen ermittelt --> '''Es wird genau die Farbe ermittelt, welches die kleinste Abweichung zu der Legoteil-Farbe hat.'''
<br />
<br />
Die ermittelte Farbe wird als String zurückgegeben.<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
Die ermittelte Farbe wird als String zurückgegeben. Es können weitere Farben im Nachhinein hinzugefügt werden oder Farbschwellwerte verändert werden, falls sich die Lichtverhältnisse in der Kamerabox durch Umbauten verändern. Dazu muss in der Funktion [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\Bildverarbeitung_Main_V1.m  Bildverarbeitung_Main_V1] folgende Stelle unkommentiert sein:
<br /><br /><br /><br /><br />
<source lang=matlab>
%% Merkmalsextraktion %%
%Farbe identifizieren
dbstop in FARBERKENNUNG_V2
FARBE = FARBERKENNUNG_V2(ColorImage,BW);
</source>
<br />
Dies lässt das Programm beim Ausführen automatisch in die Funktion '''FARBERKENNUNG_V2''' springen (mit Breakpoint). Sobald also nun ein farbiges Teil in der Box ist, wird das Programm an dieser Stelle anhalten. Nachdem dies geschehen ist, sollte der Benutzer folgende Variable beobachten:
<source lang=matlab>
FARBE(1,1) = (sum(sum(Farbmaske(:,:,1))))/Pixel_Flaeche;                   
FARBE(1,2) = (sum(sum(Farbmaske(:,:,2))))/Pixel_Flaeche;
FARBE(1,3) = (sum(sum(Farbmaske(:,:,3))))/Pixel_Flaeche;
</source>
<br />
Diese enthält die durchschnittliche R, G und B Anteile des hineingeworfenen Legoteils. Sollten diese (z.B. nach einem Umbau der Bildverarbeitungsbox) von den Werten in der hinterlegten Tabelle stark abweiche, müssen diese mit dem gemessenen Wert überschrieben werden:
<source lang=matlab>
%% Farbwerte-Tabelle mit normierten Lego-Farben
% %          R(1) G(1) B(1) 
Farbwerte=[  0.5273 0.5489 0.5362; %'weiss'         
              0.4138 0.3891 0.3115; %'beige'       
              0.3230 0.0622 0.0623; %'rot'         
              0.0087 0.1275 0.3309; %'blau'         
              0.5409 0.4596 0.2026; %'gelb'         
              0.0450 0.0664 0.0659; %'schwarz'     
              0.0509 0.1826 0.1287; %'gruen'       
              0.2182 0.2038 0.1518; %'hellbraun'         
              0.2709 0.3230 0.3345; %'hell-grau'       
              0.1391 0.1804 0.1878; %'dunkel-grau' 
%              0.0565 0.0629 0.0552; %'dunkelbraun' 
              ];
</source>
<br /><br />


=== Merkmalsextraktion ===
<u>''Geometrische Merkmale extrahieren:''</u><br />
[[Datei:Merkmalsextraktion.png|300px|thumb|right|Abbildung 9: Merkmalsextraktion]]
[[Datei:Merkmalsextraktion.png|200px|thumb|right|Abbildung 15: geometrische Merkmalsextraktion]]
<br />
Die Funktion "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\Merkmalsberechnung_V3.m Merkmalsberechnung_V3]" erhält als Übergabeparameter ein Binärbild eines einzelnen Objektes (Legoteil). Aus diesem Objekt werden dann folgende Merkmale extrahiert, welche dann zurückgegeben werden:
Die Funktion "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\Merkmalsberechnung_3.m Merkmalsberechnung_3.m]" erhält als Übergabeparameter ein Binärbild eines einzelnen Objektes (Legoteil). Aus diesem Objekt werden dann folgende Merkmale extrahiert, welche dann zurückgegeben werden:
* Umfang --> Anzahl der Pixel, die sich am Rand des Objektes befinden
* Umfang --> Anzahl der Pixel, die sich am Rand des Objektes befinden
* Fläche --> Anzahl der Pixel, die sich innerhalb des Objektes befinden (Löcher ausgeschlossen)
* Fläche --> Anzahl der Pixel, die sich innerhalb des Objektes befinden (Löcher ausgeschlossen)
Zeile 289: Zeile 316:
Anhand der Größe der Kantenpixelliste kann außerdem der Umfang des Objektes bestimmt werden.  
Anhand der Größe der Kantenpixelliste kann außerdem der Umfang des Objektes bestimmt werden.  
<br />
<br />
Diese Merkmale dienen, zusätzlich zu der Farbe des Objektes und die Anzahl der Löcher im Objekt, als Indikatoren für den Abgleich zwischen aktuellen Legoteil in der Box und den hinterlegten Daten in der Datenbank. <br />
Diese Merkmale dienen, zusätzlich zu der Farbe des Objektes und die Anzahl der Löcher im Objekt, als Indikatoren für den Abgleich zwischen aktuellen Legoteil in der Box und den hinterlegten Daten in der Datenbank (siehe Funktion: "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\Datenbankabgleich.m Datenbankabgleich.m]"). <br />
Sollten sich herausstellen, dass diese Merkmale nicht genügen, um alle Legoteile voneinander unterscheiden zu können, sind weitere Merkmalsberechnungen möglich (z.B. Die Seitenlängen einer um das Objekt aufgespannten Boundingbox). <ref name="Autor: Penner"> Autor Kevin Penner</ref>
Sollten sich herausstellen, dass diese Merkmale nicht genügen, um alle Legoteile voneinander unterscheiden zu können, sind weitere Merkmalsberechnungen möglich (z.B. Die Seitenlängen einer um das Objekt aufgespannten Boundingbox).
<br /><br /><br />


<br /><br /><br /><br />
<u>''Herauspusten der Legoteile:''</u><br />
Sobald alle Merkmale erfasst wurden, werden diese mit einer Datenbank abgeglichen und einer Legoteil-ID zugeordnet, anhand derer man die zugehörige Box (des Linearläufers) ermittelt und mitteilt (siehe Funktion: "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\BoxausID_SwitchCaseDB.m BoxausID_SwitchCaseDB.m]"). Danach erfolgt das Herauspusten des Legoteils aus der Kamerabox. Um herauszufinden, wann der Herauspusten beendet werden kann, wird das aktuelle Kamerabild (bei Auflichtverfahren) mit dem Kalibrierbild verglichen. Sollten hier keine großen unterschiede vorliegen, ist die Box leer und das Ventil der Druckluftdüse kann geschlossen werden.
<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br />
<br />


== Teach-IN ==
=== Teach In ===
Zur Ermittlung von Merkmals-Daten (Datenbank) für die einzelnen Legoteile, wurde die Main-Funktion (Bildverarbeitung) kurzzeitig modifiziert, so dass die Daten der Merkmale 10 Mal ermittelt und anschließend gemittelt wurden. Diese Werte wurden in eine Datenbank geschrieben, in welcher die Legoteile mit ihren zugehörigen IDs hinterlegt sind. Während der Datensammlung wurde jedes Legoteil einzeln 10 Mal nacheinander in die Bilderkennungsbox gefahren. Bei Legoteilen, welche aus mehreren Perspektiven andere Merkmale aufweisen, wurden mehrere Merkmals-Daten der ID zugeordnet.  
Für das einteachen von Legoteilen sind folgende Schritte nötig:
# Vorraussetzungen:
## Maschine ist eingeschaltet
## USB-Verbindung zwischen PC und Arduino und PC und Webcam
## Arduino ist mit folgendem Programm geflasht: "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Arduino/Arduino_Kommunikation/Serielle_Kommunikation_Arduino_Matlab\Serielle_Kommunikation_Arduino_Matlab.ino Serielle_Kommunikation_Arduino_Matlab.ino]"
## Druckluftversorgung der Ventilinsel
# Bildverarbeitungsprogramm öffnen: "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\Bildverarbeitung_Main_V1.m Bildverarbeitung_Main_V1]"
# Im Quellcode die Bereiche mit der Bezeichnung "'''Für Teach In:....'''" unkommentieren
# Nun gleiche Legoteile nacheinander in die BV_Box befördern, dabei werden die Merkmale gespeichert und bei Beendigung des Programms (Esc) gemittelt
# Öffnen der Excel_Liste: "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste\ Datenbank Teile-Kopie_fuer sql]" und unter der jeweiligen Lego-ID die Mittelwerte der Merkmale eintragen (Achtung: Einige Teile müssen in mehreren Lagepositionen eingeteacht werden. Dazu einfach eine weitere Zeile mit derselben ID erstellen)
# Nachdem eintragen einiger Teile, schließen der Excel Liste und Ausführen des Programms: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste\InventurlisteErstellen_SQL.m InventurlisteErstellen_SQL.m]. Das führt dazu, dass die Inhalte der Excel-Liste in die SQL Datenbank eingetragen werden.
# Für die Zuordnung von IDs zu den einzelnen Sortierboxen existiert bisher nur ein Testprogramm: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\BoxausID_SwitchCaseDB.m BoxausID_SwitchCaseDB.m]". Eine Excel-Liste wäre hier jedoch besser geeignet. 
# '''Zusatz:''' Die Toleranzen beim Abgleichen von Merkmalen können bei Bedarf in folgender Funktion geändert werden: "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\Datenbankabgleich.m Datenbankabgleich.m]". Dabei werden die Toleranzen für Fläche, Umfang und Max-Schwerpunkt relativ angegeben und die Toleranzen für Min-Schwerpunkt und Anzahl der Löcher absolut.
<br />
Zum Testen wurden bisher nur ein paar Legoteile in die Datenbank eingeteacht. Zur Vollständigkeit müsste dies mit den restlichen Legoteilen auch geschehen.
Praktisch wäre hier eine extra Teach-In Funktion, welche die Werte automatisch ermittelt und in die Excel-Tabelle einträgt. Erste Implementierungen wurden schon durchgeführt, sind jedoch noch mit Fehlern versehen: "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Bildverarbeitung/Durchlicht_Auflicht_Verfahren\Teach_In.m Teach_In.m]"
<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br />


Ein automatisches Teach-IN von neuen Legoteilen mit GUI-Anbindung wurde für das kommende Semester vorgesehen. Dort könnte ein Legoteil in kleinen Positionsschritten automatisch vom Band in die Kamerabox eingefahren werden. So wäre eine Aufnahme des Objektes aus verschiedenen Blickwinkeln möglich.  
=== Fazit ===
Durch die Konzeptänderung und die dadurch entstandene Änderung der BV-Box, wurden viele vorher aufgetauchte Probleme beseitigt. So sind Reflexionen und Schattierungen kein Problem mehr und auch schwarze und braune Legoteile stellen kein Problem mehr dar. Es gibt jedoch noch kleine Fehler beim Herauspusten von Legoteilen. So kann es passieren, dass die Legoteile durch den hohen Luftdruck nicht nach draußen, sondern gegen die innere Holzwand springen und damit doppelt gezählt werden. Aber auch ein Liegenbleiben im oberen Bereich des Rohrs kam häufiger vor. Hier ist eine Vergrößerung des Ausgangs möglich oder die Veränderung des Rohres (kürzer bzw. schmaler). Insgesamt kann man aber sagen, dass die Konzeptänderung der Bildverarbeitung erfolgreich verlaufen ist, aber noch mit wenig Aufwand optimiert werden kann.  
<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br />
<br />


<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref> <ref name="Autor: Penner"> Autor Kevin Penner</ref>
== Gruppe: Sortierung ==
Die SDE-Gruppe von dem Semester 2016/2017 hat sich dafür entschieden, einen Linearläufer einzusetzen. Im folgenden Bild wird schematisch der Aufbau und Ablauf der Sortierung dargestellt.


== Datenbankanbindung, Listen IN/OUT ==
[[File:Lego Zaehlmaschine Sortierer Ablaufplan.png|400x400px]]
=== Datenbank ===
[[Datei:UML-Design.PNG|thumb|right|Abbildung 10: Datenbank UML Diagram]]
Die Datenbank ist in MySQL implementiert und eine Verbindung mit Matlab wurde realisiert. Hinzukommt das alle Daten im Excel-Format vorhanden sind. Die Daten sind aufgeteilt in drei Excel Dateien, [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste\Datenbank%20Teile-Kopie_fuer%20sql.xlsx Datenbank Teile-Kopie_fuer sql.xlsx], [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste\Datenbank%20Kastendetails.xlsx Datenbank Kastendetails.xlsx], [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste\Datenbank%20Kasten.xlsx Datenbank Kasten.xlsx], die die gesamte Datenbank representieren und alle einträge beinhaltet. Dies dient der Datensicherheit, da die Daten in getrennten Formaten und Speichermedien vorhanden sind. Die Struktur innerhalb der Tabellen sollte erhalten bleiben, aber die Daten innerhalb der Tupel können nach belieben manipuliert werden. In der Datei "InventurlisteErstellen_SQL.m" befindet sich ein Code, der die Daten in die gestartete SQL-Datenbank importieren kann. Dies ist aber nur möglich solange die Strucktur, Spaltennamen und Anzahl, bestehen bleibt.


Es wurden noch weitere Konzepte ausgearbeitet. Mögliche Ansätze für zukünftige Optimierungen des Auswerfers findet man [[http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_Auswerfer_Konzepte hier]].<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Krause"> Autor Sergej Krause</ref>


Die Datenbank ist aufgeteilt in drei Tabellen, Legoteileliste, beinhaltet alle einzelnen Legoteile, Kastendetails, enthält die Nummer der Legokästen, und der Kasten Tabelle, die die Legoteile mit den Kästen verbindet. In der Tabelle Legoteileliste sollen alle Legoteile aufgenommen werden. Die Attribute für die Legoteile sind:  
===Schaltplan des Linearläufers===
[[file:LEGOZAEHL Schaltung Linearläufer.png|right|gerahmt|400x400px|Abbildung 16: Verdrahtung des GECKODRIVES. Der GECKODRIVE befindet sich im Schaltschrank. Er gibt die Schritte für den Schrittmotor des Linearläufers]]
{| class="wikitable"
| colspan="7" style="text-align:center;vertical-align:top;font-size:125%" |'''Geckodrive-> 24V-Netzteil'''
|-
! Klemme <br>
(Gecko)
! Bezeichnung
!colspan="2"| Farbe
! Überträgt
! Klemme<br>(Netzteil)
! Zusatz-Information
|-
| style="text-align:center;"| 1
| GND
| style="background:#000000"|
| Schwarz
| Ground
| GND
| style="text-align:center;"| ---
|-
| style="text-align:center;"| 2
| 24V
| style="background:#FF0000"|
| Rot
| Spannung
| 24V
| 18-80 VDC
|}


* '''DataID''', der Primarykey, ist als Autoincrement implementiert und versieht jedes neu hinzugefügte Legoteil automatisch mit einer eindeutigen ID
{| class="wikitable"
* '''LegoteileID''', entspricht der ID vom Hersteller Lego, kann in unserer Datenbank zweimal vorkommen, wenn das Legoteil mehrere Perspektiven hat
| colspan="8" style="text-align:center;vertical-align:top;font-size:125%" |'''Geckodrive-> Stecker des Schrittmotors'''
* '''Bezeichnung''', eine kurze Beschreibung des Legoteils, eine eindeutige Beschreibung wurde mit zurhilfenahme von Onlineshops realisiert (max. 30 charakter lang)
|-
* '''Farbe''', die Farbe des Bauteils nach Hersteller Norm
! Klemme <br>
* '''Form''', noch in Bearbeitung
(Gecko)
* '''Umfang''', der Pixelumfang vom Teach-In Prozess
! Bezeichnung
* '''Flaeche''', der Flaecheninhalt des Legoteils in Pixel vom Teach-In Prozess
!colspan="2"| Farbe
* '''MaxSchwerpunkt''', der maximale Schwerpunkt vom Teach-In Prozess
! Überträgt
* '''MinSchwerpunkt''', der minimale Schwerpuntk vom Teach-In Prozess
!colspan="2"| Stecker<br>(Motor)
* '''Rundloch''', entspricht der Anzahl der vom Teach-In Prozess erkannten Löcher im Legoteil
! Zusatz-Information
* '''AnzPerspektiven''', gibt die gesamt Anzahl aller vorhandenen Perspektiven, unterschiedliche Lagen eines einzelnen Legoteils, die neue Werte für die oben genannten Attribute liefert, an
|-
* '''Scanbar''', '1' oder '0', '1' bedeutet es kann von der Legoteil Zählmaschine erkannt werden, '0' bedeutet es muss manuell, per Hand, gezählt werden, zB. weil es zu groß ist
| style="text-align:center;"| 3
| WINDING A+
| style="background:#FFFF00"|
| Gelb
| Schritte
| style="background:#FFFFFF"|
| PIN1 (Weiß)
| rowspan="2" style="text-align:center;" |<span style="font-weight:normal;">Phase 1</span>
|-
| style="text-align:center;"| 4
| WINDING A-
| style="background:#FF0000"|
| Rot
| Schritte
| style="background:#991100"|
| PIN2 (Braun)
|-
| style="text-align:center;"| 5
| WINDING B+
| style="background:#0000FF"|
| Blau
| Schritte
| style="background:#0000FF"|
| PIN3 (Blau)
| rowspan="2" style="text-align:center;" |<span style="font-weight:normal;">Phase 2</span>
|-
| style="text-align:center;"| 6
| WINDING B-
| style="background:#000000"|
| Schwarz
| Schritte
| style="background:#000000"|
| PIN4 (Schwarz)
|}


Die Tabelle Kastendetails besteht aus:  
{| class="wikitable"
| colspan="7" style="text-align:center;vertical-align:top;font-size:125%" |'''Geckodrive-> Stoppschalter -> Arduino'''
|-
! Klemme <br>
(Gecko)
! Bezeichnung
! colspan="2"| Farbe
! Überträgt
! colspan="2"| Klemme<br>(Arduino)
! Zusatz-Information
|-
| style="text-align:center;"| 7
| DISABLE
| style="background:#0000FF"|
| Blau
| Signale
| style="background:#008800"|
| GND
| Benötigt einen<br>33kΩ-Pulldown Widerstand
|}
'''Anmerkung''': Sollte der Linearläufer zu nah an das Ende seiner Schiene kommen, so betätigt er einen der beiden Stoppschalter. Das Betätigen sorgt dafür, dass Disable auf GND gezogen wird. Dadurch wird der Geckodrive ausgeschaltet und somit auch der Schrittmotor. Im Notfall wird somit die Hardware geschont.


* '''KastenID''', der Primarykey, die vom Hersteller Lego vorgesehene Kastennummer, muss eindeutig sein
{| class="wikitable"
* '''Bezeichnung''', eine kurze Beschreibeung des Kasten bzw. den Namen des Kastens (max. 50 charakter lang)
| colspan="7" style="text-align:center;vertical-align:top;font-size:125%" |'''Geckodrive-> Arduino'''
 
|-
Zu letzt die Tabelle Kasten, diese setzt sich zusammen aus einer LegoteileID, KastenID und Anzahl. Die Tabelle Kasten spiegelt die reale Welt wieder indem sie genau beschreibt welches Legoteil in welchem Kasten ist und wie oft dieses Legoteil in einem Kasten vorhanden ist:
! Klemme <br>
 
(Gecko)
* '''LegoteileID''', Primarykey mit KastenID, Forenkey auf Legoteileliste.LegoteileID, dementsprechend eine ID aus Legoteileliste,
! Bezeichnung
                (LegoteileIDs können nur zugewiesen werden wenn ein eintrag in Legoteileliste vorhanden ist)
!colspan="2"| Farbe
* '''KastenID''', Primarykey mit LegoteileID, Forenkey auf Kastendetails.KastenID, dementsprechend eine ID aus Kastendetails,
! Überträgt
            (KastenIDs können nur zugewiesen werden wenn ein eintrag in Legoteileliste vorhanden ist)
! Klemme<br>(Arduino)
* '''Anzhal''', die genaue Anzahl eines Legoteil in einem bestimmten Kasten entnommen von der Originalverpackung von Lego (max. vierstelliger Integer wert)
! Zusatz-Information
 
|-
Um in Matlab auf die Zugriff auf die Datenbank zu haben muss XAMPP und der MySQL ODBC - Connector installiert und konfiguriert sein. Sobald dies geschehen ist, kann mit:  
| style="text-align:center;"| 8
 
| DIRECTION
<source lang=matlab>
| style="background:#FFFF00"|
DatenbankVerbindung = database.ODBCConnection('Datenbank','root','');
| Gelb
</source>
| Signale
 
| D5
eine Verbindung hergestellt werden. Danach kann man mit mit SQL Befehlen Daten aus der Datenbank extrahieren und einpflegen. Ein Beispiel:
| Gibt die Richtung an
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/GUI/2016%20-%20GUI%20-%20Zaehlprozess/GUI_Database/getAllKasten.m getAllKasten.m]
|-
 
| style="text-align:center;"| 9
In '''sqlquery''' wird der SQL-Befehl hinterlegt und mit '''exec(conn, sqlquery)''' wird der Befehl auf der Datenbank, die in '''conn''' spezifiziert ist, ausgeführt. Mit '''fetch(curs)''' wird das Ergebnis der SQL-Anfrage zurück gegeben, alles weitere ist eine manipulation der Struktur in der die Daten weitergeben werden sollen.
| STEP
 
| style="background:#0000FF"|
====Installation der Datenbank====
| Blau
Für die Benutzung der Datenbank auf einem neun PC, müssen einige Dateien Installiert und Matlab Konfiguriert. Eine Schritt für Schritt Anleitung findet sich in der [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation\06_MATLAB\Einrichten%20der%20Datenbank.docx Einrichten der Datenbank.docx]. Hier folgt eine Kurzanleitung anhand der Schritt für Schritt Anleitung:
| Signale
1. Download von [https://www.apachefriends.org/de/ XAMPP] und [https://dev.mysql.com/downloads/connector/odbc/ MySQL ODBC - Connector]
| D6
2. Installation von XAMPP und MySQL ODBC - Connector
| Gibt die Schritte an
3. Starte XAMPP -> starte Apache -> starte MySQL
|-
4. Erstelle eine neue Datenbank (Benenne die Datenbank, so das sie eindeutig und ihren nutzen klar werden lässt)
| style="text-align:center;"| 10
5. Konfiguration von Matlab
| COMMON
5.1 Im oberen Reiter auf APPS gehen
| style="background:#FF0000"|
5.2 Wähle unter den APPS den '''Database Explorer'''
| Rot
5.3 Gehe im Menu auf New->ODBC - Configure ODBC data source
| Signale
5.4 Füge als neue Datenquelle den '''MySQl ODBC Unicode Driver''' hinzu
| D7
5.5 Server Daten eingeben -> Name: Lego ; TCP/IP Server: 127.0.0.1 Port: 3306; User: root; Password: - (leer lassen); Database: eure erstellte Datenbank wählen
| Ein/Aus des Geckodrives
5.6 Alles bestätigen -> Verbidung hergestellt
|}
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Krause"> Autor Sergej Krause</ref>
<ref name="Autor: Krause"> Autor Sergej Krause</ref>


=== Erstellung einer Inventurliste ===
===Einstellung des Geckodrives===
Eine Anforderung an die Legoteil Zählmaschine ist, dass dem Anwender nach Abschluss des Zählprozesses eine Liste in Excel ausgegeben wird, in der die gezählten Teile und dessen Anzahl aufgelistet sind.
{| class="wikitable" align="center"
Dazu wurde zunächst eine Funktion InventurlistenTamplateMultiKaesten.m geschrieben, die aus der Datenbank die Bauteile ausliest, die in dem ausgewählten Baukästen enthalten sind und diese in eine Excel-Liste schreibt. Als Übergabeparameter benötigt die Funktion die entsprechenden BaukastenIDs, einen Dateinamen für die Inventurliste und die entsprechende Verbindung zur Datenbank. Als Rückgabewert gilt ein Cell-Array, welches den Inhalt der Inventurliste in Excel enthält.
| colspan="4" style="text-align:center;vertical-align:top;font-size:125%" |'''Elektrische Charakteristiker des Linearläufers'''
|-
!
!Ohne Last
!Auf max. Geschwindigkeit entgegen<Br> der Richtung des motors
!Auf max. Geschwindigkeit <Br>  in Richtung Motor)
|-
| Spannung
| style="text-align:center;"| 24 V
| style="text-align:center;"| 22 V
| style="text-align:center;"| 24 V
|-
| Strom
| style="text-align:center;"| 0.63 A
| style="text-align:center;"| 2.02 A
| style="text-align:center;"| 1,60 A
|-
| Leistung
| style="text-align:center;"| 15,12 W
| style="text-align:center;"| 44,44 W
| style="text-align:center;"| 35,19 W
|}


'''Motor: MOT-AN-S56(NEMA23)'''


Die Funktion InventurlistenTamplateMultiKaesten.m ist wie folgt implementiert:
0,55m / 1,81 s = 0,304 m/s Richtung ende mit der Einstellung von F = 1000000
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste/InventurlistenTamplateMultiKaesten.m InventurlistenTamplateMultiKaesten.m]
0,55m / 1,42 s = 0,387 m/s Richtung Motor mit der Einstellung von F = 1000000




Nach der Erstellung des Templates werden die Gezählten IDs in die Liste eingetragen. Dazu wird der Inhalt des Templates nach den entsprechenden IDs durchsucht und die dazugehörige Anzahl notiert. Durch den Angleich voll Soll- und Ist-Anzahl der einzelnen Legoteile, wird außerdem eine Fehlteilliste erstellt, die dem Anwender anzeigt, welche Teile in welcher Häufigkeit fehlen. Die Funktion InventurlisteFuellen.m benötigt ebenfalls die entsprechenden BaukastenIDs, einen Dateinamen für die Inventurliste und die entsprechende Verbindung zur Datenbank als Übergabeparameter.Außerdem werden die gezählten Legoteil-IDs und dessen Anzahl benötigt. Als Rückgabewert gilt erneut der Inhalt der Excel-Liste.
'''Pin Options am GeckoDrive G201X:''' <br>
 
1-5 Stromstärke einstellen eingestellt auf 4,4 AMPS <br>
 
{| class="wikitable centered"
Die Funktion InventurlisteFuellen.m ist wie folgt implementiert:
!colspan="2"| PIN
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Inventurliste/InventurlisteFuellen.m InventurlisteFuellen.m]
! Schaltstellungen des Geckodrives
 
|-
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
| style="text-align:center;"| 1
| style="text-align:center;"| ON
| rowspan="10" style="text-align:center;" |<span style="font-weight:normal;">[[Datei:Geckdrive Einstellung.png]]</span>
|-
| style="text-align:center;"| 2
| style="text-align:center;"| OFF
|-
| style="text-align:center;"| 3
| style="text-align:center;"| OFF
|-
| style="text-align:center;"| 4
| style="text-align:center;"| ON
|-
| style="text-align:center;"| 5
| style="text-align:center;"| OFF
|-
| style="text-align:center;"| 6
| style="text-align:center;"| ON
|-
| style="text-align:center;"| 7
| style="text-align:center;"| ON
|-
| style="text-align:center;"| 8
| style="text-align:center;"| ON
|-
| style="text-align:center;"| 9
| style="text-align:center;"| ON
|-
| style="text-align:center;"| 10
| style="text-align:center;"| ON
|}


== Separierung und Zentrierung der Legoteile ==
Hinweis: <br>
 
*  6-8 Keine Funktion bei dem NEMA-23
[[Datei:Zentrierung.jpg|300px|thumb|right|Abbildung 11: Zentrierung]]
*  9 Auto Standby um den Motor bei stillstand auf 70% der Stromstärke zu drosseln um die Hitzeentwicklung zu reduzieren.  
=== Teilezentrierung ===
* 10 auf ON wenn mit NEMA-23 Motoren gearbeitet wird. (Es wird ein NEMA-23 Motor verwendet!)
 
Die provisorisch aus Holz gefertigte Teilezentrierung wurde mit fixierbarer Variante aus Aluminium ersetzt. An den Zentrierungskomponenten wurden elastische Kunststoffstreifen geklebt und anschließend an den Alu-Profilen vor der Bildverarbeitungsbox festgeschraubt.
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>


=== Separierung ===
Die Separierung wurde mit Hilfe von Geschwindigkeitsdifferenzen an den Laufbandübergängen realisiert.
Je größer die Geschwindigkeitsdifferenzen, desto bessere ist die Separierung möglich.
Aber die Bilderkennung fungiert in diesem Punkt als "Flaschenhals", wenn das letzte Laufband zu schnell dreht, dann werden weniger Teile erkannt. Es wurden experimentell die optimalen Geschwindigkeiten für jedes Laufband ermittelt, so dass Separierung und Bilderkennung optimal laufen.
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Krause"> Autor Sergej Krause</ref>
<ref name="Autor: Krause"> Autor Sergej Krause</ref>
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
== Elektronik und Sicherheit ==
[[Datei:Neues_Netzteil_24VDC.jpg|350px|thumb|left|Abbildung 12: 24VDC Installation]]
[[Datei:Kabelkanal.jpg|450px|thumb|right|Abbildung 13: Kabelkanal]]
[[Datei:Kamera_BildBox_Fixierung.jpg|450px|thumb|right|Abbildung 14: Kamera/Bildbox Fixierung]]
===Neues 24V Netzteil===
Wie in den offenen Punkten aus dem Artikel [[Legoteil Zählmaschine 2015]] beschrieben, benötigte die Lego Zählmaschine ein stärkeres Netzteil. Bei der Auslegung der Maschine wurde das Netzteil für die Versorgung der Bandmotoren zu klein dimensioniert und bei gleichzeitigem Anlaufen der Motoren ist es vorgekommen, dass das alte Netzteil mit einem maximalen Ausgangsstrom von 10 A sich aus Selbstschutz abgeschaltet hat. Hier wurde ein stärkeres Netzteil vom selben Hersteller mit 20 A maximalem Ausgangsstrom eingebaut. Dies besitzt eine etwas breite Bauweise, konnte aber durch leichte Änderungen im Schaltschrank installiert werden.<ref name="Autor: Fankhauser"> Autor: Adam Fankhauser</ref>
===Kabelkanal===
Ebenfalls in den offenen Punkten des Artikels [[Legoteil Zählmaschine 2015]] beschrieben, sollten die bisher provisorisch verlegten Leitungen fest verlegt werden. Hierzu wurde ein Kabelkanal zur ordentlichen Verlegung der Leitungen an den Förderbändern montiert. Er dient dem Schutz und der mechanischen Entlastung der Leitung. Es wurde ein geschlitzer Kabelkanal wewählt, da an vielen unterschiedlichen Stellen Leitungen z.B. zu den Motoren abgehen. So war es nicht nötig, einen geschlossenen Kabelkanal zu modifizieren, um die Leitungsabgänge möglich zu machen.<ref name="Autor: Fankhauser"> Autor: Adam Fankhauser</ref>
===Kamera/Bildbox- und Auswerferhalterung===
Die Bildbox und die Kamera waren bis zum jetzigen Zeitpunkt noch nicht befestigt und lagen lose auf dem Förderband auf. Dies barg die Gefahr, dass aus beide Teile aus ihrer beträchtlichen Höhe immer drohten herunterzufallen und irreperabel beschädigt zu werden. Zur Befestigung wurde "Boschprofil" mit den Zubehörwinkeln genutzt. Die Bildbox wurde so befestigt, dass sie über vier Schrauben Höhenverstellbar ist, um auch die Einfuhr von größeren Teilen möglich zu machen. Ebenso ist die Befestigung am Förderband mit vier Schrauben lösbar und damit die gesamte Konstruktion verschiebbar. Die Kamera wurde an der Bildboxbefestigung so fixiert, dass sie bei dieser Höhen- und Seitenverstellung immer an der selben Stelle verharrt. Dies ermöglicht eine ein mal eingestellte Kameraposition beizubehalten.
Ebenso wurde der Auswerfer am Ende des letzten Förderbandes mit Boschprofil und Winkeln befestigt. Somit ist die bisherige Befestigung über eine Holzkiste ersetzt worden. <ref name="Autor: Fankhauser"> Autor: Adam Fankhauser</ref>
===Höhenanpassung der Laufbänder===
An den Laufbandübergängen wurden verbesserungswürdige Fallhöhen festgestellt. Die Legoteile fallen von einem Laufband auf das andere, wenn die Fallhöhe zu groß ist, dann federn die Teile ab und fallen manchmal vom Band runter. Deshalb wurden die Höhen der Laufbänder so eingestellt, dass es kleinstmögliche Fallhöhen gibt. Ebenso wurde damit der das Förderband steiler gestellt und somit die Vereinzelung der Legoteile leicht verbessert, da die größeren Teile im Bunker weniger Halt auf den Lamellen finden können und eher abrutschen. <ref name="Autor: Fankhauser"> Autor: Adam Fankhauser</ref>
===Elektrische Sicherheit===
Die elektrische Sicherheit des Schaltschrankes wurde im Zuge der Umbauarbeiten sichergestellt, indem alle Leitungen gegen spannungsfestere Leitungen vom Typ H07 bzw. H05 ausgetauscht wurden. So werden nun auch die Anforderungen nach VDE 0100-600 erfüllt.
Eine Anlagenprüfung soll im nächsten Semester vorgenommen werden, wenn alle noch anstehenden Anlagenveränderungen vorgenommen wurden. <ref name="Autor: Fankhauser"> Autor: Adam Fankhauser</ref>
== HSHL-Wiki-Dokumentation ==
Die HSHL-Wiki-Dokumentation wurde von der gesamten Gruppe bearbeitet.
Jedes Themenabschnitt unterliegt der bereits oben genannten [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Aufgabenteilung_inkl._weiteren_Aufgaben_aus_dem_Pflichtenheft '''Verantwortlichkeiten'''].
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>


== Evaluation der Druckluftdüsen ==
== Evaluation der Druckluftdüsen ==
Zeile 493: Zeile 635:
| 40,90€
| 40,90€
|}
|}
== Video-Anleitung ==
'''UNTER BEARBEITUNG''': wird im nächsten Semester mit Vollendung des Programm erstellt
* Aktueller Stand hier: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/04_Skizzen%20u.%20Bilder/Pr%c3%a4sentation%20-%20Legoz%c3%a4hlmaschine_Final.mp4 Präsentation - Legozählmaschine]
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
 
== Pflichtenheft Dokumentation in DOORS ==
Das Pflichtenheft wurde mit Hilfe der Software '''DOORS''' dokumentiert.
* SVN-Link: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Anforderungsmanagement/Pflichtenheft/Pflichtenheft.pdf Pflichtenheft.pdf]
 
<ref name="Autor: Penner"> Autor Kevin Penner</ref>


== Prozessvisualisierung mit Visio ==
== Arduino-Kommunikation ==


Die Prozesse wurden mit Microsoft´s Visio dokumentiert.
Zum Ansteuern der Aktoren mithilfe des Arduino Mega, wurde ein Kommunikationsprogramm geschrieben. Dieses ermöglicht dem Nutzer über den PC einen seriellen Befehl an den Arduino zu schicken, der daraufhin den Befehl ausführt. Zu den Befehlen gehören:
*Ansteuern der LED's in den Kameraboxen für die Erkennung bzw. Separierung
*Ventilsteuerung für die Druckluftdüsen für die Erkennung bzw. Separierung
*Einstellung der Drosselklappenstellung für die Sortierung
*Ansteuern der Förderbandmotoren
*Ansteuern des Linearläufers für die Sortierung
Für die Botschaften wurde ein einheitliches Framework herausgearbeitet. So besitzt jede serielle Botschaft folgende kodierte Inhalte:
*Am Anfang jeder Botschaft steht ein '''B'''
*Eine 1-stellige ID, welche die oben aufgeführten Aufgaben repräsentiert
*Eine 2-stellige Nummer (NR), welche einen bestimmten Aktor beinhaltet
*Eine 3-stellige Zusatzzahl, welche z.B. den Motoren eine relative Geschwindigkeit vorgibt, den LEDs bzw. Ventilen an/auf und aus/zu vorgibt oder die Sollposition für den Linearläufer bzw. Drosselklappe beinhaltet
*Die Botschaft wird mit einem '''E''' beendet
Eine detalierte Beschreibung der Kommunikation findet sich in folgender Tabelle:
{| class="wikitable"
{| class="wikitable"
|-
|-
|[[Datei:MAIN.jpg|250px]] || [[Datei:Bildverarbeitung_Main.jpg|250px]] || [[Datei:Farberkennung.jpg|250px]] || [[Datei:Merkmalsextraktion.png|250px]]
!Beschreibung
!ID
!NR
!ZUSATZ
!Gesamtstring
!Beispielstring<br />(ohne Leerzeichen)
|-
| '''Drosselklappe'''
| D
| 00 (nur eine Drosselklappe vorhanden)
| Z: Stellung (0 oder 1)
| B ID NR Z E
| B D 00 001  E (Drosselklappe in Stellung 1)
|-
|-
|Abbildung 15: Übersicht des Gesamtprogramms||Abbildung 16: Detailierte Sicht der Bildveraberbeitung ||Abbildung 17: Teilgebiet der Bildverarbeitung: <br>Farberkennung im Detail ||Abbildung 18: Teilgebiet der Bildverarbeitung:<br>Merkmalsextraktion im Detail
| '''LED's'''
| L
| 00: Erkennung oben<br />1: Erkennung unten<br />2: Sortierung
| Z: Status (0=aus; 1 = an)
| B ID NR Z E
| B L 01 001 E (Erkennung unten an)
|-
| '''Förderbandmotoren'''
| M
| 00: Bunker<br />01: Förderband
| Z: Power in %
| B ID NR Z E
| B M 01 080 E (Förderband mit 80%)
|-
| '''Schrittmotor Sortierung (Linearläufer)'''
| S
| 00 - 04: Position <br /> (Position 0: aktuelle Position als Initialposition annehmen)
| Z: 0 (kein Zusatz)
| B ID NR Z E
| B S 04 000 E (Linearläufer auf Position 4 bzw. Box 4)
|-
| '''Ventile'''
| V
| 00: Erkennung pusten <br />01: nicht belegt<br />02: Vereinzelung pusten (1)<br />03: Vereinzelung pusten (2)
| Z: Status (0=aus; 1 = an)
| B ID NR Z E
| B V 00 001 E (Erkennung pusten)
|}
|}
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br />
<ref name="Autor: Hanemann"> Autor Simon Hanemann</ref>
Das Programm auf dem Arduino beobachtet dauerhaft den seriellen Eingang und reagiert bei einem Eintreffen einer Botschaft mit einem jeweiligen Ansteuern der digitalen Ausgänge. Das Programm befindet sich im folgenden Ordner:
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Arduino/Arduino_Kommunikation\Serielle_Kommunikation_Arduino_Matlab.ino  Serielle_Kommunikation_Arduino_Matlab].
Hierbei wurde das Ansteuern der Drosselklappe noch nicht implementiert. Die Boxpositionen können hier auch verändert werden bzw. auch erweitert werden. Dazu müssen folgende Variablen verändert/hinzugefügt werden:
<source line lang="c" style="font-size:small">
//Positionen der Boxen
double Box_1 = 0.0;
double Box_2 = 105;
double Box_3 = 210;
double Box_4 = 315;
//double Box_5 = 0.0;
//double Box_6 = 0.0;
//double Box_7 = 0.0;
//double Box_8 = 0.0;
</source>
Außerdem muss folgende switch-case Struktur in der Funktion '''void Sortierung(int Position)''' erweitert werden (bei Veränderung der Boxanzahl):
<source line lang="c" style="font-size:small">
    switch(Position)
    {
      case 0:
        //Initialisierung des Linearläufers. Aktuelle Position = 0-Punkt
        Achse_X.setCurrentPosition(0);
        Position = 0;
        break;
      case 1:
        Position = Box_1;
        break;
      case 2:
        Position = Box_2;
        break;
      case 3:
        Position = Box_3;
        break;
      case 4:
        Position = Box_4;
        break;
      default:
        Position = 0;
        break;
    }
</source>
 
<br /><br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
<br />


== QM-Tests ==
== Main-Funktion ==
Wurde mit Genehmigung von Prof. Schneider auf das nächste Semester verlegt.
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>


== Auswerfer==
Die Main-Funktion aus dem Semester: [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016 http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016] wurde an das neue Konzept angepasst. Dabei wurden folgende Programmteile aus dem vorherigen Semester beibehalten:
* GUI-Einbindung [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#GUI http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#GUI]
* Inventurlisten erstellen [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Erstellung_einer_Inventurliste http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016#Erstellung_einer_Inventurliste]


Die bestehende Lösung hat zwei Auswerfer vorgesehen, welche die Legoteile in 3 Kategorien sortieren sollte. In unserem Pflichtenheft ist aber festgeschrieben worden, dass die Legoteile nur noch in 2 Kategorien eingeteilt werden sollen. Daher ist für den Auswefer auch nur ein Servomotor installiert worden. Die bestehende Implementierung auf dem Arduino wurde übernommen und angepasst. Die Matlab Software schickt immer, wenn ein Teil "erkannt" wurde einen String über die serielle Schnittstelle zum Arduino, dieser ließt den String ein und speichrt sich den Zeitstempel bei Eintreffen der Nachricht. Darauf wird ein Zeitdelay gerechnet, bei dem dann die Schranke für einen festgesetzten Zeitraum öffnet.
Folgende Änderungen wurden durchgeführt:
Diese Umsetzung ist noch nicht sehr robust, da das Senden und Empfangen der Nachricht über eine Erkennung eines Legoteils nicht den geforderten Echtzeitanforderungen entspricht. Ebenfalls wäre es besser, wenn sich das Zeitdelay automatisch an die Bandgeschwindikeit anpassen würde und die Dauer der Schrankenöffnung sich an die Größe des erkannten Legoteils.
* Austausch der Bildverarbeitungsfunktion
* Kamera-Kalibrierung in der main
* Einbeziehen der neuen Aktoren (LEDs, Druckluftventile ...)


== Planung der Aufgaben für das nächste Semester ==
Die Main-Funktion befindet sich im folgenden SVN-Ordner: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/main_new.m main_new.m]
Für das kommende Semester wurde anfangs geplant, eine Sortierungsanlage zu entwerfen und realisieren.
Leider wurde festgestellt, dass ein größeres Problem bei der Vereinzelung von den Legoteilen besteht.
Durch den "Flaschenhals"-Bilderkennung ist es unmöglich allein durch die Laufbandgeschwindigkeits-Differenzen alle Legoteile zu vereinzeln.  
Das erste Laufband, welches die Legoteile aus dem Bunker auf die nächste Laufband fördert, muss modifiziert werden damit nicht zu viele Teile auf einmal gefördert werden.
Als eine der Hauptaufgaben für das nächste Semester wurde die Vereinzelung von Legoteilen vor der Bildverarbeitung festgelegt. Zusätzlich dazu noch andere Aufgaben aus dem Pflichtenheft.<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>


=== Konzept für Sortieranlage ===
[[Datei:Konzept_Sortierung.JPG|300px|thumb|left|Abbildung 19: Konzept_Sortierung]]
[[Datei:Konzept_CAD.JPG|300px|thumb|right|Abbildung 20: Konzept CAD]]
Da es ein Konzept bereits entworfen wurde, wird dieses hier auch dokumentiert (eventuell für zukünftige Aufgaben).
Gedacht ist ein durch einem Motor am Rand angetriebene (konstanter Geschwindigkeit) Scheibe mit Gummi- oder Filsbeschichtung (damit die Legoteile nicht abprallen). Welches auf mindestens drei freilaufende Räder mit einem Nut rotierbar gelagert wird. In der Mitte (feststehende runde Platte) soll dann die Verkabelung (entweder elektrische Leitungen für elektro Motoren, oder pneumatische Leitungen für pneumatischen Auswerfern) platziert werden, die entweder elektrischen oder pneumatischen Auswerfern versorgen. Radial zur drehender Scheibe werden Kisten angebracht mit passend gebogenen Führungsblechen (damit die Legoteile immer in die Kisten fallen).
<br /><br />
<br /><br />
Zum Öffnen des 3D-Modells vom Konzept, laden Sie bitte folgende frei erhältliche Software [http://www.3ds.com/de/produkte-und-services/3d-xml/download/ 3DXML-Player] herunter und öffnen Sie die Datei [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\CAD_SORTIERUNG\CAD_3DXML\Sortieranlage.3dxml Sortieranlage.3dxml].
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
Um das 3D-Modell zu rotieren, drücken und halten Sie die mittlere und rechte Maustasten fest. Wenn Sie dann die Maus bewegen, dann wird das 3D-Modell in die entsprechende Richtung rotiert.
<br />
Zoomen: Halten Sie die mittlere Maustaste gedrückt, anschließend die rechte Maustaste antippen und loslassen (mittlere gedrückt halten), Maus nach oben bewegen --> Hineinzoomen, Maus nach unten bewegen --> Herauszoomen.


== HSHL-Wiki-Dokumentation ==
Die HSHL-Wiki-Dokumentation wurde von der gesamten Gruppe bearbeitet.
Jedes Themenabschnitt unterliegt der bereits oben genannten [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016_#Aufgabenteilung_inkl._weiteren_Aufgaben_aus_dem_Pflichtenheft '''Verantwortlichkeiten'''].
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br /><br /><br /><br />


= Ergebnisse =
= Ergebnisse =


== Anleitung Programmstart ==
== Anleitung Programmstart ==
Vor dem Starten der Legoteil-Zählmaschine müssen einige Voraussetzungen erfüllt sein. Es gilt zu prüfen, ob alle benötigten Komponenten mit dem Rechner verbunden sind, von dem das Programm gestart werden soll. Dazu zählen:
* USB-Kabel zum Arduino
* USB-Kabel zur Webcam in der Separierungseinheit
* USB-Kabel zur Webcam in der Erkennungseinheit
Außerdem muss die Anlage an das Stromnetz und die Ventilinsel an eine Druckluftleitung angeschlossen sein.


* Vorbereitung
Vor dem Start gilt es außerdem zu überprüfen, ob die Notschalter der Anlage deaktiviert sind und ob der Linearläufer in seine Initialposition gebracht wurde. Ist dies nicht der Fall ist dies durchzuführen. Anschließend ist der Luftdruck, der an der Ventilinsel anliegt einzustellen. Empfohlen werden zwischen 3 und 5 Bar.
** LED-Stecker anschließen
Der Start des Programms wird durch ausführen der Datei [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/main_new.m main_new.m] ausgelöst. Es öffnet sich eine Eingabemaske, in der die zu zählenden Baukästen ausgewählt werden. Nach dessen Bestätigung sind die Anzahlen der Legoteile anzugeben, die nicht durch die Maschine gezählt werden können. Anschließend startet die Maschine das automatische Zählen. Der Inhalt der Legokiste, abzüglich der manuell gezählten Teile, ist in den Bunker zu geben. Da die Separierungseiheit noch nicht zuverlässig funktioniert und noch nicht in den Gesamtprozess integriert ist, sollten zunächst nur kleine Mengen in den Bunker geschüttet werden und eine manuelle Separierung vorgenommen werden. Wenn der Bunker leergelaufen sein sollte, sind nicht erkannte in den Bunker zurückzuführen (Aus Sicherheitsgründen darf dies in dem aktuellen Status nicht bei einer laufenden Maschine durchgeführt werden!) Ist der Zählprozess durchlaufen, kann die Zählung vom Anwender mit der ESC-Taste beendet werden. Es wird eine Inventur- sowie eine Fehlteilliste im Tool Excel ausgegeben. Außerdem werden Motoren und LEDs ausgeschaltet und der Linearläufer auf Initialposition gefahren. Nach gebrauch der Anlage ist der Druck der Druckluftleitung herunterzuregeln und die Anlage vom Strom zu trennen.
** Hauptstecker anschließen
** Hauptschalter betätigen
* Datenbank starten
** XAMPP control panel starten
** Apache Modul starten
** MySQL Modul starten
* Matlab Programm öffnen
** unter SVN\MTR_SDE_Praktikum_2015\SRC die main-datei öffnen
** Programm starten
* Baukasten in der GUI auswählen
* handgezählte Teile eintragen
* automatischer Zählprozess
** Motoren werden automatisch gestartet
** Kästen hinter das Förderband stellen
** Legoteile in den Bunker füllen
** Esc-Taste betätigen zur Beendigung des automatischen Zählprozess
* Motoren werden automatisch ausgeschaltet
* Inventurliste wird ausgegeben


<ref name="Autor: Krause"> Autor Sergej Krause</ref>
<ref name="Autor: Krause"> Autor Sergej Krause</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>


= Fazit=
= Fazit=
===Abgeschlossene Punkte===
===Abgeschlossene Punkte===
* '''Einbau eines 24V Netzteils''', um Überlast beim Lauf aller Motoren zu verhindern.
*Allgemein
* '''Bildverarbeitung''' Differenzierung der Legoteile durch Farbe, Umfang, Fläche, Schwerpunkt, max. "Radius", min. "Radius"
** Evaluierung der Druckluftdüsen
* '''Einbindung einer Datenbank mit SQ'''L, zum Verwalten von größeren Datensätzen
** CAD-Modell des „Klemmbocks“ zu Befestigung der Düsen
* '''Aufteilung Legoteile in Baukästen''', zu besseren Auswertung der Datensätze
** Main-Datei angepasst
* '''Montage von Kabelkanälen''' zum Schutz und der mechanischen Entlastung der Leitung
** Arduino-Kommunikations-Software implementiert (zum Ansteuern aller Hardwarekomponenten bzw. Aktoren)
* '''Montage von Kamerahaltung''' zum Einstellen und Fixieren der Kamera
* Separierung
* '''Montage von Bildverarbeitungskasten''' für festen halt und optimale Beleutungsverhältnisse
** Entwicklung eines neuen Konzepts zur Separierung der Legoteile
* '''Zentrierung der Teile''' auf dem Fließband zur besseren Bildverarbeitung und zum Auswerfen der (nicht) erkannten Teile
** Umbau der Anlage (Anpassung an das neue Konzept)
* '''Anpassung der Laufbänder:''' Höhenverstellung und Reduktion von Schleifkontakten
** Umbau Schaltschrank (Anpassung an das neue Konzept)
* '''GUI2.0:''' interaktive Benutzeroberfläche über mehrere Seiten
** Entwicklung neue Schaltplatine (Anpassung an das neue Konzept)
* '''Erkennung von mehr als 30 verschiedenen Teile'''n
** Entwicklung der ersten Version des Separierungs-Algorithmus
* Bildverarbeitung / Bildverarbeitungsbox
** Neues Konzept: Idee --> CAD-Konzept
** Konstruktion und Zusammenbau der neuen BV-Box
** BV-Software-Anpassung
** Lichtsteuerung über Arduino
** "Drosselklappe", Prototyp für Separierung in Y-Richtung
** Einteachen von ein paar Legoteilen
* Sortierung
** Prozessablaufplan der Sortierung
** Montage Konzept der Sortierung
** Ansteuerung des Linear-Läufers
** Verdrahtung des Linearläufers
** Test der Funktionalität des Linearläufers
** Einbindung der Sensoren des Linearläufers
** Montage der einzelnen Kästen
<br />
===Offene Punkte ===
* Allgemein
** Parallele Ausführung zweier Funktionen
*** Bildverarbeitung der Separierung
*** Bildverarbeitung der Legoteilerkennung
** GUI überarbeiten/erweitern
*** Teach-In Einbindung in der GUI: Benutzerschnittstelle zu Eingabe und Bearbeitung der Teile
*** Merge-Funktion: Auswahl von mehrern Kästen ermöglicht
** Anleitung zum Start der Maschine eine „Broschüre“ mit vielen Bildern
** Videoanleitung zum Erklären der Projektergebnisse
* Separierung
** Schutzbleche für herunterfallende Legoteile (am Bunker)
** Anbringung von Besen oder Abstreifern zur Verhinderung von Legoteil-Überlagerungen
* Bildverarbeitung
** Teach-In Funktion implementieren
** alle Legoteile einteachen
** Bildverarbeitungsbox von Umgebungslicht vollständig abschirmen (Tunnel am Eingang der Box aus Blech erstellen; Schlitze in der Box abdichten)
* Sortierung
** Montage und Einbindung der „Auswerfer-Klappe“ vor dem Linearläufer
<br />


=== Kritikpunkte ===
* Es werden nicht die optimalen Luftdruckdüsen eingesetzt
* Ein zweite Bildverarbeitung zum Erkenn von Bauteilhaufen erfordert viel Rechenleistung
* Die Startposition des Linearläufers ist kann stark variieren und den den kompletten Prozess anhalten.
* Beim Überschreiten der Notfall Schalter des Linearläufers kann das System nicht eigenständig reagieren. Daher muss der Läufer manuell auch dieser Lage befreit werden.
* Es gibt noch keine Sicherheitsvorkehrungen, die im Fehlerfall den Prozess oder Teilprozesse stoppen.
* Wenn ein Sortierkasten überfüllt ist, können einzelne Teile aus dem Kasten fallen. Die Kapazität der Sortierkästen könnte angepasst werden.
<br />


===Offene Punkte===
===Optmierungen===
* '''Optimierung der Bildverarbeitung:''' Mehr Merkmale, weniger Rechenleistung und schnellere Erkennung
* Separierung
* '''Bildverarbeitung:''' Problemfarbe: Schwarz
** Bildverarbeitung zum Erkennen von Bauteilhaufen
* '''Bildverarbeitung:''' Einbindung einer "Reinigungsfunktion", welche dem User ein Signal gibt, wenn fälschlicherweise Objekte auf dem Band erkannt werden
*** Stoppen des Bunkers sobald mehrere Teile in der Box erkannt werden
* '''Datenbank:''' Füllen der Datenbank mit weiteren Legoteilen bzw. Merkmalswerten
*** Vergrößerung des Eingangsbereiches
* '''Optimierung der Vereinzelung:''' eine absolute Vereinzelung wäre ideal
*** über- oder direkt aneinanderliegende Legoteile als unterschiedliche Teile erkennen
* '''Teach-In Einbindung in der GUI:''' Benutzerschnittstelle zu Eingabe und Bearbeitung der Teile
*** beide Luftdruckdüsen gezielt einzeln anzusteuern
* '''GUI Fertigstellung:''' Optimierung von vorhandenen Programmteilen
*** Anhalten der Fließbänder sobald ein Legoteil in der Bildverarbeitungsbox der Legoteilerkennung ist
* '''Schnellerer Durchlauf:''' Ziel: 60 Teile in 60 Sekunden
* Bildverarbeitung
* '''Videoanleitung''' zum Erklären der Projektergebnisse
** Modifizieren des Ausgangsrohrs, da ein paar Legoteile teilweise dort hängen bleiben
* '''Anleitung zum Start der Maschine''' eine „Broschüre“ mit vielen Bildern
** Modifizieren des Box-Ausgangs (vergrößerung, da einige Legoteile beim Rauspusten an den oberen Rand zurückprallen können
* '''Erweiterung der Datenbank''' um neue Bauteile und Baukästen (z.B. NXT)
* Sortierung
* '''Merge-Funktion''': Auswahl von mehrern Kästen ermöglicht
** Einbau von zusätzlichen Sensoren für das Start/Kalibrierungsproblem des Linearläufers
* '''Projektabschluss:''' Abschlusspräsentation und Dokumentation der Arbeit um künftigen Studiengängen einen besseren Einstig zu ermöglichen.
** Verbinden der Sensoren des Linearläufers mit dem Arduino um automatisch bei Fehlerfällen eingreifen zu können.
 
** Ein Rohr mit geringerem Durchmesser würde den Trichter vor dem Linearläufer sparen.
===Mögliche Themen für neue Projektziele===
* '''Realisierung eines Auswerfers''' um Teile in bestimmte Kästen zu sortieren
* '''Serienproduktion''' Optimierung der Maschine auf kostengünstige Hardware
* '''Rückführung''' um nicht erkannte Teile wieder zurück in den Prozess zu führen
* '''Sortiersystem''' welche Bauteile kommen zusammen in ein Fach eines Kastens?
 


= Referenzen =
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
<ref name="Autor: Lingenauber"> Autor Niklas Lingenauber</ref>
Zeile 620: Zeile 863:
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
<ref name="Autor: Penner"> Autor Kevin Penner</ref>
= Dokumentation =
== SVN ==
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\main.m Main Funktion] : Main-Funktion die alle andere Unterfunktionen aufruft
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\AutomatischesZaehlen.m AutomatischesZaehlen.m]
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\FARBERKENNUNG_V2.m FARBERKENNUNG_V2.m]
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC\Bildverarbeitung\Tracking\Algorithmus_und_Module\Merkmalsberechnung_3.m Merkmalsberechnung_3.m]
<ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
== Gefährdungsbeurteilung ==
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/13_Gefaehrdungsbeurteilung SVN Link zur Gefährdungsbeurteilung] <br />
Eine Anlagenprüfung/Gefährdungsbeurteilung soll im nächsten Semester vorgenommen werden, wenn alle noch anstehenden Anlagenveränderungen vorgenommen wurden
<ref name="Autor: Fankhauser"> Autor Adam Fankhauser</ref>


== Autoren ==
== Autoren ==
<references />
<references />
== Siehe auch / Weiterführende Links ==
# '''SVN:''' Checkout URL [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk | https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk]
# '''Rückblick Nr.1 (SS16):''' [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016 | http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016]
# '''Rückblick Nr.2 (WS15):''' [http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2015 | http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2015]

Aktuelle Version vom 18. Mai 2017, 10:06 Uhr

Abbildung 1: Legoteilzählmaschine im Überblick

Bei der HSHL Lego® Zählmaschine handelt es sich um eine Maschine, die automatisch Legoteile zählen und sortieren kann, um gegebenen Falls fehlende Lego®-Steine nachbestellen zu können. Es ist ein studentisches Projekt, welches in Rahmen des System-Entwurf-Praktikums des Studiengangs Mechatronik mit Schwerpunkt System Design Engineering im 7. Semester durchgeführt wurde. [1] [2]

Autoren: Adam Fankhauser, Christo Tsibadze, Kevin Penner, Niklas Lingenauber, Sergej Krause, Simon Hanemann

Betreuer: Prof. Schneider, Prof. Goebel


Aufgabenstellung

Die vorhandene Legoteilzählmaschine (siehe Legoteilzählmaschine_2016 ) soll Soft- und Hardwaremäßig modifiziert werden, um drei wichtigsten Anforderungen zu erfüllen. Die Vereinzelung bzw. Separierung der Legoteile soll verbessert werden damit in Bildverarbeitungsbox nur einzelne Legoteile zugeführt werden. Für die Bildverarbeitung bzw. Legoteilerkennung soll ein neuer Ansatz entwickelt werden. Bisherige Ansätze konnten Merkmale bei einigen Legoteilen teilweise ungenau ermitteln. Die größten Probleme gab es bei schwarzen und braunen Legoteilen, sowie an Licht-reflektierenden Flächen der Legoteile und bei Schattenbildung. Nach der Legoteilerkennung wurde bisher nur binär sortiert, erkannt und nicht erkannt. In diesem Semester soll ein Konzept aufgestellt und zum Teil realisiert werden. [1]


Aufgabenteilung

Die in der Aufgabenstellung genannten wichtigsten Arbeitspakete wurden wie folgt in drei Teams aufgeteilt:

  • Adam Fankhauser, Niklas Lingenauber:
    • Separierung:
      • Neues Konzept zur Separierung der Legoteile
        • Umbau der Legoteil-Zählmaschine
        • Erkennung von Legoteil-Gruppen
    • Weitere Aufgaben:
      • Entwurf einer Steuerplatine zur Realisierung des neuen Konzeptes
      • Umbau Schaltschrank
  • Kevin Penner, Christo Tsibadze:
    • Bildverarbeitung: Neuer Ansatz für bessere Farb- und Merkmalerkennung der Teile
      • Ablauf der Bildverarbeitung / Legoteilerkennung
      • Schnittstellen
      • Mechanischer Aufbau Neuer BV-Box
      • Matlabimplementierung
        • Ablaufplan
        • Parametrisierung der Kamera
        • Automatische Kalibrierung der Kamera
        • Legoteilerkennung
    • Weitere Aufgaben:
      • "Abflussrohr", Transportsrohr für Legoteile (Bildverarbeitungsbox --> Sortierung)
      • "Drosselklappe", Prototyp für Separierung in Y-Richtung
      • Kommunikation mit Arduino
      • Einteachen von ein paar Legoteilen
      • Modifizierung der Main-Datei
  • Simon Hanemann, Sergej Krause:
    • Sortierung:
      • Konzepte verschiedener Sortierverfahren
      • Realisierung eines Linearläufers
      • Hardwareaufbau der Sortierungskästen
      • Programmierung des Linearläufers mithilfe des GeckoDrive
      • Hardwaresicherung für Linearläufer
    • Weitere Aufgaben:


[1] [3]

Realisierung

Gruppe: Separierung


Die Separierung ist der erste Schritt für die Sortierung von Legoteilen. Hauptziel dieses Schrittes ist es, dass alle Legoteile einzeln in die folgenden Schritte weitergegeben werden. Die Bildverarbeitung und die Sortierung sind nur möglich, wenn die Teile vereinzelt wurden.

Die Ergebnisse des vorausgegangenen Praktikums haben aufgezeigt, dass eine Vereinzelung der Legoteile mit dem vorhandenen Aufbau schwer zu verwirklichen ist (siehe Semester 2016 Fazit). Durch das Befüllen des Bunkers mit einer Vielzahl an Legoteilen, gestaltet es sich schwierig, die Anzahl der ausgegeben Legoteile auf das Förderband zu regulieren. Es kommt oft dazu, dass sich zu viele Teile auf dem Fließband befinden. Eine Verminderung der Geschwindigkeit des Förderns aus dem Bunker reicht nicht aus, da die Lamellen des Stetigförderers zu viele Teile aufnehmen können. Auch vereinzelte das vorherige Konzept mit unterschiedlich schnell laufenden Bändern die Teile nicht, wenn sich zu viele Teile auf dem Band befanden.

In Wintersemester 2016/2017 wurde das Konzept umgesetzt, dass Hindernisse am Rand des Förderbandes angebracht werden. Diese sollten nur einzelne Teile durchlassen, wenn sich eine Vielzahl an Teilen auf dem Förderband befinden.Es stellte sich heraus, dass das Anbringen von Hindernissen auf dem ersten Förderband nicht wie gewünscht die Legoteil-Gruppen auseinander zieht und gelegentlich durch verklemmte Teile die Legoteil-Zufuhr zur Bilderkennung verstopft. Dies hat in Kombination mit den Problemen bei der Sortierung von Legoteilen nach dem Erkennungsprozess dazugeführt, dass eine Überarbeitung des Gesamtkonzeptes notwendig war, um die Zuverlässigkeit der Legoteil-Zählmaschine gewährleisten zu können.


Neues Konzept zur Separierung der Legoteile

Das neue Konzept zur Separierung besteht aus einer eigenen Bilderkennungsbox, in der erkennt werden soll, ob sich zu viele Legoteile zur selben Zeit auf dem Laufband befinden. Am Ausgang der Bildbearbeitungsbox befinden sich zwei Laufdrückdüsen, die einen Laufstoß ausgeben können wenn sich zu viele Teile auf dem Band befinden. Dabei werden die Teile entgegen der Laufrichtung des Band befördert. Es folgt eine erneute Auswertung der Anzahl der sich auf dem Fließband befindenden Teile. Sollten sie nun vereinzelt sein, können die Box passieren.

Bei diesem Konzept der Separierung kann auf ein zweites Förderband zunächst verzichtet werden.



Umbau der Legoteil-Zählmaschine

Abbildung 2: Neuer Aufbau der Legoteil Zählmaschine

Um das neue Konzept des vorherigen Kapitels umzusetzen, mussten einige Komponenten an der Legozählmaschine umgebaut und angepasst werden (siehe Abbildung 2). Zum Einen wurde das erste, kurze Förderband entfernt, sodass nur noch das Lange verwendet wird. Dies war notwendig um Platz für den Anlagenteil zur Sortierung zu schaffen, außderdem ist die Separierung durch zwei unterschiedlich schnell laufende Förderbänder nicht mehr Teil des Separierungskonzepts. Am Anfang des Förderbandes wurde der Bunker platziert, der die Legoteile auf das Band befördert. Die Box zur Bilderkennung befindet sich nach wie vor mittig auf dem langen Förderband. Innerhalb dieser Box wird die Lage der Legoteile erfasst. Am Ausgang der Box wurden zwei Luftdruckdüsen so angebracht, dass diese die Legoteile in der Box auf dem Band zurück pusten können. Mithilfe dieser Düse ist es nun möglich, von der Bilverarbeitung erkannte Häufungen von Legoteilen auseinander zu treiben. Am Ende des langen Laufbandes wurde eine neue Bildverarbeitungsbox angebracht, in der die Legoteile erkannt werden (weitere Informationen hierzu sind im Kapitel "Gruppe: Bildverarbeitung/Legoteil-Erkennung" zu finden). Diese wurde schräg montiert, sodass Legoteile hineinrutschen können. Über ein Abwasserrohr, welches seitlich an der Box angebracht wurde, können nach der Erkennung die Legoteile per Druckluft in die Sortierung befördert werden (siehe Kapitel "Gruppe: Sortierung"). Für die Sortierung wurde ein Linearläufer mit Gecko-Drive verbaut. Auf dem Linearläufer wurde eine Befestigung für Sortierkästen angebracht. Um Platz zur Umsetzung einer Sortieranlage zu schaffen, wurde der Stromkasten vor Kopf der Anlage platziert. Unter dem Förderband wurde ein Ventilinsel platziert, mit der sich alle Luftdruckdüsen des Systems steuern lassen. Die Ventilinsel ist mit vier Ventilen bestückt, es können aber weitere Ventile nachgerüstet werden. Die Kontakte der Ventilinsel sind in den Schaltschrank geführt. Der Druckluftanschluss kann über ein Schnellspannanschluss an normale Druckluftanschlüsse angeschlossen werden. Die Verkabelungen und Verschlauchungen des neuen Aufbaus wurden, soweit möglich, in Kabelkanälen verlegt.

Die Montage von Schutzblechen vor der Bildverarbeitung der Separierung ist aus zeitlichen Gründen noch nicht geschehen. Die Bleche sollen Teile daran hindern, vom Laufband zufallen wenn sie von einem Luftstoß erfasst werden. Des weiteren bestand ein Konzept, flexible Elemente in Form von Borsten einzusetzen, damit große Gruppen von Legoteilen direkt im Bunker zurückgehalten werden können. Das Konzept wurde aus zeitlichen Gründen nicht umgesetzt, es wurden jedoch bereits verschiedene Besen angeschafft.

Erkennung von Legoteil-Gruppen

Abbildung 3: Ablaufplan Legoteilerkennung

Zur Umsetzung der Separierung wurde eine Funktion entwickelt, die Gruppen von Legoteilen erkennen soll und die Separierung per Luftdruck durchführt.

Programmablauf (siehe Abbildung 3)
Zu Beginn der Separierungsfunktion müssen zunächst Steuerbefehle zur Betreibung der Anlage erteilt werden. Dazu gehört die Einrichtung einer Seriellen Schnittstelle mit dem steuernden Arduino. Außerdem sind Einstellungen an der Webcam vorzunehmen, um Fehler durch unterschiedliche Kameraparameter zu verhindern. Diese können beispielsweise durch Kalibrierungsfunktionen entstehen. Neben der Definition von weiteren Parametern, mit denen sich beispielsweise der betrachtete Bereich im inneren der Bildverarbeitungsbox einstellen lässt, wird die Anlage automatisch gestartet, d.h. es sind die Laufbänder zu starten und das Licht in der Fotobox einzuschalten.
Nach dem die Anlage gestartet wurde, wird die eigentliche Funktion der Legoteil-Gruppenerkennung gestartet. Es wird ein Bild vom Innenraum der Bildverarbeitung aufgenommen (siehe Abbildung 4, oben links) und anhand der zuvor eingestellten Parameter so zugeschnitten, dass Bildränder und weitere uninteressante Bereiche wie der unmittelbare Ein- und Ausgangsbereich entfernt werden. Anschließend wird das Bild so gefiltert, dass nur noch die Legofarben Inhalt des Bildes sind. Das Ergebnis wird dabei in ein Binärbildumgewandelt, die Erkennung der Farben wird durch mehrere Unterfunktionen realisisert. Die entstandenen Bilder werden von kleinen Pixelelementen entfernt, und Lücken im Inneren der Objekte geschlossen. Anschließend werden die Bilder zu einem zusammengeführt. Durch Labeln der Pixelgruppen kann nun die Anzahl der Objekte im Raum bestimmt werden (siehe Abbildung 4, unten links). Anschließend wird ein zweiter Zuschnitt des Bildes vorgenommen, der einen kritischen Bereich betrachtet. Dieser Bereich liegt an einer Stelle, an der die Luftdruckdüsen präzise auf die Legoteile ausgerichtet sind. Außerdem handelt es sich hieberi um einen dünnen Streifen, der die Breite des Förderbandes aber zwingend abdecken muss. Nach dem erneuten Zuschnitt des Bildes wird ausgewertet, wie viele verschiedene Label in diesem Bereich vertreten sind (siehe Abbildung 4, rechts). Befindet sich mehr als ein Objekt im kritischen Bereich, sind die Luftdruckdüsen anzusteuern, da die Legoteile nicht separiert in der Legoteilerkennung ankommen würden. Befindet sich ein oder kein Legoteil in diesem Bereich, werden die Düsen geschlossen und die Teile werden in die Legoteilerkennung befördert. Das Ergebnis der Software wir in Abbildung 4 in der Überschift oben links ausgegeben. Diese Funktion muss während des gesamten Programmablaufs durchgeführt werden. Wird das Programm beendet, wird die Anlage gestoppt, d.h. das Licht und die Motoren werden ausgeschaltet. Das Software-Modul lautet: Separierung.m

Abbildung 4: Bildverarbeitung der Separierungsfunktion


Verbesserungsmöglichkeiten der Software
Aufgrund des hohen Zeitaufwandes des Anlagenumbaus und einer später Lieferung der Pneumatik, konnte die Software nicht ausgibig im Betrieb getestet und nicht optimiert werden. Erste Schnelltests haben jedoch gezeigt, dass die Legoteile bei einer großen Anzahl in der Bildverarbeitungsbox durch gegenseitige Behinderung die Box nicht mehr verlassen und gegen den unteren Rand des Eingangsbereiches der Box stoßen. Dadurch werden die Teile nicht ausreichend weit zurückgeworfen. Da in die aktuelle Version der Software noch kein Stoppen des Bunkers integriert ist, sobald mehrere Teile in der Box erkannt werden, werden zeitgleich weitere Teile in die Bildverarbeitung transportiert. Dies führt zu einer durchgängigen Aktivierung der Düsen. Eine Bunkeransteuerung in Abhängigkeit des Auswertungsergebnisses ist durch eine zusätzliche Verwendung der Seriellen Schnittstelle leicht umzusetzen. Weitere Abhilfe sollte die Vergrößerung des Eingangsbereiches schaffen, sodass zurückgepustete Legoteile die Bildverarbeitung wieder verlassen können.
Ein weiterer Aspekt ist, dass über- oder direkt aneinanderliegende Legoteile mit dem aktuellen Algorithmus als ein Teil erkannt und durchgelassen werden. Dies kann dadurch verbessert werden, dass z.B. durch die Verwendung von Besen und Abstreifern das Übereinanderliegen der Legoteile verhindert wird. Außerdem kann beispielsweise ermittelt werden, ob erkannte Objekte aus unterschiedlichen Farben bestehen. Ist dies der Fall, handelt es sich nicht um ein Teil, sondern um mehrere. Dies würde die Wahrscheinlichkeit reduzieren, dass mehrere Legoteile in die Bildverarbeitung der Legoteilerkennung gelangen.
Des Weiteren ist es denkbar, die beiden Luftdruckdüsen einzeln anzusteuern. Dadurch kann möglicherweise erreicht werden, dass bei einer geringen Anzahl an Legoteilen nebeneinander, nicht alle zurückgeworfen werden und eines dennoch durchlaufen kann. Dazu muss jedoch sowohl die Ausrichtung der Luftdüsen als auch die Erkennung der Algorithmen dahingehend angepasst werden, dass erkannt werden kann, welche Düse zu betätigen ist und welche Auswirkungen dies auf die Legoteile hat. Eine weitere Unterstützung der Separierung wäre möglich, in dem das Fließband und der Bunker angehalten werden, sobald ein Legoteil in der Bildverarbeitungsbox der Legoteilerkennung erkannt wird. Wurde dieses aus der Box entfernt, könnten beide Bänder wieder gestartet werden.

Weitere Aufgaben


Entwicklung einer Steuerplatine zur Realisierung des neuen Konzeptes

Abbildung 5: Steuerplatine

Zur Inbetriebnahme der umgebauten Anlage war es notwendig, die Funktionen der Schaltplatine zu erweitern. Die eingebaute Steuerplatine war auf den Arduino aufgesattelt und bezog Steuersignale sowie die 5 V Versorgungsspannung direkt über die eingesteckten Pins. Mit dieser Platine ist es möglich, drei Motoren mit Strom zu versorgen bzw. durch ein PWM Signal zu steuern. Zusätzlich konnten noch zwei Servomotoren und zwei Infrarotsensoren betrieben werden. Durch die Konzeptänderung der Separierung und der Bildverarbeitung wurde es notwendig, weitere Schaltfunktionen hinzuzufügen. Die Bildverarbeitung benötigte durch Software schaltbares Licht, um zwischen Durch- und Drauflicht in der Bildverarbeitungsbox umschalten zu können. Die Ansteuerung des Lichts sollte, ebenso wie bei den Motoren, über den Arduino erfolgen. Die Spannungsversorgung der Bildverarbeitungsbox war in der Vergangenheit mit einem eigenen Netzteil erfolgt, welches direkt in eine Steckdose eingesteckt wurde. Neben der Einrichtung von schaltbaren Licht, wurde die Schaltung der Pneumatik hinzugefügt. Auch diese sollte über den Arduino gesteuert werden. Die Ventilinsel wird mit 24 V Signalen angesteuert. Die Motoransteuerung musste auch bei der neuen Steuerplatine wieder per MOSFETs umgesetzt werden, da die Geschwindigkeit hier per PWM Signal gesteuert wird. Die Lichtansteuerung der LED Streifen in den Bildverarbeitungsboxen sollte ebenfalls per MOSFET geschehen, da die Schaltfrequenz gegebenfalls recht hoch werden kann und mechanische Relais nicht für höhere Schaltfrequenzen ausgelegt sind. Außerdem benötigen diese eine 12 V Versorgungsspannung. Die Option auf einen weiteres Netzteil, um aus 230 V Netzspannung die 12 V Spannung für die LEDs herzustellen, wurde aufgrund des hohen Kaufpreises für das Netzteil sowie des hohen Aufwandes für den Umbau abgelehnt. Als Alternative wurde sich für die Verwendung von Linearspannungsreglern auf der Steuerplatine entschieden, die aus der vorhandenen Spannung von 24 V, die zur Versorgung der Motoren benötigt werden, 12 V erzeugen sollen. Bei der Ansteuerung der Ventilinsel gab es ebenfalls zwei Optionen. Die erste Möglichkeit war die Nutzung von Relais, wie z.B. Solid State Relais, durch die Arduino-Ausgänge weniger belastet werden. Die zweite Option war die Nutzung der selben MOSFETs, die schon bei der Ansteuerung der Motoren und des Lichts verwendet wurden. Hier wurde sich aug Grund von bereits vorhandenen Komponenten und der damit verbundenen Einheitlichkeit für die zweite Variante entschieden. Der Schaltplan der Platine wurde in Multisim erstellt, der Leiterplattenentwurf in Ultiboard. Die Platine wurde anschließend in der Hochschule gefräst und bestückt(siehe Abbildung 5). Zum Anschluss an den Arduino wurde die Platine mit Schraubklemmen versehen. Der Arduino wurde eine Platine aus dem Zubehör erweitert, welche jeden Anschluss als Schraubklemme zur Verfügung stellt, um Platine und Arduino zu verbinden.

Während der Tests der Platine sind 2 MOSFETs aus unbekannten Gründen zerstört worden. Die Platine ist weiterhin für die aktuellen Funktionen einsatzfähig, für die Hinzunahme weiterer Funktionen, wie beispielsweise der Einbindung einer weiteren Druckluft-Düse, müssen die Bauteile jedoch ausgetauscht werden.

Umbau des Schaltschranks

Abbildung 6: Schaltschrank der Anlage

Aufgrund des Einsatzes der neuen Steuerplatine war es notwendig, den Schaltschrank umzubauen (siehe Abbildung 6). Hierzu wurde die alte Steuerplatine entfenrt und an ihrer Stelle die neue Sattelplatine mit Schraubklemmen auf dem Arduino installiert. Auch wurde der Arduino auf einer Hutschienenhalterung installiert. Ebenso wurde die neue Steuerplatine auf einer solchen Halterung installiert. Die Anschlüsse untereinander wurden verbunden, die Anschlüsse zu den Geräten außerhalb des Schranks wurden auf Reihenklemmen gelegt. In dem Schaltschrank wurde zusätzlich noch der Gecko-Drive für die Steuerung des Linearläufers installiert. dieser wurde auf eine Seitenwand geschraubt, um Kühlung zu gewährleisten.









[4] [5]

Gruppe: Bildverarbeitung/Legoteil-Erkennung



Im vorherigen Semester stellte sich heraus, dass bei dem bestehenden Konzept zur Erkennung von Legoteilen Probleme aufgetaucht sind. Darunter die Erkennung von schwarzen und braunen Legoteilen. Aber auch Schattierungen und Lichtrefelxionen an Legoteilen verfälschten die Merkmale so(z.B. Flächeninhalt), dass oftmals keine Klassifikation stattfinden konnte aufgrund von Nichtübereinstimmungen zwischen gemessenen Merkmalen und hinterlegten Merkmalen in der Datenbank (siehe Semster 2016 Fazit). So wurde ein neues Konzept mit einer neu angefertigten Kamerabox geplant und realisiert, da die Probleme softwaretechnisch nicht zu lösen waren.
[3] [1]

Schnittstellen

Damit die Bildverarbeitung und damit auch das Erkennen der Legoteile erfolgreich verlaufen kann, müssen zunächst die Legoteile vereinzelt in die Bildverarbeitungsbox gelangen (Separierung). Sobald ein Legoteil erkannt wurde, wird es aus der Box per Druckluft gefördert und muss anschließend sortiert werden. Damit das Legoteil richtig sortiert wird, wird dem jeweiligen Legoteil anhand der ID eine Box zugeorndet. Der Schnittstellenplan lässt sich zusammengefasst folgendermaßen darstellen:

Abbildung 7: Schnittstellen der Legoteilerkennung


[3] [1]

Mechanischer Aufbau

Um die Lichtreflexionen und Schatten an den Legoteilen während der Bilderkennung zu vermeiden, wurde ein neues Konzept entwickelt. Wenn ein Legoteil sich auf einem halb-transparentem Milchglas befindet (siehe Skizze), wird zuerst die untere Beleuchtung eingeschaltet und mittels einem Durchlichtverfahren die genaue Kontur des Legoteils mit der Kamera ermittelt. Hier können bereits einige Merkmale genau extrahiert werden (geometrische) und eine Maske erzeugt werden. Anschließend wird das untere Licht ausgeschaltet und das obere Licht eingeschaltet. Nach diesem Schritt wird mit Hilfe der Maske, nur in dem Bereich wo das Legoteil liegt, die Farbe ermittelt.

Abbildung 8: BV-Box Funktionskonzept Skizze



Im nächsten Schritt wurde die Idee mit Hilfe eines CAD-Programms ausgearbeitet. Die Konstruktion wurde für den ersten Prototypen einfach gehalten und sich so für miteinander verschraubte Holzbretter entschieden. In der unteren Box am oberen Rand wurde die halb-transparente Plexiglasplatte angebracht. In einem bestimmten Abstand wurde unter der Plexiglasscheibe eine weitere Ebene mit LEDs platziert. Der Abstand wurde so gewählt, dass bei angeschalteten LEDs das Licht durch das Plexiglas optimal gestreut wird (ohne helle Punkte, ohne Licht-Spots). In der oberen Box wurde im Deckel eine Bohrung durchgeführt, wo die Stromleitungen der Kamera und der LEDs durchlaufen können. Die LEDs wurden in rechteckiger Form angeordnet und von innen an Deckplatte befestigt (siehe Abbildung 9). Auf einer weiteren halb-transparenten Plexiglasplatte wurde die Kamera befestigt. Für die Kamera wurde eine weitere Bohrung erzeugt. In der oberen Box wurden Ein- und Ausgänge für die Legoteile erzeugt, sowie eine Aussparung für eine flache Druckluftdüse. Zur besseren Vorstellung befindet sich unter den folgenden Link das CAD-Modell als 3dxml-Datei: BV_Box_Komplett.3dxml. Der 3dxml viewer ist unter folgenden Link zu finden: Link

Abbildung 9: CAD-Konzept BV-Box



Anhand des CAD-Modells wurde die Bildverarbeitungsbox fertiggestellt und in Gesamtsystem integriert. Desweiteren wurde eine "Drosselklappe" prototypisch für die Vor-Separierung in Y-Richtung realisiert.

Abbildung 10: BV-Box fertiggestellt


[3] [1]

Grober Ablauf der Legoteilerkennung


Abbildung 11: Grober Ablaufplan Legoteilerkennung


[3] [1]

Matlabimplementierung

Das einzelne Programm für die Erkennung von Legoteilen befindet sich hier: Bildverarbeitung_Main_V1. Die einzelne Funktion für ein späteres Gesamtprogramm wurde ebenfalls geschrieben und befindet sich hier: AutomatischesZaehlen. der Funktion wird ein kalibriertes Kameraobjekt, die Schnittstelle zur Datenbank, die serielle Schnittstelle zum Arduino und das Kalibrierbild übergeben. Als Rückgabewert wird eine Liste mit den gezählten Legoteil-IDs zurückgegeben.


Ablaufplan:
Ablaufplan Legoteilerkennung


Parametrisierung der Kamera:
Für die Einstellungen der Paramter wurde das Matlabtool Image Acquisition Toolbox benutzt. Dort wurden einzelne Parameter so ausgetestet/eingestellt, dass sich zum einen die Legoteile beim Durchlichtverfahren gut vom Hintergrund abgrenzen und zum anderen die unterschiedlichen Legofarben beim Auflichtverfahren erkennen lassen. Folgende Einstellungen wurden getroffen:

cam.BacklightCompensation = 0;
cam.Tilt = 0;
cam.Sharpness = 128;
cam.Pan = 0;
cam.Saturation = 128;
cam.Brightness = 128;
cam.Contrast = 128;
cam.Gain = 0;

cam.ExposureMode = 'manual';
cam.FocusMode = 'manual';
cam.WhiteBalanceMode = 'manual';

cam.WhiteBalance = 4000;
cam.Focus = 10;
cam.Exposure = -3;




Kamera-Kalibrierung:
Obwohl die Parameter der Kamera konstant und unverändert waren, stellte sich heraus, dass das Bild der Kamera bei einigen Programmstarts trotzdem heller war. Um Neustarts des Programms zu vermeiden wurde so eine Kalibrierfunktion geschrieben, welche anhand eines aufgenommenen Bildes erkennt, ob die Kameraeinstellungen korrekt vorgenommen.
Dabei wird in einer Schleife ein Kameraobjekt erzeugt und mit den oben aufgeführten Einstelllungen/Parametern versehen. Nun wird ein Bild mit diesen Einstellungen geschossen (im Auflichtverfahren) und mit einem zuvor gespeicherten Bild (siehe Abbildung 12), welches die richtigen Einstellungen beinhaltet, verglichen. Sollten sich die durchschnittliche Helligkeiten der Bilder Unterschiede aufweisen, wird das Kameraobjekt neu erzeugt und der Vorgang wiederholt sich, bis die richtigen Einstellungen getroffen wurden.
Zusammenfassend beschreibt folgendes Diagramm den Ablauf der Selbstkalibrierung:

Abbildung 12: Kalibrierbild

Ablaufplan Kamerakalibrierung
Das Kalibrierbild befindet sich im folgenden Ordner: Calib_Img und die Kalibrierfunktion hier: Cam_Configuration_Check_V1


Legoteilerkennung:
Die Legoteilerkennung erfolgt in einer Schleife, in welcher jeder einzelne Frame ausgewertet wird. Zum Beenden der Schleife und damit des Programms muss hier die Escape-Taste gedrückt werden.


Vorverarbeitung, Segmentierung & Nachverarbeitung:
Zunächst wird das im Durchlichtverfahren aufgenommene Bild zugeschnitten, damit unnötige Bildregionen nicht bearbeitet werden müssen. Die Anzahl an Pixeln, welche in Höhe und Breite weggeschnitten werden, wurde experimentell ermittelt und so ausgelegt, dass sich das größte Legoteil immer im Blickfeld befindet.
Daraufhin erfolgt die Binarisierung bzw. Segmentierung. Die Schwellwerte für die jeweiligen Farbkanäle und die Funktion zur Binarisierung wurden mithilfe des Matlabtools Color Thresholder ermittelt. Sollte sich im Laufe des Projektes die Kamerabox verändern (z.B. mehr LEDs eingebaut oder ein anderer Lichteinfall) muss diese Funktion ersetzt werden, da es sonst zu Segmentierungsfehlern kommen kann.

Abbildung 13: Segmentierung der Legoteile mithilfe des Color Thresholder Tools


Die Funktion zur Segmentierung findet man hier: createBinary_V3
Im Anschluss werden noch kleine, einzelne Pixel im Hintergrund und im Legoteil gelöscht. Damit ist das Bild bereinigt und vollständig segmentiert.


Legoteilerfassung:
Damit ein Legoteil erfasst werden kann, müssen folgende Kriterien eingehalten werden:

  1. Legoteil muss sich an der Kante befinden
  2. Legoteil muss sich in einer Ruhelage befinden
  3. Es darf nur ein Legoteil im Bild vorhanden sein

Sollte mehr als ein Legoteil ein Bild sein, werden alle vorhandenen Legoteile in der Box herausgepustet und als "nicht erkannt" deklariert.


Farbliches Merkmale extrahieren:

Abbildung 14: Farberkennung

Damit die Farbe erkannt werden kann, wird das Auflichtverfahren angewendet. Die Funktion "FARBERKENNUNG_V2" bekommt als Übergabewerte zwei Matrizen:

  • RGB-Bild aus Auflichtverfahren und Binärbild vom erkannten Objekt
  • mit Hilfe der Übergabeparameter wird eine 3D-Farbmaske erstellt (3D --> RGB).
    • Farbmaske: Aus dem Originalbild werden nur die Pixel in die Masken übernommen, die im Binärbild dem Objekt zugeordnet werden können (weiße Pixel)
  • Anschließend werden Mittelwerte für Rot-, Grün- und Blau-Anteil berechnet.


Zuordnung zur nächstgelegenen Farbe:

  • Es werden die RGB-Mittelwerte mit einer Farbtabelle verglichen:
    • die Differenzen von jedem Farbanteil zur Farbtabelle werden ermittelt. Davon werden die Differenzen des Farbanteils mit dem größten Wert (Abweichung) gespeichert.
    • Anschließend wird der minimalste Wert von den maximalen Abweichungen ermittelt --> Es wird genau die Farbe ermittelt, welches die kleinste Abweichung zu der Legoteil-Farbe hat.


Die ermittelte Farbe wird als String zurückgegeben. Es können weitere Farben im Nachhinein hinzugefügt werden oder Farbschwellwerte verändert werden, falls sich die Lichtverhältnisse in der Kamerabox durch Umbauten verändern. Dazu muss in der Funktion Bildverarbeitung_Main_V1 folgende Stelle unkommentiert sein:

%% Merkmalsextraktion %%
%Farbe identifizieren
dbstop in FARBERKENNUNG_V2
FARBE = FARBERKENNUNG_V2(ColorImage,BW);


Dies lässt das Programm beim Ausführen automatisch in die Funktion FARBERKENNUNG_V2 springen (mit Breakpoint). Sobald also nun ein farbiges Teil in der Box ist, wird das Programm an dieser Stelle anhalten. Nachdem dies geschehen ist, sollte der Benutzer folgende Variable beobachten:

FARBE(1,1) = (sum(sum(Farbmaske(:,:,1))))/Pixel_Flaeche;                    
FARBE(1,2) = (sum(sum(Farbmaske(:,:,2))))/Pixel_Flaeche;
FARBE(1,3) = (sum(sum(Farbmaske(:,:,3))))/Pixel_Flaeche;


Diese enthält die durchschnittliche R, G und B Anteile des hineingeworfenen Legoteils. Sollten diese (z.B. nach einem Umbau der Bildverarbeitungsbox) von den Werten in der hinterlegten Tabelle stark abweiche, müssen diese mit dem gemessenen Wert überschrieben werden:

%% Farbwerte-Tabelle mit normierten Lego-Farben
% %           R(1) G(1) B(1)  
Farbwerte=[   0.5273 0.5489 0.5362; %'weiss'          
              0.4138 0.3891 0.3115; %'beige'         
              0.3230 0.0622 0.0623; %'rot'           
              0.0087 0.1275 0.3309; %'blau'          
              0.5409 0.4596 0.2026; %'gelb'          
              0.0450 0.0664 0.0659; %'schwarz'       
              0.0509 0.1826 0.1287; %'gruen'         
              0.2182 0.2038 0.1518; %'hellbraun'          
              0.2709 0.3230 0.3345; %'hell-grau'        
              0.1391 0.1804 0.1878; %'dunkel-grau'   
%               0.0565 0.0629 0.0552; %'dunkelbraun'  
              ];



Geometrische Merkmale extrahieren:

Abbildung 15: geometrische Merkmalsextraktion

Die Funktion "Merkmalsberechnung_V3" erhält als Übergabeparameter ein Binärbild eines einzelnen Objektes (Legoteil). Aus diesem Objekt werden dann folgende Merkmale extrahiert, welche dann zurückgegeben werden:

  • Umfang --> Anzahl der Pixel, die sich am Rand des Objektes befinden
  • Fläche --> Anzahl der Pixel, die sich innerhalb des Objektes befinden (Löcher ausgeschlossen)
  • Flächenschwerpunkt --> Pixelkoordinaten {x/y}
  • Minimaler Abstand von Flächenschwerpunkt zu äußerem Rand des Objektes
  • Maximaler Abstand von Flächenschwerpunkt zu äußerem Rand des Objektes


Die Berechnung der Fläche erfolgt über die Summenbildung der Zeilen und Spalten des Binärbildes. Da so nur die weißen Pixel addiert werden, handelt es sich hierbei nur um die Pixel, die zum Objekt gehören.
Die Schwerpunktskoordinaten lassen sich mit der Matlab-Funktion Regionprops berechnen, welche als Übergabeparameter das Binärbild des Objektes und die Option 'centroid' erhält.
Mithilfe des Kantenbildes des Objektes (erzeugt mit der Matlab-Funktion bwperim), kann eine Liste mit allen Kantenkoordinaten erstellt werden (Matlab-Funktion: Regionprops(Kantenbild, 'Pixellist')). Aus der Differenz zwischen jedem einzelnen dieser Kantenpixel und dem Schwerpunkt bestimmt man nun die Abstände vom Schwerpunkt zum Rand, welche nach minimalen und maximalen Wert durchsucht werden. Anhand der Größe der Kantenpixelliste kann außerdem der Umfang des Objektes bestimmt werden.
Diese Merkmale dienen, zusätzlich zu der Farbe des Objektes und die Anzahl der Löcher im Objekt, als Indikatoren für den Abgleich zwischen aktuellen Legoteil in der Box und den hinterlegten Daten in der Datenbank (siehe Funktion: "Datenbankabgleich.m").
Sollten sich herausstellen, dass diese Merkmale nicht genügen, um alle Legoteile voneinander unterscheiden zu können, sind weitere Merkmalsberechnungen möglich (z.B. Die Seitenlängen einer um das Objekt aufgespannten Boundingbox).


Herauspusten der Legoteile:
Sobald alle Merkmale erfasst wurden, werden diese mit einer Datenbank abgeglichen und einer Legoteil-ID zugeordnet, anhand derer man die zugehörige Box (des Linearläufers) ermittelt und mitteilt (siehe Funktion: "BoxausID_SwitchCaseDB.m"). Danach erfolgt das Herauspusten des Legoteils aus der Kamerabox. Um herauszufinden, wann der Herauspusten beendet werden kann, wird das aktuelle Kamerabild (bei Auflichtverfahren) mit dem Kalibrierbild verglichen. Sollten hier keine großen unterschiede vorliegen, ist die Box leer und das Ventil der Druckluftdüse kann geschlossen werden.
[3] [1]

Teach In

Für das einteachen von Legoteilen sind folgende Schritte nötig:

  1. Vorraussetzungen:
    1. Maschine ist eingeschaltet
    2. USB-Verbindung zwischen PC und Arduino und PC und Webcam
    3. Arduino ist mit folgendem Programm geflasht: "Serielle_Kommunikation_Arduino_Matlab.ino"
    4. Druckluftversorgung der Ventilinsel
  2. Bildverarbeitungsprogramm öffnen: "Bildverarbeitung_Main_V1"
  3. Im Quellcode die Bereiche mit der Bezeichnung "Für Teach In:...." unkommentieren
  4. Nun gleiche Legoteile nacheinander in die BV_Box befördern, dabei werden die Merkmale gespeichert und bei Beendigung des Programms (Esc) gemittelt
  5. Öffnen der Excel_Liste: "Datenbank Teile-Kopie_fuer sql" und unter der jeweiligen Lego-ID die Mittelwerte der Merkmale eintragen (Achtung: Einige Teile müssen in mehreren Lagepositionen eingeteacht werden. Dazu einfach eine weitere Zeile mit derselben ID erstellen)
  6. Nachdem eintragen einiger Teile, schließen der Excel Liste und Ausführen des Programms: InventurlisteErstellen_SQL.m. Das führt dazu, dass die Inhalte der Excel-Liste in die SQL Datenbank eingetragen werden.
  7. Für die Zuordnung von IDs zu den einzelnen Sortierboxen existiert bisher nur ein Testprogramm: BoxausID_SwitchCaseDB.m". Eine Excel-Liste wäre hier jedoch besser geeignet.
  8. Zusatz: Die Toleranzen beim Abgleichen von Merkmalen können bei Bedarf in folgender Funktion geändert werden: "Datenbankabgleich.m". Dabei werden die Toleranzen für Fläche, Umfang und Max-Schwerpunkt relativ angegeben und die Toleranzen für Min-Schwerpunkt und Anzahl der Löcher absolut.


Zum Testen wurden bisher nur ein paar Legoteile in die Datenbank eingeteacht. Zur Vollständigkeit müsste dies mit den restlichen Legoteilen auch geschehen. Praktisch wäre hier eine extra Teach-In Funktion, welche die Werte automatisch ermittelt und in die Excel-Tabelle einträgt. Erste Implementierungen wurden schon durchgeführt, sind jedoch noch mit Fehlern versehen: "Teach_In.m"
[3] [1]

Fazit

Durch die Konzeptänderung und die dadurch entstandene Änderung der BV-Box, wurden viele vorher aufgetauchte Probleme beseitigt. So sind Reflexionen und Schattierungen kein Problem mehr und auch schwarze und braune Legoteile stellen kein Problem mehr dar. Es gibt jedoch noch kleine Fehler beim Herauspusten von Legoteilen. So kann es passieren, dass die Legoteile durch den hohen Luftdruck nicht nach draußen, sondern gegen die innere Holzwand springen und damit doppelt gezählt werden. Aber auch ein Liegenbleiben im oberen Bereich des Rohrs kam häufiger vor. Hier ist eine Vergrößerung des Ausgangs möglich oder die Veränderung des Rohres (kürzer bzw. schmaler). Insgesamt kann man aber sagen, dass die Konzeptänderung der Bildverarbeitung erfolgreich verlaufen ist, aber noch mit wenig Aufwand optimiert werden kann.
[3] [1]

Gruppe: Sortierung

Die SDE-Gruppe von dem Semester 2016/2017 hat sich dafür entschieden, einen Linearläufer einzusetzen. Im folgenden Bild wird schematisch der Aufbau und Ablauf der Sortierung dargestellt.

Es wurden noch weitere Konzepte ausgearbeitet. Mögliche Ansätze für zukünftige Optimierungen des Auswerfers findet man [hier].[2] [6]

Schaltplan des Linearläufers

Abbildung 16: Verdrahtung des GECKODRIVES. Der GECKODRIVE befindet sich im Schaltschrank. Er gibt die Schritte für den Schrittmotor des Linearläufers
Geckodrive-> 24V-Netzteil
Klemme

(Gecko)

Bezeichnung Farbe Überträgt Klemme
(Netzteil)
Zusatz-Information
1 GND Schwarz Ground GND ---
2 24V Rot Spannung 24V 18-80 VDC
Geckodrive-> Stecker des Schrittmotors
Klemme

(Gecko)

Bezeichnung Farbe Überträgt Stecker
(Motor)
Zusatz-Information
3 WINDING A+ Gelb Schritte PIN1 (Weiß) Phase 1
4 WINDING A- Rot Schritte PIN2 (Braun)
5 WINDING B+ Blau Schritte PIN3 (Blau) Phase 2
6 WINDING B- Schwarz Schritte PIN4 (Schwarz)
Geckodrive-> Stoppschalter -> Arduino
Klemme

(Gecko)

Bezeichnung Farbe Überträgt Klemme
(Arduino)
Zusatz-Information
7 DISABLE Blau Signale GND Benötigt einen
33kΩ-Pulldown Widerstand

Anmerkung: Sollte der Linearläufer zu nah an das Ende seiner Schiene kommen, so betätigt er einen der beiden Stoppschalter. Das Betätigen sorgt dafür, dass Disable auf GND gezogen wird. Dadurch wird der Geckodrive ausgeschaltet und somit auch der Schrittmotor. Im Notfall wird somit die Hardware geschont.

Geckodrive-> Arduino
Klemme

(Gecko)

Bezeichnung Farbe Überträgt Klemme
(Arduino)
Zusatz-Information
8 DIRECTION Gelb Signale D5 Gibt die Richtung an
9 STEP Blau Signale D6 Gibt die Schritte an
10 COMMON Rot Signale D7 Ein/Aus des Geckodrives

[2] [6]

Einstellung des Geckodrives

Elektrische Charakteristiker des Linearläufers
Ohne Last Auf max. Geschwindigkeit entgegen
der Richtung des motors
Auf max. Geschwindigkeit
in Richtung Motor)
Spannung 24 V 22 V 24 V
Strom 0.63 A 2.02 A 1,60 A
Leistung 15,12 W 44,44 W 35,19 W

Motor: MOT-AN-S56(NEMA23)

0,55m / 1,81 s = 0,304 m/s Richtung ende mit der Einstellung von F = 1000000 0,55m / 1,42 s = 0,387 m/s Richtung Motor mit der Einstellung von F = 1000000


Pin Options am GeckoDrive G201X:
1-5 Stromstärke einstellen eingestellt auf 4,4 AMPS

PIN Schaltstellungen des Geckodrives
1 ON
2 OFF
3 OFF
4 ON
5 OFF
6 ON
7 ON
8 ON
9 ON
10 ON

Hinweis:

  • 6-8 Keine Funktion bei dem NEMA-23
  • 9 Auto Standby um den Motor bei stillstand auf 70% der Stromstärke zu drosseln um die Hitzeentwicklung zu reduzieren.
  • 10 auf ON wenn mit NEMA-23 Motoren gearbeitet wird. (Es wird ein NEMA-23 Motor verwendet!)

[2] [6]

Evaluation der Druckluftdüsen

Der vollständige Bericht befindet sich im SVN unter
...\Dokumentation\16_Pneumatik\Evaluation_der_Druckluftdüsen.docx

Im ersten Test wurden verschiedene Legoteile und den unten in der Tabelle genannten Düsen getestet. Ziel des Versuches war es heraus zu finden, welche Legoteile sich am besten für den Test der Düsen eigen. In dem Test stellte sich heraus, dass sie Komplexität der Form der Legoteile kaum Einfluss auf das Ergebnis hat. Dies ist auf das geringe Gewicht und die großen Oberflächen der Legoteile zurückzuführen.

Im zweiten Test wurden getestet wie weit die Düsen die Legoteile bei einmaligen betätigen bewegen können. Ein Teil muss dabei mindestens eine Strecke von 20 cm überwinden können. In dem Test zeigte sich, dass die Testergebnisse von der punktuellen Düse nur dann sinnvolle Ergebnisse erzielen, wenn das Objekt mit einem optimalen Angriffswinkel getroffen wird. Deshalb schwanken die Messwerte auch sehr stark im Test. Dies ist sehr ungünstig da die Lage der Teile im laufenden Prozess der Legoteilzählmaschine sehr variabel ist. Das optimalste Ergebnis haben die spitzen Luftdruck-Düsen erzielt, da selbst mit geringen Drücken viel Kraft auf die Legoteile übertragen werden konnte.


Platz Düsen-Nr Bild Düsenart Material min. Druck Preis
1 1761 Spitz Aluminium >2,5 Bar 11,40€
2 1873 Spitz Edelstahl >2,5 Bar 21,70€
3 2075 Spitz Kunststoff (ABS) >2,5 Bar 18,80€
4 R02-100 Spitz Edelstahl 3,5 Bar 10,60€
5 1761 Spitz Edelstahl 3,5 Bar 40,90€

[2]

Arduino-Kommunikation

Zum Ansteuern der Aktoren mithilfe des Arduino Mega, wurde ein Kommunikationsprogramm geschrieben. Dieses ermöglicht dem Nutzer über den PC einen seriellen Befehl an den Arduino zu schicken, der daraufhin den Befehl ausführt. Zu den Befehlen gehören:

  • Ansteuern der LED's in den Kameraboxen für die Erkennung bzw. Separierung
  • Ventilsteuerung für die Druckluftdüsen für die Erkennung bzw. Separierung
  • Einstellung der Drosselklappenstellung für die Sortierung
  • Ansteuern der Förderbandmotoren
  • Ansteuern des Linearläufers für die Sortierung

Für die Botschaften wurde ein einheitliches Framework herausgearbeitet. So besitzt jede serielle Botschaft folgende kodierte Inhalte:

  • Am Anfang jeder Botschaft steht ein B
  • Eine 1-stellige ID, welche die oben aufgeführten Aufgaben repräsentiert
  • Eine 2-stellige Nummer (NR), welche einen bestimmten Aktor beinhaltet
  • Eine 3-stellige Zusatzzahl, welche z.B. den Motoren eine relative Geschwindigkeit vorgibt, den LEDs bzw. Ventilen an/auf und aus/zu vorgibt oder die Sollposition für den Linearläufer bzw. Drosselklappe beinhaltet
  • Die Botschaft wird mit einem E beendet

Eine detalierte Beschreibung der Kommunikation findet sich in folgender Tabelle:

Beschreibung ID NR ZUSATZ Gesamtstring Beispielstring
(ohne Leerzeichen)
Drosselklappe D 00 (nur eine Drosselklappe vorhanden) Z: Stellung (0 oder 1) B ID NR Z E B D 00 001 E (Drosselklappe in Stellung 1)
LED's L 00: Erkennung oben
1: Erkennung unten
2: Sortierung
Z: Status (0=aus; 1 = an) B ID NR Z E B L 01 001 E (Erkennung unten an)
Förderbandmotoren M 00: Bunker
01: Förderband
Z: Power in % B ID NR Z E B M 01 080 E (Förderband mit 80%)
Schrittmotor Sortierung (Linearläufer) S 00 - 04: Position
(Position 0: aktuelle Position als Initialposition annehmen)
Z: 0 (kein Zusatz) B ID NR Z E B S 04 000 E (Linearläufer auf Position 4 bzw. Box 4)
Ventile V 00: Erkennung pusten
01: nicht belegt
02: Vereinzelung pusten (1)
03: Vereinzelung pusten (2)
Z: Status (0=aus; 1 = an) B ID NR Z E B V 00 001 E (Erkennung pusten)


Das Programm auf dem Arduino beobachtet dauerhaft den seriellen Eingang und reagiert bei einem Eintreffen einer Botschaft mit einem jeweiligen Ansteuern der digitalen Ausgänge. Das Programm befindet sich im folgenden Ordner: Serielle_Kommunikation_Arduino_Matlab. Hierbei wurde das Ansteuern der Drosselklappe noch nicht implementiert. Die Boxpositionen können hier auch verändert werden bzw. auch erweitert werden. Dazu müssen folgende Variablen verändert/hinzugefügt werden:

//Positionen der Boxen 
double Box_1 = 0.0;
double Box_2 = 105;
double Box_3 = 210;
double Box_4 = 315;
//double Box_5 = 0.0;
//double Box_6 = 0.0;
//double Box_7 = 0.0;
//double Box_8 = 0.0;

Außerdem muss folgende switch-case Struktur in der Funktion void Sortierung(int Position) erweitert werden (bei Veränderung der Boxanzahl):

    switch(Position)
    {
      case 0:
        //Initialisierung des Linearläufers. Aktuelle Position = 0-Punkt 
        Achse_X.setCurrentPosition(0);
        Position = 0;
        break;
      case 1:
        Position = Box_1;
        break;
      case 2:
        Position = Box_2;
        break;
      case 3:
        Position = Box_3;
        break;
      case 4:
        Position = Box_4;
        break;
      default:
        Position = 0;
        break;
    }



[3]

Main-Funktion

Die Main-Funktion aus dem Semester: http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016 wurde an das neue Konzept angepasst. Dabei wurden folgende Programmteile aus dem vorherigen Semester beibehalten:

Folgende Änderungen wurden durchgeführt:

  • Austausch der Bildverarbeitungsfunktion
  • Kamera-Kalibrierung in der main
  • Einbeziehen der neuen Aktoren (LEDs, Druckluftventile ...)

Die Main-Funktion befindet sich im folgenden SVN-Ordner: main_new.m



[3]

HSHL-Wiki-Dokumentation

Die HSHL-Wiki-Dokumentation wurde von der gesamten Gruppe bearbeitet. Jedes Themenabschnitt unterliegt der bereits oben genannten Verantwortlichkeiten. [1]

Ergebnisse

Anleitung Programmstart

Vor dem Starten der Legoteil-Zählmaschine müssen einige Voraussetzungen erfüllt sein. Es gilt zu prüfen, ob alle benötigten Komponenten mit dem Rechner verbunden sind, von dem das Programm gestart werden soll. Dazu zählen:

  • USB-Kabel zum Arduino
  • USB-Kabel zur Webcam in der Separierungseinheit
  • USB-Kabel zur Webcam in der Erkennungseinheit

Außerdem muss die Anlage an das Stromnetz und die Ventilinsel an eine Druckluftleitung angeschlossen sein.

Vor dem Start gilt es außerdem zu überprüfen, ob die Notschalter der Anlage deaktiviert sind und ob der Linearläufer in seine Initialposition gebracht wurde. Ist dies nicht der Fall ist dies durchzuführen. Anschließend ist der Luftdruck, der an der Ventilinsel anliegt einzustellen. Empfohlen werden zwischen 3 und 5 Bar. Der Start des Programms wird durch ausführen der Datei main_new.m ausgelöst. Es öffnet sich eine Eingabemaske, in der die zu zählenden Baukästen ausgewählt werden. Nach dessen Bestätigung sind die Anzahlen der Legoteile anzugeben, die nicht durch die Maschine gezählt werden können. Anschließend startet die Maschine das automatische Zählen. Der Inhalt der Legokiste, abzüglich der manuell gezählten Teile, ist in den Bunker zu geben. Da die Separierungseiheit noch nicht zuverlässig funktioniert und noch nicht in den Gesamtprozess integriert ist, sollten zunächst nur kleine Mengen in den Bunker geschüttet werden und eine manuelle Separierung vorgenommen werden. Wenn der Bunker leergelaufen sein sollte, sind nicht erkannte in den Bunker zurückzuführen (Aus Sicherheitsgründen darf dies in dem aktuellen Status nicht bei einer laufenden Maschine durchgeführt werden!) Ist der Zählprozess durchlaufen, kann die Zählung vom Anwender mit der ESC-Taste beendet werden. Es wird eine Inventur- sowie eine Fehlteilliste im Tool Excel ausgegeben. Außerdem werden Motoren und LEDs ausgeschaltet und der Linearläufer auf Initialposition gefahren. Nach gebrauch der Anlage ist der Druck der Druckluftleitung herunterzuregeln und die Anlage vom Strom zu trennen.

[6] [5] [3]

Fazit

Abgeschlossene Punkte

  • Allgemein
    • Evaluierung der Druckluftdüsen
    • CAD-Modell des „Klemmbocks“ zu Befestigung der Düsen
    • Main-Datei angepasst
    • Arduino-Kommunikations-Software implementiert (zum Ansteuern aller Hardwarekomponenten bzw. Aktoren)
  • Separierung
    • Entwicklung eines neuen Konzepts zur Separierung der Legoteile
    • Umbau der Anlage (Anpassung an das neue Konzept)
    • Umbau Schaltschrank (Anpassung an das neue Konzept)
    • Entwicklung neue Schaltplatine (Anpassung an das neue Konzept)
    • Entwicklung der ersten Version des Separierungs-Algorithmus
  • Bildverarbeitung / Bildverarbeitungsbox
    • Neues Konzept: Idee --> CAD-Konzept
    • Konstruktion und Zusammenbau der neuen BV-Box
    • BV-Software-Anpassung
    • Lichtsteuerung über Arduino
    • "Drosselklappe", Prototyp für Separierung in Y-Richtung
    • Einteachen von ein paar Legoteilen
  • Sortierung
    • Prozessablaufplan der Sortierung
    • Montage Konzept der Sortierung
    • Ansteuerung des Linear-Läufers
    • Verdrahtung des Linearläufers
    • Test der Funktionalität des Linearläufers
    • Einbindung der Sensoren des Linearläufers
    • Montage der einzelnen Kästen


Offene Punkte

  • Allgemein
    • Parallele Ausführung zweier Funktionen
      • Bildverarbeitung der Separierung
      • Bildverarbeitung der Legoteilerkennung
    • GUI überarbeiten/erweitern
      • Teach-In Einbindung in der GUI: Benutzerschnittstelle zu Eingabe und Bearbeitung der Teile
      • Merge-Funktion: Auswahl von mehrern Kästen ermöglicht
    • Anleitung zum Start der Maschine eine „Broschüre“ mit vielen Bildern
    • Videoanleitung zum Erklären der Projektergebnisse
  • Separierung
    • Schutzbleche für herunterfallende Legoteile (am Bunker)
    • Anbringung von Besen oder Abstreifern zur Verhinderung von Legoteil-Überlagerungen
  • Bildverarbeitung
    • Teach-In Funktion implementieren
    • alle Legoteile einteachen
    • Bildverarbeitungsbox von Umgebungslicht vollständig abschirmen (Tunnel am Eingang der Box aus Blech erstellen; Schlitze in der Box abdichten)
  • Sortierung
    • Montage und Einbindung der „Auswerfer-Klappe“ vor dem Linearläufer


Kritikpunkte

  • Es werden nicht die optimalen Luftdruckdüsen eingesetzt
  • Ein zweite Bildverarbeitung zum Erkenn von Bauteilhaufen erfordert viel Rechenleistung
  • Die Startposition des Linearläufers ist kann stark variieren und den den kompletten Prozess anhalten.
  • Beim Überschreiten der Notfall Schalter des Linearläufers kann das System nicht eigenständig reagieren. Daher muss der Läufer manuell auch dieser Lage befreit werden.
  • Es gibt noch keine Sicherheitsvorkehrungen, die im Fehlerfall den Prozess oder Teilprozesse stoppen.
  • Wenn ein Sortierkasten überfüllt ist, können einzelne Teile aus dem Kasten fallen. Die Kapazität der Sortierkästen könnte angepasst werden.


Optmierungen

  • Separierung
    • Bildverarbeitung zum Erkennen von Bauteilhaufen
      • Stoppen des Bunkers sobald mehrere Teile in der Box erkannt werden
      • Vergrößerung des Eingangsbereiches
      • über- oder direkt aneinanderliegende Legoteile als unterschiedliche Teile erkennen
      • beide Luftdruckdüsen gezielt einzeln anzusteuern
      • Anhalten der Fließbänder sobald ein Legoteil in der Bildverarbeitungsbox der Legoteilerkennung ist
  • Bildverarbeitung
    • Modifizieren des Ausgangsrohrs, da ein paar Legoteile teilweise dort hängen bleiben
    • Modifizieren des Box-Ausgangs (vergrößerung, da einige Legoteile beim Rauspusten an den oberen Rand zurückprallen können
  • Sortierung
    • Einbau von zusätzlichen Sensoren für das Start/Kalibrierungsproblem des Linearläufers
    • Verbinden der Sensoren des Linearläufers mit dem Arduino um automatisch bei Fehlerfällen eingreifen zu können.
    • Ein Rohr mit geringerem Durchmesser würde den Trichter vor dem Linearläufer sparen.

Referenzen

[1] [5] [2] [6] [4] [3]

Autoren

  1. 1,00 1,01 1,02 1,03 1,04 1,05 1,06 1,07 1,08 1,09 1,10 1,11 Autor Christo Tsibadze
  2. 2,0 2,1 2,2 2,3 2,4 2,5 Autor Simon Hanemann
  3. 3,00 3,01 3,02 3,03 3,04 3,05 3,06 3,07 3,08 3,09 3,10 3,11 Autor Kevin Penner
  4. 4,0 4,1 Autor Adam Fankhauser
  5. 5,0 5,1 5,2 Autor Niklas Lingenauber
  6. 6,0 6,1 6,2 6,3 6,4 Autor Sergej Krause

Siehe auch / Weiterführende Links

  1. SVN: Checkout URL | https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk
  2. Rückblick Nr.1 (SS16): | http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016
  3. Rückblick Nr.2 (WS15): | http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2015