Ceks.it
2026

LeRobot SO-100
React js Controller

A custom-built robotic arm controller powered by React. The goal was to create an intuitive web interface to control a SO-100 6-DOF robotic arm in real time, communicating directly with an Arduino board via Web Serial API. No server, no middleware — just the browser talking to hardware.

StackReact, TypeScript, Web Serial APIHardwareSO-100 Arm, Waveshare Servo Driver, ArduinoRoleDesign & DevelopmentLinks

The Control Interface

A React-based control panel that connects directly to an Arduino via the Web Serial API. Each motor can be configured individually with custom ranges and target positions. A gamepad-style pad control allows smooth real-time movement of any selected joint.

React control console for the SO-100 robotic arm

How It Works

Browser

The React app runs entirely in the browser. Motor configurations, positions and movement commands are managed through React state and dispatched as serial messages.

Web Serial API

No backend needed. The browser communicates directly with the Arduino board over USB using the Web Serial API, sending position commands as structured byte sequences.

Arduino + Servos

The Arduino receives serial commands and drives a Waveshare servo controller board, translating position values into PWM signals for each of the 6 STS3215 servo motors.

The Hardware

The arm is built on the SO-100 open-source design — a 6 degrees of freedom robotic arm using Waveshare STS3215 serial bus servo motors. The servo driver board handles communication with all 6 joints: shoulder pan, shoulder lift, elbow flex, wrist flex, wrist roll, and gripper.

Waveshare servo driver board
SO-100 robotic arm assembled

Motor Configuration

Each joint has its own range limits and default position. The interface allows sending individual commands per motor or controlling them smoothly via the pad controller.

MotorMinMaxDefault
shoulder_pan140029002000
shoulder_lift110027002000
elbow_flex110029002000
wrist_flex100029002000
wrist_roll90037002000
gripper194026002000

The Result

The final assembled arm, controlled entirely from a React interface in the browser.

LeRobot SO-100 result
LeRobot SO-100 result
LeRobot SO-100 result