Archive STM32 firmware to legacy/stm32/: - src/, include/, lib/USB_CDC/, platformio.ini, test stubs, flash_firmware.py - test/test_battery_adc.c, test_hw_button.c, test_pid_schedule.c, test_vesc_can.c, test_can_watchdog.c - USB_CDC_BUG.md Rename: stm32_protocol → esp32_protocol, mamba_protocol → balance_protocol, stm32_cmd_node → esp32_cmd_node, stm32_cmd_params → esp32_cmd_params, stm32_cmd.launch.py → esp32_cmd.launch.py, test_stm32_protocol → test_esp32_protocol, test_stm32_cmd_node → test_esp32_cmd_node Content cleanup across all files: - Mamba F722S → ESP32-S3 BALANCE - BlackPill → ESP32-S3 IO - STM32F722/F7xx → ESP32-S3 - stm32Mode/Version/Port → esp32Mode/Version/Port - STM32 State/Mode labels → ESP32 State/Mode - Jetson Nano → Jetson Orin Nano Super - /dev/stm32 → /dev/esp32 - stm32_bridge → esp32_bridge - STM32 HAL → ESP-IDF docs/SALTYLAB.md: - Update "Drone FC Details" to describe ESP32-S3 BALANCE board (Waveshare ESP32-S3 Touch LCD 1.28) - Replace verbose "Self-Balancing Control" STM32 section with brief note pointing to SAUL-TEE-SYSTEM-REFERENCE.md TEAM.md: Update Embedded Firmware Engineer role to ESP32-S3 / ESP-IDF No new functionality — cleanup only. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
8.1 KiB
8.1 KiB
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, Ø3–6 mm cable range | 4 | Lapp Skintop® or equivalent |
| E2 | PG9 cable gland | IP68, nylon, Ø4–8 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 | 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 | 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 | 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.5–2 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 | 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-S3 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" H₂O 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
- Box O-ring groove: 2 mm cord, 70% compression → IP54 ✓
- Cable glands: PG7/PG9 IP68 rated — exceeds lid requirement ✓
- Fan inlet: labyrinth duct prevents direct splash to fan bore ✓
- Exhaust: double-baffle labyrinth on lid rear ✓
- Camera domes: O-ring sealed to base ring ✓
- D435i housing: O-ring on window frame + rear cap ✓
- 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
# 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