# Charging Dock BOM — Issue #159
**Agent:** sl-mechanical | **Date:** 2026-03-01

Cross-variant charging dock: 5 V / 5 A pogo-pin contact, V-guide funnel, ArUco marker, LED status.

---

## A. Dock Station Hardware

| # | Description | Spec | Qty | Notes / Source |
|---|-------------|------|-----|----------------|
| D1 | High-current pogo pin | OD 5.5 mm, 5 A rated, 20 mm length, 4 mm travel | 2 | Generic HC pogo "PBX-5" type; AliExpress or Preci-Dip 821 series. Specify press-fit shoulder. |
| D2 | Brass contact pad | Ø12 × 2 mm, bare brass | 2 | Machine from Ø12 mm brass rod, or order PCB contact pad. Robot-side receiver. |
| D3 | Meanwell IRM-30-5 PSU | 5 V / 5 A (30 W), open-frame | 1 | Or equivalent: Hi-Link HLK-30M05, Recom RAC30-05SK |
| D4 | PG7 cable gland | IP67, M12 thread, 3–6 mm cable | 2 | PSU mains in + DC out to pogo; fits bracket cable exit |
| D5 | M20 hex nut (ballast) | Steel, 30 mm AF, ~86 g each | 8 | Stack in 4× base pockets (2 nuts/pocket) for ~690 g ballast |
| D6 | M4×16 SHCS | Stainless | 12 | Back wall + guide rail attachment to base |
| D7 | M4×10 BHCS | Stainless | 8 | ArUco mast foot + PSU bracket to base |
| D8 | M4 T-nut or insert | Heat-set, M4 | 20 | Into base plate slots |
| D9 | M3×16 SHCS | Stainless | 4 | LED bezel to back wall |
| D10 | M3 hex nut | DIN 934 | 4 | LED bezel |
| D11 | M8×40 BHCS | Zinc | 4 | Optional floor anchor bolts |
| D12 | Rubber foot | Ø20 × 5 mm, self-adhesive | 4 | Underside of base plate (no floor bolts variant) |
| D13 | 16 AWG silicone wire | Red + black, 300 mm each | 2 | Pogo pin to PSU |
| D14 | Crimp ring terminal | M3, for 16 AWG | 4 | Pogo pin terminal connection |
| D15 | Silicone sleeve | 4 mm ID, 100 mm | 2 | Wire strain relief in cable routing channel |

## B. LED Status Circuit Components

| # | Description | Spec | Qty | Notes |
|---|-------------|------|-----|-------|
| L1 | 5 mm LED — Red | Vf ≈ 2.0 V, 20 mA | 1 | SEARCHING state |
| L2 | 5 mm LED — Yellow | Vf ≈ 2.1 V, 20 mA | 1 | ALIGNED state |
| L3 | 5 mm LED — Blue | Vf ≈ 3.2 V, 20 mA | 1 | CHARGING state |
| L4 | 5 mm LED — Green | Vf ≈ 2.1 V, 20 mA | 1 | FULL state |
| L5 | Current limiting resistor | 150 Ω 1/4 W (for 5 V rail) | 4 | R = (5 V − Vf) / 20 mA |
| L6 | TP4056 or MCU GPIO | LED driver / controller | 1 | GPIO from Jetson Orin NX via I2C LED driver, OR direct GPIO with resistors |
| L7 | 2.54 mm pin header | 1×6, right-angle | 1 | LED→controller connection |

> **LED current calc:** R = (5.0 − 2.1) / 0.020 = 145 Ω → use 150 Ω for red/yellow/green.
> Blue: R = (5.0 − 3.2) / 0.020 = 90 Ω → use 100 Ω.

## C. Robot Receiver Hardware (per robot)

| # | Description | Spec | Qty | Notes |
|---|-------------|------|-----|-------|
| R1 | Brass contact pad | Ø12 × 2 mm | 2 | Press-fit into receiver housing (0.1 mm interference) |
| R2 | 16 AWG silicone wire | Red + black, 300 mm | 2 | From pads to battery charging PCB |
| R3 | M4×10 SHCS | Stainless | 4 | Receiver to chassis (rover/tank flange bolts) |
| R4 | M4×16 SHCS | Stainless | 2 | Lab variant stem collar clamp |
| R5 | Solder lug, M3 | For wire termination to pad | 2 | Solder to brass pad rear face |

