Skip to the content
PCBKitNew board
2 layers90 × 70 mmRolo, the printed circuit board in 3D

ESP32 self-balancing robot, inspired by the JJRobots B-Robot: TMC2209 steppers, a servo arm, gamepad control and live telemetry.

Size
90 × 70 mm
Copper layers
2
Thickness
1.6 mm
Parts
43
Nets
54
Pads
158
Tracks, vias
239, 6
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
27 Oct 2026
Updated
29 Oct 2026

Overview

Rolo is an open-source printed circuit board by mpaunete, from the mpaunete/rolo repository on GitHub, published under the MIT licence. It is a 2-layer board of 90 × 70 mm with 43 parts on 54 nets, routed with 239 tracks and 6 vias.

It is built around the RUEF500. Its parts include 12 connectors, 8 capacitors, 6 resistors, 5 ICs and 2 diodes. It belongs with the robots and motor control and keyboards and input boards of this library.

Main components

1

README

README.md

ROLO

A two-wheeled self-balancing robot built around an ESP32, with stepper motors, a servo arm, a Bluetooth gamepad, live telemetry over WiFi, and the ability to stand itself up after a fall.

Early version, work in progress. The electronics mostly work: you can pair a gamepad and drive ROLO around, and it balances and stands itself up. But this is a first version, some improvements are already needed, and much is still being built, tuned and redesigned. Expect things to change, and some parts of this repository to be incomplete. See Current status.

ROLO lying on the floor, pushing itself up with its arm, then driving off

Inspiration and goals

