Friedrich-Alexander-Universität Erlangen-Nürnberg  /   Technische Fakultät  /   Department Informatik

SPiC RobotArm

RobotArm
RobotArm

basierend auf dem MeArm Robot Arm

Voraussetzungen für den Bau

Der RobotArm kann ohne Probleme selbst gebaut werden – man braucht nur einen freien Nachmittag/Abend für das OpenLab im FAU FabLab. Dort bekommt man (sofern man nicht bereits eine Einweisung hat) Unterstützung für den Lasercutter. Die Servomotoren müssen selbst besorgt werden (diese sind jedoch sehr leicht zu bekommen, z.B. über Amazon oder Ebay), alle weiteren benötigten Bauteile sind in der Regel im FabLab vorrätig.

Material

  • ⅓ Acrylplatte, 3mm GS (gegossen) in beliebiger Farbe
    • Kosten für eine ganze Acrylplatte im FabLab ab 11€, je nach Farbe
    • alternativ auch Holz (3mm HDF) möglich (etwa 2€)
  • vier SG90 Micro Servo Motoren (9g) (Kostenpunkt gesamt etwa 10€)
  • Metrische Zylinderkopfschrauben M3 (im Fablab je 0.05€, gesamt 2.30€)
    • 6× M3 Schraube 6mm (M3×6)
    • 15× M3 Schraube 8mm (M3×8)
    • 3× M3 Schraube 10mm (M3×10)
    • 8× M3 Schraube 12mm (M3×12)
    • 4× M3 Schraube 20mm (M3×20)
    • 10× M3 Mutter
  • 4× Gummifüsse (optional)

Die Vorlage befindet sich in der Datei laser-cut-template.svg, welche für das auf den FabLab-Workstation installierte Inkscape konzipiert wurde. Dieses sollte einfach geladen und via VisiCut (mit angepassten Materialeinstellungen) an den LTT iLaser 4000 gesendet werden können. Die Laserzeit liegt unter 5 Minuten.

Als Mikrocontrollerplattform wird das dem SPiCboard v3 zugrunde liegende ATmega328PB Xplained Mini verwendet.

Da die Pulsweitenmodulation über Software generiert wird, können beliebige GPIOs verwendet werden, im Beispiel PD4 bis PD7 (grün eingefärbt, Verbindung mittels Jumperkabel):

Xplained Mini
Xplained Mini

Zur Stromversorgung kann neben einer externen Versorgung auch direkt über das Xplained Mini erfolgen (Buchsenleiste an GND und VCC, rot eingefärbt)– allerdings sollten dann die Servos nicht auf Last verwendet werden, da die Stromaufnahme sonst über den Grenzen von USB liegen.

Vorbereitung

Für die vor dem Zusammenbau notwendige Kalibrierung der Servos muss das Xplained Mini mit der AVR-Anwendung bespielt werden – dazu wird die libspicboard im übergeordnete Verzeichnis (also ~/libspicboard im Beispiel) benötigt, alternativ kann auch der CIP verwendet werden (es wird dann /proj/i4spic/pub/libspicboard verwendet).

~/SPiC-RobotArm$ cd avr

~/SPiC-RobotArm/avr$ make flash
Compiling servo.c (optimized for size)...
   text    data     bss     dec     hex filename
   1890      46      31    1967     7af servo.elf
Flashing...

avrdude: stk500v2_command(): command failed
avrdude: Target prepared for ISP, signed off.
avrdude: Now retrying without power-cycling the target.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.05s

avrdude: Device signature = 0x1e9516 (probably m328pb)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
        To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "servo.hex"
avrdude: input file servo.hex auto detected as Intel Hex
avrdude: writing flash (1936 bytes):

Writing | ################################################## | 100% 1.82s

avrdude: 1936 bytes of flash written
avrdude: verifying flash memory against servo.hex:
avrdude: load data flash data from input file servo.hex:
avrdude: input file servo.hex auto detected as Intel Hex
avrdude: input file servo.hex contains 1936 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 1.89s

avrdude: verifying ...
avrdude: 1936 bytes of flash verified

avrdude: safemode: Fuses OK (E:FE, H:9F, L:E0)

avrdude done.  Thank you.

rm servo.hex

Montage

Der zeitliche Aufwand beträgt etwa eine Stunde, als Anleitung bietet sich das MeArm Assembly Manual) für Version 1.0 von MeArm.com an.

Für die vor dem Zusammenbau notwendige Kalibrierung der Servos muss das Xplained Mini mit der AVR-Anwendung bespielt werden und anschließend mit den Servos verbunden:

~/SPiC-RobotArm$ cd linux

~/SPiC-RobotArm/linux$ make
gcc -o main.o -c main.c -std=gnu11 -O3 -Wall -Werror -Wpedantic -Wstrict-aliasing -D_GNU_SOURCE
gcc -o robotArm arm.o com.o coord.o main.o parse.o -std=gnu11 -O3 -Wall -Werror -Wpedantic -Wstrict-aliasing -D_GNU_SOURCE -lm

~/SPiC-RobotArm/linux$ ./robotArm -c
Calibrating...

Die Verbindung zum Mikrocontroller sollte einige Sekunden (maximal eine Minute) nach dem Überspielen der AVR-Anwendung verfügbar sein. Im Zweifel hilft ein erneutes Anstecken (sowie warten von etwa einer Minute).

