sl-firmware 291dd689f8 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 08:41:26 -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-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" 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
```