Community project

Realtime Robothand Fingertracking

ESP32
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

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+5VSG90 Servo VCCEXT
groundGNDSG90 Servo GNDEXT

2. Connections between "servo_ring" and "ESP32"

Functionservo_ringESP32
powerVCCSG90 Servo VCCEXT
groundGNDSG90 Servo GNDEXT
pwmSIGNALGPIO 26

3. Connections between "servo_middle" and "ESP32"

Functionservo_middleESP32
powerVCCSG90 Servo VCCEXT
groundGNDSG90 Servo GNDEXT
pwmSIGNALGPIO 27

4. Connections between "servo_index" and "ESP32"

Functionservo_indexESP32
powerVCCSG90 Servo VCCEXT
groundGNDSG90 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