DIY Roboterarm mit Gestensteuerung (Hand-Tracking) – Arduino & 3D-Druck
Komponenten und Materialien
| Arduino UNO (Roboterarm) | 1 |
| Arduino Nano R3 (Handschuh) | 1 |
| JLCPCB Custom PCB (optional) | 1 |
| Servomotoren MG996R | 6 |
| 5 V Batteriepack (2200 mAh RC-Akku) | 1 |
| PCA9685 8-Kanal Servotreiber (I²C) | 1 |
| HC-05 Bluetooth-Modul | 2 (Master/Slave) |
| A4988 Schrittmotortreiber | 1 |
| NEMA-17 Schrittmotor (Basisrotation) | 1 |
| Steckbrett | 1 |
| IMU MPU6050 (6 DoF) | 1 |
| Flex-Sensor | 1 (bzw. 3 für Finger) |
Benötigte Werkzeuge
- 3D-Drucker (für Arm & Handschuh-Exoskelett)
Projektübersicht
MARK 1 – Ein 6-achsiger Roboterarm, der per Handgesten (Dataglove) gesteuert wird. Inspiriert von Filmen wie „Pacific Rim“ und „Avatar“. Der Arm kann vorprogrammierte Abläufe ausführen oder drahtlos per Bluetooth aus bis zu 10 m Entfernung gesteuert werden. Maximale Traglast: 1 kg (empfohlen 600 g).
Funktionsprinzip
Der Dataglove (Handschuh) erfasst Fingerbeugung (Flex-Sensoren) und Handgelenksrotation (MPU6050 Beschleunigungs-/Gyroskop). Die Daten werden per Bluetooth (HC-05, 4800 Baud) an den Roboterarm gesendet. Dort steuert ein PCA9685 Servotreiber (I²C) die sechs MG996R-Servos; die Basisrotation erfolgt über einen NEMA-17 Schrittmotor mit A4988-Treiber.
Sensoren im Handschuh
- Flex-Sensoren: Widerstand ändert sich mit Biegeradius → Analogwert → Fingerstellung.
- MPU6050 (2×): Erkennung von Handgelenksrotation (X/Y/Z) für Basis-Drehung und Greifer-Orientierung.
Die Sensorwerte werden kalibriert (oberes/unteres Limit) und auf diskrete Befehle (Buchstaben) gemappt, die per Serial an das Bluetooth-Modul gesendet werden.
Mechanischer Aufbau
Roboterarm (3D-Druck)
Basiert auf Thingiverse-Designs (Wonder Tiger):
- Teil 1: Greifer
- Teil 2: Basis & Drehteller
- Teil 3: Hauptarm
Druckzeit ca. 40 h. Kostengünstiger als Fertigbausätze. Alternative Designs auf Thingiverse verfügbar.
Dataglove
3D-gedrucktes Exoskelett (Roman 13) oder simpler Handwerkerhandschuh. Für große Hände bei 105 % skalieren.
Elektronik & Verkabelung
Servotreiber PCA9685
Externe 5 V/2,2 Ah Stromversorgung für Servos (Arduino kann nicht genug Strom liefern). I²C-Adresse 0x40. Verkabelung: SDA/SCL an Arduino (UNO: A4/A5), V+/GND an Akku.
NEMA-17 Schrittmotor für Basis
MG996R zu schwach für Basisdrehung unter Last. NEMA-17 + A4988 bietet hohes Drehmoment und Präzision. Step/Dir-Pins an Arduino.
Gesamtverkabelung Roboterarm
Bluetooth-Konfiguration (HC-05)
| Modul | Rolle | Einstellung |
|---|---|---|
| Handschuh HC-05 | Master | AT+ROLE=1, AT+BIND= |
| Arm HC-05 | Slave | AT+ROLE=0, Baud 4800 |
Programmierung – Roboterarm (Auszug)
#include "HCPCA9685.h"
#define I2CAdd 0x40
HCPCA9685 HCPCA9685(I2CAdd);
// Servo-Positionen & Limits
const int servo_joint_L_parking_pos = 60;
int servo_joint_L_pos_increment = 20;
int servo_joint_L_parking_pos_i = servo_joint_L_parking_pos;
int servo_joint_L_min_pos = 10;
int servo_joint_L_max_pos = 180;
// ... weitere Servos analog ...
void setup() {
Serial.begin(4800); // Bluetooth Baudrate
HCPCA9685.Init(SERVO_MODE);
// Startpositionen einfahren
}
void loop() {
if (Serial.available() > 0) {
char state = Serial.read();
// Beispiel: Basisdrehung links
if (state == 'S') { baseRotateLeft(); delay(5); }
// Greifer öffnen/schließen
if (state == 'f') { // Greifer runter
if (servo_joint_3_parking_pos_i < servo_joint_3_max_pos) {
HCPCA9685.Servo(4, servo_joint_3_parking_pos_i);
servo_joint_3_parking_pos_i += servo_joint_3_pos_increment;
}
}
// ... weitere Befehle 'F', 'L', 'R', 'P', etc.
}
}
void baseRotateLeft() {
digitalWrite(stepPin, LOW);
delayMicroseconds(stepDelay);
}
Wichtig: Hard-Stops bei Min/Max-Winkeln verhindern Getriebeschaden.
Programmierung – Dataglove (Auszug)
// Sensor-Pins
int pinkie_Data = A1;
int finger_Data = A2;
int thumb_Data = A3;
const int MPU1 = 0x68, MPU2 = 0x69; // I²C-Adressen zweier MPU6050
int response_time = 1000;
bool calibrated = false;
int thumb_high, thumb_low, finger_high, finger_low, pinkie_high, pinkie_low;
void loop() {
// Rohwerte lesen
int pinkie = analogRead(pinkie_Data);
int finger = analogRead(finger_Data);
int thumb = analogRead(thumb_Data);
GetMpuValue1(MPU1);
GetMpuValue2(MPU2);
// Einmalige Kalibrierung nach Reset
if (!calibrated) {
delay(1000);
thumb_high = thumb * 1.15; thumb_low = thumb * 0.9;
finger_high = finger * 1.03; finger_low = finger * 0.8;
pinkie_high = pinkie * 1.06; pinkie_low = pinkie * 0.8;
calibrated = true;
}
// Gesten-Erkennung & Senden
if (finger >= finger_high) { Serial.print("F"); delay(response_time); }
if (finger <= finger_low) { Serial.print("f"); delay(response_time); }
// ... analog für thumb, pinkie, MPU-Werte
}
Ergebnis & Ausblick
Der Arm kann Objekte präzise greifen und bewegen. Die Gestensteuerung funktioniert zuverlässig für grundlegende Aktionen. Präzision und Geschmeidigkeit lassen sich durch feinere Kalibrierung, PID-Regelung der Servos und zusätzliche Sensoren (Kraftsensoren am Greifer) verbessern.
Der Code ist Open Source auf GitHub: EbenKouao/arduino-robotic-arm. Beiträge und Weiterentwicklungen sind willkommen!
3D-Druck-Dateien (Thingiverse)
Herstellungsprozess
- Bluetooth-gesteuerter Raspberry Pi Roboter mit Audio-Feedback bauen
- DIY Hausaufgaben-Schreibmaschine zu Hause bauen
- Android-gesteuertes Roboterfahrzeug mit Raspberry Pi Motor Shield
- Servogesteuerter Hindernisvermeidungs-Roboter: Bauen mit Arduino & HC-SR04
- Autonomer Linienfolger-Roboter mit Arduino UNO
- Arduino-basierter 6-DoF Roboterarm mit Nunchuk-Steuerung
- Sprachgesteuerter Roboter mit Arduino Nano bauen
- Ethernet-gesteuerter Roboterarm: Fernsteuerung leicht gemacht
- MobBob: Eigenen Arduino-Roboter bauen, per Android-Smartphone steuern
- Smartes Indoor-Navigations-Roboter-Kit für Arduino-Projekte