// ===================================================================== // Revolt Kits — Battery Bank Housing (Housing 2) // Parametric source — OpenSCAD 2021.01+ // // Architecture: 2-piece clamshell. Base tray holds 3x 13350 cells in // open U-channels (full-height ridges between cells) with spring (-) // and plate (+) contact pockets at each end, plus an open bay for the // charge/boost/display board and a panel-mount switch. A flat lid // closes over the top and is what retains the cells vertically — the // channels only position them laterally. No O-ring — indoor-use item. // // Print orientation: base tray prints flat, open side up — every // cavity is open from the top, zero supports. Lid prints flat too. // Both finish well inside a 1-3hr library slot. // // FLAGGED ASSUMPTIONS (see README.md) — verify before final print: // - board_thickness: unconfirmed. Interior is tall enough (sized to // cell diameter) that this doesn't constrain the design — only // standoff height, which is a modest fixed value here. // - Type-C / USB-A port cutout positions are NOT modeled (unknown // edge locations). The end wall above the board bay is left low/ // open so ports are reachable; hand-fit once the board is in hand. // - Contact hardware (compression springs + brass/nickel plates) is // assumed but not in your current BOM — flagged in the write-up. // ===================================================================== $fn = 48; // "assembly" | "base_tray" | "lid" part = "assembly"; // ===================== CELLS (3x 13350, parallel) ==================== cell_dia = 13.0; cell_len = 35.0; cell_clear = 1.0; cell_ch_w = cell_dia + cell_clear; // 14.0 channel width n_cells = 3; cell_pitch = cell_ch_w + 2.0; // 16.0 center-to-center (2mm ridge) // contact pockets at the ends of each channel spring_pocket_d = 8.5; spring_pocket_deep = 5.0; plate_pocket_w = 11.0; plate_pocket_l = 6.0; plate_pocket_deep = 1.2; // shallow shelf cut, from the floor up end_margin = 3.0; // extra length beyond the cell for each pocket cell_ch_len = cell_len + spring_pocket_deep + plate_pocket_l + 2*end_margin; // ~54 // ======================= CHARGE/DISPLAY BOARD ========================== // 26.9 x 41.9mm board (Type-C in, USB-A out, digital display) brd_w = 26.9; brd_h = 41.9; brd_clear = 1.0; brd_bay_w = brd_w + brd_clear; // 27.9 brd_bay_h = brd_h + brd_clear; // 42.9 standoff_d = 3.6; standoff_hole_d = 2.0; standoff_h = 4.0; // FLAGGED — modest fixed clearance under the board // ========================= SWITCH ======================================== sw_hole_d = 12.0; sw_boss_od = 17.0; // ===================== SHELL / WALLS ===================================== wall = 2.2; floor_t = 2.0; partition = 2.6; corner_r = 4; // interior clear height: sized to fully contain the cell diameter so // the flat lid can close over everything (the lid is what retains // the cells — see note above). interior_h = cell_dia + 2.5; // ~15.5 tray_h = floor_t + interior_h; // ~17.5 cellrow_x = cell_ch_len; cellrow_y = n_cells * cell_pitch; boardzone_x = brd_bay_w + 2*wall; boardzone_y = brd_bay_h; tray_x = wall + cellrow_x + partition + boardzone_x + wall; tray_y = max(cellrow_y, boardzone_y) + 2*wall; lid_t = 2.2; boss_screw_d = 2.6; boss_screw_od = 6.5; cellrow_x0 = -tray_x/2 + wall; // inner-left edge of cell zone boardzone_x0 = tray_x/2 - wall - boardzone_x; // outer-left edge of board zone // --------------------------------------------------------------------- module rrect(w, h, r) { hull() { for (x = [-(w/2-r), (w/2-r)]) for (y = [-(h/2-r), (h/2-r)]) translate([x,y]) circle(r=r); } } // ========================================================================= // BASE TRAY // ========================================================================= module base_tray() { difference() { // ---- outer shell (solid block) ---- linear_extrude(height = tray_h) rrect(tray_x, tray_y, corner_r); // ---- CELL ROW ZONE: individual channels, open top, full height ---- // (leaves 2mm ridges between channels automatically, since only // the channel strips themselves are cut) for (i = [0:n_cells-1]) { ypos = -cellrow_y/2 + cell_pitch/2 + i*cell_pitch; translate([cellrow_x0, ypos - cell_ch_w/2, floor_t]) cube([cellrow_x, cell_ch_w, tray_h]); // spring pocket (negative terminal), near end, slightly deeper translate([cellrow_x0 - 0.1, ypos - spring_pocket_d/2, floor_t]) cube([spring_pocket_deep, spring_pocket_d, spring_pocket_deep + 3]); // plate pocket (positive terminal), far end, shallow shelf translate([cellrow_x0 + cellrow_x - plate_pocket_l, ypos - plate_pocket_w/2, floor_t]) cube([plate_pocket_l + 0.1, plate_pocket_w, plate_pocket_deep]); } // bus wire channels linking the 3 spring pockets, and the 3 plate pockets // (shallow slots in the ridges, just above the floor) translate([cellrow_x0 - 0.1, -cellrow_y/2 + cell_pitch/2, floor_t]) cube([spring_pocket_deep, cellrow_y - cell_pitch, 3]); translate([cellrow_x0 + cellrow_x - plate_pocket_l, -cellrow_y/2 + cell_pitch/2, floor_t]) cube([plate_pocket_l + 0.1, cellrow_y - cell_pitch, 3]); // lead-out slot from the positive bus, through the partition, to the board bay translate([cellrow_x0 + cellrow_x - plate_pocket_l, -2, floor_t]) cube([cellrow_x + 2*partition, 4, 3]); // ---- BOARD BAY ZONE: open pocket, full height ---- translate([boardzone_x0 + wall, -brd_bay_h/2, floor_t]) cube([brd_bay_w, brd_bay_h, tray_h]); // switch hole through the far end wall (+X), centered on the board bay translate([tray_x/2 - 0.5, 0, floor_t + interior_h/2]) rotate([0,90,0]) cylinder(d = sw_hole_d, h = wall + 1); // screw pilot holes (through the floor, at tray corners) for (sx = [-(tray_x/2 - 6), (tray_x/2 - 6)]) for (sy = [-(tray_y/2 - 6), (tray_y/2 - 6)]) translate([sx, sy, -0.5]) cylinder(d = boss_screw_d, h = floor_t + 3); } // ---- board standoffs, rising from the bay floor ---- bx0 = boardzone_x0 + wall; for (sx = [bx0 + 4, bx0 + brd_bay_w - 4]) for (sy = [-brd_bay_h/2 + 5, brd_bay_h/2 - 5]) translate([sx, sy, floor_t]) difference() { cylinder(d = standoff_d + 2, h = standoff_h); translate([0,0,-0.5]) cylinder(d = standoff_hole_d, h = standoff_h + 1); } // ---- switch boss (reinforcement collar) ---- translate([tray_x/2 - 1, 0, floor_t + interior_h/2]) rotate([0,90,0]) difference() { cylinder(d = sw_boss_od, h = 3); translate([0,0,-0.5]) cylinder(d = sw_hole_d, h = 4); } // ---- screw bosses (standoffs for lid screws, at tray corners) ---- for (sx = [-(tray_x/2 - 6), (tray_x/2 - 6)]) for (sy = [-(tray_y/2 - 6), (tray_y/2 - 6)]) translate([sx, sy, floor_t]) difference() { cylinder(d = boss_screw_od, h = tray_h - floor_t - 1); translate([0,0,-0.5]) cylinder(d = boss_screw_d, h = tray_h); } } // ========================================================================= // LID // ========================================================================= module lid() { difference() { linear_extrude(height = lid_t) rrect(tray_x, tray_y, corner_r); for (sx = [-(tray_x/2 - 6), (tray_x/2 - 6)]) for (sy = [-(tray_y/2 - 6), (tray_y/2 - 6)]) translate([sx, sy, -0.5]) cylinder(d = boss_screw_d + 0.6, h = lid_t + 1); } } // ========================================================================= if (part == "base_tray") { base_tray(); } else if (part == "lid") { lid(); } else { color("Teal") base_tray(); color("SlateGray") translate([0,0,tray_h + 8]) lid(); }