
Base
google/mozc-devices
Circuit diagrams and firmware source code for Gboard DIY keyboards

ESP32 self-balancing robot, inspired by the JJRobots B-Robot: TMC2209 steppers, a servo arm, gamepad control and live telemetry.
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.
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 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:
The full clip, from the stand-up to driving around: rolo-driving.mp4 (22 s, no sound).
| area | status |
|---|---|
| balancing | working, tuned from recorded data |
| driving (gamepad and web joystick) | working; faster driving and steering feel still being tuned |
| standing up from lying face-down | working (arm push + wheel kick), still being refined |
| telemetry, recorder and analysis tools | working |
| web pages (drive, calibration with terminal, gamepad) | working |
| battery warnings | working |
| 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, AI | planned |
| second robot and games | planned |
| battery management (charging in place) | planned |
| kids' programming (UIFlow on the M5Stack head) | planned |
The planned fixes for the electronics and the mechanical parts are listed in docs/next-revision.md.
| folder | contents |
|---|---|
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 |
| part | notes |
|---|---|
| ESP32 (DevKit V1, classic ESP32) | dual core: control loop on core 1, WiFi/web/LEDs on core 0 |
| 2 × TMC2209 stepper drivers | UART-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 servo | the arm (also used to stand up) |
| 3 × WS2812 LEDs | network, robot state, effort / battery warning |
| 3S LiPo | voltage divider (100k/22k) on GPIO 35 |
| Mini560 buck converter | 5 V for the logic and the servo |
| Bluetooth gamepad | a Switch Pro style controller, via Bluepad32 (classic Bluetooth) |
Main pin assignments are in firmware/controller/include/config.h.
Requires PlatformIO (the VS Code extension or the CLI).
cd firmware/controller
pio run -t uploadThe project uses the Bluepad32 Arduino core (classic Bluetooth gamepad support), which
PlatformIO downloads automatically through platform_packages in platformio.ini.
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.
Connect WiFi from the serial console (115200 baud):
wifi <ssid> <password>
netWithout a configured network it starts its own access point rolo
(password rolorolo). That password is public, so change it on first use:
apname <name>
appass <password>The password must be at least 8 characters. Both are saved on the robot.
Open http://<robot-ip>/ for the drive page. The calibration page (/calibration) has
the parameters and a terminal; /gamepad helps with pairing.
Stand the robot up; it starts balancing once it is near upright.
The same commands work on the serial port and in the web terminal (help lists them):
| command | what it does |
|---|---|
set <name> <value>, list, save, load, reset | tuning parameters (save only while lying down) |
arm up / arm down | the arm |
kick [accel] [speed] [angle] | stand up from lying face-down |
pad pair on|off, pad forget, pad rumble | gamepad pairing |
motors, motortest <steps/s> [seconds] [accel] | driver status, spin the wheels with the robot held up |
net, wifi, forget, apname, appass | network |
mem | free memory |
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-1Each 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.
MIT, for now, covering the whole repository. Separate licences for the hardware files (electronics and mechanical) may follow.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | 0.1uF | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C5, C6, C7, C8 |
| 3 | 1K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R1, R5, R6 |
| 2 | 10K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R3, R4 |
| 2 | 470uF / 35V | Capacitor_THT:CP_Radial_D8.0mm_P3.50mm | C3, C4 |
| 2 | MS1 EN | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | JP2, JP4 |
| 2 | MS2 EN | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | JP3, JP5 |
| 2 | ~ | rolo_footprints:TMC2209_16Pin | U2, U3 |
| 1 | 1N5818 | Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal | D2 |
| 1 | 220uF / 16V | Capacitor_THT:CP_Radial_D8.0mm_P3.50mm | C9 |
| 1 | 330 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R2 |
| 1 | 470uF / 16V | Capacitor_THT:CP_Radial_D8.0mm_P3.50mm | C1 |
| 1 | Aux | Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical | J12 |
| 1 | BAT+ | MountingHole:MountingHole_2.2mm_M2_Pad | J1 |
| 1 | BAT- | MountingHole:MountingHole_2.2mm_M2_Pad | J11 |
| 1 | BEC Conn | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J10 |
| 1 | Buzz Conn | Connector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical | J8 |
| 1 | Conn_01x02 | Connector_AMASS:AMASS_XT30U-M_1x02_P5.0mm_Vertical | J2 |
| 1 | LED | LED_THT:LED_D3.0mm | D1 |
| 1 | LED Conn | Connector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical | J7 |
| 1 | LED Jumper | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | JP1 |
| 1 | Motor1 | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J5 |
| 1 | Motor2 | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J6 |
| 1 | RPi 4 | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | J9 |
| 1 | RUEF500 | rolo_footprints:Fuse_RUEF500 | F1 |
| 1 | Servo1 | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J3 |
| 1 | Servo2 | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J4 |
| 1 | ~ | rolo_footprints:ESP32_DevKit_30Pin | U1 |
| 1 | ~ | rolo_footprints:MPU6050_Conn | U4 |
| 1 | ~ | rolo_footprints:MINI560_5V_8Pin | U5 |
The 39 most common of 43 parts.
It measures 90 × 70 mm and has 2 copper layers, 1.6 mm thick.
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.
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.
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).

google/mozc-devices
Circuit diagrams and firmware source code for Gboard DIY keyboards

rusefi/rusefi
rusefi - GPL internal combustion engine control unit


jrsteensen/OpenHornet
OpenHornet 1:1 F/A-18C Simulator Repository


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!

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

zynthian/zynthian-hw
Zynthian hardware stuff: PCBs, schemes, parts specifications, pin assignment, ...