# CB02 — circular modular toy base, revision 0.2

29 September 2026. **Engineering prototype, not a released print-and-build kit.**
The user explicitly relaxed the original 100 × 50 mm footprint. This revision
uses a 114 mm circular shell and component-led packaging. It supersedes MB01 v0.1;
the earlier source and published review are retained as history.

Latest CAD verification: 31 component instances, 72 valid leaf solids, zero
unintended pairwise intersections, at least 1.2 mm conservative wheel clearance,
27 unobstructed nominal sensor-axis/cone-edge samples and clear dock bores.
These checks establish geometry consistency, not real-world sensing or retention.

## Architecture

Coordinates are millimetres: +Y forward, X left/right, Z above the floor.
The shell roof is Z49, hidden dock top Z50.5 and locating keys Z52.7. The split is
Z25 / 25.25. Nominal wall/floor is 2 mm, outer edge radius 3 mm, clearance 4 mm.
Two official 32 mm wheel models rotate about X at Y16, Z16, centres X±50. A rear
ball caster sits at Y−44. This frees the front face for small optical sensors.

Two active Pololu 5138 MP 6 V encoder motors replace the unavailable right-angle
motor. They are currently offered on backorder, not confirmed stock. The vendor
archive explicitly shares one exterior STEP across precious-metal brush variants;
internal gear ratios are not represented. Wheels are Pololu 1088, sold as one pair.

The protected battery sits on a removable strap tray behind the axle. Its official
STEP occupies 63 × 37 × 6 mm including lead stubs, larger than product text
62 × 34 × 5 mm. The larger geometry controls this model; verify a delivered cell.
Two millimetres of PCB underside clearance is provided on the removable electronics
deck. A top-off service approach exposes both USB sockets; there is no sealed
external charge port in this iteration.

The display, microphone, speaker and two servo candidates remain in the generic
removable upper hardware carrier. It is a review fixture, not a final character.
Servo axes/arms and final bracket retention remain body-specific design work.

## Actual geometry and provenance

`../../references/components/sources.json` records official download URLs, retrieval
date and SHA-256 checksums. No rigid bought part has been scaled to make it fit.

- **Official STEP:** both motors, both wheels, caster, battery, DRV8833, 5 V boost,
  USB-C charger, MAX98357 amplifier, all three ToF carriers and upper speaker.
- **Official PCB-derived reconstruction:** IMU outline and drill locations from the
  Adafruit EAGLE source, with reconstructed major component/connector heights.
- **Detailed but provisional reconstructions:** XIAO Plus shield/USB/board, SG92R
  housings/ears/output bosses, Waveshare LCD and MEMS microphone. These are not
  manufacturer STEP and cannot establish final purchased-part fit. The Seeed Plus
  KiCad project is saved with references; the supplier's 3D link leads to GrabCAD,
  and an exact downloadable Plus STEP was not obtained.
- The official Pololu ToF file is shared across four sensor variants. PCB holes
  and overall carrier geometry are vendor data; package appearance is generic.
- Pololu wheel and caster references each combine their parts into one solid.
  Colours in presentation are illustrative; they do not define manufacturing
  material. Vendor model internal contacts are not a separate mechanism simulation.

Adafruit CAD Parts repository: MIT, copyright Adafruit Industries, accompanying
license retained. IMU board source: accompanying LGPL text retained. Pololu models
are public supplier reference files, with supplier ownership/notices preserved;
no blanket open-source license is asserted for them. Seeed source retains its
original project attribution. Reuse/redistribution rights must be checked before
commercially redistributing a component library. No Otto CAD/code was copied.

## Front sensing

Use a forward-facing **VL53L1X (Pololu 3415)** and two **VL53L4CD (3692)** carriers
at X±25, Y39, Z18, tilted 45° below horizontal. The optical origin is the centre of
the shared source package at local (6.858, 8.89, 2.07). The carriers have real PCB
mount holes and separate removable brackets. The optical holes are uncovered;
ordinary dark cosmetic plastic is not an assumed infrared window.

The VL53L4CD has a typical 18° full field of view and near-floor capability; the
VL53L1X typical full FoV is 27°. These are cone approximations, not calibrated
coverage. At 18 mm height and 45° tilt, the floor centre is 18 mm ahead of the
sensor, Y57. Vertical FoV limits meet the floor at approximately Y52.1 and Y63.8.
The wheel contact line is Y16, leaving **36.1 mm** to the conservative near-FoV
boundary for a straight perpendicular edge. Detection thresholds and mixed
floor/drop returns can consume that margin. This is not a guaranteed warning
length for angled edges, turning, textured/glossy/dark surfaces or invalid readings.

