Overview
Six legs, eighteen joints
Gaits
Forward, backward, turn left and turn right, plus stand, rest and shut-down poses, all tuned in the RTrobot editor.
Obstacle mode
Walks on her own until something is within 20 cm, then stands, turns and carries on once it's clear past 35 cm.
Tilt safety
Past 10° of pitch or roll she stops and stands, and resumes once she's back under 7°.
IR remote
Arrows walk and turn while held. She stands when you let go.
Browser & gamepad
A control page on port 5005, and a Python controller that drives her from a PS2-style gamepad.
RIFT integration
She joins the NORA network and registers with the fleet, or hosts her own access point.
Hardware
What she's built from
- 01 ESP32 (the same module as NORA)
- 02 RTrobot 32-channel servo controller
- 03 18-DOF hexapod chassis
- 04 18× MG995 180° servos
- 05 3S LiPo battery
- 06 UBEC set to 6 V
- 07 HC-SR04 ultrasonic sensor
- 08 MPU6050 gyro + accelerometer
- 09 NEC IR receiver + remote
Power
3S LiPo ──► UBEC (6 V) ──► RTrobot servo controller V+ / GND All grounds tied together
Set the UBEC to 6 V before connecting the servos, and make sure every module shares a common ground.
ESP32 pinout
| Signal | GPIO |
|---|---|
| Servo controller (UART0, 38400 baud) | TX0 1 / RX0 3 |
| Debug console (Serial2) | RX2 16 / TX2 17 |
| HC-SR04 TRIG / ECHO | 12 / 13 |
| MPU6050 SDA / SCL | 21 / 22 |
| IR receiver | 14 |
| Servos | RTrobot channels |
|---|---|
| Left side (three legs) | 1–9 |
| Right side (three legs) | 24–32 |
The servo controller shares UART0 with the USB bridge, so disconnect it before uploading. scripts/servo_setup centres every channel at 1500 µs for fitting servo horns.
Controls
Three ways to drive
Obstacle Avoidance
IR 2, the web page, or gamepad Circle.
Hold to walk
Arrows walk and turn. 350 ms without a repeat and she stands.
Browser or gamepad
The page's D-pad or the Python controller. 500 ms without a command and she stands.
Python controller
| Input | Action |
|---|---|
| D-pad / arrow keys | Forward, backward, turn left, turn right |
| Cross (A) | Web control mode (needed before driving) |
| Circle (B) | Obstacle Avoidance mode |
| Square (X) | IR Remote mode |
| Triangle (Y) | Emergency stop (stand) |
Driven by NORA
NORA can drive WHIP through her IR transmitter: Samsung-format IR at address 0x0DA3, with the fleet link’s commands 0x48–0x4F (drive, stop, obstacle, manual, speed). Driving switches her into IR Remote mode, and each command runs as the matching remote button. She stands once the link has been quiet for 600 ms (frames can land mid-step). She has one gait speed, so speed is ignored. Link frames print as LINK cmd=0x...
Quick start
Get her walking
- Flash
scripts/esp32/esp32.inowith the servo controller's wires disconnected, then reconnect them. - Power WHIP. She stands, joins NORA's network or starts her own
WHIPAP, and starts in Obstacle Avoidance mode. - Open
http://<WHIP's IP>:5005/, or run the Python controller.
$ python -m venv venv $ source venv/bin/activate $ pip install -r requirements.txt $ python scripts/controller.py
| Setting | Value |
|---|---|
| NORA's network | NORA / 12345678 |
| WHIP's own AP | WHIP / 12345678 |
| Control page / RIFT port | 5005 |
Who's nearby
ESP-NOW + Bluetooth LE: the robots sense each other
Every robot sends a small "I'm here" beacon twice a second. The signal strength says roughly how close each one is, and how it changes says whether it's coming closer, steady or leaving. Coarse, for "who's around": the ultrasonic and ToF sensors still do the precise avoiding.
Very close to far
Above −45 dBm very close, −60 near, −75 medium, below that far.
In Brainfuck
Over ESP-NOW each beacon carries a program that prints park, go, wait or hand; the receiver runs it. RIFT decodes them too.
Who makes way
A parked robot isn't the one moving; a yielding one is making way; a human-driven one gets space; otherwise the alphabet decides, and everyone makes way for MILA.
WHIP hears the others over ESP-NOW (NORA, MILA) and Bluetooth LE (NORA, KIDA-00, KIDA-01). In obstacle mode she stands, then turns away, when a robot with right of way is close. GET /near shows her list.
Screens
The controllers
Captured without a robot connected, so live values show their offline state.