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

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.


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.
| Motor | Min | Max | Default |
|---|---|---|---|
| shoulder_pan | 1400 | 2900 | 2000 |
| shoulder_lift | 1100 | 2700 | 2000 |
| elbow_flex | 1100 | 2900 | 2000 |
| wrist_flex | 1000 | 2900 | 2000 |
| wrist_roll | 900 | 3700 | 2000 |
| gripper | 1940 | 2600 | 2000 |
The Result
The final assembled arm, controlled entirely from a React interface in the browser.


