Community project
Realtime Robothand Fingertracking
Bram
Published August 6, 2026 · Updated August 11, 2026
Generated with AIThis project builds a four-finger robot hand controlled in real time by an ESP32 microcontroller. Four SG90 servos drive the individual fingers, receiving angle commands (0–180 degrees) continuously over USB serial from a tracking application running on a connected computer.
The guide provides a complete wiring diagram, parts list, and step-by-step assembly instructions for mechanically mounting the servos and configuring the power distribution. Firmware is included to parse incoming finger-angle data and drive each servo independently, with built-in angle clamping for safety and change detection to minimize unnecessary servo updates.
Wiring diagram
Interactive · read-only
Pan and zoom to explore the wiring. Remix the project to edit it in your own workspace.
Parts list
Bill of materials| Component | Qty | Notes |
|---|---|---|
| SG90 ServoSG90 of MG90S | 1 | Micro servo motor (SG90) |
| SG90 ServoSG90 of MG90S | 1 | Micro servo motor (SG90) |
| SG90 ServoSG90 of MG90S | 1 | Micro servo motor (SG90) |
| SG90 ServoSG90 of MG90S | 1 | Micro servo motor (SG90) |
| USB-C 5V Adapter5 V DC, ≥3 A | 1 | USB-C wall adapter delivering regulated 5 V to the board's USB or VBUS rail. Default wired power source for desktop / stationary projects. |
Assembly
5 stepsMaak de voeding spanningsloos
Koppel de ESP32 los van de computer en laat de externe 5 V-servoadapter nog uit het stopcontact. Zet de vier servohevels voorlopig los van de servoassen; zo kunnen ze later mechanisch in de juiste nulstand worden gemonteerd.
- Tip: Gebruik een geregelde 5 V-voeding van minimaal 3 A. Voor vier SG90/MG90S-servo's is meer stroomreserve beter.
- Tip: Servo-kleuren zijn doorgaans: rood = VCC, bruin/zwart = GND, oranje/geel/wit = signaal.
- ⚠ Voed de servo's niet vanaf de 5V- of 3V3-pin van de ESP32 en niet vanaf de USB-poort van de computer.
- ⚠ Controleer de kleurcodering van elk servosnoer; goedkope klonen kunnen afwijken.
Verdeel de externe 5 V naar alle servo's
Verbind de +5 V-uitgang van servo_supply parallel met de rode VCC-draad van servo_pink, servo_ring, servo_middle en servo_index. Verbind de GND-uitgang van servo_supply parallel met de bruine/zwarte GND-draad van alle vier servo's. Gebruik een degelijke klemmenstrook of verdeelblok voor deze gezamenlijke voedingsverbindingen.
- Tip: Houd de voedingsdraden kort en gebruik voldoende dikke draad voor de gezamenlijke 5 V- en GND-verbindingen.
- Tip: Een elco van ongeveer 470–1000 µF, minimaal 10 V, over +5 V en GND bij het verdeelpunt helpt spanningsdips door servo's opvangen; plus naar +5 V, min (gestreepte zijde) naar GND.
- ⚠ Verwissel +5 V en GND nooit; dit kan servo's en de voeding beschadigen.
- ⚠ Schakel de externe voeding pas in nadat alle aansluitingen zijn gecontroleerd.
Maak één gemeenschappelijke massa
Verbind de GND-rail van de servo's (de GND van servo_supply en alle bruine/zwarte servodraden) met een GND-pin van de ESP32. De ESP32 wordt daarna via zijn USB-kabel met de computer verbonden voor data en eigen voeding. Verbind de externe +5 V hierbij NIET met de 5V/VIN-pin van de ESP32.
- Tip: De gemeenschappelijke GND is noodzakelijk: zonder die referentie herkennen de servo's het 3,3 V-PWM-signaal niet betrouwbaar.
- Tip: Een van de GND-pinnen op de ESP32 DevKit v1 mag worden gebruikt.
- ⚠ Alleen GND wordt gedeeld tussen servo-voeding en ESP32. Sluit de +5 V van servo_supply niet op een ESP32-GPIO aan.
- ⚠ Laat de ESP32 via USB aan de computer; USB levert de seriële verbinding die dit project gebruikt.
Verbind de vier PWM-signaaldraden
Verbind uitsluitend de signaaldraad van elke servo met de aangegeven ESP32-GPIO: servo_pink SIGNAL naar GPIO25, servo_ring SIGNAL naar GPIO26, servo_middle SIGNAL naar GPIO27 en servo_index SIGNAL naar GPIO33. Dit zijn de oranje/gele/witte draden van de servo's.
- Tip: De GPIO's geven alleen een 3,3 V-stuursignaal; de servo's krijgen hun vermogen nog steeds rechtstreeks van servo_supply.
- Tip: Markeer de vier servo's fysiek met Pink, Ring, Middel en Wijs om verwisseling bij montage te voorkomen.
- ⚠ Sluit geen servosignaal aan op GPIO0, GPIO2, GPIO12 of GPIO15: dat zijn opstart-/strappingpinnen.
- ⚠ Controleer vóór inschakelen dat er geen losse draad of kortsluiting is tussen +5 V en GND.
Nulstand instellen en mechanisch monteren
Verbind de ESP32 via USB met de computer en gebruik Schematik Deploy om de ESP32-firmware te plaatsen. Zet daarna de externe 5 V-servo-voeding aan. De firmware initialiseert alle servo's op 0°. Monteer nu pas de servohevels en vingermechaniek in de gewenste open-hand-nulstand.
- Tip: Als een vinger de verkeerde richting beweegt, keer dan in de Python-code alleen voor die vinger de hoek om met 180 - angle, of monteer de hevel anders.
- Tip: Zet de mechanische eindstop nooit tegen de servo-eindstop. Begrens zo nodig de hoekbereiken in Python.
- ⚠ Houd vingers uit de buurt van hevels en trekkabels tijdens de eerste test; servo's kunnen abrupt naar de ingestelde stand gaan.
- ⚠ Stop direct met de externe 5 V-voeding als een servo blokkeert, ratelt of erg warm wordt.
Pin assignments
Board wiring reference| Pin | Connection | Type |
|---|---|---|
| EXT | servo_supply +5V → SG90 Servo VCC | power |
| EXT | servo_supply GND → SG90 Servo GND | ground |
| EXT | servo_ring VCC → SG90 Servo VCC | power |
| EXT | servo_ring GND → SG90 Servo GND | ground |
| EXT | servo_middle VCC → SG90 Servo VCC | power |
| EXT | servo_middle GND → SG90 Servo GND | ground |
| EXT | servo_index VCC → SG90 Servo VCC | power |
| EXT | servo_index GND → SG90 Servo GND | ground |
| GPIO 25 | servo_pink SIGNAL | pwm |
| GPIO 26 | servo_ring SIGNAL | pwm |
| GPIO 27 | servo_middle SIGNAL | pwm |
| GPIO 33 | servo_index SIGNAL | pwm |
| GND | servo_pink GND | ground |
Firmware
ESP32#include <Arduino.h>
/*
ESP32 robothand: ontvangt vier servohoeken via USB-serieel.
Verwacht exact één regel per update:
pink,ring,middle,index\n
Voorbeeld:
25,80,130,45
Elke waarde is een hoek van 0 tot 180 graden. De Python-app op de
computer verzendt deze regel meerdere keren per seconde.
*/
#include <ESP32Servo.h>
// Veilige PWM-pinnen op de ESP32 DevKit v1.
// Forward declarations
int clampAngle(int angle);
void setServoAngles(int pink, int ring, int middle, int index);
void processLine(char* line);
const int PINK_SERVO_PIN = 25;
const int RING_SERVO_PIN = 26;
const int MIDDLE_SERVO_PIN = 27;
const int INDEX_SERVO_PIN = 33;
Servo pinkServo;
Servo ringServo;
Servo middleServo;
Servo indexServo;
// Servohoek die wordt aangehouden wanneer de hand tijdelijk verdwijnt.
int currentAngles[4] = {0, 0, 0, 0};
char inputLine[48];
size_t inputLength = 0;
// Begrens een ontvangen waarde tot het mechanisch veilige bereik.
int clampAngle(int angle) {
return constrain(angle, 0, 180);
}
// Schrijf alleen gewijzigde waarden. Dit vermindert onnodige servo-updates.
void setServoAngles(int pink, int ring, int middle, int index) {
const int received[4] = {
clampAngle(pink), clampAngle(ring), clampAngle(middle), clampAngle(index)
};
Servo* servos[4] = {&pinkServo, &ringServo, &middleServo, &indexServo};
for (int i = 0; i < 4; i++) {
if (received[i] != currentAngles[i]) {
currentAngles[i] = received[i];
servos[i]->write(currentAngles[i]);
}
}
}
// Controleer en verwerk een CSV-regel met precies vier gehele getallen.
void processLine(char* line) {
int pink, ring, middle, index;
if (sscanf(line, "%d,%d,%d,%d", &pink, &ring, &middle, &index) == 4) {
setServoAngles(pink, ring, middle, index);
Serial.printf("OK,%d,%d,%d,%d\n", currentAngles[0], currentAngles[1],
currentAngles[2], currentAngles[3]);
} else {
Serial.println("ERR: verwacht pink,ring,middle,index");
}
}
void setup() {
Serial.begin(115200);
// Standaardpulsbereik voor gangbare SG90/MG90S-microservo's.
pinkServo.setPeriodHertz(50);
ringServo.setPeriodHertz(50);
middleServo.setPeriodHertz(50);
indexServo.setPeriodHertz(50);
pinkServo.attach(PINK_SERVO_PIN, 500, 2400);
ringServo.attach(RING_SERVO_PIN, 500, 2400);
middleServo.attach(MIDDLE_SERVO_PIN, 500, 2400);
indexServo.attach(INDEX_SERVO_PIN, 500, 2400);
setServoAngles(0, 0, 0, 0);
Serial.println("Robothand klaar: stuur pink,ring,middle,index");
}
void loop() {
// Niet-blokkerend seriëel lezen: de ESP32 verwerkt steeds volledige regels.
while (Serial.available() > 0) {
char c = static_cast<char>(Serial.read());
if (c == '\r') {
continue; // CR van Windows-regels negeren.
}
if (c == '\n') {
inputLine[inputLength] = '\0';
if (inputLength > 0) {
processLine(inputLine);
}
inputLength = 0;
} else if (inputLength < sizeof(inputLine) - 1) {
inputLine[inputLength++] = c;
} else {
// Te lange of kapotte regel weggooien en opnieuw synchroniseren.
inputLength = 0;
Serial.println("ERR: invoerregel te lang");
}
}
}“Deploy to device” opens this project in Schematik, where you can flash it to your board over USB.
Remix this project
Make it yours in one click
Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.