Community project

Realtime Robothand Fingertracking

Photo of Realtime Robothand Fingertracking
Generated with AI

Bram

Last updated August 11, 2026

This 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

Wiring diagram for Realtime Robothand Fingertracking
Loading diagram…

Gather all the parts

QtyComponent
1

SG90 Servo

SG90 of MG90S

Micro servo motor (SG90)

1

SG90 Servo

SG90 of MG90S

Micro servo motor (SG90)

1

SG90 Servo

SG90 of MG90S

Micro servo motor (SG90)

1

SG90 Servo

SG90 of MG90S

Micro servo motor (SG90)

1

USB-C 5V Adapter

5 V DC, ≥3 A

USB-C wall adapter delivering regulated 5 V to the board's USB or VBUS rail. Default wired power source for desktop / stationary projects.

Assemble it in 5 steps

1. Maak 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.

  • Gebruik een geregelde 5 V-voeding van minimaal 3 A. Voor vier SG90/MG90S-servo's is meer stroomreserve beter.
  • 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.

2. 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.

  • Houd de voedingsdraden kort en gebruik voldoende dikke draad voor de gezamenlijke 5 V- en GND-verbindingen.
  • 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.

3. 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.

  • De gemeenschappelijke GND is noodzakelijk: zonder die referentie herkennen de servo's het 3,3 V-PWM-signaal niet betrouwbaar.
  • 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.

4. 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.

  • De GPIO's geven alleen een 3,3 V-stuursignaal; de servo's krijgen hun vermogen nog steeds rechtstreeks van servo_supply.
  • 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.

5. 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.

  • 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.
  • 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.

Review all connections

1. Connections between "servo_supply" and "ESP32"

Functionservo_supplyESP32
power+5V → SG90 Servo VCCEXT
groundGND → SG90 Servo GNDEXT

2. Connections between "servo_ring" and "ESP32"

Functionservo_ringESP32
powerVCC → SG90 Servo VCCEXT
groundGND → SG90 Servo GNDEXT
pwmSIGNALGPIO 26

3. Connections between "servo_middle" and "ESP32"

Functionservo_middleESP32
powerVCC → SG90 Servo VCCEXT
groundGND → SG90 Servo GNDEXT
pwmSIGNALGPIO 27

4. Connections between "servo_index" and "ESP32"

Functionservo_indexESP32
powerVCC → SG90 Servo VCCEXT
groundGND → SG90 Servo GNDEXT
pwmSIGNALGPIO 33

5. Connections between "servo_pink" and "ESP32"

Functionservo_pinkESP32
pwmSIGNALGPIO 25
groundGNDGND

Deploy the firmware

#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");
    }
  }
}

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.

Open in Schematik