Blackpicker: Pick&Place-Automat aus Maker-Komponenten (Teil1)

Ein Selbstbau-Portalroboter löst Probleme, die sonst weitaus teureren Industriegeräten vorbehalten sind. Die Objekterkennung erledigt ein RasPi mit Kamera.

In Pocket speichern vorlesen Druckansicht 5 Kommentare lesen
Lesezeit: 17 Min.
Von
  • Ramon Hofer Kraner
Inhaltsverzeichnis

Wer in der Automatisierungsindustrie arbeitet und in der Freizeit an 3D-Druckern und Lasercuttern herumexperimentiert, wird in diesem Artikel neue Wege finden, denn es geht genau um die Verschmelzung dieser beiden Themen. Ein aus gut erhältlichen Komponenten selbstgebauter Portal-Pick'n-Placer ersetzt beim Autoren einen teuren Industrieroboter.

In der Welt der Automatisierung wird es schnell teuer. Stabile Profile, Vorrichtungen, Steuerungen oder Roboter haben immer noch stolze Preise, obwohl sich der Markt der Low-cost Roboter langsam in Richtung bezahlbarer Preise bewegt. So sind z.B. Roboter wie der Dobot Magician für ca. 1500 Euro zu haben. Dabei liegt die Genauigkeit und die Geschwindigkeit für den Heimgebrauch auf einem sehr guten Niveau von ca. 0,2 mm und 320°/s. Wer kleine Bauteile (max. 250g) auf einer relativ kleinen Fläche handhaben will, könnte mit einem solchen Arm glücklich werden.

Es geht aber noch günstiger, größer, schneller und mit mehr Freiheitsgraden. Die Materialkosten meines BlackPickers belaufen sich für die gesamte Maschine auf ca. 1300 Euro. Damit lassen sich auf einem großen Tisch ca. 80 wild ausgestreute und beliebig orientierte Hülsen (3,4,5) in 10 Minuten sortieren – alles gesteuert durch einen Teensy-Mikrokontroller als Steuerung und einen Raspberry Pi mit Kamera für die Objekterkennung.

Die Aufgabe ist nicht ganz einfach: 100 bis 300 wild ausgestreute Hülsen sollen mittels Objekterkennung in Position und Orientierung erfasst und mit einem Greifer in vorgefertigte Ablagen manövriert werden. Dabei ist zu beachten, dass immer die Seite mit dem kleinen Loch einheitlich nach links ausgerichtet zu liegen kommt.

Hülsen und Sortierrahmen: Die Maschine soll die Hülsen richtig ausgerichtet in das Tray befördern.

Wer solche Hülsen mit gängiger Industrieautomatisierung sortieren möchte, benötigt einen Roboter mit großem Aktionsradius, genügend Kraft und Genauigkeit. Hier könnte man evtl. mit Lösungen um die 10.000 Euro glücklich werden, jedoch wird die Tracking-Lösung (günstiges 3D-System) mit dem gleichen Betrag ein richtig großes Loch in die Geldbörse reißen. Auf der anderen Seite bieten Maker bereits praktikable Lösungen an. Hier positioniert sich z.B. der Liteplacer im Bereich der Bestückungsmaschinen als industrienaher Maker-Ansatz. Der wesentliche Bestandteil, nämlich ein kompakter, stabiler Greifer, fehlt leider, da die Maschine für das Ansaugen von SMD-Bauteilen ausgelegt ist.

Ein Ansatz, der in die gewünschte Richtung geht, ist der Arduino- und Raspberry-Pi-gesteuerte Greifer von Paco Garcia für Spielzeug. Doch hier wird schnell ersichtlich, dass die Vorrichtung für den industriellen Einsatz noch viel zu wenig Zuverlässigkeit, Genauigkeit und Geschwindigkeit besitzt. So wurde nach intensiver und leider erfolglosen Suche im Netz dann doch entschieden, eine Maschine neu aufzubauen, um die Grenzen eines solchen makerbasierten Ansatzes zu testen.