## D. ArUco Marker

| # | Description | Spec | Qty | Notes |
|---|-------------|------|-----|-------|
| A1 | ArUco marker print | 100×100 mm, ID = 0 (DICT_4X4_50) | 1 | Print on photo paper or laminate; slip into frame slot |
| A2 | Lamination pouch | A5, 80 micron | 1 | Weather-protect printed marker |

---

## Printed Parts

| Part | File | Qty | Print settings | Mass est. |
|------|------|-----|----------------|-----------|
| Dock base plate | `charging_dock.scad` `base_stl` | 1 | PETG, 5 perims, 60% infill (heavy = stable), 0.3 mm layer | ~380 g |
| Back wall | `charging_dock.scad` `back_wall_stl` | 1 | PETG, 5 perims, 40% infill | ~120 g |
| Guide rail | `charging_dock.scad` `guide_rail_stl` | 2 (mirror R) | PETG, 5 perims, 60% infill | ~45 g each |
| ArUco mast | `charging_dock.scad` `aruco_mount_stl` | 1 | PETG, 4 perims, 40% infill | ~55 g |
| PSU bracket | `charging_dock.scad` `psu_bracket_stl` | 1 | PETG, 4 perims, 30% infill | ~35 g |
| LED bezel | `charging_dock.scad` `led_bezel_stl` | 1 | PETG, 4 perims, 40% infill | ~10 g |
| Lab receiver | `charging_dock_receiver.scad` `lab_stl` | 1 | PETG, 5 perims, 60% infill | ~28 g |
| Rover receiver | `charging_dock_receiver.scad` `rover_stl` | 1 | PETG, 5 perims, 60% infill | ~32 g |
| Tank receiver | `charging_dock_receiver.scad` `tank_stl` | 1 | PETG, 5 perims, 60% infill | ~38 g |

---

## Mass Summary

| Assembly | Mass |
|----------|------|
| Dock printed parts (all) | ~690 g |
| Steel ballast (8× M20 hex nuts) | ~690 g |
| PSU + hardware | ~250 g |
| **Dock total** | **~1630 g** |
| Receiver (per robot) | ~30–38 g |

---

## Pogo Pin Contact Height — Cross-Variant Alignment

The dock `POGO_Z = 35 mm` (contact height above dock floor) is set for **SaltyLab** (stem receiver height ≈ 35 mm).

| Robot | Chassis floor-to-contact height | Dock adapter |
|-------|--------------------------------|--------------|
| SaltyLab | ~35 mm (stem base) | None — direct fit |
| SaltyRover | ~55 mm (deck belly) | 20 mm ramp shim under dock base |
| SaltyTank | ~90 mm (hull floor) | 55 mm ramp shim under dock base |

> **Ramp shim:** print `dock_base.scad` with `BASE_T` increased, or print a separate shim block (not included — cut from plywood or print as needed).
> **Alternative:** in firmware, vary approach Z offset per variant. Single dock at POGO_Z = 60 mm midpoint ± 25 mm spring travel gives rough cross-variant coverage.

---

## Wiring Diagram

