Give the creature a body: two servo legs, a phone for a brain. No terminal, no coding, no prior hardware needed.
Before you start, let's confirm your phone is supported. You do not need a SIM, just Wi-Fi. Load this page on the phone you plan to use and look for a green dot below.
The check page fails on my phone. Try a different browser on the same phone first. If it still fails, use a different phone for the first build. The phone side is hard to work around later.
Order these first to get started
PicoRobotics.py and set GPIO_PINS = {1: 15, 3: 13} (sockets 0 and 2). Two builders found that independently, thank you. Using an ESP32 instead of a Pico? That's a supported path with different (command-line) flashing steps: see the ESP32 build guide. Anything else: ask in Discord.
And these you can find or source locally
Can I use SG90 servos instead? They will move, but the plastic gears strip once it starts walking. Get the MG90S.
My Pico has no header pins. This guide assumes pins already soldered on. A bare Pico needs soldering first.
I have a different carrier board. It may well work, the firmware auto-detects most PCA9685 boards, but this guide photographs the Waveshare. Check the optional boards list or ask in Discord.
Before building anything, let's confirm your hardware works. This is the only step you need a computer for. When it's done, the Pico board has a name and is on your Wi-Fi.
The Pico stays on the carrier board for everything, including flashing. Push it into the socket with the USB connector facing the end the board marks for USB.
RP2350 appears on your computer. No drive is normal if you forgot to hold BOOTSEL, unplug and try again.RP2350 drive.
This part needs a computer, not the phone. The installer talks to the Pico through its USB cable, and only desktop Chrome or Edge can do that. Safari and Firefox can't (they don't support it), and phones can't either. On the right setup, use the one-click installer. Anything else: the Thonny path below works everywhere.
Most people can skip this. It is the manual path for when the one-click installer isn't an option, or you want to see the files. Thonny is a free editor for MicroPython boards: thonny.org.
Connect: Run > Configure interpreter > MicroPython (Raspberry Pi Pico), port = the Pico's serial port (usbmodem… / COM…, or auto-detect). The Shell shows a MicroPython prompt when it's talking.
Copy 4 files from the kit download, each one: File > Open (This computer) then File > Save As (Raspberry Pi Pico):
PicoRobotics.py → save as PicoRobotics.pyact_engine.py → save as act_engine.pysecrets.example.py → type your Wi-Fi name + password into it, save as secrets.pyrelay_chip.py → save as main.py (the name matters, MicroPython auto-runs main.py at boot)Unplug, replug, and watch Thonny's Shell for PAIRING CODE: gb-…
gb-a3f9c1No serial port / COM port shows up. A blank Pico never shows one, that's normal. The serial port only exists after MicroPython is installed (2B). Before that you should see the RP2350 drive instead, with BOOTSEL held.
No RP2350 drive either. The cable is power-only, or it's not in the Pico's own USB port. Swap cable, use the Pico's port, hold BOOTSEL while plugging in.
The Pico still shows up as a drive after flashing. Replug without holding BOOTSEL. If the drive returns, the .uf2 didn't take, drag it on again.
The browser installer can't see anything. Web Serial is desktop Chrome and Edge only. Not Safari, not Firefox, not phones or iPads. Use the Thonny path instead.
No pairing code appears. Open Thonny and restart the Pico, any error prints in the Shell. The most common: Wi-Fi name or password typo, or a 5 GHz-only network.
Before any building: prove your phone can talk to the board. No battery needed yet, that comes in step 04. USB power alone is enough for the board to join Wi-Fi and dial in.
Stop at the green dot. Skip the wiggle button for now, the servos aren't plugged in yet.
No green dot. Wait the full 20 seconds. Then check the pairing code is exactly right, and that the Pico is actually powered (still plugged into USB, or plugged back in).
Still nothing, and you suspect the Wi-Fi. The robot's radio can only see 2.4 GHz networks. Most routers broadcast 2.4 and 5 GHz under one name and the robot quietly picks the one it can use, so usually there is nothing to do. But if your router gives the two bands separate names, you must give the robot the 2.4 GHz one. And if your network is 5 GHz only, the robot cannot join it at all: most phone hotspots share on 2.4 GHz, so that is the quickest way through if your cell plan allows hotspots.
Still nothing. Open Thonny and read what the board prints at boot. WIFI_FAIL means the network name or password, fix secrets.py and re-run step 2C.
The robot's phone is on cellular / a different Wi-Fi. Fine, that's the point of the cloud relay.
The plate's slots hold the board, both servos, and the battery pack by shape, no tape needed for any of it. Here's the whole thing seated, before legs go on:
Seat the board into its slot at the top of the plate, header pins up. It should sit flush and not rock.
Press both servos into their side slots, shafts pointing out to each side. They push in, no screws needed. A dot of glue or a small screw can secure them further if you want, but it's not required.
Never wire servo or battery power to the Pico's own pins. The carrier board handles power.
01
My servo wires are different colors. Signal is the lightest (orange, yellow, or white), ground the darkest (brown or black). Follow the board's labels.
My board has 8+ servo ports. Use only the two named here. The rest are for other projects.
Every power-up, the robot runs a leg check. The shafts are still bare, so watch the splined output shaft on top of each servo (the little post the horn will later clip onto): it rotates part of a turn each time, and you will hear the servo whir.
Every time you switch the carrier board on, it runs this calibration sequence first. Confirm the right servo moves first (you will confirm this again in step 07):
Nothing moves. Board switch on? Fresh batteries? Servos only ever move on battery, never on USB alone. On a carrier board other than the Waveshare or the Kitronik 5329, the driver may be talking to the wrong pins: see want to use another board? in the parts list.
Only one moves. Reseat the still one's plug, and check it is in socket 0 or 1, no other socket does anything. Still dead? Swap the two servos between the sockets: if the fault moves with the servo it is the servo, if it stays put it is the socket.
They twitch and the board restarts. Weak power. Fresh lithium AAs, or a 5-6 V supply that can give 2 A.
A servo buzzes hard or runs hot. Power off, check the plug isn't shifted over by one pin.
The trick: the boot check ends by parking both servos at 90°, so you can attach the legs after that.