Für einen stabilen Aufbau benötigen Industriemaschinen normalerweise ein gutes Fundament. Dieses besteht in der Regel aus teuren und schweren Profilen und Platten aus Alu oder Stahl oder sogar einem Betonsockel. Um die Kosten hier signifikant zu reduzieren, können Pressspanholzplatten (MDF) verwendet werden. Diese Platten sind formstabil und haben eine plane Oberfläche, sodass ein ziemlich genaues Fundament mit einer Kreissäge geschnitten und zusammengeschraubt werden kann. Damit sich diese Basis nicht verziehen kann, sind Querstreben eingebaut, zwischen denen auch die ausziehbare Elektronik untergebracht ist. Im Baumarkt kann man sich die großen Flächen bei Bedarf auch genau zuschneiden lassen.

Um die Trackingaufgabe zu vereinfachen, sollen die Hülsen alle ohne Überlappung auf einer Fläche ausgestreut werden. Auch wenn das nicht die Traumlösung ist, so wäre doch die Aufgabe um einiges komplexer, wenn die Hülsen direkt aus einer tiefen Kiste mit wild durcheinander gestapelten Hülsen entnommen werden müssten. Dann wäre nämlich ein 3D-Scanning nötig. So aber muss nur einfach eine Auskleidung des Streubereichs mit Klebeplüschfolie erfolgen (um ein Wegrollen zu verhindern), die Teile lassen sich so mit einer einfachen Pi-Cam erfassen.

Arbeitsbereich in der Vogelperspektive. Rechts die Streuablage, in der die Hülsen ausgestreut und verteilt werden. Links werden die Hülsen durch den Greifer einheitlich ausgerichtet abgelegt. In der Mitte die Messstation, in der die Hülsen mit Sensoren bezüglich Ausrichtung kontrolliert werden.

Für den Grundaufbau des XYZ-Portals kamen diverse Lösungen in Frage. Zum Beispiel könnte man den Aufbau einer Shapeoko oder einer Low-cost-Fräse von Aliexpress nehmen, jedoch liegen die Preise auch da noch relativ hoch. Günstiger geht es mit Openbuilds-Profilen. Hier wurde per Zufall ein Lasergravierer auf Aliexpress entdeckt, der Openbuilds-Profile als Linearschienen verwendet und mit 150cm Länge genügend Auslauf für das Projekt bietet. Bestellen kann man ihn auch ohne Elektronikkomponenten, sodass die Kosten mit ca. 350 Euro akzeptabel bleiben. Einzig müssen die Schienen danach auf die gewünschten Längen zugeschnitten werden. Das geht auch ohne grosses Gerät und kann mit einer Stichsäge mit Metallblatt durchgeführt werden. Schön praktisch sind auch die mitgelieferten Schleppketten, die mit 30x15mm genügend Platz für alle Kabel bieten. Für die Z-Achse wurde wiederum ein schönes Modul auf Basis Openbuilds gefunden, welches eine günstige Positionierung des Z-Motors ermöglichte und sich mit ein wenig Anpassung am Laserkopf montieren ließ.

Die Holzverstrebungen unten, um ein wenig Stabilität zu erzeugen. In der Mitte ist auch die Elektroschublade ersichtlich.

Mit der Streulösung für die zu sortierenden Teile war ein Kompromiss unausweichlich: Die Kamera kann die Ausrichtung des Lochs bei liegenden Hülsen von oben nicht erfassen, daher müssen die liegenden Teile auf eine "Messstation" mit Sensoren zur Erfassung der Ausrichtung gelegt werden. Im Endeffekt musste jedoch jedes Teil auf diese Station abgelegt und durchgemessen werden, da der Greifer bedingt durch Reflektionen auf den Teilen diese nur mit begrenzter Genauigkeit aufnehmen konnte. Dieser leichte Off-Grip kann auf der Station ausgeglichen werden.

