BLACKFYRE
MG—01
MODE
LANG
←
ALL POSTS
05 · Writing / 2026
03 NOV 2026 · 7 MIN READ

Upping the Ante for Next Year's Career Day

A school career day sent me back to Spooder, the hexapod I parked in 2024, and one weekend with AI agents produced the firmware it had been waiting for.

From a four-legged kit robot to Spooder, a six-legged robot on a Servo 2040
CONTENTS
04 +

On 8 October I was at my daughter’s primary school for career day, with a robot that fits in my palm, a kit my daughter and I built together in 2024: four 3D-printed legs, eight of the cheapest servos known to man and an ESP8266 to drive them. The children loved it. It also left me with a problem, because next year I’ll have to bring something better, and the something better has been sitting half-built since February 2024.

Enlarge imageA small grey 3D-printed four-legged robot held in an open hand, with eight blue SG90 micro servos, a small LiPo battery and two capacitors on its body
FIG. 1The career day robot: four legs, eight SG90 servos and a 400 mAh battery

The robot on the shelf

Spooder is a hexapod: six legs, three servos each, eighteen in all. It’s a shameless iteration over Aecert’s Hexapod V1, whose mechanical design and movement code (the inverse kinematics, the Bézier foot paths and the gait table) it reuses with the author’s permission. I printed the frame and started assembling it in February 2024, on an Arduino Nano RP2040 Connect with two PCA9685 boards to drive the servos, and within a week I had a moving leg. Then it stopped. The two servo boards shared one I²C bus that didn’t have the bandwidth for eighteen servos, each needed its oscillator calibrated by hand, and the Bluetooth library I used for the gamepad has since dropped support for the Nano’s radio. The frame stayed half-built because the firmware never caught up.

A weekend with the firmware

On Friday 16 October I set up the toolchain and OpenSpec in the old repository, and by Sunday afternoon it held 101 new commits. The robot now runs on a Pimoroni Servo 2040, which drives all eighteen servos straight from the RP2040’s crystal-timed PIO, with no bus in between, and measures its own servo current and voltage. That made room for power protection: overcurrent, sustained overload, brown-out, low and high voltage and an emergency stop each latch a fault and cut the servos at once, and clearing a fault never sets the robot moving again by itself. A LilyGO T-Display with an ESP32 pairs a Bluetooth gamepad and talks to the robot over a serial link, and a desktop calibrator written in Go drives and calibrates it over USB. None of it moved a real leg that weekend. Everything ran against a virtual robot: the robot’s own control loop compiled for my computer behind a fake USB port, which the calibrator and the end-to-end tests talk to as if it were the board.

Enlarge imageThe Spooder desktop calibrator in a dark theme, in Calibrate mode: a grid of joint cards with offset and pulse controls on the left, and on the right a side view of leg 1 and a top view of all six legs
FIG. 2The calibrator against the virtual robot in Calibrate: every joint's offset and pulses, and leg 1's live pose
Enlarge imageThe same calibrator with an orange emergency stop banner across the top, faults showing emergency stop and output off, and the legs pane on leg 3
FIG. 3An emergency stop from the app: the fault latches and output stays off until it's cleared
FIG. 4Spooder's architecture: the robot, the gamepad bridge, the desktop tools and the virtual robot. Click a node, or press ? for the guide.Open in a new tab ↗

I built it the way I described in How I Work with AI Agents, with each change planned in OpenSpec, implemented by an agent and reviewed by Codex on my machine. I could have written all of it myself, but it would have taken far more time than two days of inattentiveness, which is about what that weekend gave it. That changed what I let myself build: a calibrator and a virtual robot are the kind of tooling that waits until the main thing works, and here they arrived first.

For anyone who wants to read the firmware: everything that makes a decision lives in core/, which is plain C++ with no SDK, no hidden globals and time passed in as an argument. The board code only moves bytes between the hardware and the core, so the robot’s 20 ms tick runs unchanged on my computer, and that is what the virtual robot is. Each tick reads its input and checks the power before anything else, so an emergency stop lands within 20 ms. Protection can cut the servos but never moves the robot, and after a fault nothing moves until someone asks for a mode again. Every byte from the outside, whether a gamepad report, a USB frame or a request from the phone portal, is validated in the core and rejected or visibly clamped, never quietly fixed. Safety limits are a header the build refuses to go without. These rules live in the repository as instructions the agents follow, so every change is held to them.

Next: the legs

Since that weekend all eighteen MG996R servos have come to life on the Servo 2040. Five of them wouldn’t move at first, but they were only lightly seized, and regreasing their gears got them singing with the rest. The bridge now reads the real robot’s telemetry over the serial link and shows it on pages in the same look as this site, which its left button cycles through: driving, the last minute of supply voltage and current, and the link. An emergency stop, a fault or a lost link is spelled out on every page. The firmware kept growing as well: Spooder can say hi or wiggle when I press a button on the gamepad, and it slows its own movement wherever a joint would have to turn faster than an MG996R manages under load.

