Lego Submarine

The Build

What the plan looked like

Depth stabilisation. Latching hatches. A clean internal layout. A submarine that would hold depth from a pressure sensor feeding the Pi, adjust its ballast automatically, and present itself neatly enough to photograph.

What shipped was a manual remote, whatever-held lids, and ballast taped to the top.

Parts

The ballast engine — a medical syringe. The seductive idea: move a few millilitres of air in and out of the hull and the whole thing rises or falls. I picked a syringe sized at roughly 5% of the hull's buoyancy. In theory, plenty. In practice — without proper mechanical engineering in the loop, every number on paper is an approximation — nearly half of that range got eaten by slop in the seals, flex in the tubing, and the general imprecision of a build not calibrated to the gram. The syringe worked. It just had less margin than I'd imagined.

Silicone hose to run from the syringe through the hull wall. Cheap, flexible enough to survive being worked by the motor.

Hull. First attempt: plexiglass tube, 50 cm long, 10 cm diameter — $40. Elegant on paper, too narrow in practice. I couldn't fit the electronics, the syringe, and the Lego assembly inside. Second attempt: 30 cm long, 13 cm diameter — $30. Shorter and fatter is, counterintuitively, cheaper. Still tight. And there's a trap with going wider: a bigger hull needs more ballast, and if your ballast is steel balls in a loose pile, the packing gaps cost you volume faster than the extra diameter gives it back.

Ballast — $10 of steel balls from an MMA shop, where they use them to fill training accessories. Dirt cheap. Denser metal gets more mass per litre if budget isn't a constraint. Steel was fine.

Sealing the ends — rubber O-rings plus silicone tape, with small plexiglass rings glued inside the lids to give the O-rings something to seat against. Tried several combinations before this one held.

Lego mechanism — three motors (one with step control), structural pieces, a propeller. $140.

Controls.

Total

Item Cost
Hull — first attempt (too narrow, abandoned) $40
Hull — second attempt (shipped) $30
Ballast (steel balls) $10
Lego mechanism $140
Raspberry Pi + Lego hat $100
Battery pack $40
Cables, accessories, sensors $100
Wireless transmitter $10
Total $470

The syringe, silicone hose, O-rings, silicone tape, and plexiglass rings were cheap enough to round to noise. $40 of the total paid for a hull that never touched water — a fair tax for learning that the second one had to be wider.

What got cut

Three ambitions quietly collapsed during the build. Each one felt small at the time. Together they define the distance between the submarine I'd sketched and the one that shipped.

Depth stabilisation → manual control. The plan: a pressure sensor feeds the Pi, the Pi drives the syringe, the hull holds depth. What shipped: I move the motor directly from the remote; the Pi exists only to translate the incoming comm signal into a Lego signal. The closed loop never closed.

Latches → whatever held. The plan: proper hatches that clamped shut. What shipped: a seal combination I'd trust for an afternoon in a pool, nothing more.

Neat internal layout → ballast taped on top. The plan: everything tidy inside the hull. What shipped: some of the ballast on the outside, held by tape, because there wasn't room.

None of these concessions killed the project. Each one got the submarine closer to the water. That's the trade I didn't understand at the start: the version that exists beats the version that was specified.

Lessons learned

Supply chain eats iteration cycles. The parts list above understates the true cost. Hunting down latches that might work and ordering them from AliExpress was expensive in both money and time — and none of it shows up in a receipt. Each iteration ran four to six weeks: a wait for parts, a few attempts to make them work, and, the largest slice, thinking about how to approach the problem. In hindsight that thinking was less productive than it felt. Adopting the best solution available inside a fixed time box would have moved the build forward faster, even if it meant shipping something cruder.

Software without a test environment. I was writing the control code in Python, which I was learning, remotely on an old Raspberry Pi, before AI assistants existed. No surprise the scope got cut — I had no patience for that loop. A minimal way to run the logic off-device, simulating the sensors and motors, would have made depth stabilisation something I could at least attempt. Without it, I bypassed the whole idea.

No log, no memory. I reverse-engineered this entire post from old emails, because I wasn't keeping notes while I built. That's why every project I start now has a log from day one, tracked in public. If it's worth building, it's worth leaving a trail that someone — including future me — can follow.