Timo Britz hat aus einem Bausatz einen voll steuerbaren Roboterarm gemacht, mit eigener Firmware, inverser Kinematik, 3D-Simulation und einer Weboberfläche für Punkte und Bahnen.
Dieselbe inverse Kinematik wie in der echten Software: Ziel vorgeben, der Rechner stellt die Gelenke.
Die Original-Software war eine simple Fernbedienung. Timo Britz hat Firmware und PC-Software neu gebaut.
X, Y und Z in Millimetern eingeben, die Software rechnet die Gelenkwinkel. Der Greifer bleibt waagerecht.
Eine mitlaufende 3D-Ansicht zeigt jederzeit die Stellung des Arms, selbst gerendert ohne Bibliotheken.
Positionen speichern und anfahren. Aus Wegpunkten, Pausen und Werkzeug-Aktionen entstehen ganze Abläufe, auch in Schleife.
Fahrten enden vor den mechanischen Anschlägen, unerreichbare Ziele werden abgelehnt. STOP hält an, der Not-Aus schaltet die Motoren ab.
An der Drehachse ersetzt eine Lichtschranke den mechanischen Endschalter.
Das Protokoll der Original-Firmware wurde per Disassembly entschlüsselt. Heute läuft eine komplett eigene Firmware.
Zehn geführte Schritte prüfen Endschalter und Drehrichtungen und messen den Arm ein.
Alle Achsen starten und stoppen gemeinsam, keine eilt voraus.
Optional ersetzt ein ESP32 das USB-Kabel.
Läuft lokal, ohne Cloud und ohne schwere Abhängigkeiten.
Ein Arduino Mega 2560 mit RAMPS-1.4-Shield steuert drei Schrittmotoren für die Gelenke und einen für die Schiene. An der Drehachse sitzt statt eines Endschalters eine Lichtschranke, damit die Achse gefahrlos durchdrehen kann.
| Funktion | Anschluss (RAMPS) | Pin |
|---|---|---|
| Hauptarm (X, 1. Gelenk) | Y-Treiber-Steckplatz | STEP/DIR/EN |
| Vorderarm (Y, 2. Gelenk) | X-Treiber-Steckplatz | STEP/DIR/EN |
| Drehachse (Z) | Z-Treiber-Steckplatz | STEP/DIR/EN |
| Linearschiene (E) | E0-Treiber | STEP/DIR/EN |
| Endschalter Vorderarm | X-min | D3 |
| Endschalter Hauptarm | Y-min | D14 |
| Lichtschranke Drehachse | Z-min (S/−/+) | D18 |
| Greifer / Sauger / Lüfter | FET-Ausgänge | D9 / D10 / D8 |
| ESP32-WLAN-Brücke (optional) | AUX-4 (Serial2) | D16 TX2 / D17 RX2 |
| Spannungsversorgung | Netzteil | 12 V DC |
Ein Punkt im Raum wird vorgegeben, der Arm stellt seine Gelenke selbst: Das ist inverse Kinematik. Für diese Zwei-Gelenk-Kette auf einem Drehteller gibt es eine exakte Lösung.
Zuerst dreht sich der Teller, bis das Ziel in der Armebene liegt:
Reichweite r und Höhe z ergeben die Distanz d. Der Kosinussatz liefert die Armwinkel:
Ist d größer als a + b oder kleiner als |a − b|, ist das Ziel unerreichbar. Die Software fährt dann nicht los.
Die Vorwärtskinematik rechnet aus den Gelenkwinkeln die echte Position zurück. So zeigt die 3D-Ansicht immer, wo der Arm steht.
Von der Installation bis zum ersten Programm.
Python 3 installieren, einmalig pip install pyserial, dann Start_Windows.bat.
Die Oberfläche öffnet sich im Browser unter localhost:8000.
In der Arduino IDE die Bibliothek AccelStepper installieren,
RobotArmFW.ino öffnen, Board „Mega 2560“ wählen und hochladen.
Port wählen (USB oder „ESP32-Brücke“) und verbinden. Mit M119 die Endschalter testen.
Die Lichtschranke zeigt „unterbrochen = 1“. Erst dann kleine Jog-Schritte fahren.
Mit G28 fährt jede Achse an ihren Endschalter und setzt den Nullpunkt.
Abbruch per STOP (Knopf oder !) oder Not-Aus (Leertaste).
Der Assistent führt in zehn Schritten durch das Einmessen. Danach werden die Grenzen vor den Anschlägen angelernt.
Fahrten enden vor den eingemessenen Grenzen, unerreichbare Ziele werden abgelehnt. STOP hält an, die Motoren bleiben bestromt. Der Not-Aus schaltet sie ab.
| Befehl | Funktion |
|---|---|
| G0 / G1 X Y Z E F [S0] | Achsbewegung, alle Achsen im Gleichlauf; S0 fährt sie unabhängig |
| G4 S<s> | Pause / Wartezeit |
| G28 [X Y Z] | Referenzfahrt (abbrechbar) |
| G90 / G91 | Absolut- / Relativmodus |
| G92 X Y Z E | aktuelle Position setzen |
| M17 / M18 | Motoren ein / aus |
| M42 P<pin> S<0..255> | Ausgang schalten (Greifer/Sauger/Lüfter) |
| ! | STOP: bricht jede Bewegung ab, die Motoren bleiben bestromt |
| M112 | Not-Aus: stoppt sofort und schaltet die Motoren ab |
| M114 | Position ausgeben |
| M119 | Endschalter-Zustände ausgeben |
Die ganze Anleitung liegt dem Download als
FIRMWARE_ANLEITUNG.md und LIESMICH.md bei.
Stellungen aus der 3D-Simulation.
Aus einem Zielpunkt werden die Gelenkwinkel berechnet: Zwei-Gelenk-Trigonometrie plus Basisdrehung.
def cart_to_joints(self, x, y, z, e): # Weltkoordinaten [mm] -> Gelenkwinkel des Parallelogramm-Arms a, b = g["lower_arm"], g["upper_arm"] dx = x - e # Arm-Basis sitzt auf der Schiene base = math.degrees(math.atan2(dx, y)) # Basisdrehung r = math.hypot(dx, y) - g["tool_offset_h"] # Reichweite h = z + g["tool_offset_v"] - g["base_height"] # Höhe über Schulter d = math.hypot(r, h) if d > a + b: raise ValueError("Punkt zu weit weg") th1 = math.atan2(h, r) + math.acos((a*a + d*d - b*b) / (2*a*d)) # Hauptarm th2 = math.atan2(h - a*math.sin(th1), r - a*math.cos(th1)) # Vorderarm, absolut # … Winkelgrenzen und Scherenwinkel prüfen, in Gelenk-Einheiten umrechnen return joints, angles
X, Y und Z bedeuten als Koordinate etwas anderes als im G-Code. Ein Klick auf eine Zeile hebt die Achse hervor.
| Buchstabe | Als Koordinate | Als Gelenk (G-Code) |
|---|---|---|
X | links / rechts in mm | Hauptarm-Winkel (Gelenk 1) |
Y | vor / zurück in mm | Vorderarm-Winkel (Gelenk 2) |
Z | Höhe in mm | Basisdrehung |
E | - | Schiene in mm |
Ein G1 Z50 fährt nicht 50 mm nach oben, sondern dreht die Basis.
Für die Höhe den kartesischen Jog oder die Koordinateneingabe nutzen.
Drehen sich alle Gelenke gleichmäßig, fährt die Spitze einen Bogen. Für eine echte Gerade wird die Bahn in kleine Schritte zerlegt und für jeden einzelnen die inverse Kinematik gerechnet. Die Vorführung zeigt beide Wege.
Firmware, Steuerungssoftware und Anleitungen in einem Paket. Läuft auf jedem PC mit Python.
⭳ ArmControl.zip anfragenFragen zur Bauweise, zu den Entscheidungen dahinter oder zur Übertragbarkeit auf einen anderen Fall.