main
TylerK Wrist Health Tracker: KiCad project, fabrication files, 3D models, enclosure and dock CAD, design docs d433b2a 7h ago

Enclosure and dock

A parametric CadQuery model built around the board in kicad/. Every part is interference-checked against the board's KiCad 3D model (hardware/health-tracker.step), and so is the dock.

Run it with CadQuery installed: python enclosure.py, then check_fit.py, assembly.py and render.py (PYOPENGL_PLATFORM=egl, needs pyrender). Outputs go to out/.

  • Size: a 35.7 × 33.9 mm case, 41.3 mm long across the strap lugs, 9.95 mm thick at the sensor boss and 9.3 mm at the edge.
  • Wrist: fits standard 20 mm quick-release watch bands.
File What
enclosure.py The model. All dimensions are parameters at the top of the file.
check_fit.py The fit check: every part against every board component, the cell and its leads, and each other. It also checks the build path, the tolerances and the dock (see below).
render.py Offscreen renders (PYOPENGL_PLATFORM=egl). out/render_docked_section.png is a cut through the pogo pins with the device on the dock.
assembly.py Builds the full assembly.
out/full_assembly.glb Open this to see everything (assembly.py also writes full_assembly.step). Four groups, every part named and coloured, every part resting on the surface that holds it:
• Centre: the device as worn. It shows the case, the routed board, the cell, magnets, screws, thermal pad, spring bars and a 20 mm strap.
• −x side: the same device exploded in build order.
• +x side: the dock, with its pogo pins drawn free.
• Further +x: the device seated on a second dock, with the pins compressed onto the J1 pads.
out/*.step, out/*.stl One file per printed or cut part, for manufacturing. enclosure_assembly.step holds the enclosure parts only.

Fit check

The current design reports CLEAN.

The device:

  • 0 interferences, including the cell and both battery leads.
  • The board's insertion path is clear, with the cell already in its pocket.
  • A cell at the top of its tolerance (20.2 × 25 × 3.2 mm) still drops into its pocket.
  • The battery leads have a continuous route to BT1's pads.
  • A spudger reaches under the board edge at both pry slots.
  • The button works: 0.18 mm of dead travel to SW1's plunger.
  • The crush ribs bite the board edge by the designed amount.
  • Corner screws: each has at least 0.6 mm of plastic to the board cavity and 0.97 mm to the outside. Each head sits 0.25 mm in from the edge.

The dock:

  • The device seats in the cradle recess. The case, lugs, strap loops and the board's parts all clear the cradle, including its pogo tongue.
  • All four pogo pins land on the J1 pads. The pad centres are read from the routed .kicad_pcb and match to 0.00 mm. Each pin compresses 0.6 mm, and nothing obstructs its path.
  • Both LED rods show light on the dock. Each one shines into a groove that runs out under the case wall to the cradle's top face beside the device.
  • Both magnet pairs sit in open pockets with 0.2 mm between them, and nothing is printed over either face.
Board outline (JLC ±0.2) Rib bite Button dead travel + 0.25 mm switch travel
31.8 × 29.8 (small) −0.10. The ribs don't touch, so the board can drift 0.1 mm. up to 0.53 mm of the pin's 0.7 mm
32.0 × 30.0 (nominal) +0.10 0.43 mm
32.2 × 30.2 (large) +0.30. A firm press; if it won't go in, pare the rib crests with a blade. 0.43 mm

Measured clearances:

Gap Size What fills it
Back plate to module can 0.20 mm (0.10 if the module is at its +0.1 mm maximum) Air. The can is a backstop for the plate; no tape.
Thermal post to TMP117 0.24 mm 0.25 mm thermal pad
Light pipes to MAX30101 cover glass 0.10 mm (by datasheet height) Optical coupling resin, see below

The vendor 3D model of the MAX30101 is 0.3 mm short, so the fit check reads about 0.41 mm for that last gap. The pipes stand 0.10 mm off the sensor's datasheet height so that a part up to 0.1 mm tall is never pushed on.

Design decisions

Coordinates. Everything uses the board's STEP frame: X = board x, Y = −board y, +Z = skin side.

  • X runs along the arm. The button is on the −x wall.
  • Y runs around the wrist, from lug to lug. This is the dimension that has to sit flat on a curved wrist, so the design keeps it as short as possible.

Stack, skin to the top of the wrist:

  1. The 0.65 mm-proud sensor boss and the 0.8 mm back plate.
  2. A 0.2 mm air gap over the module can.
  3. The board, with every part facing the skin.
  4. A 0.2 mm air gap.
  5. The Li-Po cell (302025, about 110 mAh).
  6. 0.3 mm of foam tape, holding the cell to the pocket floor.
  7. The 1.0 mm top of the body.

How the board goes in. The body is an open-backed tub, like a watch case.

  • The cell goes in first. It's taped to the floor of its own pocket, which locates it. Its leads lie in a channel that runs to a well under BT1's pads.
  • Then the board. BT1's pads are on the battery side, so you solder the leads with the board flipped out beside the case; the leads are cut about 12 mm long for this.
  • Then turn the board over and lower it straight down from the skin side onto a 0.7 mm ledge, before fitting the back plate. The spare lead tucks into the BT1 well.
  • Why the cell goes in first:
    • If the cell were soldered to the board and both dropped in, the cell would hang from its leads and have to land in a pocket with 0.2 mm clearance.
    • With the cell in first, the pocket does the locating.
    • The board can also come out for rework without disturbing the cell.

Taking the board out (bring-up, rework).

  • Two pry slots in the −y wall, at board x 11 and 21, each end in a pocket under the board edge.
  • Put a plastic spudger down a slot, hook it under the board, and lift that edge. The board hinges up on its leads.
  • The crush ribs get shaved on the first insertion, so a refitted board is held by the back plate's clamp. That's fine for a test unit.

Board location and retention.

  • Clearance: 0.45 mm all round. That covers JLCPCB's ±0.2 mm outline tolerance plus about ±0.2 mm of print tolerance.
  • Locating: two crush ribs on the +x wall and two on the +y wall stand 0.1 mm proud of the board edge. As the board is pressed down they get shaved, and they push it against two flat datum pads on the −x wall and two on the −y wall.
  • This puts the board at its nominal position whatever its actual size, which keeps SW1's plunger and the light pipes aligned.
  • Lead-ins: every pad and rib has a lead-in at the top.
  • Clamping: the back plate's rim, cut clear of every component, clamps the board onto the ledge. The board needs no mounting holes.

Fasteners: corner screws.

  • Four M1.2 × 4 countersunk self-tapping screws go in from the skin side, one in each case corner.
  • They sit just outside the board's 3 mm corner radius, in the plastic that fills the corner.
  • Putting the screws in the corners lets the end walls be 1.5 mm thick, which keeps the case short.
  • The case's outer corner radius is 2.3 mm so that each corner can hold a screw.
  • The pilot holes are Ø0.95 and 4 mm deep. The countersinks are Ø2.4 at 90°.

Side button.

  • SW1 (TS24CA) is a side-push switch whose plunger overhangs the board edge by 0.27 mm. The body wall clears it by 0.18 mm, so it passes the wall on the way in.
  • The printed button cap is pushed into its recess from inside, before the board goes in. The board's switch then traps it.
  • At rest, the cap's flange sits on the floor of the recess, 0.18 mm from the plunger. Pressing the 0.7 mm-proud pin takes up that gap and works the switch.

Fits.

  • The light pipes, thermal post, LED rods and dock pogo pins are drawn line-to-line with their holes. MJF and SLA holes print slightly small, so each is a light press; add a dot of CA glue.
  • If a hole prints too tight, open it with a drill bit of the nominal size: pipes 2.15 mm square, post Ø2.0, rods Ø1.0, pogo Ø1.02, magnets Ø3.1.

PPG optics (the critical feature).

  • Two separate light pipes: one over the photodiode aperture (2.15 × 2.70 mm) and one over the LED aperture (2.15 × 1.20 mm).
  • Both are cut from 3.0 mm clear cast acrylic sheet. Each pipe is exactly one sheet thickness tall, so the sheet's polished faces become the pipe ends.
  • They sit in an opaque holder with a 0.68 mm barrier between them, which runs all the way from the sensor to the skin.
  • The holder is part of the back plate and must be printed in IR-opaque black. Test a sample with a TV remote and a phone camera.
  • The pipe tops are flush with a 0.65 mm-proud boss, which gives steady contact pressure on the skin.

Skin temperature.

  • A Ø2.0 × 3.60 mm aluminium post runs from the boss surface to the TMP117, with a 0.25 mm thermal pad between them.
  • On the board, a no-pour zone keeps the TMP117 from being heat-sunk.

Antenna.

  • The antenna end (+x) has no metal, no screws within 5 mm and no battery; the cell pocket stops 4.2 mm short of it.
  • The battery leads run to BT1, which is beside the antenna end, not under it, and at least 4 mm away.
  • The case walls there are plain plastic. Don't use a metal band.

Battery.

  • The cell is a 302025, turned so its 20 mm side runs along x and its 25 mm side along y. That keeps it clear of the side button's pegs and away from the antenna.
  • Why 302025: it costs about the same as a 402025 (roughly $2–7 a cell) and is 1.0 mm thinner.
  • Capacity: about 100–120 mAh, depending on the seller.
  • Battery life: the design workbook estimates about 5.4 mAh a day (§14). That's about 20 days on paper, and still about 5 days if real use is 4× worse, which meets the 3-day target.
  • Charge current: R1 = 12 k sets 83 mA (about 0.75C). A full charge takes under 2 hours.
  • The pocket is 20.4 × 27.8 × 3.5 mm (CELL, FOAM and LEAD_ZONE in enclosure.py).
    • That's the nominal 20 × 25 × 3.0 mm cell, plus 0.2 mm on width and thickness and 0.3 mm of foam.
    • It also includes a 2.6 mm lead zone at the +y (dock) end, for the protection board's fold and the leads' bend.
  • The leads leave the cell's +y end, run along a 1.6 mm-deep channel and drop into the well under BT1. The well also holds the solder joints and the spare lead.

Dock.

  • Pogo connection.
    • The J1 pads sit on the board's skin side, 4.0 mm in from the skin face, because the 3 mm module is on that side too.
    • The back plate therefore has one walled well over all four pads (9.5 × 2.6 mm, with a lead-in chamfer).
    • A tongue on the cradle enters the well, with 0.2 mm clearance, and stops 1.2 mm above the pads.
    • Four P75-series pogo pins (1.02 mm barrel) are pressed through the tongue. Set each with its plunger tip 1.8 mm above the tongue; seated, each compresses 0.6 mm onto its pad.
    • The pins stand only 1.8 mm proud of plastic, so they're hard to bend.
  • Recess. The cradle has a 1.0 mm-deep recess shaped to the case (+0.25 mm), crossed by a channel the width of the lugs that's open at both ends.
    • The lug horns and the strap's loops round the spring bars drop into the channel, so the device seats with its band on.
    • The cradle ends just past the lug tips, and the band hangs over its ends.
    • The recess, the sensor boss's pocket and the tongue together locate the device. The tongue is off-centre, so the device only seats one way round, which keeps VBUS from landing on D+.
  • Charge LED. A 1.4 mm groove under each LED rod runs out under the case wall to the cradle's top face, beside the device.
    • The red charge light, and the status light, show there while the device charges.
    • Print the cradle in a light colour so the groove glows.
  • Magnets. There are two Ø3 × 1.5 mm epoxy-coated N52 magnets in the device and two in the cradle.
    • Each sits in an open pocket, 0.1 mm below its face, pressed in from outside with a dot of CA or epoxy.
    • Device and dock magnets end up 0.2 mm apart, which is about as strong as this magnet size gets. That holds the device down against the four pin springs.
    • The poles are opposite, so the device only seats one way round.
    • Why open pockets:
      • A buried magnet would need a thin printed skin over it, which MJF nylon can't print reliably (its minimum is about 0.8 mm).
      • Open pockets need no printed skin and no insert-from-inside step.
      • Epoxy-coated magnets cost the same as nickel ones and keep nickel off the skin.

LEDs. Ø1.0 mm clear acrylic rods carry the charge and status LED light to the skin face. It's visible when the device is off the wrist or on the dock.

Sealing (open decision, guide §4.6).

  • There's no gasket: a groove can't fit in 1.4–1.5 mm walls.
  • The pogo well, button hole and light pipes are open paths anyway.
  • For a test unit:
    • conformal-coat the board, masking J1, BT1, J2 and the sensors;
    • treat the device as sweat-resistant, not splash-proof;
    • rinse the pogo well with water now and then.

Strap. The lugs are drilled through with Ø1.1 holes, 20.0 mm between the lug inner faces, 2.3 mm from the case end. They fit standard 1.5–1.8 mm spring bars.

Bill of materials (per device)

Item Spec Qty Notes
Body out/body.stl 1 MJF/SLS PA12 (nylon) or tough SLA resin. MJF PA12 from JLCPCB/JLC3DP is cheap, strong and RF-transparent.
Back plate out/back_plate.stl 1 Black, IR-opaque. MJF PA12 black, or black SLA resin. Check its IR opacity before trusting the PPG.
Button cap out/button_cap.stl 1 SLA resin (it's a tiny part, about 2.4 mm)
Light pipes 3.0 mm clear cast acrylic: 2.15 × 2.70 and 2.15 × 1.20 mm 1 each Laser cut (SendCutSend, Ponoko, or a makerspace). Order extras.
LED light rods Ø1.0 mm clear PMMA rod, 2.8 mm long 2 Cut with a fresh blade, then polish the ends
Thermal post Ø2.0 mm aluminium rod, 3.60 mm long 1 Cut and deburr; press-fit with a dot of CA
Thermal pad 0.25 mm silicone pad, 2 × 2 mm 1 Between the post and the TMP117
Magnets Ø3 × 1.5 mm N52, epoxy-coated 2 (+2 in the dock) Mark the poles before gluing
Screws M1.2 × 4 countersunk self-tapping, stainless 4 The pilot holes are already in the body
Foam tape 0.3 mm double-sided some Cell to the pocket floor only
Battery 302025 Li-Po with a protection circuit, about 100–120 mAh, wire leads (not bare tabs) 1 Max 20.2 × 25.0 × 3.2 mm including the protection board. Measure it before printing.
Kapton tape 0.05 mm some Over the BT1 joints and over the cell's top face
Strap 20 mm quick-release band. A nylon sport loop is best for steady overnight pressure; FKM rubber is the alternative. 1 Spring bars come with QR bands

The dock needs:

  • out/dock_cradle.stl, in any filament, light-coloured so the LED grooves glow;
  • 4 P75-series pogo pins (1.02 mm barrel, with at least 1 mm of travel);
  • 2 epoxy-coated Ø3 × 1.5 mm magnets;
  • a 100 µF / 10 V aluminium electrolytic (6.3 × 5.4 mm SMD can), in the pocket beside the pins;
  • a USB connector or cable that brings out D+ and D−.

The capacitor is required, not optional.

  • Solder it straight across the VBUS and GND pogo pins, with short leads.
  • Without it, plugging in rings VBUS to about 9 V (Adom Fields hot-plug check). That's above the nRF52840's 5.8 V limit; the capacitor's ESR damps the ring.
  • Many USB-C breakouts are power-only, so check that yours brings out the data lines.
  • The J1 order is 1 VBUS, 2 D−, 3 D+, 4 GND. On the tongue, that's left to right with the device face down and the antenna end (+x) to your right.

Assembly order

  1. Press the magnets into the back plate's skin-face pockets and the cradle's floor pockets, with a dot of CA or epoxy. Mark the poles first:
    • Device: A at board x 2.6 is N out; B at board x 20.0 is S out.
    • Cradle: the opposite poles face up.
  2. Press the light pipes into the holder pockets, pipe tops flush with the boss. For the best signal, put a drop of clear UV-cure resin on each pipe's bottom face so it couples optically to the MAX30101 cover glass. Cure it after the plate is seated (step 10), with the device face down.
  3. Press in the thermal post and the LED rods. Stick the thermal pad to the post's inner end.
  4. Push the button cap into the body's left wall from inside, pin first. This must happen before the board goes in.
  5. Program the board over SWD (J2, battery side) before connecting the cell. After that, use USB through the dock. J2 can still be reached later by lifting the board out on its leads.
  6. Put 0.3 mm foam tape on the cell's large face and press it into its pocket, leads at the +y (dock) end. Put Kapton on the cell's top face. Lay the leads along the channel toward the BT1 well. out/render_cell_in.png shows this step.
  7. Cut the leads so each reaches about 12 mm past its BT1 pad. The fit check reports a 22 mm run, so that's about 34 mm from the cell.
  8. Stand the board beside the case's +x (antenna) wall, battery side up, with BT1 nearest the case. Strip, tin and solder red to + (pad 1, VBAT) and black to − (pad 2, GND); check the silkscreen. Cover the joints with Kapton.
  9. Turn the board over, parts facing up, and hold it flat over the opening. Lower it straight down onto the ledge, tucking the spare lead into the BT1 well as it goes. Press evenly, because the crush ribs take a firm push. Check that the button clicks.
  10. Fit the back plate and drive the four corner screws.
  11. Press the four pogo pins into the dock's tongue until each tip stands 1.8 mm above it. Solder the damping capacitor and the USB wires.
  12. Fit the 20 mm quick-release band.

Checks before printing

  • Confirm the MAX30101 aperture positions against the ADI outline drawing (PD_OFF, LED_OFF, PD_SZ and LED_SZ in enclosure.py). They were measured from the vendor 3D model.
  • Print one back plate and check the barrier for IR leaks before printing the rest.
  • The skin-side screw heads must sit flush. If the countersinks print undersized, open them with a 90° bit.
  • Measure the cell you buy (with calipers, including the protection board) against the pocket before printing. "302025" cells range from 100 to 120 mAh, and some are 20.5 mm wide.
  • Check pogo pin height with the device on the dock. It should click down onto the magnets and show charging, the red LED glowing in the groove. If it rocks, the pins are set too high.

Model notes

SW1 3D model. The vendor (EasyEDA/LCSC) 3D model of the TS24CA is wrong: its plunger is about 1 mm short, and it sits 0.9 mm into the board. The board uses kicad/lib/health_tracker.3dshapes/TS24CA_datasheet.step instead, built from the manufacturer's drawing by a small CadQuery script. The footprint matches the datasheet.