Die größte Herausforderung bezüglich Materialbeschaffung stellte der Greifer dar. Wir konnten weder auf Thingiverse noch auf anderen gängigen Portalen (grabcad, openbuilds etc.) geeignete Greifer finden, die auf kompakten Massen eine Rotation in zwei Richtungen unterstützen. Daher musste hier eine Eigenentwicklung her.

Prototyp-Greifer in einer frühen Version

Der Rohbau mit den Linearachsen und dem Z-Modul von Aliexpress

Auf der Seite der Elektronik bietet sich für das Erfassen und Erkennen der Objekte ein Minicomputer wie der Raspberry Pi 4 mit Kamera an. Dabei wurde ein angsteinflößend langes 15-Pin-Flachband-Kamerakabel (150cm) an den Kameraport angeschlossen, um die Kamera auch gut positionieren zu können. Nach anfänglichen Bedenken lief diese Lösung aber einwandfrei, obwohl das Kabel gefährlich nahe an den Powerleitungen der Schrittmotoren vorbeigeführt werden musste. Nach ersten positiven Versuchen mit CNC Shields und Arduino Megas wurde schlussendlich dann doch ein Teensy 3.6 für die Maschinensteuerung auserkoren.

Was immer wieder leicht vergessen wird, wenn man als Entwickler einen neuen Aufbau fertigstellt, sind die Bedienelemente für Nicht-Techniker. Hierzu gehört natürlich ein LCD-Display, dass in diesem Falle mit 4 Zeilen auskommen muss. Natürlich wäre ein entsprechender Monitor am Raspberry Pi ebenfalls möglich gewesen, jedoch böte so eine Lösung weniger direkte Interaktion mit der Steuerung und würde eine aufwändigere Kommunikation zwischen Pi und Steuerung erfordern. Dazu wäre die Ausarbeitung eines schönen und bediensicheren GUIs dazugekommen. Nicht zu vergessen sind die Elemente zur Bedienung der wichtigsten Funktionen (Multischalter für Teileart Auswahl und alle Buttons) und der wichtigsten unwichtigen Funktion: Not-Aus.

Das HMI: 4x20 Zeichen LCD, Multischalter mit 12 Positionen (nur 4 aktiv), Start Button, Reset Button und Notaus. Alles wurde mit Laserschnitt aus einer 3mm MDF geschnitten.

Die aufwändigste Entwicklung an der Hardware war der Greifer: Dieser muss in der Lage sein, die Hülsen in beliebiger Lage sicher aufzunehmen – das heißt, entweder mit dem kleinen oder großen Loch oben oder in der liegenden Position. Außen kann nur gegriffen werden, wenn die Hülse liegt, ansonsten könnte der Greifer an benachbarten stehenden Hülsen aufstehen, was ein Greifen unmöglich macht.

Links der fertig aufgebaute Greifkopf mit Verkabelung, rechts das CAD-Modell

Daher wurde entschieden, stehende Hülsen immer innen zu greifen. Über mehrere Iterationen von neuen Greifbacken konnten wir im aufwändigen, aber nötigen "Trial and Error"-Verfahren eine gute Form finden. Schlussendlich wurden die Backen dadurch aber auch relativ filigran. Es reichte erstaunlicherweise trotzdem, mit einer Druckschichtdicke von eigentlich zu großen 0,3 mm zu drucken. Aber das verwendete ABS und die richtige Ausrichtung für das Drucken mit einem UPBOX-Printer von Teartime genügte, um immer noch einen stabilen und belastbaren Greifer zu erhalten. Wir nutzen die Free-Version von Autodesk Fusion 360 für das Erstellen des CAD-Modells.

Der Standard-Greifer kann bei einem Außengriff an benachbarten Hülsen aufsetzen

Das Aufsetzen des Greifers kann auch dazu benutzt werden, das große oder kleine Loch der Hülse zu detektieren – je nach dem an welcher Höhenposition der Greifer aufsetzt.

