OVO v1 / display build

Code-CAD portfolio project · build123d · 2026

Ovo

A folding hydrokinetic charger.

A portable water turbine for streams and towing, designed end to end as parametric Python CAD. Packed, it is a 75 mm egg. Deployed, three blades swing open into a 194 mm rotor.

Display build. Real bearings and folding blades, no electronics. Not yet printed or tested in water, so every performance figure on this page is a model estimate.
Ovo deployed: an ivory egg-shaped hull with two side fins and three orange blades open at its tail
Deployed · Ø194 mm rotorCAD model

Drag to orbit · Ctrl + scroll to zoom

0°
0 %

The full CAD assembly, compressed for the web. Fold angle 0° is deployed, 90° stowed. Spin turns the rotor only when the blades are open; it stops at the angle where they fold home. The cutaway shows the v2 front shell with its cable gland.

What it is

A turbine that packs into an egg

Ovo is a generic portable hydrokinetic charger: an axial turbine you tether in a stream or tow behind a boat. The hull is a Myring body of revolution shaped like an egg. The rotor sits downstream at the tail, and its three blades fold forward into shallow pockets, so the packed product is a clean egg with three orange stripes.

This first version is a display build with real mechanics. The rotor turns on two ball bearings and the blades really fold, held by magnets at both ends of their travel. The generator bay carries a printed replica of the motor chosen for v2, with its real envelope and bolt patterns. The shaft seal pocket, the O-ring gland at the equator and the cable gland seat are modelled too, so v2 can add electronics without a redesign.

Every dimension lives in one Python file, ovo/params.py. The design studies write JSON that the CAD reads, and one command rebuilds every part, runs the checks and exports the STL and STEP files and the model at the top of this page.

Hull
Myring profile, Ø75 mm, built length 161 mm, L/D 2.15, 2.4 mm wall
Rotor
3 blades, Ø194 mm, downstream, tangential hinge pins at r 14 mm
Blades
NACA 44xx, t/c 18 to 12 %, chord 25.1 mm to 14 mm, twist 17.2° to 5.2°, 0.6 mm trailing edge
Design point
1.5 m/s current at TSR 4; towing at 2 to 2.5 m/s
Drivetrain
8 mm stainless shaft on 608-2RS and 688-2RS bearings, thrust collar, dog coupling, lip seal pocket for v2
Joint
Split at the equator: 3-lug bayonet with click tines, AS568-141 O-ring gland for v2
Roll fins
2 slide-in Clark Y fins, 30 × 70 mm, 12.5° incidence, on recessed rails with flush blanking strips
Generator
Bay for a CubeMars GL40 KV70 in v2; a printed replica in v1
Printer
Bambu Lab A1, P1S or X1 (256 mm bed), PLA and PETG, one material per plate
CAD
build123d (Python, OpenCascade), one module per subassembly

Folding

Blades that fold forward into the hull

  1. Stowed

    Each blade lies in its own shallow pocket in the static tail, held by a magnet pair (about 2.3 N, estimate). The pockets line up at one rotor angle in every 120°, so they also lock the rotor while it is packed.

  2. Released

    The rotor sits downstream, so a folded blade points upstream along the hull. The current drags its tip aft and swings it open, 90° about a 3 mm pin on a tangential axis.

  3. Running

    Thrust presses each blade heel onto its stop on the hub, where a second magnet pair holds it. The aft pre-cone that makes a folded blade hug the hull gives the running rotor mild downstream coning.

This opening sequence is the design intent of the layout study. It has not been tested in water yet.

Animation rendered from the CAD assembly: the stowed egg unfolds its three blades and the rotor spins.
Fold 90 degrees: blades stowed flush in the hull
90° stowed
Fold 60 degrees: blades lifting out of their pockets
60°
Fold 30 degrees: blades nearly radial
30°
Fold 0 degrees: rotor deployed
0° deployed

Four poses from the CAD assembly. The interference matrix runs on fine meshes of the CAD solids at exactly these poses and finds 0 defects. Stowed gaps include 0.171 mm from the blade to its detent boss, 0.337 mm from the blade span to the pocket floor (target 0.3) and 0.899 mm from the blade root to the static tail (target 0.8).

Engineering

Four studies, one source of truth

Each study is a Python module that writes JSON. The CAD reads those files, so a change in a study reaches every part on the next build. The derivations are in the report.

Blade: constraint-aware BEM

Blade element momentum theory with Prandtl tip and hub losses and Buhl's high-induction correction, 24 elements, and section polars from NeuralFoil (a network trained on XFOIL) at Reynolds numbers of 55k to 83k. The solver reproduces the Glauert ideal rotor (Cp 0.5185 against 0.5185 from theory).

The unconstrained optimum is then made printable: straight chord and twist laws, a 14 mm minimum chord and a 0.6 mm blunt trailing edge. Together these constraints cost 2.4 % of Cp at the design point, from 0.376 to 0.367.

Cp 0.367 at TSR 3.8, 1.5 m/s18.3 W shaft power at 564 rpm estimate

ovo/bem.py → data/blade_design.json

Power coefficient against tip speed ratio at 1.5 m/s, BEM model. The generator runs the rotor faster than its Cp peak because the motor loses less in its windings at lower torque: TSR 6.05 with a diode bridge (5.79 with active rectification).

Data table

Fold kinematics and layout

The hinge pins are tangential, at r 14 mm and 116 mm behind the nose. Folding a blade 90° about such a pin maps the aft direction to the outward one, so a blade built with an aft pre-cone that copies the hull curve lands flat on the convex tail.

The layout study solved that curved pitch axis, swept the hinge position for root clearance and cut the pockets: about 3 mm deep at the equator and under 7 mm along the blade span. Neighbouring blades stay at least 3 mm apart at every fold angle, and 5.6 mm clear of the fins.