```
MAINS INPUT (AC)
     │
     ▼
┌─────────────────┐
│  IRM-30-5 PSU   │  5 V / 5 A out
│  63×45×28 mm    │
└────────┬────────┘
         │ 5 V (RED 16 AWG)          0 V (BLK 16 AWG)
         │                                   │
         ▼                                   ▼
   ┌───────────┐                      ┌───────────┐
   │  POGO +   │  (spring-loaded)     │  POGO -   │
   │  pin      │◄────────────────────►│  pin      │
   └─────┬─────┘   robot docks        └─────┬─────┘
         │                                   │
   ─ ─ ─ ┼ ─ ─ ─ ─ ─ DOCK/ROBOT GAP ─ ─ ─ ┼ ─ ─ ─
         │                                   │
   ┌─────▼─────┐                      ┌─────▼─────┐
   │ CONTACT + │  (brass pad Ø12 mm)  │ CONTACT - │
   └─────┬─────┘                      └─────┬─────┘
         │                                   │
         └──────────────┬────────────────────┘
                        │
               ┌────────▼────────┐
               │  Robot charging │
               │  PCB / BMS      │
               │  (on robot)     │
               └────────┬────────┘
                        │
                  [Battery pack]

LED STATUS CIRCUIT (dock side):
                        │ 5 V from PSU
                        │
          ┌─────────────┼──────────────────────┐
          │             │                      │
         [R]           [R]                    [R]
        150 Ω         150 Ω        100 Ω     150 Ω
          │             │             │         │
        [LED1]        [LED2]        [LED3]   [LED4]
         RED          YELLOW         BLUE     GREEN
       SEARCHING      ALIGNED      CHARGING    FULL
          │             │             │         │
          └─────────────┴─────────────┴─────────┘
                        │
               GPIO (Jetson Orin NX)
               or TP4056 charge state output

CURRENT SENSING (optional — recommended):
  Insert INA219 (I2C) in series with POGO+ line.
  I2C addr 0x40; reads dock current to detect:
    0 mA     → SEARCHING (no robot contact)
    >10 mA   → ALIGNED (contact made, BMS pre-charge)
    >1000 mA → CHARGING
    <50 mA   → FULL (BMS trickle / float)
```

---

## Assembly Sequence

1. **Print all parts** (see table above). Base at 60% infill for mass.
2. **Press ballast nuts** into base pockets from underside. Optional: fill pockets with epoxy to lock.
3. **Install heat-set M4 inserts** in base plate slots (back wall × 3, guide × 4 each side, ArUco foot × 4, PSU × 4).
4. **Press pogo pins** into back wall bores from the front face. Flange seats against counterbore shoulder. Apply drop of Loctite 243 to bore wall.
5. **Solder 16 AWG wires** to pogo pin terminals. Route down wiring channel. Thread through base cable slot.
6. **Assemble PSU bracket** to base (rear). Connect pogo wires to PSU DC terminals (observe polarity: POGO+ → V+, POGO- → COM). Route AC mains input via PG7 glands on bracket.
7. **Install LED bezel**: press 5 mm LEDs through bores (body recessed 2 mm), solder resistors and wires on rear, plug into controller header.
8. **Bolt back wall** to base (3× M4×16 from underneath).
9. **Bolt guide rails** to base (2× M4 each side). Mirror the right rail — print a second copy, insert STL mirrored in slicer OR use `mirror([1,0,0])` in OpenSCAD.
10. **Mount ArUco mast** to base front (4× M4×10).
11. **Insert ArUco marker** (laminated 100×100 mm, ID=0, DICT_4X4_50) into frame slot from side.
12. **Attach rubber feet** (or drill floor anchor holes).
13. **Robot receiver**: press brass contact pads into bores (interference fit, apply Loctite 603 retaining compound). Solder wires to pad rear lugs before pressing in.
14. **Mount receiver to robot**: align pads to dock pogo height, fasten M4 bolts.

---

## Export Commands

```bash
# Dock parts
openscad charging_dock.scad -D 'RENDER="base_stl"'        -o dock_base.stl
openscad charging_dock.scad -D 'RENDER="back_wall_stl"'   -o dock_back_wall.stl
openscad charging_dock.scad -D 'RENDER="guide_rail_stl"'  -o dock_guide_rail.stl
openscad charging_dock.scad -D 'RENDER="aruco_mount_stl"' -o dock_aruco_mount.stl
openscad charging_dock.scad -D 'RENDER="psu_bracket_stl"' -o dock_psu_bracket.stl
openscad charging_dock.scad -D 'RENDER="led_bezel_stl"'   -o dock_led_bezel.stl

# Robot receivers
openscad charging_dock_receiver.scad -D 'RENDER="lab_stl"'   -o receiver_lab.stl
openscad charging_dock_receiver.scad -D 'RENDER="rover_stl"' -o receiver_rover.stl
openscad charging_dock_receiver.scad -D 'RENDER="tank_stl"'  -o receiver_tank.stl
openscad charging_dock_receiver.scad -D 'RENDER="contact_pad_2d"' -o contact_pad.dxf
```