FIG. 5My video of Spooder's eighteen servos running on the bench, with the calibrator on the screen behind them
Enlarge imageFour pages of the bridge screen: driving at 6.08 V and 1.84 A with ticks holding the recent peak and low, the last minute of voltage and current as traces, the link rates with the bridge as the source, and the drive page after a brown-out with LOW V and BROWN-OUT in an orange strip
FIG. 6The bridge's screen pages, rendered on the computer from the bridge's own drawing code: drive, power, link, and the drive page after a brown-out
Enlarge imageThe black 3D-printed hexapod frame with red parts, one leg fitted with its servos and cables and the other leg mounts still empty, next to an 8BitDo gamepad on a clear plastic box lid
FIG. 7The first leg on the frame, beside the gamepad that will drive it

The electronics needed a home on top of the frame, so on Saturday 24 October an agent designed one in code. A Python script builds the parts with build123d from named measurements: a deck screwed to the frame’s inserts, a black cover with yellow inlays on its lid, and four yellow corner guards, printed hollow so they give in a knock or a rollover. Before it writes a single print file it checks them: nothing reaches into the legs’ sweep, every part prints in PETG without supports, every screw can be reached with a screwdriver, and the air has a clear path from the vents low on one side to the fan position high on the other. The cover lifts off after three screws with nothing to unplug, because calibrating and flashing happen with it open. The sizes are nominal until I measure the bought parts with calipers, so none of it has been printed yet.

Enlarge imageA render of the electronics mount on the hexapod’s frame top: a faceted black case with SPOODER and yellow chevrons on its lid, a yellow guard on each corner and a window in the lid
FIG. 8The mount closed on the frame top: the black cover with its inlays and the four corner guards
Enlarge imageA render of the mount with its cover off: the boards and converters as blocks on the deck, with the cover’s three posts standing between them
FIG. 9Cover off, the way it will run while I calibrate and flash it
Enlarge imageAn exploded render: the four corner guards lifted above the cover, the cover above the deck and its electronics, and the frame top below
FIG. 10Exploded: the corner guards snap onto the cover with detents, without screws

What’s left is printing and assembly. The first leg is on the frame, and the other legs, the mount, the Servo 2040 and the bridge still have to go in before I find out what the virtual robot didn’t catch.

Try it without a robot

You don’t need the hardware to poke at Spooder. On Linux, with mise installed, clone the repository, run mise install and mise run setup, then mise run desktop-sim. That builds the virtual robot and the calibrator, runs the robot in your terminal and opens the calibrator on its port. Click Connect, then Calibrate, and you’re where the calibrator screenshots above were taken. The terminal takes commands that break things on purpose: supply 7.5 sets the supply voltage, estop on presses the emergency stop, load 5 loads the servos and unplug pulls the cable. The readme lists the packages the calibrator needs.

I have until next year’s career day. When Spooder walks, I’ll write about that too.

CITE THIS POST

Referencing this in a paper or thesis? Here’s a BibTeX entry.

galicz2026upping.bib
BIBTEX
1@misc{galicz2026upping,
2 author = {Galicz, Mikl{\'o}s},
3 title = {{Upping the Ante for Next Year's Career Day}},
4 year = {2026},
5 month = nov,
6 howpublished = {\url{https://blackfyre.ninja/blog/upping-the-ante-for-next-year-s-career-day/}},
7 url = {https://blackfyre.ninja/blog/upping-the-ante-for-next-year-s-career-day/},
8 urldate = {2026-11-03},
9 note = {Blog post, blackfyre.ninja}
10}
TAGS
06 · CONTACT

Have a system that needs building?

GET IN TOUCH → PROJECTS →
PRODUCT DATA SHEET
MG—01
BLACKFYRE
S/N MG-1985-1027
Miklós Galicz — Golang Advocate · Solution Architect
MODEL
MG—01 "Miklós Galicz"
SERIES
1985
ORIGIN
Nagykovácsi, Hungary
FUNCTION
Senior Full Stack Engineer · Solution Architect
CORE LANGUAGES
Go · PHP · JavaScript
SPOKEN
Hungarian · English · German
SERVICE LIFE
~20 years in software, ongoing
POWER SUPPLY
Coffee, 2–4 cups / day
DIMENSIONS
1 × human, standard size
OPERATING TEMP.
Calm under production incidents
CONNECTIVITY
[email protected] · github.com/blackfyre · linkedin.com/in/galiczmiklos
Less, but better. Specifications subject to continuous improvement.
● ● ●