Inhaltsverzeichnis:

Roboterarm: Jensen - Gunook
Roboterarm: Jensen - Gunook

Video: Roboterarm: Jensen - Gunook

Video: Roboterarm: Jensen - Gunook
Video: Humanoid - Jansen Walking Mechanism 🚶‍♀ 2024, Oktober
Anonim
Roboterarm: Jensen
Roboterarm: Jensen

Jensen ist ein Roboterarm, der auf der Arduino-Plattform mit Fokus auf intuitiver Bewegungsplanung basiert und als 1-Kredit-unabhängiges Projekt unter der Leitung von Charles B. Malloch, PhD, durchgeführt wird. Es kann eine Reihe von Bewegungen replizieren, die durch manuelles Bewegen des Arms programmiert werden. Die Inspiration zum Bau habe ich von anderen Roboterarmen, die im UMass Amherst M5 Makerspace gebaut wurden. Außerdem wollte ich den Umgang mit CAD-Software lernen und ein fortgeschrittenes Arduino-Projekt machen. Ich habe dies als Gelegenheit gesehen, all diese Dinge zu tun.

Schritt 1: Ursprüngliches Design und Umfang

Ursprüngliches Design und Umfang
Ursprüngliches Design und Umfang

Die CAD-Software, die ich für dieses Projekt ausgewählt habe, war OnShape, und das erste, was ich modelliert habe, war ein analoges HiTec HS-422-Servo. Ich habe mich für das Servo entschieden, weil es mir vor Ort zur Verfügung stand und es einen vernünftigen Preis hatte. Es diente auch als gute Übung zum Erlernen von OnShape, bevor ich mit dem Entwerfen meiner eigenen Teile überging. Zu diesem frühen Zeitpunkt des Projekts hatte ich eine allgemeine Vorstellung davon, wozu der Arm fähig sein sollte. Ich wollte, dass es eine anständige Bewegungsfreiheit und einen Greifer zum Aufnehmen von Dingen hat. Diese allgemeinen Spezifikationen prägten das Design, während ich es weiter in CAD modellierte. Eine weitere Designbeschränkung, die ich zu diesem Zeitpunkt hatte, war die Größe des Druckbetts auf meinem 3D-Drucker. Deshalb ist die Basis, die Sie auf dem Foto oben sehen, ein relativ primitives Quadrat.

Während dieser Phase des Projekts überlegte ich auch, wie ich den Arm kontrollieren wollte. Ein Roboterarm, von dem ich mich im Makerspace inspirieren ließ, verwendete einen Marionettenarm zur Steuerung. Ein anderer verwendete eine intuitive Wegprogrammierungsmethode, bei der der Arm vom Benutzer in verschiedene Positionen bewegt wurde. Der Arm würde dann durch diese Positionen zurückkehren.

Mein ursprünglicher Plan war es, die Konstruktion des Arms abzuschließen und dann diese beiden Kontrollmethoden zu implementieren. Später wollte ich auch eine Computeranwendung zur Steuerung machen. Wie Sie wahrscheinlich sehen können, habe ich den Umfang dieses Aspekts des Projekts reduziert. Als ich anfing, an den ersten beiden Steuerungsmethoden zu arbeiten, stellte ich schnell fest, dass die intuitive Pfadprogrammierung komplizierter war, als ich dachte. Da habe ich mich entschieden, mich darauf zu konzentrieren und die anderen Kontrollmethoden auf unbestimmte Zeit zu legen.

Schritt 2: Kontrolle

Steuerung
Steuerung

Die von mir gewählte Kontrollmethode funktioniert so: Sie bewegen den Arm mit den Händen in verschiedene Positionen und "speichern" diese Positionen. Jede Position enthält Informationen über den Winkel zwischen jedem Glied des Arms. Nachdem Sie die Positionen gespeichert haben, drücken Sie eine Wiedergabetaste und der Arm kehrt der Reihe nach zu jeder dieser Positionen zurück.

Bei dieser Kontrollmethode gab es viele Dinge herauszufinden. Damit jedes Servo zu einem gespeicherten Winkel zurückkehrt, musste ich diese Winkel zunächst irgendwie "speichern". Dies erforderte das Arduino Uno, das ich verwendet habe, um den aktuellen Winkel jedes Servos zu empfangen. Mein Freund Jeremy Paradie, der einen Roboterarm entwickelt hat, der diese Steuermethode verwendet, hat mich in die Verwendung des internen Potentiometers jedes Hobby-Servos hingewiesen. Dies ist das Potentiometer, das das Servo selbst verwendet, um seinen Winkel zu codieren. Ich wählte ein Testservo, lötete einen Draht an den mittleren Stift des internen Potentiometers und bohrte ein Loch in das Gehäuse, um den Draht nach außen zu führen.