Um die Rotationsachsen möglichst kompakt zu halten, wurden die Servos so nahe wie möglich beieinander platziert. Nach anfänglichen Versuchen mit 180°-Standard Servos für eine 180°-Bewegung haben wir festgestellt, dass diese um einige Grade nicht die vollen 180° ausfahren konnten. Dies mag an der billigen China-Version gelegen haben und scheint auch bei anderen Makern immer wieder vorzukommen. Der Wechsel auf 270°-Servos und die entsprechenden Korrekturen zum Abschneiden der überflüssigen Grade im Code führten zu einem befriedigenden Ergebnis.

Eine wichtige Funktion des entwickelten Greifers ist die Möglichkeit, ein Aufsetzen des Greifers auf einem Hindernis zu erkennen. Dies wird mit einer Linearschiene, an der sich der gesamte Greifer auf und ab bewegen kann, gelöst. Sobald der Greifer aufsetzt, wird er auf der Linearschiene nach oben bewegt und betätigt einen Taster. Beim Picken wird dieser Taster an kritischen Positionen ausgelesen.

Die 3D gedruckte Messstation: Eine Halte- und Umgreifvorrichtung für die Hülsen ermittelt mit Infrarot-Abstandssensoren die Ausrichtung der Hülse.

Der Nutzen des Tasters wurde mir erst während des Einsatzes gewahr: Durch das geschickte Abfragen bei Aufstand an bestimmten Höhenpositionen kann man erfassen, ob der Greifer sich in einem großen oder kleinen Loch der Hülse befindet, da er weiter oben oder unten aufsteht. Cool! Leider musste die Hülse trotzdem zum Umgreifen auf die Messstation, denn das Ablegen mit Innengriff im Loch konnte nicht zuverlässig realisiert werden, auch wenn dies einige Sekunden Bonussortierzeit bedeutet hätte.

Trotz der tollen Aufstandsfunktion konnten nicht alle Situationen abgefangen werden. So kam es vor, dass beim Anlernen des Ablaufs der Greifer den Innengriff nicht löste, indem er die Backen zusammenfährt, sondern aufmachte. Das führte immer wieder zu folgenreichen Unfällen und zum Zerstören der 3D-gedruckten Greiferenden. Abhilfe schaffte eine konstruktive Anpassung, bei der die Backen nach innen wegklappen konnten. Durch Gummizüge wurden diese wieder in die Ausgangsposition zurückgebracht.

Die Idee war gut: Man nehme einen Arduino Mega mit CNC-Shield und benutze die berühmte Accelstepper-Lib. Es stellte sich aber schnell heraus, dass die geforderte Geschwindigkeit und der ruhige Lauf mit mind. Viertel-Microstepping den Mega schnell an den Anschlag bringt – zumal auch häufig mehrere Achsen gleichzeitig bewegt werden müssen. Mit einem Takt von 16Mhz kann er mit der Library nur ca. 4000 Steps/sek fahren, mit Tricks auch wenig mehr. Was dann in einer Verfahrgeschwindigkeit von ca. 10 cm/s endete. Die daraus resultierende Geschwindigkeit war nicht geeignet für die Sortieraufgabe. Ein Upgrade auf den Arduino Due versprach eine Leistungssteigerung um ca. 60% – das dann aber leider nur für eine Achse auf einmal. Daher musste etwas Schnelles her.

"Form follows function": Die Verkabelung der Steuerungsschublade wurde bestimmt nicht ISO gerecht aufgebaut und auch die farbige Kennzeichnung lässt zu wünschen übrig. Der Teensy wurde auf ein Prototying-Board gesteckt, damit alle Leitungen bequem eingesteckt und verbunden werden konnten.

