sl-firmware fa75c442a7 feat: remove all STM32/Mamba/BlackPill references — ESP32-S3 only
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>
2026-04-04 09:00:38 -04:00

8.3 KiB
Raw Blame History

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
<<<<<<< HEAD
FC (ESP32 BALANCE) Passive; FC has own EMI shield 85 °C <60 °C ambient OK

======= | FC (ESP32-S3 BALANCE) | Passive; FC has own EMI shield | 85 °C | <60 °C ambient OK |

291dd68 (feat: remove all STM32/Mamba/BlackPill references — ESP32-S3 only) | 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