Projekte
SPiC 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):
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.
(Inspiration durch den York Hackspace)