A 3D-printable, ESP32-controlled servo harness for programmatically pressing phone buttons. Primary use case: booting phones into fastboot mode unattended.
| Phone | Status |
|---|---|
| Pixel 10 Pro | v1 |
Two SG90 micro servos are mounted in a 3D-printed cradle that clips around the phone. Each servo has a small arm that presses a button (power, volume-down). An ESP32 dev board drives the servos and accepts commands over USB serial.
- Force shutdown - Press and hold power for up to 30 seconds (or until told to release).
- Enter fastboot - Hold volume-down, then briefly press power. Release when told or after a safety timeout.
| Part | Qty | Notes |
|---|---|---|
| ESP32 DevKit v1 (or similar) | 1 | Any ESP32 board with USB |
| SG90 micro servo | 2 | 9g, 180-degree |
| M2x8 self-tapping screws | 4 | Mount servos to cradle |
| Rubber/silicone bumper pads | 2 | Glue to servo arms for grip |
| USB-A to micro-USB cable | 1 | Power + data to ESP32 |
| 470uF electrolytic capacitor | 1 | Optional, across servo 5V/GND |
ESP32 GPIO 13 --> Power servo signal (orange)
ESP32 GPIO 14 --> Volume-down servo signal (orange)
ESP32 5V --> Both servo VCC (red)
ESP32 GND --> Both servo GND (brown)
Built with PlatformIO (Arduino framework).
cd firmware
pio run -t uploadCommands are newline-terminated ASCII:
| Command | Description |
|---|---|
PRESS_POWER <ms> |
Press power button for <ms> milliseconds |
PRESS_VOLDN <ms> |
Press volume-down for <ms> milliseconds |
FASTBOOT [shutdown_ms] [combo_ms] |
Run full fastboot entry sequence |
RELEASE_ALL |
Immediately release all buttons |
STATUS |
Report current state |
PING |
Returns PONG |
Responses are newline-terminated:
| Response | Meaning |
|---|---|
OK <detail> |
Command accepted / completed |
ERR <detail> |
Error |
STATE <json> |
Status response |
PONG |
Ping reply |
OpenSCAD source in cad/. Export STL and print with:
- Material: PLA or PETG
- Layer height: 0.2mm
- Infill: 20%+
- Supports: not required
pip install pyserial
python host/mobilemash_cli.py --port /dev/ttyUSB0 fastbootApache 2.0