A smartphone-controlled robot platform built on the ESP32 (TinyPICO) and Dynamixel XL330 servo motors. The robot hosts its own Wi-Fi network and serves a web interface that lets you control it from your phone's browser — no app install required.
This repo contains architectural improvments building on the incredible Rei Lee's Conebot
Rei's Original ConeBot A tiltyBot in gyro control mode A tiltyBot in drive control modeThe TinyPICO runs an HTTPS server over a local Wi-Fi access point. You connect your phone to that network, open the control page in a browser, and send commands to the motors over WebSocket. There are three control modes:
- 2motor — Direct position control of two motors (0–360°). Useful as a starting point for custom builds.
- tilty — A pan/tilt head that responds to your phone's gyroscope orientation, or manual sliders.
- drive — Differential drive with a virtual joystick. Two wheels plus a caster ball.
There's also a sound recorder page that lets you capture and play back audio clips through a Bluetooth speaker connected to a second phone.
- TinyPICO (ESP32-based)
- 2x Dynamixel XL330 servo motors
- USB-A to USB-C cable
- Wheels, axle pieces, hinge bracket, idler cap (included in kit)
- Cardboard, tape, and whatever else you want to build with
The motors daisy-chain together and connect to the TinyPICO via Serial2 (RX: GPIO 14, TX: GPIO 4).
- Visual Studio Code
- PlatformIO extension for VS Code
- Git
- macOS Sonoma+ (if on Mac)
- iOS 17.3.1+ or any modern Android browser (for the phone controller)
Clone the repo:
git clone https://github.com/imandel/tiltybot.git
cd tiltybot
Open the project in VS Code with PlatformIO installed.
Edit src/network.h and set a unique SSID and password:
const char *ssid = "my-robot";
const char *password = "something";In platformio.ini, uncomment the mode you want under build_src_filter and comment out the others:
build_src_filter =
-<*>
+<init.cpp>
+<init.h>
; +<2motor.cpp>
+<tilty.cpp>
; +<drive.cpp>- Connect the TinyPICO to your computer via USB.
- Upload the firmware (arrow button at the bottom of VS Code, or PlatformIO: Upload).
- Build the filesystem image: PlatformIO sidebar → Platform → Build Filesystem Image.
- Upload the filesystem image: PlatformIO sidebar → Platform → Upload Filesystem Image. Make sure the Serial Monitor is closed before this step.
- Open the Serial Monitor to find the IP address.
- On your phone, join the Wi-Fi network you configured.
- Navigate to the URL shown in the monitor (e.g.
https://192.168.4.1/tilty.html). - Ignore the self-signed certificate warning and proceed.
The URL path depends on the mode: /2motor.html, /tilty.html, or /drive.html. There's also an index page at / with links to all modes.
src/
init.cpp / init.h — Wi-Fi setup, HTTPS server, LittleFS, SSL cert generation, motor init
network.h — SSID and password config
2motor.cpp — 2-motor position control mode
tilty.cpp — Pan/tilt gyroscope mode
drive.cpp — Differential drive mode
data/
*.html / *.js — Browser-side control interfaces
sound.html / sound.js — Audio recorder/player
lib/ — Pico CSS, joystick controller library
Managed by PlatformIO (see platformio.ini):
- The robot generates a self-signed SSL certificate on first boot and stores it in LittleFS. First boot may take a minute.
- Turn off cellular data on your phone so it doesn't drop the robot's network.
- Disconnect from any VPN before connecting.
- If you're building the tilty robot, set both motors to position 0 in 2motor mode before assembling. Don't rotate the motors by hand after that.
- Corporate/managed phones may not work due to network restrictions.