Die Gerätedatei der seriellen Schnittstelle kann mit dem Parameter -d spezifiziert werden, ebenso die Baudrate (-b) und Verbindungseinstellungen (-s). Weiterführende Details sind der Hilfe (Parameter -h) zu entnehmen.

Steuerung

Der RobotArm kann komfortabel über die Linuxanwendung gesteuert werden.

Wichtig: Sofern die Größe des RobotArms geändert wurde, muss zuerstdie Datei linux/armconfig.h angepasst werden!

Die Berechnung der Servowinkel anhand der kartesischen und Polarkoordinaten (Inverse Kindematik) übernimmt die Linuxanwendung, da der AVR nicht (ohne weiteren Aufwand) leistungsfähig genug ist.

Die Eingabe kann entweder direkt über die Konsole oder via Datei geschehen, dabei sind folgende Befehle implementiert (es werden nur Ganzzahlen akzeptiert, keine Fließkommazahlen!):

Befehl Wirkung
? Teste die Erreichbarkeit der nachfolgenden Koordinate (aber keine Bewegung)
- Fahre linear in einer gleichmäßigen Bewegung von der aktuellen Position zur folgenden Zielkoordinate
# Fahre direkt schnellstmöglich zur nachfolgenden Zielkoordinate
[x,y,z] Bewegung an die Position der ganzzahligen kartesischen Koordinaten x, y und z
(r,φ,z] Bewegung an die Position der ganzzahligen Polarkordinaten r, φ und z
{per} Greifer um per% schließen (0 entspricht offen, 100 geschlossen)
<us> Warte us Mikrosekunden (vor Ausführung des nächsten Befehls)
. Sende einen Ping an das Gerät
! Setze die Verbindung zurück (sollte immer am Anfang ausgeführt werden!)
r Belaste die Servos nur für einen kurzen Moment bei einer Änderung der Position
f Permanente Belastung der Servos (externe Stromversorgung dringend empfohlen!)
q Trenne die Verbindung, beende die Anwendung
;/, wird ignoriert

(Nichtdruckbare Zeichen wie Leerzeichen und Tabulator werden ebenfalls ignoriert).

Zur besseren Einschätzung der Koordinaten kann die vorgegebene Workplate auf DinA3 ausgedruckt und als Unterlage verwendet werden.

Technische Details

Ansteuerung der Servomotoren

Der Servomotor SG90 kann sich um 180 Grad drehen. Das Steuersignal wird über die orange PWM-Verbindung empfangen. Die zwischen 1ms (Minimum) bis 2ms (Maximum) lange Duty Cycle am Anfang der 20ms PWM-Periode (somit 50 Hz) bestimmt mit ihrere Dauer den gewünschten Winkel.

Da wir auf dem Xplained Mini über keine vier unterschiedliche PWM-Pins der Timer verfügen, geschieht die Ansteuerung über Software PWM.

Allerdings sind die Duty Cycle der günstigen Servomotoren oft nicht exakt – in der Datei avr/servo.c können daher für jeden Motor das Mini- und Maximum angepasst werden (in Microsekunden).

Protokoll der seriellen Verbindung

Die vier Servos des RobotArm werden über Buchstaben (A - D) identifiziert und können (theoretisch) sich um 180° drehen:

Bezeichner Position Winkel
A Basis α
B Schulter βₛ
C Ellenbogen γₛ
D Greifer δ

Entsprechend empfängt der Mikrocontroller die Befehle für die Servos als Bezeichner und ganzzahlige positive Gradzahl, mit einem Zeilenumbruch als Abschluss.

Sonderbefehle

Befehl Bedeutung
* sofortiger Reset und Initialisierung
~/- Servo nur einen kurzen Moment/durchgehend Steuersignale senden
. Ping (zum Überprüfen der Verbindung)
a-d Rohdaten für Servo senden (nur im Debug Modus)

(müssen alle mit einem Zeilenumbruch terminiert werden)

Antworten

Antwort Bedeutung
+ Drehbefehl des Servos erfolgreich empfangen und veranlasst
# Rohdaten-Drehbefehl erfolgreich empfangen (nur im Debug Modus)
! Ungültiger Drehbefehl
? Unbekanntes Symbol empfangen
* Reset ausgeführt
~/- Steuersignaldauer auf kurz/durchgehend eingestellt
. Ping (Antwort)

Steuerung des AVR

Dem Mikrocontroller können auch manuell die Befehle für den Servo gesendet werden. In der Linuxanwendung ist das über -r möglich:

~/SPiC-RobotArm/linux$ ./robotArm -r
D80
+

(öffnet den Greifer)

Berechnung der Position

Durch die gegebenen Längen des Vorder- und Oberarms sowie Greifer und Basis können mit Hilfe des Kosinussatzes aus einer Zielkoordinate (sofern überhaupt erreichbar) die inneren Winkel β und γ errechnet werden, welche wiederrum zur Berechnung der Servowinkel βₛ und γₛ (neben dem einfachen Drehwinkel α) herangezogen werden. Die Längen sind dabei in der Datei linux/armconfig.h hinterlegt.

RobotArm Schema
RobotArm Schema

(Inspiration durch den York Hackspace)