Ich konnte jetzt den aktuellen Winkel erhalten, indem ich die Spannung am mittleren Pin des Potentiometers ablese. Allerdings gab es zwei neue Probleme. Erstens gab es Rauschen in Form von Spannungsspitzen auf dem Signal, das vom mittleren Pin kam. Dieses Problem wurde später zu einem echten Problem. Zweitens waren die Wertebereiche für das Senden eines Winkels und den Empfang eines Winkels unterschiedlich.

Um den Hobby-Servomotoren mitzuteilen, dass sie sich in einen Winkel zwischen 0 und 180 Grad bewegen sollen, wird ein PWM-Signal mit einer dem Winkel entsprechenden hohen Zeit gesendet. Im Gegensatz dazu gibt die Verwendung eines analogen Eingangspins des Arduino zum Lesen der Spannung am mittleren Pin des Potentiometers beim Bewegen des Servohorns zwischen 0 und 180 Grad einen separaten Wertebereich zurück. Daher war etwas Mathematik erforderlich, um einen gespeicherten Eingangswert in den entsprechenden PWM-Ausgangswert zu übersetzen, der benötigt wird, um das Servo in den gleichen Winkel zurückzubringen.

Mein erster Gedanke war, eine einfache Entfernungskarte zu verwenden, um die entsprechende Ausgangs-PWM für jeden gespeicherten Winkel zu finden. Das funktionierte, aber es war nicht sehr genau. Bei meinem Projekt war der Bereich der PWM-Hochzeitwerte, der einem Winkelbereich von 180 Grad entspricht, viel größer als der Bereich der analogen Eingangswerte. Außerdem waren diese beiden Bereiche nicht stetig und bestanden nur aus ganzen Zahlen. Daher ging die Genauigkeit verloren, wenn ich einen gespeicherten Eingabewert einem Ausgabewert zuordnete. An diesem Punkt dachte ich, dass ich einen Regelkreis brauche, um meine Servos dorthin zu bringen, wo sie sein mussten.

Ich schrieb Code für einen PID-Regelkreis, bei dem der Eingang die mittlere Pinspannung und der Ausgang der PWM-Ausgang war, stellte jedoch schnell fest, dass ich nur eine integrierte Steuerung benötigte. In diesem Szenario repräsentierten sowohl der Ausgang als auch der Eingang Winkel, so dass das Hinzufügen von Proportional- und Differentialsteuerung dazu neigte, es zu überschwingen oder ein unerwünschtes Verhalten aufzuweisen. Nach der Abstimmung der Integralsteuerung gab es noch zwei Probleme. Erstens, wenn der anfängliche Fehler zwischen dem aktuellen und dem gewünschten Winkel groß wäre, würde das Servo zu schnell beschleunigen. Ich konnte die Konstante für die Integralsteuerung reduzieren, aber das machte die Gesamtbewegung zu langsam. Zweitens war die Bewegung nervös. Dies war auf das Rauschen des analogen Eingangssignals zurückzuführen. Die Regelschleife las dieses Signal kontinuierlich, sodass die Spannungsspitzen eine ruckartige Bewegung verursachten. (An diesem Punkt bin ich auch von meinem einen Testservo zu der oben abgebildeten Baugruppe gewechselt. Ich habe auch ein Regelkreisobjekt für jedes Servo in der Software erstellt.)

Ich habe das Problem der zu schnellen Beschleunigung gelöst, indem ich einen exponentiell gewichteten gleitenden Durchschnitt (EWMA)-Filter auf die Ausgabe gesetzt habe. Durch die Mittelung der Ausgabe wurden die großen Bewegungsspitzen (einschließlich des Jitters durch das Rauschen) reduziert. Das Rauschen des Eingangssignals war jedoch immer noch ein Problem, daher versuchte die nächste Phase meines Projekts, dies zu lösen.

Schritt 3: Rauschen

Lärm
Lärm

Oben abgebildet

In Rot: Original-Eingangssignal

In Blau: Eingangssignal nach Verarbeitung

Der erste Schritt zur Reduzierung des Rauschens im Eingangssignal bestand darin, seine Ursache zu verstehen. Die Abtastung des Signals mit einem Oszilloskop ergab, dass die Spannungsspitzen mit einer Frequenz von 50 Hz auftraten. Ich wusste zufällig, dass das PWM-Signal, das an die Servos gesendet wurde, auch eine Frequenz von 50 Hz hatte, also vermutete ich, dass die Spannungsspitzen etwas damit zu tun hatten. Ich vermutete, dass die Bewegung der Servos irgendwie Spannungsspitzen am V+-Pin der Potentiometer verursachte, was wiederum den Messwert am mittleren Pin durcheinander brachte.

Hier habe ich meinen ersten Versuch unternommen, das Rauschen zu reduzieren. Ich öffnete jedes Servo wieder und fügte einen Draht hinzu, der vom V + -Pin am Potentiometer kommt. Ich brauchte mehr analoge Eingänge, um sie zu lesen, als das Arduino Uno hatte, also wechselte ich an dieser Stelle auch zu einem Arduino Mega. In meinem Code habe ich den Winkeleingang von einem analogen Messwert der Spannung am mittleren Pin zu einem Verhältnis zwischen der Spannung am mittleren Pin und der Spannung am V+-Pin geändert. Meine Hoffnung war, dass eine Spannungsspitze an den Pins sich im Verhältnis aufheben würde.

