// ------------------------------------------------------------------------ // Customizable battery holder. // Instead of holes or cubes for each battery, there is a width of the // battery holder and a long cutout centered on the width. The cutout size // is choosen by the maximum number of batteries of the selected type which // fit into the cutout (battery diameter + a small offset) // Each holder holds one type of battery in at least one line. // The battery holders may have two holes on one side and two connectors // on the other side to connect the different holders. The position of the // box is important for the connectors to be appied. // standalone : no connectors are applied // top : only the connectors are appied at the bottom of the box // center : holes are appied at the top and connectors are applied // at the bottom of the box // bottom : wholes are applied at the top of the box // ______________________________ // | 0 0 | // | -------------------------- | // | | | | // | -------------------------- | // |______________________________| // 0 0 // // If all the boxes have the same width, they can be connected, no matter // how big the batteries are. // ------------------------------------------------------------------------ //--------------------------- configurator -------------------------------- /* [Battery type] */ // The type of the batteries Battery_type = "None"; // [None, Mono, Block, CR123A, AA, AAA] /* [Box options] */ // The width of the box Width = 110; // The number of rows of the box Rows = 2; // [1:10] // The height of the box Height = 30; // Position of the box Position = "standalone"; // [standalone, top, center, bottom] /* [Hidden] */ $fn=52; // ********************** // ** Static Settings: ** // ********************** // You may redefine the local settings depending on your 3D printer // Attributes of the batteries: // A description, the width or diameter, the length or diameter and the height // The atttributes are selected by the Battery_type of the configurator. // Remark: The battery height is currently not used. battery = object([ ["None", ["no output", 0.0, 0.0, 0.0]], ["Mono", ["Mono cell", 25.3, 25.3, 49.6]], ["Block", ["9V Block", 16.7, 25.7, 47.2]], ["CR123A", ["CR123A cell", 16.6, 16.6, 34.2]], ["AA", ["AA cell", 14.5, 14.5, 50.7]], ["AAA", ["AAA cell", 10.4, 10.4, 44.5]] ]); // Some other often used settings BASE_THICKNESS = 2.0; WALL_THICKNESS = 3; INNER_WALL = 1; PIN_SIZE = 1.5; HOLE_SIZE = PIN_SIZE + 0.3; PIN_HEIGHT = Height * 0.9; // ********************* // ** Helper Modules: ** // ********************* // ------------------------------------------------------------------------ // Connector to connect the battery holders wit each other. // ------------------------------------------------------------------------ module connector (height, pinwidth, center = false, rotate = true) { d = pinwidth * 1.5; len = pinwidth + d / 2; offset = (d - len) / 2; target = center ? [-offset, 0, 0] : // centered around the cylinder with pin! [d / 2, -d / 2, height / 2]; // cylinder tangents on the x and y axis translate(target) { rotate([0, 0, rotate ? 90 : 0]) { translate ([pinwidth / 2, 0, 0]) cube ([pinwidth, pinwidth, height], center=true); cylinder(h = height, d = d, center=true); } } } // ------------------------------------------------------------------------ // calculate the length of the box for the number of rows // ------------------------------------------------------------------------ function boxlen(battery_len, rows) = battery_len * rows + INNER_WALL * (rows - 1) + 2 * WALL_THICKNESS; // ------------------------------------------------------------------------ // draw a battery box without the pins // ------------------------------------------------------------------------ module batterybox(width, rows, height, type) { len = boxlen(type[2], rows); inner_cnt = floor(width / (type[1] + 0.2)); inner_width = inner_cnt * (type[1] + 0.2); inner_x = (width - inner_width) / 2; difference() { cube([width, len, height]); translate([inner_x, WALL_THICKNESS, BASE_THICKNESS]) cube([inner_width, type[2] * rows + INNER_WALL * (rows - 1), height]); } for (y = [WALL_THICKNESS + type[2] : INNER_WALL + type[2] : len - 2 * WALL_THICKNESS]) { translate([0, y, 0]) cube([width, INNER_WALL, height]); } } // ------------------------------------------------------------------------ // position the pins at the bottom or top of the box // ------------------------------------------------------------------------ module locate_pins(type, rows, height, width, size, pos, pin_dist = 5) { translate ([0, (pos == "bottom" ? boxlen(type[2], rows) : 0), 0]) { translate ([pin_dist, 0, 0]) connector(height = height, pinwidth = size); translate ([width - pin_dist * 1.5 , 0, 0]) connector(height = height, pinwidth = size); } } // ------------------------------------------------------------------------ // bring the modules together and set the configurator values ... // ------------------------------------------------------------------------ module main() { if (Battery_type != "None") { battery_type = battery[Battery_type]; difference() { batterybox(width = Width, rows = Rows, height = Height, type = battery_type); if (Position == "bottom" || Position == "center") locate_pins(type = battery_type, rows = Rows, width = Width, height = PIN_HEIGHT, size = HOLE_SIZE, pos = "bottom"); } if (Position == "top" || Position == "center") locate_pins(type = battery_type, rows = Rows, width = Width, height = PIN_HEIGHT, size = PIN_SIZE, pos = "top"); } } // ------------------------------------------------------------------------ // Do it! // ------------------------------------------------------------------------ main();