diff --git a/chassis/BOM.md b/chassis/BOM.md index 9250597..cf42569 100644 --- a/chassis/BOM.md +++ b/chassis/BOM.md @@ -80,11 +80,24 @@ PR #7 (`chassis_frame.scad`) used placeholder values. The table below records th ## Battery +> **Rev B update:** previous placeholder (185×72×52 mm) replaced with real pack dimensions. + | # | Part | Qty | Spec | Notes | |---|------|-----|------|-------| -| 18 | LiPo / LiFePO4 pack | 1 | 24V (6S LiPo or 8S LiFePO4), 4Ah, ≤185×72×52mm | Confirm dims before printing tray; add 2mm clearance | -| 19 | Velcro strap 20mm wide | 2 | 300mm length | Route through tray strap slots | -| 20 | BMS board | 1 | Matched to cell chemistry | Mount externally on rear inner face of tray wall | +| 18 | Battery pack | 2 (default) | 24V, 420×88×56 mm each | Sit side-by-side on deck (2-pack = 420×176 mm footprint). Up to 4 packs with underdeck shelf. | +| 19 | Velcro strap 25mm × 500mm | 4 | One per strap slot × 2 slots × 2 packs | Pass through 25mm plate slots at x=±105mm; cinch over pack | +| 20 | BMS board | 1–2 | Matched to cell chemistry | Mount to deck underside near battery centre; one BMS can parallel both packs | +| 21 | 4-pack underdeck shelf plate | 0 (option) | 6mm Al, 440×200mm | Required only for 4-pack config; attaches via M5 shelf bolts; carries 2 more packs below main deck | +| 22 | M5×20 shelf bolt + nut | 8 | SS, for underdeck shelf | Only for 4-pack config; M5 holes in main plate are pre-punched when `BATT_PACKS=4` | + +### Battery footprint analysis + +| Config | Width (Y) | Length (X) | Fits on 600mm wheelbase? | Notes | +|--------|-----------|-----------|--------------------------|-------| +| 2-pack (default) | 176 mm | 420 mm | ✅ Yes | Centred between forks | +| 4-pack (in-line) | 176 mm | 840 mm | ❌ No | 840 > 600 mm wheelbase | +| 4-pack (side-by-side) | 352 mm | 420 mm | ❌ No | 352 > 210 mm plate depth | +| 4-pack (2+2 underdeck) | 176 mm | 420 mm | ✅ Yes | 2 packs below main deck via shelf | --- diff --git a/chassis/prototype_baseplate.scad b/chassis/prototype_baseplate.scad index 8f5a2c4..599e83f 100644 --- a/chassis/prototype_baseplate.scad +++ b/chassis/prototype_baseplate.scad @@ -1,11 +1,18 @@ // ============================================================================= -// SaltyBot — Prototype Base Plate +// SaltyBot — Prototype Base Plate (Rev B — real battery dimensions) // Agent: sl-mechanical | 2026-02-28 // // Laser-cut or CNC-routed flat plate (6mm aluminium or 8mm acrylic). // Uses CALIPER-VERIFIED hub motor axle measurements — replaces placeholder // values from chassis_frame.scad (PR #7). // +// ── BATTERY LAYOUT (real measurements — NOT placeholder) ───────────────────── +// Each pack: 420 mm (L) × 88 mm (W) × 56 mm (H) +// 2-pack (default): side-by-side in Y → footprint 420 × 176 mm on deck +// 4-pack (expansion): 2 more packs on secondary underdeck tray +// (4-wide = 352 mm exceeds robot width; in-line = 840 mm exceeds wheelbase) +// Plate depth: 210 mm (176 mm battery + 17 mm margin each side) +// // ── VERIFIED AXLE PROFILE (stepped D-cut) ──────────────────────────────────── // Zone │ Feature │ Diameter / Width │ Length // ───────┼──────────────────┼────────────────────┼───────── @@ -43,7 +50,9 @@ AXLE_CL_HEIGHT = TIRE_OD / 2; // 127 mm — axle centre above ground // ============================================================================= WHEELBASE = 600.0; // mm axle C/L to axle C/L -PLATE_DEPTH = 220.0; // mm front-to-rear +// PLATE_DEPTH driven by 2-pack battery width: 2 × 88 mm = 176 mm + 2×15 mm edge = 206 mm min. +// 210 mm gives ~17 mm edge margin each side; increase if structural ribs are added. +PLATE_DEPTH = 210.0; // mm front-to-rear (was 220; reduced to match 2-pack footprint) PLATE_OVERHANG = 40.0; // mm plate extends past axle C/L on each side PLATE_THICK = 6.0; // mm stock thickness (6 mm Al / 8 mm acrylic) @@ -68,9 +77,22 @@ DCUT_CL = 0.3; // mm all-round clearance on D-cut profile FC_PITCH = 30.5; FC_HOLE_D = 3.2; -// Battery area — 24 V pack footprint (mount holes) -BATT_L = 185.0; -BATT_W = 72.0; +// Battery — REAL MEASUREMENTS (each cell pack) +// ┌──────────────────────────────────────────────────────────────────────────┐ +// │ 420 mm (L) × 88 mm (W) × 56 mm (H) per pack │ +// │ Default config: 2 packs side-by-side → footprint 420 × 176 mm │ +// │ Expansion: 4 packs (2+2) → 4-pack requires underdeck shelf │ +// │ — 4-pack side-by-side (352 mm wide) exceeds robot width envelope │ +// │ — 4-pack in-line (840 mm long) exceeds wheelbase │ +// │ → Only viable 4-pack layout: 2 on deck + 2 on secondary underdeck tray │ +// └──────────────────────────────────────────────────────────────────────────┘ +BATT_L = 420.0; // mm pack length (runs along X / wheelbase axis) +BATT_W = 88.0; // mm pack width (runs along Y / front-rear axis) +BATT_H = 56.0; // mm pack height (clearance for under-deck routing) +BATT_PACKS = 2; // packs on this plate (2 or 4); 4 adds shelf mounts +BATT_INSET = 18.0; // mm mount-hole inset from each pack end +BATT_STRAP_W = 25.0; // mm Velcro strap slot width +BATT_STRAP_T = 4.0; // mm strap slot depth (through-slot in plate) // Utility M3 = 3.2; M4 = 4.3; M5 = 5.3; @@ -136,6 +158,12 @@ module assembly() { translate([side * WHEELBASE/2, 0, 0]) rotate([0, side * 90, 0]) axle_ghost(); + + // Battery pack ghosts — shows 2-pack layout on deck surface + %for (pack_y = [BATT_W/2, -BATT_W/2]) + color("DarkGoldenrod", 0.35) + translate([-BATT_L/2, pack_y - BATT_W/2, PLATE_THICK]) + cube([BATT_L, BATT_W, BATT_H]); } // ============================================================================= @@ -185,22 +213,47 @@ module base_plate() { translate([x, y, -1]) cylinder(d=FC_HOLE_D, h=PLATE_THICK + 2); - // ── Battery tray mount holes (M4 × 4 corners) ────────────────────── - for (x = [-BATT_L/2 + 12, BATT_L/2 - 12]) - for (y = [-BATT_W/2 + 10, BATT_W/2 - 10]) - translate([x, y, -1]) + // ── Battery mount holes ────────────────────────────────────────────── + // Layout: 2 packs side-by-side, each running lengthwise (420 mm in X). + // Pack centres at y = +BATT_W/2 (pack A, front) + // y = -BATT_W/2 (pack B, rear) + // 4 mount holes per pack (corners, BATT_INSET from each end) = 8 holes total. + for (pack_y = [BATT_W/2, -BATT_W/2]) // two packs in Y + for (dx = [-BATT_L/2 + BATT_INSET, + BATT_L/2 - BATT_INSET]) // two holes in X per pack + translate([dx, pack_y, -1]) cylinder(d=M4, h=PLATE_THICK + 2); - // ── Lightening / cable routing slots (3 centre panels) ───────────── - slot_w = 28; - slot_h = PLATE_DEPTH - 80; - for (x = [-130, 0, 130]) - translate([x - slot_w/2, -slot_h/2, -1]) - // Rounded slot via hull - hull() { - translate([slot_w/2, slot_w/2, 0]) cylinder(d=slot_w, h=PLATE_THICK+2); - translate([slot_w/2, slot_h - slot_w/2, 0]) cylinder(d=slot_w, h=PLATE_THICK+2); - } + // ── Velcro strap slots (2 slots per pack, run full Y depth) ───────── + // Slots pierce the plate so the strap passes through from below. + // Positioned at x = ±BATT_L/4 (quarter-length of battery). + for (sx = [-BATT_L/4, BATT_L/4]) + translate([sx - BATT_STRAP_W/2, -PLATE_DEPTH/2 + 8, -1]) + cube([BATT_STRAP_W, PLATE_DEPTH - 16, PLATE_THICK + 2]); + + // ── 4-pack expansion shelf attachment holes (M5, 4 per side) ──────── + // Only punched when BATT_PACKS >= 4. + // These accept M5 bolts that hold a secondary underdeck tray for + // two more packs (same 420×88mm dims) mounted below the main plate. + if (BATT_PACKS >= 4) + for (ex = [-BATT_L/2 - 10, -BATT_L/6, + BATT_L/6, BATT_L/2 + 10]) + for (ey = [-PLATE_DEPTH/2 + 12, PLATE_DEPTH/2 - 12]) + translate([ex, ey, -1]) + cylinder(d=M5, h=PLATE_THICK + 2); + + // ── Lightening / cable routing slots ──────────────────────────────── + // Placed between the two battery pack columns and at the centre. + // Only if they don't overlap the strap slots (strap slots are at ±BATT_L/4). + slot_w = 22; + slot_h = BATT_W - 20; // runs between the pack boundaries + for (x = [-BATT_L/3 + 10, 0, BATT_L/3 - 10]) + hull() { + translate([x, -slot_h/2 + slot_w/2, -1]) + cylinder(d=slot_w, h=PLATE_THICK + 2); + translate([x, slot_h/2 - slot_w/2, -1]) + cylinder(d=slot_w, h=PLATE_THICK + 2); + } // ── Bearing seat relief (36mm slot lets hub collar clear plate edge) ─ // Prevents Ø37.8mm bearing seat from binding against plate edge.