feat: Prototype base plate — real hub motor axle measurements #11

Merged
seb merged 3 commits from sl-mechanical/prototype-baseplate into main 2026-02-28 15:17:48 -05:00
2 changed files with 88 additions and 22 deletions
Showing only changes of commit 5bb5c7f863 - Show all commits

View File

@ -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 | 12 | 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 |
---

View File

@ -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.