$fn = 50; threshold = 0.1; half_threshold = threshold / 2; wire_radius = 1; wall_thickness = 2; cutout_threshold = 1; battery_length = 71; battery_width = 18.75; cell_holder_length = battery_length + wall_thickness * 2; cell_holder_width = battery_width + wall_thickness * 2; cell_holder_height = battery_width + wall_thickness; battery_contact_thickness = .6; // battery_contact_thickness = 1; battery_contact_width = 11; battery_contact_length = 12.8; battery_contact_spring_height = 10.5; battery_contact_flange_height = 1.9; converter_width = 11.25; converter_length = 22.25; converter_height = 4.25; module box(length, width, height, wall_thickness) { center_width = width - wall_thickness; center_height = height - wall_thickness; center_length = length - wall_thickness; union() { hull() { translate([-center_width / 2, -center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([-center_width / 2, -center_length / 2, center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, -center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, -center_length / 2, center_height / 2]) sphere(r = wall_thickness); } hull() { translate([-center_width / 2, center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([-center_width / 2, center_length / 2, center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, center_length / 2, center_height / 2]) sphere(r = wall_thickness); } hull() { translate([-center_width / 2, -center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([-center_width / 2, -center_length / 2, center_height / 2]) sphere(r = wall_thickness); translate([-center_width / 2, center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([-center_width / 2, center_length / 2, center_height / 2]) sphere(r = wall_thickness); } hull() { translate([center_width / 2, -center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, -center_length / 2, center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, center_length / 2, center_height / 2]) sphere(r = wall_thickness); } hull() { translate([-center_width / 2, -center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([-center_width / 2, center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, -center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, center_length / 2, -center_height / 2]) sphere(r = wall_thickness); } } /* difference() { cube([width, length, height], center = true); translate([0, 0, wall_thickness]) cube([width - wall_thickness * 2, length - wall_thickness * 2, height + threshold], center = true); } */ } module channel(length, width, height, wall_thickness) { center_width = width - wall_thickness; center_height = height - wall_thickness; center_length = length - wall_thickness; union() { hull() { translate([-center_width / 2, -center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([-center_width / 2, -center_length / 2, center_height / 2]) sphere(r = wall_thickness); translate([-center_width / 2, center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([-center_width / 2, center_length / 2, center_height / 2]) sphere(r = wall_thickness); } hull() { translate([center_width / 2, -center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, -center_length / 2, center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, center_length / 2, center_height / 2]) sphere(r = wall_thickness); } hull() { translate([-center_width / 2, -center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([-center_width / 2, center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, -center_length / 2, -center_height / 2]) sphere(r = wall_thickness); translate([center_width / 2, center_length / 2, -center_height / 2]) sphere(r = wall_thickness); } } /* difference() { cube([width, length, height], center = true); translate([0, 0, wall_thickness]) cube([width - wall_thickness * 2, length + threshold, height + threshold], center = true); } */ } module cell_cradle(length, width) { translate([0, 0, -width / 4]) difference() { cube([width + wall_thickness * 2, wall_thickness, width / 2], center = true); translate([0, 0, width / 2]) rotate([90, 0, 0]) cylinder(h = wall_thickness + cutout_threshold, r = width / 2, center = true); } } module cell_box() { union() { channel(cell_holder_length, cell_holder_width, cell_holder_height, wall_thickness); translate([0, -battery_length / 6, 0]) cell_cradle(cell_holder_length, battery_width); translate([0, battery_length / 6, 0]) cell_cradle(cell_holder_length, battery_width); } } module contact_box(width, contact_width, contact_height, contact_thickness) { contact_thickness_ = contact_thickness * .75; cutout_width = contact_width * .8; box_width = width + wall_thickness * 2; box_thickness = contact_thickness_ + wall_thickness * 2; box_height = width + wall_thickness; union() { color("red", 1) cube([box_width, box_thickness, width + wall_thickness], center = true); translate([0, 0, wall_thickness * 2]) cube([contact_width, contact_thickness_, contact_height + cutout_threshold], center = true); /* translate([box_width / 2 - (contact_width * .8) / 2, wall_thickness, box_height - contact_height]) cube([contact_width * .8, wall_thickness + contact_thickness_ + cutout_threshold, contact_height + cutout_threshold]); translate([width / 2 + wall_thickness, 0, width + wire_radius * 2]) rotate([-90, 0, 0]) cylinder(h=wall_thickness * 4, r=wire_radius, center = true); rotate([0, 180, 0]) translate([-cutout_threshold / 2, box_thickness, width + wire_radius * 2]) cylinder(h = width + wall_thickness * 2 + cutout_threshold, r = 1, center = true); */ } } module battery_slot(length, width) { union() { translate([width + wall_thickness * 2, wall_thickness, 0]) contact_box(battery_width, battery_contact_width, battery_contact_length, battery_contact_flange_height); translate([0, wall_thickness, 0]) cell_box(); translate([0, wall_thickness + length, 0]) rotate([0, 0, 180]) contact_box(battery_width, battery_contact_width, battery_contact_length, battery_contact_flange_height); } } module battery_case() { union() { battery_slot(battery_length, battery_width); translate([battery_width + wall_thickness, 0, 0]) battery_slot(battery_length, battery_width); } } battery_case(); translate([-50, 0, 0]) contact_box(battery_width, battery_contact_width, battery_contact_length, battery_contact_flange_height); /* rotate([0, 90, 0]) translate([0, 5, 0]) cylinder(h=battery_width + wall_thickness * 2 + cutout_threshold, r=1, center = true); translate([0, -5, 0]) rotate([0, 90, 0]) cylinder(h=battery_width + wall_thickness * 2 + cutout_threshold, r=1, center = true); */