Ich habe alles wieder zusammengebaut und getestet, aber die Spikes traten immer noch auf. Was ich an dieser Stelle hätte tun sollen, war, meinen Boden zu erkunden. Stattdessen war meine nächste Idee, die Potentiometer vollständig auf eine separate Stromversorgung zu legen. Ich habe die V+-Drähte von den analogen Eingängen des Arduino getrennt und an eine separate Stromversorgung angeschlossen. Ich hatte die Pins vorher sondiert, damit ich wusste, mit welcher Spannung ich sie versorgen sollte. Ich habe auch die Verbindung zwischen der Steuerplatine und dem V + -Pin in jedem Servo abgeschnitten. Ich habe alles wieder zusammengebaut, den Winkeleingabecode auf den vorherigen Wert zurückgesetzt und dann getestet. Wie erwartet gab es am Eingangspin keine Spannungsspitzen mehr. Es gab jedoch ein neues Problem - die Potentiometer auf ein separates Netzteil zu legen hatte die internen Regelkreise der Servos völlig durcheinander gebracht. Obwohl die V+-Pins die gleiche Spannung wie zuvor erhielten, war die Bewegung der Servos unregelmäßig und instabil.

Ich verstand nicht, warum dies geschah, und sondierte schließlich meine Masseverbindung in den Servos. Es gab einen durchschnittlichen Spannungsabfall von etwa 0,3 Volt über Masse, und er stieg noch höher, wenn die Servos Strom zogen. Mir war damals klar, dass diese Pins nicht mehr als "Masse" betrachtet werden konnten, sondern besser als "Referenz" -Pins bezeichnet werden könnten. Die Steuerplatinen in den Servos müssen die Spannung am mittleren Pin des Potentiometers relativ zur Spannung an den V+- und Referenzpins gemessen haben. Die separate Stromversorgung der Potentiometer hat diese relative Messung durcheinander gebracht, da jetzt anstelle einer Spannungsspitze an allen Pins nur am Referenzpin aufgetreten ist.

Mein Mentor, Dr. Malloch, half mir bei der Fehlersuche und schlug vor, auch die Spannung am mittleren Pin relativ zu den anderen Pins zu messen. Das habe ich bei meinem dritten und letzten Versuch getan, das Rauschen der Winkeleingabe zu reduzieren. Ich öffnete jedes Servo, befestigte den Draht, den ich abgeschnitten hatte, und fügte einen dritten Draht hinzu, der vom Referenzstift am Potentiometer kam. In meinem Code habe ich die Winkeleingabe äquivalent zu dem folgenden Ausdruck gemacht: (mittlerer Pin - Referenzpin) / (V + Pin - Referenzpin). Ich habe es getestet und es hat die Auswirkungen der Spannungsspitzen erfolgreich reduziert. Zusätzlich habe ich auch noch einen EWMA-Filter auf diesen Eingang gelegt. Dieses verarbeitete Signal und das Originalsignal sind oben abgebildet.

Schritt 4: Dinge einpacken

Dinge zusammenfassen
Dinge zusammenfassen

Nachdem das Geräuschproblem so gut wie möglich gelöst war, machte ich mich daran, die letzten Teile des Designs zu reparieren und herzustellen. Der Arm hat zu viel Gewicht auf das Servo in der Basis gelegt, also habe ich eine neue Basis gemacht, die das Gewicht des Arms mit einem großen Lager trägt. Ich habe auch den Greifer gedruckt und ein bisschen geschliffen, damit er funktioniert.

Mit dem Endergebnis bin ich sehr zufrieden. Die intuitive Bewegungsplanung funktioniert konsistent und die Bewegung ist glatt und genau, wenn man alles berücksichtigt. Wenn jemand anderes dieses Projekt machen möchte, würde ich ihn zuerst dringend ermutigen, eine einfachere Version davon zu machen. Im Nachhinein war es sehr naiv, so etwas mit Hobby-Servomotoren zu machen, und die Schwierigkeiten, die ich hatte, es zum Laufen zu bringen, zeigen das. Ich halte es für ein Wunder, dass der Arm so gut funktioniert wie er. Ich möchte immer noch einen Roboterarm bauen, der mit einem Computer verbunden werden kann, komplexere Programme ausführen und sich mit größerer Präzision bewegen kann, also werde ich das für mein nächstes Projekt tun. Ich werde hochwertige digitale Robotik-Servos verwenden und hoffentlich viele der Probleme vermeiden, auf die ich bei diesem Projekt gestoßen bin.

CAD-Dokument:

cad.onshape.com/documents/818ea878dda7ca2f…

Empfohlen: