- Robot Type: Hexapod
Overview
WHIP is an 18-servo hexapod. An ESP32 runs the behaviour, WiFi and a browser control page, and streams pre-tuned gait poses to an RTrobot 32-channel servo controller, which moves all the joints together. An MPU6050 watches for tipping and an HC-SR04 watches the way ahead.
- 18-DOF walking: forward, backward, turn left and turn right gaits, plus stand, rest and shut-down poses.
- Three control modes: Obstacle Avoidance (the boot default), IR Remote, and Web (the browser page or the Python controller).
- Tilt safety: past 10Β° of pitch or roll for 250 ms she stops and stands, and resumes once she is back under 7Β°.
- Obstacle avoidance: walks until something is closer than 20 cm, then stands, turns and walks on once the way is clear past 35 cm.
- Fleet: joins NORA's network when it's in range and registers with the fleet, or hosts her own
WHIPaccess point.
Prerequisites
- Arduino IDE with the ESP32 board package
- Library:
IRremote4.x (WiFi,WebServer,HTTPClientandWirecome with the ESP32 core) - Python 3 with
pygameandrequestsfor the desktop controller (pip install -r requirements.txt)
| Component | Details |
|---|---|
| Microcontroller | ESP32 (the same module as NORA) |
| Servo controller | RTrobot 32-channel servo controller (UART, 38400 baud) |
| Chassis | 18-DOF hexapod chassis |
| Servos | 18 Γ MG995 180Β° |
| Battery | 3S LiPo |
| Regulator | UBEC set to 6 V |
| Distance | HC-SR04 ultrasonic sensor |
| Balance | MPU6050 gyro + accelerometer |
| Remote | NEC IR receiver + remote (the same remote as MILA and IDA) |
| Controllers | Browser, PS2-style USB gamepad (Python controller), IR remote |
Chassis Instruction Manual: https://1drv.ms/b/c/e7037d9b1b4cf216/EZ1ctC5zh_tOmuoInNRW6fgBGUFWBfHWW5chNCMn1rw6kQ?e=z3zNVd](https://1drv.ms/b/c/e7037d9b1b4cf216/EZ1ctC5zh_tOmuoInNRW6fgBGUFWBfHWW5chNCMn1rw6kQ?e=z3zNVd)
Power
3S LiPo βββββββΊ UBEC (set to 6 V)
UBEC 6 V ββββββΊ RTrobot servo controller V+ / GND (servo power)
ESP32 βββββββββΊ USB or 5 V from the servo controller's logic rail
All grounds tied together
Tip
Set the UBEC to 6 V before connecting the servos, and make sure every module shares a common ground.
ESP32 wiring
| Signal | ESP32 pin |
|---|---|
| Servo controller RX β ESP32 TX | GPIO 1 (TX0) |
| Servo controller TX β ESP32 RX | GPIO 3 (RX0) |
| Debug console (optional USB-TTL) | GPIO 16 (RX2), GPIO 17 (TX2) |
| HC-SR04 TRIG / ECHO | GPIO 12 / GPIO 13 |
| MPU6050 SDA / SCL | GPIO 21 / GPIO 22 |
| IR receiver OUT | GPIO 14 |
The servo controller shares UART0 with the USB-serial bridge, exactly like NORA's ESP32βArduino link. Disconnect the controller's wires before uploading, then reconnect. Boot and status logging goes to Serial2 (GPIO 17) instead.
Servo channels
The gaits drive RTrobot channels 1β9 and 24β32 (18 servos, three per leg). Every pose and gait line comes from gait.xml, exported from the RTrobot editor.
scripts/servo_setup/servo_setup.ino sends every channel to 1500 Β΅s (centre) for fitting the servo horns. It runs on an Arduino with the controller on SoftwareSerial pins 11 (RX) and 10 (TX) at 38400 baud.
Connectivity & Controls
On boot WHIP looks for NORA's access point. If it's there she joins it and registers with the fleet. If not, she starts her own.
| Parameter | Value |
|---|---|
| NORA's network | SSID NORA, password 12345678 |
| WHIP's own AP | SSID WHIP, password 12345678 |
| Control page | http://<WHIP's IP>:5005/ |
| Fleet registry | 192.168.4.1:5000/register (heartbeat every 10 s) |
WHIP's control page is on port 5005, the port RIFT assigns her. On NORA's network she shows up in RIFT's Registered Fleet list.
| Mode | How | What it does |
|---|---|---|
| Obstacle Avoidance | IR 2, web, gamepad Circle |
Walks on her own and turns away from anything within 20 cm (boot default) |
| IR Remote | IR 1, gamepad Square |
Arrows walk and turn while held. She stands when you let go (350 ms timeout) |
| Web | Web page, gamepad Cross | D-pad on the page or the Python controller. She stands if the browser goes quiet for 500 ms |
NORA can drive WHIP through her IR transmitter, from her web page, Python controller or Bluetooth. The frames are Samsung-format IR at address 0x0DA3, with the fleet link's commands: 0x48 forward, 0x49 back, 0x4A left, 0x4B right, 0x4C stop, 0x4D obstacle mode, 0x4E manual, 0x4F 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...
Draws a PS2-style pad and drives WHIP over WiFi. It finds her on NORA's network first, and on her own AP otherwise.
| 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) |
Gaits
| Movement | Lines | Source |
|---|---|---|
| Forward | 4 | gait.xml "Forward" group |
| Backward | 4 | gait.xml |
| Turn left / turn right | 5 each | gait.xml |
| Stand, rest, shut down | Poses | gait.xml "Reset - Shut Down" group |
Each line is sent with a move time of GAIT_MOVE_MS (300 ms). Retuning the walking speed is that one constant in esp32.ino.
The patterns below are the design notes for future gaits. The current firmware walks with the tables above.
| Gait | Logic | Best for |
|---|---|---|
| Tripod | {L1, R2, L3} then {R1, L2, R3}: three legs move, three hold a triangle |
Speed on flat ground |
| Wave | L3 β L2 β L1 β R3 β R2 β R1, one leg at a time |
Maximum stability |
| Ripple | {L3, R1} β {L2, R3} β {L1, R2}, two legs at a time |
Smooth, lifelike motion |
| Amble | Two non-opposite legs lifted together | Spreading load differently |
| Metachronal | A sequential "Mexican wave" | Tight corridors |
| Rotational | Legs circle the centre axis | Turning 360Β° in place |
| Sidewinding | Sideways without changing heading | Strafing round obstacles |
| Stair / climb | High tibia lift | Steps and debris |
[!TIP] Lifting a leg (femur servo) must be coordinated with extending it (coxa servo) to keep the centre of gravity inside the support triangle, or WHIP will tip.
View How to Run
- Flash
scripts/esp32/esp32.inoto the ESP32 (servo controller wires disconnected), then reconnect them. - Power WHIP. She stands, connects to NORA's network or starts her own
WHIPAP, and starts in Obstacle Avoidance mode. - Open
http://<WHIP's IP>:5005/in a browser, or run the Python controller:
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
python scripts/controller.py # or ./scripts/launch_controller.shEvery robot sends a small "I'm here" beacon twice a second and listens for the others'. From the signal strength it knows roughly how close each one is, and from how that changes over time whether it's coming closer, steady or leaving:
| Signal | Zone |
|---|---|
| above β45 dBm | very close |
| β45 to β60 dBm | near |
| β60 to β75 dBm | medium |
| below β75 dBm | far |
It's coarse (walls, bodies and antenna angle all change it): for "who's around", not distance. Precise collision avoidance stays with the ultrasonic and ToF sensors.
They tell each other what they're doing, because a rising signal looks the same from both sides even when only one robot moves. Over ESP-NOW they say it in Brainfuck, like the fleet's conversations: each beacon carries a program that prints park, go, wait or hand (a human is driving), and the receiver runs it. Bluetooth adverts are too small for a program, so BLE carries the same state as one byte.
Who makes way, in self-driving modes only:
| The other robot... | So this one... |
|---|---|
| is parked | is the one closing in: steers away |
| is yielding | carries on, carefully |
| is driven by a human | makes way (it's unpredictable) |
| drives itself | follows the alphabet: KIDA00, KIDA01, NORA, WHIP; everyone makes way for MILA, who can't hear the others |
| is leaving | carries on |
Making way = stop for 2 s, turn away, then drive on (and not yield again for 5 s, so two robots that stay close don't take turns forever). While another robot is near, or coming closer, it drives slower with wider margins.
WHIP hears the others over ESP-NOW (NORA, MILA) and Bluetooth LE (NORA, KIDA-00, KIDA-01). In obstacle mode she stands still and then turns away when a robot with right of way is close. GET /near shows her list. Code: scripts/esp32/fleet_near.h and fleet_near_ble.h (BLE adds a lot of code: she may need the Huge APP partition scheme).
Python controller. Captured without a robot connected, so live values show their offline state.
Minds β DREAM companion Β· TINA engineer Β· NINA caretaker Β· RIFT fleet hub Β· LYCEA training school
Robots β NORA Β· MILA Β· WHIP Β· KIDA-00 Β· KIDA-01 Β· IDA Β· ARM
Tools β CRUSH compression Β· Image-Generator Β· GloriosaAI Β· SynthWomb Β· PyVitals