Illustrative braking budget only: at 100 mm/s, 60 ms total sensor/control latency
and 500 mm/s² deceleration, stopping distance is v·t + v²/(2a) = 16 mm, before
safety margin. None of those values is measured. Derive the real speed limit from
measured latency, braking, floor readings, load and traction; stop on stale/invalid
readings. Do not interpret missing return as clear travel.

**Front-only sensing does not protect reversing, sideward arc motion or every
orientation of a table edge.** Add rear/perimeter coverage or restrict motions
before untethered tabletop operation. A single tilted sensor cannot reliably
separate obstacle ranging from floor-loss sensing. Ultrasonic eye sensors in a
future character would supplement obstacle sensing, not replace cliff sensors.

All these carriers share default I²C address 0x29. Plan individual XSHUT startup
addressing or an I²C multiplexer, observe XSHUT voltage limits, and validate GPIO
availability with encoders, display, audio, servos and IMU. Wiring and PCB routing
remain deliberately deferred. No cable bend envelopes have been validated.

## Mechanical interfaces and assembly

The four hidden body M2 clearance screws lie on a 36 × 36 mm square. Asymmetric
4 and 3 mm locating keys have 0.25 mm radial socket relief. A 14 × 10 mm opening
reserves the future keyed electrical connection. Adapter removal does not require
opening the common base. Four underside M3 case screws close the shells; pilots
are 2.6 mm and clearances 3.4 mm. Thread-forming/insert choice and lengths are not
released. Print a pilot/key/shaft coupon first.

Install caster, motor cradles/clamps and wheels, then the battery tray, sensor
brackets, electronics deck and upper shell. Battery service requires top and deck
removal. The battery strap and thin motor clamp pads are not modelled. PCB corner
pads establish solder clearance, but positive PCB retention still needs clips or
straps and a physical fit check. Do not infer completed retention from zero CAD
interference. The upper rack and servo ledges are a single printable part.

Use the supplied printable STLs for fit studies only. Files are translated to
Z0, not automatically optimally oriented or support-free. The top shell and angled
sensor brackets need appropriate orientation/supports. Shell apertures and dock
rims need deburring; no production edge-safety test has been performed.

## Verification and open items

`validation.json` identifies part provenance/counts and bounds. `export_validation.json`
reimports STEP, checks pairwise component intersections, checks full 360-degree conservative cylindrical wheel envelopes, samples sensor optical paths and checks wheel/caster ground tangency.
`freecad_validation.json` checks each import's validity/volume and saved FCStd reopen.
Read the reports for residual/intentional contacts; a renderer does not validate fit.

The native FreeCAD document contains named imported B-reps, not original vendor
feature history. **build.py is the editable master** for authored geometry.
Blender/GLB use metres; CAD/STEP/STL use mm. Browser sensor cones are explanatory
visuals, shortened for display rather than rated range, and are not physical STEP parts.

Required before manufacture: verify purchased geometry, positive PCB/servo mounts,
fasteners/coupons, charge/load isolation, battery and boost peak-current budget,
connector/antenna clearances, wiring, motion envelope, centre of gravity with the
actual character, and tethered obstacle/cliff/braking tests. No payload, runtime,
tabletop safety or durability rating is claimed.

## Rebuild

From `cad/`:

```bash
python3 models/circular_base/fetch_models.py
./bin/cad build models/circular_base/build.py
./bin/cad build models/circular_base/verify.py
./bin/cad freecad-run models/circular_base/freecad_assembly.py
./bin/cad blender-run models/circular_base/render.py
./bin/cad blender-run models/circular_base/turntable.py
python3 models/circular_base/bom.py
```

BOM PDF/CSV/JSON and exports are in `outputs/circular_base/`. Encoder cables and
some retention details remain unpriced. The results site preserves the previous
revision and publishes this iteration through `site/prepare_assets.py`.

Official references: https://www.pololu.com/product/5138,
https://www.pololu.com/product/1088, https://www.pololu.com/product/3415,
https://www.pololu.com/product/3692, https://github.com/adafruit/Adafruit_CAD_Parts,
https://github.com/adafruit/Adafruit-LSM6DS3TR-C-PCB,
https://wiki.seeedstudio.com/xiao_esp32s3_getting_started/.

Cross-tool volume comparison uses the sum of leaf-solid volumes. The imported
Adafruit amplifier hierarchy under-counts its nested IC in a whole-compound
build123d volume query; all 17 leaf solids are preserved in STEP/FreeCAD. This
is a reporting correction, not a change to the vendor geometry.