A leg sits crooked at rest. Pop it off the shaft, rotate it one tooth, re-seat on the next 90° hold.
The leg works loose. The small screw is not optional.
Legs are on, so now left and right can be settled for good. Power-cycle and watch the check again: both legs center together first, then the right leg swings on its own, then the left. That solo-right-before-solo-left is how you name the sides.
Reminder from step 04: it's the robot's own left and right, its left is your right when you face it.
Wrong leg first? Swap the two servo plugs on the board, and power-cycle to check again.
Then prove the phone can drive it: back to growbot.dev/tester, green dot, tap connect (wiggle test). The legs wave. In tab 1 · Calibrate, run Step 1 · which leg and confirm tapping left moves the left leg.
Green dot but no wiggle. Board switch on? The board obeys only on battery power.
It was online in step 03, now it isn't. Power-cycle and give it 20 seconds. If it keeps dropping mid-play, that is usually weak batteries browning out the board.
The board, servos, and battery are already seated in the plate from step 04, and the legs are on. The one thing left: the phone.
The body is done. Everything from here happens in the controller, on the phone riding the robot.
On the phone that rides the robot, not the one you have been reading this on. If they are different, type it in over there:
growbot.dev/tester
Work left to right through the tabs:
| you did | which proved |
|---|---|
| phone check passed | the phone can be the brain |
| pairing code printed | board flashed, on Wi-Fi, has a name |
| green dot | phone ⇄ cloud ⇄ board all talk |
| both servos moved | power + wiring + ports correct |
| legs on at 90° | both legs start straight, so the walk begins from a known shape |
| right leg first, left means left | commands reach the right servo |
| body assembled | ready for the controller |
Anything on this list failing? Its step above has a "trouble with this step?" panel, and the 🤖 box at the top of the page knows this whole guide.