Leider hatte die Arduino Familie nicht viel im Angebot, so dass auf die ebenfalls günstigen Teensies ausgewichen werden musste. Beim ersten Test musste ich aber feststellen, dass die Accelstepper-Library auf dem Teensy nicht läuft. Der erste Schock stellte sich als ungerechtfertigt heraus, da "luni64" seine superschnelle TeensyStep-Library auf Github zur Verfügung stellt. Diese lief nach erfolglosen Versuchen auf dem Teensy 4.2 erst auf dem Teensy 3.6. Auch die TeensyStep-Lib hat ein objektorientiertes Interface und lässt sich leicht verwenden. Einzig bei der Implementierung einer Initialisierung mit Anfahren der Endschalter musste ein wenig nachgeforscht werden.

void init_XMotor(){
  motor_X.setAcceleration(maxAccX); // steps/s^2 

  // XXXX
  motor_X.setMaxSpeed(1500) ;     // steps/s
  motor_X.setTargetRel(-50000);  // Set target position to 1000 steps from current position
  controller.moveAsync(motor_X);     // This will start the movement and return immediately
  
  while(controller.isRunning()){              // wait until the movement is finished
      if (digitalRead(EndSwitchPin_X) == HIGH){
        controller.emergencyStop();  // stops the movement immediately
        motor_X.setPosition(0); 
      }      
  }
  motor_X.setMaxSpeed(maxSpeedX);
}

Arduino Code Listing zur Initialisierung der Endposition der X-Achse. Der Notfallstop ist ein bisschen hart, aber erfüllt die Anforderungen an Genauigkeit. Normalerweise würde man hier nochmals vor- und zurückfahren, um den genauen Nullpunkt zu finden.

Mit einer Taktfrequenz von 180 MHz konnte der Teensy 3.6 die Freunde der Geschwindigkeit ansprechen! Natürlich mussten auch die richtigen Motor-Treiber her, die die hohen Taktzahlen auch verarbeiten können. Mit dem TB6600 wurde ein einfach zu verwendender und günstiger Treiber gefunden. Die Treiber können maximal 20 kHz am Eingang verarbeiten und verarbeiten die 3.3V Signale des Teensy dank eingebauten Optokopplern wunderbar. Um eine weitere Steigerung der Geschwindigkeit zu erreichen, müsste nun neben dem Treiber wohl auch die Spannung von 24V erhöht werden und stärkere Motoren als die NEMA 17 eingesetzt werden, die die Leistung auch auf die Schiene bringen. Hier wäre ein Upgrade zu mindestens NEMA 23 angebracht gewesen. Für den Moment war das aber gut so. Nebenbei erwähnt wäre auch die Umsetzung mit einem Odrive und mit Encodern ausgestatteten BLDC-Motoren spannend gewesen, hätte aber auch eine ganz neue Welt mit vielen neuen Herausforderungen aufgetan und den zeitlichen Rahmen weiter gesprengt. Die Verdrahtung der Motoren und Treiber ist im Bild ersichtlich und folgt den gängigen Standards aus dem Internet.

Alle Elektronik-Komponenten des BlackPickers in einer konzeptionellen Übersicht.

Anschluss des TB6600 Treibers an Teensy (hier z.B. die X Achse). Die 5V Eingänge sind mit den 3.3V des Teensy kompatibel. Mit den Dip Switches lassen sich Strom und Microstepping einstellen. Hier wurde 4-fach Microstepping und 3.5 Ampere eingestellt.

Trotz anfänglich übersichtlicher Komponentenauswahl wurde das Projekt dann doch sehr umfangreich – dies auch wegen der Verkabelung und dem Anordnen aller Elektronikteile. Alle Steuerungskomponenten wurden in eine Holzschublade zwischen den Verstrebungen unter der Maschine verfrachtet. Diese lässt sich relativ bequem herausziehen, um an die Verkabelung zu gelangen.

Beim Bau solcher Maschinen bleibt man irgendwie immer wieder an der Power-Verteilung hängen. Neben dem 24V/10A-Netzteil für die Schrittmotorversorgung wurde auch ein 5V/6A-Netzteil für die Versorgung des Teensy, Servos, Sensoren und aller peripheren Geräten eingebaut. Leider musste für den Raspberry Pi zusätzlich ein 5V/3A-Steckernetzteil eingebaut werden, da die leichten Spannungsschwankungen auf dem billigen 5V-Böxchen zu groß für einen zuverlässigen Betrieb waren und das Blitz-Symbol doch zu viel auf dem Bildschirm sichtbar wurde.