ROLO started from the JJRobots B-Robot EVO 2 and the Kidbuild balance robot kit. I decided to rebuild them and improve the electronics, with these goals:

  • Quieter motors: TMC2209 stepper drivers.
  • Maximum customisation: most of the parts redesigned in FreeCAD.
  • More sensors and accessories than the original designs allow.
  • AI experimentation: a face, voice, vision and a personality, in the spirit of Anki Vector.
  • A 3S battery, and better battery management later (for example, charging without unplugging it).
  • Learning: about balancing control and about AI on small robots.
  • A robotics platform for kids: children can program ROLO themselves with UIFlow (M5Stack's block editor and MicroPython) on the M5Stack head, driving the robot through the same commands as the gamepad and the web pages.

ROLO from the front: blue and black body, a screen with green reptile eyes, an axe on its arm, two stepper motors and large wheels ROLO from the front left, showing the side panel with the power switch

Videos

ROLO driving towards the camera, then turning away

The full clip, from the stand-up to driving around: rolo-driving.mp4 (22 s, no sound).

Current status

areastatus
balancingworking, tuned from recorded data
driving (gamepad and web joystick)working; faster driving and steering feel still being tuned
standing up from lying face-downworking (arm push + wheel kick), still being refined
telemetry, recorder and analysis toolsworking
web pages (drive, calibration with terminal, gamepad)working
battery warningsworking
controller PCB (KiCad)first version: mostly works, improvements needed (see below); files in electronics/
mechanical parts (FreeCAD)designed, not yet published here
head: face, camera, microphones (M5Stack CoreS3)hardware chosen, firmware not started
voice, vision, AIplanned
second robot and gamesplanned
battery management (charging in place)planned
kids' programming (UIFlow on the M5Stack head)planned

Known issues in the first electronics version

  • The servo shares the 5 V supply with the logic. When it pulls hard, the supply dips enough to disturb WiFi and the IMU. A capacitor at the servo, or a separate supply for it, is needed.
  • Few spare GPIOs are left on the controller for new sensors and accessories.
  • No charging in place yet: the battery has to be unplugged to charge.

The planned fixes for the electronics and the mechanical parts are listed in docs/next-revision.md.

Features

  • Balancing with a cascaded controller: an angle loop (PD on a filtered gyro) inside a speed loop, with an acceleration feed-forward so the robot leans into speed changes.
  • Driving from a gamepad or a web joystick, with a speed ramp shared by acceleration and braking.
  • Standing up from lying face-down: the arm pushes the body up, a wheel kick drives under it, and the balance loop takes over mid-way, braking with a deeper lean afterwards.
  • Safety: tilt cut-off, runaway detection, a command timeout, and battery warnings (LEDs and web pages).
  • Web pages served by the robot: drive (joystick), calibration (live values, parameters, a terminal), and a gamepad debug page.
  • 200 Hz telemetry stream with a PC recorder and an analysis script, used to tune everything from measured data.
  • One command console shared by the serial port and the web terminal.

Repository layout

foldercontents
firmware/controller/the body's firmware: balancing, driving, arm, stand-up, web pages (PlatformIO, C++)
firmware/common/link/shared by the body and the heads: the messages on the body–head UART link
firmware/head-c3lcd/head: ESP32-C3 SuperMini with a Waveshare 2" LCD (the current head; code to be added)
firmware/head-cores3/head: M5Stack CoreS3 (face, camera, microphones, speaker)
firmware/head-seeed/head: ESP32-S3 DevKitC with a Seeed Grove Vision AI V2 and a ReSpeaker Lite
firmware/tools/rolo_stream.py (recorder and test runner), analyze.py (report and plots)
electronics/KiCad project for the controller board, Gerbers in Output/
mechanical/mechanical design, FreeCAD (to be added)
docs/documentation; next-revision.md lists the planned hardware changes; images/ has the photos and videos

Hardware

partnotes
ESP32 (DevKit V1, classic ESP32)dual core: control loop on core 1, WiFi/web/LEDs on core 0
2 × TMC2209 stepper driversUART-configured, 1/16 microstepping, 900 mA RMS
2 × NEMA17 steppers (42HD4027-01, 1.5 A)93.2 mm wheels
MPU6050 IMU±1000 °/s gyro, complementary filter
hobby servothe arm (also used to stand up)
3 × WS2812 LEDsnetwork, robot state, effort / battery warning
3S LiPovoltage divider (100k/22k) on GPIO 35
Mini560 buck converter5 V for the logic and the servo
Bluetooth gamepada Switch Pro style controller, via Bluepad32 (classic Bluetooth)

Main pin assignments are in firmware/controller/include/config.h.

Building and flashing

Requires PlatformIO (the VS Code extension or the CLI).

bash
cd firmware/controller
pio run -t upload

The project uses the Bluepad32 Arduino core (classic Bluetooth gamepad support), which PlatformIO downloads automatically through platform_packages in platformio.ini.

First setup

  1. Lay the robot down and power it on. It calibrates the IMU lying still (about 3 s), then the status LEDs show the network and robot state.

  2. Connect WiFi from the serial console (115200 baud):

    text
    wifi <ssid> <password>
    net

    Without a configured network it starts its own access point rolo (password rolorolo). That password is public, so change it on first use:

    text
    apname <name>
    appass <password>

    The password must be at least 8 characters. Both are saved on the robot.

  3. Open http://<robot-ip>/ for the drive page. The calibration page (/calibration) has the parameters and a terminal; /gamepad helps with pairing.

  4. Stand the robot up; it starts balancing once it is near upright.

Console commands

The same commands work on the serial port and in the web terminal (help lists them):

commandwhat it does
set <name> <value>, list, save, load, resettuning parameters (save only while lying down)
arm up / arm downthe arm
kick [accel] [speed] [angle]stand up from lying face-down
pad pair on|off, pad forget, pad rumblegamepad pairing
motors, motortest <steps/s> [seconds] [accel]driver status, spin the wheels with the robot held up
net, wifi, forget, apname, appassnetwork
memfree memory

Tools

bash
cd firmware/tools
python -m venv .venv
.venv/bin/pip install -r requirements.txt

# record 30 s of the 200 Hz stream
.venv/bin/python rolo_stream.py <robot-ip> --seconds 30 --name my-run

# run a repeatable test (still, step, tap, turn, ramp, all) and analyse it
.venv/bin/python rolo_stream.py <robot-ip> --test step --amount 0.5 --name step-1
.venv/bin/python analyze.py step-1

Each recording produces <name>.csv (samples), <name>-events.csv (commands and events) and <name>-params.json (the parameters at the time). analyze.py prints a report (timing, stillness, pushes, drive steps, limits) and saves a plot.

Roadmap

  • Heads: interchangeable heads on the same body, linked over UART: a plain ESP32-C3 with a 2-inch LCD, an M5Stack CoreS3 (face, camera, microphones, speaker) and a Seeed Studio vision head. They share one firmware project with a build per head, and each head tells the body what it can do. Later: offline voice (wake word and commands), vision, and WiFi moved from the body to the head.
  • Optional AI: a local server for conversation and speech, or an on-robot LLM module.
  • Games: two robots, a referee page, and living-room battles (knock off the other robot's accessories, jousting, IR tag).
  • Kids' programming: UIFlow on the CoreS3 head, with blocks for driving, the arm, the LEDs and the robot's events (fell over, stood up, battery low), so children can write their own behaviours and games.

Licence

MIT, for now, covering the whole repository. Separate licences for the hardware files (electronics and mechanical) may follow.

Parts

43
QtyValueFootprintReferences
40.1uFCapacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mmC5, C6, C7, C8
31KResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR1, R5, R6
210KResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR3, R4
2470uF / 35VCapacitor_THT:CP_Radial_D8.0mm_P3.50mmC3, C4
2MS1 ENConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJP2, JP4
2MS2 ENConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJP3, JP5
2~rolo_footprints:TMC2209_16PinU2, U3
11N5818Diode_THT:D_DO-41_SOD81_P10.16mm_HorizontalD2
1220uF / 16VCapacitor_THT:CP_Radial_D8.0mm_P3.50mmC9
1330Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR2
1470uF / 16VCapacitor_THT:CP_Radial_D8.0mm_P3.50mmC1
1AuxConnector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_VerticalJ12
1BAT+MountingHole:MountingHole_2.2mm_M2_PadJ1
1BAT-MountingHole:MountingHole_2.2mm_M2_PadJ11
1BEC ConnConnector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ10
1Buzz ConnConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ8
1Conn_01x02Connector_AMASS:AMASS_XT30U-M_1x02_P5.0mm_VerticalJ2
1LEDLED_THT:LED_D3.0mmD1
1LED ConnConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ7
1LED JumperConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJP1
1Motor1Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ5
1Motor2Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ6
1RPi 4Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ9
1RUEF500rolo_footprints:Fuse_RUEF500F1
1Servo1Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ3
1Servo2Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ4
1~rolo_footprints:ESP32_DevKit_30PinU1
1~rolo_footprints:MPU6050_ConnU4
1~rolo_footprints:MINI560_5V_8PinU5

The 39 most common of 43 parts.

Questions

How big is the Rolo PCB?

It measures 90 × 70 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Rolo use?

43 parts, built around the RUEF500. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Rolo KiCad files?

From the mpaunete/rolo repository on GitHub, at the commit this page was made from: the board is electronics/rolo.kicad_pcb and its schematic electronics/rolo.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Rolo design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers52.2 × 52.2 mmBase, the printed circuit board in 3D

    Base

    google/mozc-devices

    Circuit diagrams and firmware source code for Gboard DIY keyboards

    43 parts3kApache-2.0
  • 2 layers33 × 34 mmESP32-bat monitor latch, the printed circuit board in 3D

    ESP32-bat monitor latch

    pcbreflux/espressif

    all espressif stuff will committed here

    43 parts608GPL-3.0
  • 2 layers42.9 × 19 mmPoly kb 2.25U, the printed circuit board in 3D

    Poly kb 2.25U

    thpoll83/PolyKybd

    PolyKybd

    43 parts411CERN-OHL-W-2.0
  • 2 layers99.1 × 99.7 mmRC6502 Prototyping, the printed circuit board in 3D

    RC6502 Prototyping

    tebl/RC6502-Apple-1-Replica

    An expandable SBC-version of the Apple 1 computer, easy to get started with and lot of cool stuff that can be added to it!

    43 parts193GPL-3.0
  • 2 layers26.6 × 38.7 mmMdb slave esp32s3-mini, the printed circuit board in 3D

    Mdb slave esp32s3-mini

    nodestark/mdb-esp32-cashless

    ESP32-based MDB cashless device for vending machines, supporting EVA DTS DEX/DDCMP telemetry and payments over the MDB protocol via Bluetooth and MQTT

    43 parts190MIT
  • 2 layers97.3 × 71 mmZynScreen v1, the printed circuit board in 3D

    ZynScreen v1

    zynthian/zynthian-hw

    Zynthian hardware stuff: PCBs, schemes, parts specifications, pin assignment, ...

    43 parts156