sl-webui f71dad5344 feat(arch): migrate all STM32/Mamba/BlackPill refs to ESP32 BALANCE/IO + fix roslib@1.4.0
Architecture change (2026-04-03): Mamba F722S (STM32F722) and BlackPill
replaced by ESP32 BALANCE (PID loop) and ESP32 IO (motors/sensors/comms).

- Update CLAUDE.md, docs, chassis BOM/ASSEMBLY, pinout, power-budget,
  wiring-diagram, TEAM.md, AUTONOMOUS_ARMING.md, docker-compose
- Update all ROS2 package comments, config labels, launch args
  (stm32_port→esp32_port, /dev/stm32-bridge→/dev/esp32-bridge)
- Update WebUI: stm32Mode→esp32Mode, stm32Version→esp32Version,
  "STM32 State/Mode" labels → "ESP32 State/Mode" (ControlMode, SettingsPanel)
- Add TODO(esp32-migration) markers on stm32_protocol.py and mamba_protocol.py
  binary frame layouts — pending ESP32 protocol spec from max
- Fix roslib CDN 1.3.0→1.4.0 in all 11 HTML panels (fixes ROS2 Humble
  rosbridge "Received a message without an op" incompatibility)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 08:25:24 -04:00

164 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# IP54 Weatherproofing Kit BOM — Issue #144
**Agent:** sl-mechanical | **Date:** 2026-03-01
IP54-rated enclosures and sensor housings for all-weather outdoor robot operation.
---
## A. Main Electronics Enclosure (`ip54_enclosure.scad`)
### Purchased Hardware
| # | Description | Spec | Qty | Source / Notes |
|---|-------------|------|-----|----------------|
| E1 | PG7 cable gland | IP68, nylon, Ø36 mm cable range | 4 | Lapp Skintop® or equivalent |
| E2 | PG9 cable gland | IP68, nylon, Ø48 mm cable range | 2 | Lapp Skintop® or equivalent |
| E3 | Silicone O-ring cord | Ø2 mm cord, silicone 70 Shore A | ~800 mm | Cut to lid perimeter length; butt-join with silicone sealant |
| E4 | 40 mm axial fan | 12 V DC, sleeve bearing, >10 CFM | 1 | Sunon MF40201VX or Noctua NF-A4x10 |
| E5 | Foam filter pad | 40×40×5 mm open-cell PPI 30 | 2 | Cut from foam sheet; replace when dirty |
| E6 | Al heat sink pad — Jetson | 60×40×2 mm, adhesive back | 1 | Bergquist GP3000 or Arctic Thermal Pad |
| E7 | Al heat sink pad — ESC | 50×30×2 mm, adhesive back | 1 | Same source as E6 |
| E8 | Thermal interface material | 1 mm silicone pad, Rth ≤ 1.0 °C·cm²/W | 2 | Between board and heat sink pad |
| E9 | Spring washer M10 | For quarter-turn latch preload | 4 | DIN 127, stainless |
| E10 | M3×8 SHCS | Stainless | 8 | Fan + duct mounting |
| E11 | M3×30 SHCS | Stainless | 4 | Quarter-turn latch knob bolt |
| E12 | M3×6 BHCS | Stainless | 16 | PCB standoff mounting (Jetson×4, FC×4, ESC×8) |
| E13 | M3 brass heat-set insert | M3×4 L, Ø5.1 OD | 16 | Press into standoffs with soldering iron |
| E14 | Silicone adhesive sealant | Clear, weatherproof, Dowsil 732 or equivalent | 1 tube | Seal cable gland threads + O-ring cord join |
### Printed Parts
| Part | File | Qty | Print | Mass est. |
|------|------|-----|-------|-----------|
| Enclosure body | `ip54_enclosure.scad` `body_stl` | 1 | PETG, 5 perims, 40% infill, 0.25 mm layer | ~320 g |
| Lid with fan mount | `ip54_enclosure.scad` `lid_stl` | 1 | PETG, 5 perims, 40% infill | ~185 g |
| Fan filter duct | `ip54_enclosure.scad` `fan_duct_stl` | 1 | PETG, 4 perims, 30% infill | ~28 g |
| Quarter-turn latch knob | `ip54_enclosure.scad` `latch_stl` | 4 | PETG, 5 perims, 60% infill | ~6 g each |
### Gasket DXF
| File | Description |
|------|-------------|
| `ip54_gasket.dxf` | O-ring groove outline for laser-cut 2 mm silicone sheet (alternative to cord) |
---
## B. IMX219 Camera Dome (`ip54_sensor_housings.scad`)
| # | Description | Spec | Qty (per camera) | Notes |
|---|-------------|------|-----------------|-------|
| C1 | Clear PC dome cylinder | Ø55×35 mm, 2 mm wall, clear polycarbonate | 1 | Vac-form custom OR source clear plastic sphere halves; DXF from `imx219_dome_2d` |
| C2 | Silicone O-ring | Ø55 mm ID, 2 mm cord | 1 | Seals dome to base ring |
| C3 | Silica gel sachet | 1 g, demountable | 1 | Anti-fog; replace yearly or when saturated |
| C4 | M2×6 SHCS | Stainless | 4 | PCB to standoffs |
| C5 | M3×10 BHCS | Stainless | 4 | Base ring to sensor rail bracket |
| C6 | Anti-fog spray | Rain-X interior or similar | — | Apply to dome inner face during assembly |
| Printed Part | Qty | Print | Mass est. |
|--------------|-----|-------|-----------|
| Dome base ring | 4 (1 per camera) | PETG, 5 perims, 60% infill | ~22 g |
| Retainer ring | 4 | PETG, 4 perims, 40% infill | ~8 g |
---
## C. D435i Sealed Housing (`ip54_sensor_housings.scad`)
| # | Description | Spec | Qty | Notes |
|---|-------------|------|-----|-------|
| D1 | IR-transparent PC window | 88×22×3 mm, >85% T at 850 nm | 1 | Evonik PLEXIGLAS IR 8N or Altuglas IR; export profile from `d435i_window_2d` |
| D2 | Silicone O-ring | 2 mm cord, approx 230 mm perimeter | 1 | Seals window frame to housing front face |
| D3 | Silicone O-ring | 2 mm cord, rear cap seal | 1 | |
| D4 | PG7 cable gland | Rear cap | 1 | For D435i USB-C cable |
| D5 | M2.5×10 SHCS | Window frame screws | 4 | |
| D6 | M3×6 SHCS | Housing-to-bracket top | 3 | |
| D7 | 1/4-20 UNC hex nut | Captured in bottom | 1 | For tripod/bracket mount |
| Printed Part | Qty | Print | Mass est. |
|--------------|-----|-------|-----------|
| D435i housing body | 1 | PETG, 5 perims, 40% infill | ~65 g |
| Window retention frame | 1 | PETG, 5 perims, 60% infill | ~18 g |
| Rear cap | 1 | PETG, 5 perims, 60% infill | ~20 g |
---
## D. RPLIDAR Spinning Dome (`ip54_sensor_housings.scad`)
| # | Description | Spec | Qty | Notes |
|---|-------------|------|-----|-------|
| R1 | Clear PC cylinder | Ø120 mm OD, 1.52 mm wall, 95 mm tall | 1 | Source: plastic cylinder tube or custom vac-form; spec from `rplidar_dome_2d` |
| R2 | Clear PC disc cap | Ø120 mm, 2 mm, clear PC | 1 | Seals dome top; laser-cut from `rplidar_dome_cap_2d` export |
| R3 | Silicone O-ring | Ø120 mm ID, 2 mm cord | 1 | Seals dome cylinder to base ring |
| R4 | M3×6 captive bolt | For dome retention clips | 3 | Press-fit into clip |
| R5 | M4×8 BHCS | Deck mounting | 4 | Base ring to deck plate |
| R6 | M3×8 SHCS | RPLIDAR to base ring | 4 | Standard RPLIDAR A1M8 M3 bolts |
| Printed Part | Qty | Print | Mass est. |
|--------------|-----|-------|-----------|
| RPLIDAR dome base ring | 1 | PETG, 5 perims, 60% infill | ~55 g |
| Dome retention clip | 3 | PETG, 5 perims, 60% infill | ~4 g each |
---
## Thermal Management Summary
| Component | Thermal strategy | Max junction | Enclosure budget |
|-----------|-----------------|-------------|-----------------|
| Jetson Orin NX | Al pad → lid → fan forced convection | 95 °C Tj | Target ≤ 60 °C case |
| FC (ESP32 BALANCE) | Passive; FC has own EMI shield | 85 °C | <60 °C ambient OK |
| ESC × 2 | Al pad lid | 100 °C Tj | Target 60 °C |
| D435i | Passive; housing vent gap on rear cap | 45 °C surface | |
Fan spec: 40 mm, 12 V, 10 CFM at 0.1" HO static pressure.
Thermal analysis (simplified): ΔT = Q/(m_dot × Cp) where Q = 15 W (Jetson 10 W + ESC 5 W), airflow = 10 CFM = 4.7 L/s.
ΔT_air 15 / (4.7 × 1.2 × 1005) 2.7 °C rise over ambient. With conduction resistance (pad + wall): Tcase Tambient + 12 °C. At 40 °C ambient 52 °C max. **Within 60 °C target. ✓**
---
## Mass Summary
| Assembly | Mass est. |
|----------|-----------|
| Enclosure (body + lid + duct + latches) | ~560 g |
| 4× IMX219 domes | ~120 g |
| D435i housing (body + frame + cap) | ~103 g |
| RPLIDAR dome assembly | ~67 g |
| Hardware + glands | ~80 g |
| **Total kit** | **~930 g** |
---
## IP54 Compliance Checklist
- [x] Box O-ring groove: 2 mm cord, 70% compression IP54
- [x] Cable glands: PG7/PG9 IP68 rated exceeds lid requirement
- [x] Fan inlet: labyrinth duct prevents direct splash to fan bore
- [x] Exhaust: double-baffle labyrinth on lid rear
- [x] Camera domes: O-ring sealed to base ring
- [x] D435i housing: O-ring on window frame + rear cap
- [x] RPLIDAR dome: O-ring at dome-to-base seat
- [ ] ** Verify O-ring cord continuity** no gaps at corners after cut-and-join
- [ ] ** Test after print** submerge base (static) in 200 mm water for 30 min (IP54 splash test)
- [ ] ** D435i IR window** confirm PC sheet IR transmission spec with supplier before ordering
---
## Export Commands
```bash
# Enclosure
openscad ip54_enclosure.scad -D 'RENDER="body_stl"' -o ip54_body.stl
openscad ip54_enclosure.scad -D 'RENDER="lid_stl"' -o ip54_lid.stl
openscad ip54_enclosure.scad -D 'RENDER="fan_duct_stl"' -o ip54_fan_duct.stl
openscad ip54_enclosure.scad -D 'RENDER="latch_stl"' -o ip54_latch.stl
openscad ip54_enclosure.scad -D 'RENDER="gasket_2d"' -o ip54_gasket.dxf
# Sensor housings
openscad ip54_sensor_housings.scad -D 'RENDER="imx219_dome_stl"' -o imx219_dome.stl
openscad ip54_sensor_housings.scad -D 'RENDER="imx219_dome_2d"' -o imx219_dome_disc.dxf
openscad ip54_sensor_housings.scad -D 'RENDER="d435i_body_stl"' -o d435i_body.stl
openscad ip54_sensor_housings.scad -D 'RENDER="d435i_window_2d"' -o d435i_window.dxf
openscad ip54_sensor_housings.scad -D 'RENDER="d435i_frame_stl"' -o d435i_frame.stl
openscad ip54_sensor_housings.scad -D 'RENDER="rplidar_base_stl"' -o rplidar_dome_base.stl
openscad ip54_sensor_housings.scad -D 'RENDER="rplidar_dome_2d"' -o rplidar_dome_spec.dxf
```