Volle Schleppketten mit allerlei Motor und Signalkabeln. Wenn das mal gut geht...

Die ursprüngliche Idee, trendige Endschaltermodule (wie sie für 3D-Drucker verwendet werden) für die Initialisierung der Achsen zu verwenden, musste wieder verworfen werden, da der Einfluss der Schrittmotor-Powerleitungen neben den 5-Volt-Endschalterleitungen in der Kabelschleppkette doch zu groß war. Immer wieder kam es nämlich zu Initfahrten, bei der die Steuerung ein vermeintliches Endschaltersignal auffing und die Motoren zu früh stoppten. Ein neuer Ansatz wurde mit Optokopplermodulen gefunden, die zwischen den Mikrokontrollereingang und den Endschalterausgang gehängt werden konnten. Damit ließen sich neue robuste Endschalter mit 24 Volt betreiben, während gleichzeitig am Eingang des Controllers ein schönes 3,3-Volt-Signal ankam.

Wie so oft musste auch an anderen Orten mit dem Anpassen von Spannungsleveln jongliert werden. Auch das 5-Volt-Display mit I2C-Eingang wollte zuerst nicht richtig am 3,3-Volt-Teensy. Trotz anfänglichem Recherchieren und ersten Ansätzen von Hacks, konnte das LCD nach dem Finden und Nutzen der richtigen Library (TeensyLCD) und dem Versorgen des Displays mit 5 Volt, statt mit 3,3 Volt auch trotz unterschiedlichen Spannungsleveln einwandfrei in Betrieb genommen werden.

Die Levelshifter-Fee war auch bei der Ansteuerung der 5-Volt-Servos direkt ab 3,3-Volt-PWM aus dem Teensy glücklich und die Servos stellten ihre Positionen ohne Murren ein. Auch die Angst vor den Powerleitungen neben den Servoleitungen im Kabelkanal war nach dem Einsatz von Schirmleitungen unbegründet. Es schien, als dass sich die Effekte für die Servos nicht so dramatisch wie bei den Endschaltern auswirkten. Ein schöner Moment, wie jeder Maker sich vorstellen kann.

Für den Aufbau der Messtation haben wir billige Abstandssensoren mit dem Infrarot-Reflexsensor TCRT5000 verwendet. Die geschickte Anordnung von zwei Sensoren ermöglichte das Detektieren eines großen oder kleinen Loches so wie das Vorhandensein einer Hülse. Was trivial klingt, war im Endeffekt wichtig, um Crashes beim Manipulieren zu vermeiden. Falls nämlich eine Hülse durch irgendwelche Gründe auf der Station liegen bleibt und eine Neue abgelegt werden soll, kann der Greifer crashen.

Zum Thema Störungen bleibt zu sagen, dass im Endeffekt eine geschirmte, einseitig aufgelegte Verkabelung alle Störungen auf ein Minimum (bzw. auf ein für die Maschine akzeptables Niveau) reduziert hat. Dabei haben wir die Kabelschirme aller Signalleitungen (Drahtgeflechte und Folienschirme) bei der Steuerung zusammengeführt und mit Masse verbunden. Dadurch wurde es überhaupt erst möglich, Servosteuerleitungen und Schrittmotorleitungen nebeneinander in der gleichen Schleppkette (30) zu verlegen. Ohne Kabelschirmung ist dies bei dieser Konfiguration praktisch unmöglich, wie auch bereits in anderen Projekten auf schmerzliche Weise erfahren wurde.

Im zweiten Teil behandeln wir die "Machine Vision" mittels OpenCV auf den RasPi, die Kommunikation zwischen Schrittmotorsteuerung und Bilderkennung sowie die Programmierung und Inbetriebnahme. (cm)