Get moving in five steps
- Flash the Uno — from the phone. Install the app, plug the Uno into the phone with a USB-OTG adapter and a data cable, then Setup → Flash over USB: the app programs and verifies its built-in firmware and stores your HC-05 baud / pins in the Uno. (Arduino IDE also works: library Adafruit PWM Servo Driver Library, sketch folder
uno_robot_controller, oravrdudewith the.hexbelow.) - Wire it. PCA9685 on I²C (A4/A5), HC-05 on D10/D11 with a 1 k/2 k divider on its RXD, servos on a separate 5–6 V supply with a common ground. Full table below.
- Pair once. Android Settings → Bluetooth → pair HC-05 (PIN
1234). - Connect. Connect tab → HC-05 (or tap the USB device to drive it over the cable). The status bar turns green and shows
OK v1 16 1. - Calibrate from the app. Setup → pick Custom N or the Robot Maker 16 layout → tap Calibrate on each joint: nudge the servo, set centre / min / max, tick Invert if it moves the wrong way. Calibration is sent to the robot on every connect — you never re-flash for it.
What the app does
Control
One slider per joint, grouped Head / Arms / Legs / Waist. Mirror L↔R, Home, Stop, Relax, slew-speed limit. Sends are coalesced at 20 Hz so 9600 baud never backs up.
Poses & clips
Snapshot the current pose, recall it, chain poses into keyframed clips. Five Robot Maker presets (Wave, Bow, Squat, Walk in place, Look around) play on joints named like Robot Maker's (shRx, elL…).
Voice
Tap-to-talk, on-device recognition, a local grammar: “left arm up”, “bend both knees a lot”, “head to 120”, “play walk”, “stop”, “relax”, “slower” — plus phrases you teach that recall a pose or play a clip.
Setup
Joint ↔ board/channel map, servo type, live calibration, HC-05 baud/pins, in-app firmware generator with Save / Share, wiring guide, JSON backup & restore.
Flash over USB-OTG
The app is the programmer for the whole classic Arduino family: Uno / Nano / Pro Mini (STK500v1), Mega 2560/1280 (STK500v2) and Micro / Leonardo (Caterina, 1200-bps touch) — auto-detected by chip signature, with verify. Link settings go into EEPROM afterwards — one firmware per chip, never re-flash for settings.
Example library
16 editable examples with wiring diagrams — LED blink to PCA9685 servo waves. Stock examples ship precompiled for every board and flash straight from the phone, no internet needed; edited code compiles on this server (arduino-cli) before burning over the OTG cable.
Animation studio
Pose the robot, capture keyframes, and the in-between motion is created automatically. Keyframes are draggable diamonds on a timeline — closer = faster; scrubbing the playhead moves the robot live. Saved animations play from the Poses tab or by voice.
Robotic Car
Uno/Nano + L298N + HC-05: dual-joystick landscape drive — left stick forward/backward, right stick left/right, held like a game controller — with a big STOP, auto-connect to your paired HC-05, automatic re-pair (PIN 1234), and one-tap flashing of the bundled car firmware over USB-OTG. Simple F/B/L/R/S protocol — any Bluetooth terminal works too.
Quadruped Robot
Uno + PCA9685 + MPU-6050: a 4-legged self-balancing walker. Trot gait (walk, turn, arcs) with 100 Hz gyro balancing on the Arduino, dual-joystick drive, a leg-test mode that identifies all 8 servos, and one-tap firmware flashing.
Wiring
Servos must be powered from their own 5–6 V supply on the PCA9685 V+ terminal (≈1 A per MG996R moving, 2.5 A stalled) with a common ground to the Uno. Never from the Uno's 5 V pin. Nothing moves at boot — a servo is only driven after the app commands it, so keep the robot supported the first time.
ARDUINO UNO <-> PCA9685 A4 (SDA) ---- SDA 5V ---- VCC (logic) GND ---- GND second board (optional): same SDA/SCL/GND, bridge its A0 jumper → address 0x41 SERVO POWER external 5–6 V (+) ---- PCA9685 V+ external (−) ---- PCA9685 GND AND Uno GND 1000 µF across V+/GND near the board HC-05 <-> UNO (SoftwareSerial, 9600 baud) VCC ---- 5V GND ---- GND TXD ---- D10 (3.3 V logic is read fine by the Uno) RXD <--- D11 through 1 kΩ, plus 2 kΩ from RXD to GND (5 V → 3.3 V divider) never D0/D1 — they are the USB port used for flashing
Serial protocol v1
Newline-terminated ASCII, ≤ 95 characters per line. i = logical index (board×16 + channel), degrees are absolute servo degrees 0..180. The USB port speaks it too, so you can test from the Arduino Serial Monitor.
| Command | Meaning |
|---|---|
M<i>:<deg>[,<i>:<deg>]* | set target(s) — a channel is driven from its first M |
H / R / S | home (every commanded channel → centre) / relax (PWM off) / stop & hold |
V<deg/s> | slew speed limit, 0 = instant |
L<i>:<min>:<max>, C<i>:<deg>, U<i>:<minUs>:<maxUs> | runtime limits, centre and pulse range (the app sends these on connect) |
K<baud>:<rx>:<tx>:<boards> / K | store the HC-05 baud, pins and board count in EEPROM → OK K / read them back → OK K 9600 10 11 1 |
? | → OK v1 <channels> <boards>; anything malformed → ERR |
FF FE n d0…d(n-1) ck | binary pose frame for clip streaming: d = 0..180 or 255 = skip, ck = Σd & 0xFF |
Downloads & docs
- robot-controller.apk —
- uno_robot_controller.hex — the exact build the app flashes; by hand:
avrdude -c arduino -p m328p -P COM5 -b 115200 -D -U flash:w:uno_robot_controller.hex:i - uno_robot_controller.ino — universal firmware source (defaults 1 board, 9600 baud, D10/D11; change them at runtime with
K). - PROTOCOL.md · WIRING.md · PAIRING.md
Build it yourself: the repo compiles the APK inside its own Docker image (JDK 17 + Android SDK 34) and serves this page — docker compose up in a clone is all it takes. The Android project lives in android/.
Troubleshooting
HC-05 not in the list
The app only shows paired devices. Pair in Android settings first; the module must blink fast (not already connected elsewhere).
Connected but “no reply to ?”
Uno not powered, sketch not flashed, or TXD/RXD swapped. Check with the USB Serial Monitor at 9600: ? must answer.
Servos twitch / Uno resets
Power. Separate servo supply, common ground, a big capacitor on V+. Never the Uno's 5 V.
Joint moves the wrong way
Setup → Calibrate → tick Invert. Limits and centre are per joint and live in the app.
Voice says nothing recognised
The recogniser needs the Google app and usually internet; install the offline language pack or untick “prefer offline”.
Presets don't move anything
They target Robot Maker joint ids. Rename your joints in Setup (headY, shRx, elL…) or use the Robot Maker 16 starter.
USB flashing finds no device
Use a real OTG adapter and a data cable (many are charge-only); the phone must support USB host. "No reply from the bootloader" with an old board → pick the 57600 option.