ovo/layout.py, ovo/layout_internal.py → data/layout*.json; chart traced from out/web/ovo.glb

One blade in its own plane at fold 0, 30, 60 and 90°, traced from the CAD model as built. Millimetres, flow left to right.

Generator trade study

12 off-the-shelf motors (gimbal outrunners, drone motors, a frameless torque motor and an industrial flat motor) were coupled to the BEM rotor and scanned for their best electrical operating point, with copper, diode and iron losses. The stronger candidates that fit the hull land within a few watts of each other, so the choice came down to data quality.

The CubeMars GL40 KV70 has a complete, self-consistent datasheet and a drawing of both mounting faces. Towed at 2.5 m/s it freewheels at only 35.2 V, so open phases are electrically safe for a 60 V input stage; hydrodynamically the rotor must stay loaded, because a free-wheeling rotor cavitates from 1.6 m/s and the fins would roll the hull.

One conflict is still open: from about 2.1 m/s, keeping the blade tips free of cavitation needs more torque than the GL40's continuous rating allows (3.4 times its rated copper loss at 2.5 m/s, estimate). Towing faster than that needs a decision in v2.

GL40 at 1.5 m/s estimate7.66 W DC through a diode bridge, 7.96 V, 0.96 A, TSR 6.05 (time-domain model with its 1.8 mH inductance)8.92 W with active rectification

docs/notes/hardware-and-prior-art.md → data/hardware.json

DC power at 1.5 m/s through a passive diode bridge (block model), each motor at its best rotor speed. Hollow dots: the datasheet allows several readings of KV or resistance, one dot per reading. The GL40 is not the highest dot; it was chosen because its datasheet is complete and self-consistent. Model estimates; iron loss assumed where unpublished.

Data table

Verification

The integration step checks the CAD on every build: a validity audit of the B-rep solids, then interference, clearances and spin on fine meshes of them (0.02 mm chord). It writes the results to a JSON file, which the design notes and this page quote.

ovo/cad/assembly.py → out/cad/checks/assembly.json

  • PassInterference matrix in 7 states (stowed, 60°, 30°, deployed, cutaway, packed, v2): 0 defects. The only overlaps are intended press fits and threads.
  • PassSpin sweep in 10° steps over 23 rotor and static part pairs: nothing rubs.
  • Pass25 key clearances against their limits, for example the 0.600 mm hub running gap and the 0.337 mm stowed blade to pocket floor.
  • Pass25 print STLs (the three blades share one file): watertight, consistent winding, each in print orientation on a 256 mm bed.
  • PassThe fold you drive on this page uses the CAD's own pivots: a browser check lands the blades on the CAD solids within 0.011 mm.

Build it

Printable on one 256 mm bed

18 printed parts plus three sacrificial blade cradles: PLA for the shells and the rotor, PETG for the parts that see torque, sliding or a press fit. There are no slicer supports. Each blade prints standing on its own cradle, and the shells print on their equator and tail faces without supports. Print the tolerance coupons first and tune the press fits to your printer.

Filament235 gPLA 204 g, PETG 31 g, one display build, plus brims and coupons
Bought parts€35.48priced lines of the hardware study's list, bought in pack sizes (€15.28 pro rata); the as-built list's priced lines: €11.88 pro rata
v2 adds€74.42priced lines: the GL40 motor and the cable gland (seal and O-ring not priced yet)
Print plates, from the print plan
PlateJobMaterialPartsHeight mmg est.
0tolerance couponPLA; print a PETG copy tootolerance_coupon, tolerance_coupon_b and 3 fit keys22.034.2
1shells and stripsivory PLAfront_shell, aft_shell, fin_blank_0, fin_blank_174.6127.5
2rotorPLA, each blade on its cradlespinner, hub, blade_0, blade_1, blade_2, spinner_cap42.951.1
3drivetrain + finsPETGfin_0, fin_1, motor_carrier, adapter_spacer, claw_a, claw_b73.731.1
4cutaway shellsPLA, optional display variantfront_shell_cutaway, aft_shell_cutaway74.6100.7
5generator replicablue PLAgenerator_bell, generator_stator20.024.5
6v2 front shellPETG, v2 wet build only: replaces front_shellfront_shell_v274.657.8

Prices come from the hardware study's bill of materials, drawn up before the CAD; 11 lines, among them the shaft, pins, collar and screws, are not priced yet, and the CAD's final magnet set (18 magnets in three sizes) differs from that list, so treat the totals as indicative. The report covers the bill of materials, and the assembly order (12 steps) is in docs/notes/cad.md.

Roadmap

From display model to charger

  1. Print and assemble the display build

    Tune the fits with the tolerance coupons, then check the fold detents, the bayonet click and the spin on real parts.

  2. Bench-test the real generator

    Measure the GL40's resistance, KV, inductance and no-load loss. Its iron and friction drag is an assumption today.

  3. Electronics

    A three-phase rectifier and a buck-boost stage to 5 V USB, with a current limit at the motor's rating and a load line capped against tip cavitation above 2.2 m/s. Open: the current limit and the cavitation cap conflict above about 2.1 m/s (a bigger generator, a short-time overload, a brake, or towing at most about 2.1 m/s).

  4. Wet build

    Shells, hub and spinner in PETG; the v2 front shell with the M12 cable gland; the O-ring at the equator and the lip seal on the shaft.

  5. Water test

    Run it in a stream or under tow at 1 to 2.5 m/s and compare measured power, speed and thrust with the BEM curve.

  6. Design follow-ups

    Re-run the blade loads on the as-built hinge, a tow bridle or swivel for roll, crush ribs to locate the fins (their play spreads the anti-roll couple), and buoyancy trim for the wet build.

Files

Source, report and print files