/* TODO - vybrani pro otevreni - mozna sirsi misto na baterku? - vetsi vybrani pro baterku ve vicku - kuzelova dira pro tlacitka - jine diry pro uchyceni - zvetsit vybrani na strane tlacitek - mozna prilis velky klip zasunovaciho konce baterky - diry pro neizolovany drat muzou byt mensi - sirsi zakladna - mensi horni cast klipu baterky - pri 0.7 je sirka nahore 16 mm. */ lowres = 1; eps = 0.01; infty = 300; wall = 1.5; // generic wall thickness // 18650 is ~18mm diameter, ~65mm length, batt_diam = 18 + 0.6; batt_len = 65 + 1.5; cable_sep = 2.5; // front flat area front_flat_len = batt_len + 2*wall + 2*cable_sep; // PCB-related dimensions pcb_len = 36 + 1; // length of the board pcb_width = 11 + 0.5; // width of the board pcb_thick = 1.2 + 0.3; // thickness of the board pcb_comp_h = 2.2; // height of the components on board pcb_groove = 0.5; body_top_h = 0.30 * batt_diam; // cube-shaped part of the body wire_thick = 2.2; wire_sep = 3.5; cable_out_diam = 5.2; pcbside_protrusion_len = 20; pcbside_protrusion_diam = 2.5; battside_protrusion_len = 10; battside_protrusion_diam = 2; base_batt_extend = wall + pcb_thick; // extend the base on the battery side cover_sep = 0.1; sw_diam = 2.5 + 0.5; led_diam = 3 + 0.5; sw_xoff = 250 * 25.4/1000; // x offset of microswitches pcb_clip_w = 7; pcb_clip_off = led_xoff + pcb_clip_w/2; module battery() { translate([-batt_len/2, 0, 0]) rotate([0, 90, 0]) cylinder(r=batt_diam/2, h = batt_len); }; module case_body() { hull() { translate([-batt_len/2-wall-cable_sep, -batt_diam/2-wall, 0]) cube([batt_len + 2*wall + 2*cable_sep, batt_diam+2*wall, body_top_h]); difference() { translate([-batt_len/2-wall-cable_sep, 0, 0]) rotate([0, 90, 0]) cylinder(r=batt_diam/2+wall, h = batt_len + 2*wall + 2*cable_sep); translate([-infty/2, -infty/2, eps]) cube(infty); }; translate([-front_flat_len/2, batt_diam/2 - pcb_width, -batt_diam/2-2*pcb_comp_h-pcb_thick-wall]) cube([front_flat_len, pcb_width+wall, eps]); /* translate([-batt_len/2 - 2*wall - cable_sep, 0, 0]) rotate([0, 90, 0]) cylinder(r = 1.414*wire_sep + wire_thick, h = batt_len + 4*wall + 2*cable_sep); */ }; }; module case() { difference() { case_body(); // upper cube-shaped part // rotate([20, 0, 0]) translate([-batt_len/2, -batt_diam/2, 0]) cube([batt_len, batt_diam, batt_diam]); // battery cylinder for the lower part translate([-batt_len/2, 0, 0]) rotate([0, 90, 0]) cylinder(r=batt_diam/2, h = batt_len); // hole for PCB translate([-pcb_len/2, batt_diam/2-pcb_width, -batt_diam/2-pcb_thick - pcb_comp_h]) cube([pcb_len, pcb_width, batt_diam/2 + pcb_thick + pcb_comp_h + eps]); // hole under the PCB translate([-pcb_len/2+pcb_groove, batt_diam/2-pcb_width + pcb_groove, -batt_diam/2-pcb_thick - 2*pcb_comp_h]) cube([pcb_len-2*pcb_groove, pcb_width-2*pcb_groove, batt_diam/2 + pcb_thick + pcb_comp_h + eps]); // LED hole translate([0, batt_diam/2-pcb_width/2, -infty/2]) { cylinder(r=led_diam/2, h=infty, $fn=6); translate([sw_xoff, 0, 0]) cylinder(r=sw_diam/2, h=infty, $fn=6); translate([-sw_xoff, 0, 0]) cylinder(r=sw_diam/2, h=infty, $fn=6); }; // space under the wire holes for battery contacts translate([-batt_len/2-wall-cable_sep-eps, 0, 0]) difference() { rotate([0, 90, 0]) cylinder(r = batt_diam/2-wall, h = batt_len + 2*wall + 2*cable_sep + 2*eps); translate([-infty/2, -infty/2, -body_top_h]) cube(infty); }; // wire holes for battery contacts for (x = [-1, 1]) for (y = [-1, 1]) translate([-batt_len/2-wall-eps, x*wire_sep/2, y*wire_sep/2]) rotate([0, 90, 0]) cylinder(r = wire_thick/2, h = batt_len + 2*wall + 2*eps, $fn=6); // wire hole from PCB to battery contacts // translate([-batt_len/2-wall-eps, 0, -batt_diam/2-pcb_comp_h + wire_thick/2]) rotate([40, 0, 0]) translate([-batt_len/2-wall-eps, 0, -batt_diam/2 - wall/2 - wire_thick/2]) rotate([0, 90, 0]) cylinder(r = wire_thick/2, h = batt_len + 2*wall + 2*eps, $fn=6); // hole behind the battery contacts for(x=[1, -1]) scale([x, 1, 1]) translate([batt_len/2+wall, 0, 0]) hull() { translate([0, -batt_diam/2, 0]) cube([cable_sep + eps, batt_diam, infty]); rotate([0, 90, 0]) cylinder(r = batt_diam/2, h = cable_sep+eps); translate([0, batt_diam/2 - pcb_width, -batt_diam/2-pcb_comp_h-pcb_thick]) cube([cable_sep + eps, pcb_width, eps]); }; }; }; module lid_body() { translate([-batt_len/2 + eps, -batt_diam/2, -batt_diam/2-eps]) cube([batt_len - 2*eps, batt_diam, batt_diam/2 - body_top_h + wall + eps]); translate([-batt_len/2 - wall - cable_sep, -batt_diam/2 - wall, -batt_diam/2-wall]) cube([batt_len + 2*wall + 2*cable_sep, batt_diam + 2*wall, wall + batt_diam/2 - body_top_h]); // clip behind the battery contacts for(x=[1, -1]) scale([x, 1, 1]) translate([batt_len/2+cable_sep, 0, 0]) hull() { translate([0, -batt_diam/2, -batt_diam/2]) cube([wall, batt_diam, eps]); rotate([0, 90, 0]) cylinder(r = batt_diam/2, h = wall); translate([0, batt_diam/2 - pcb_width, batt_diam/2+pcb_comp_h+pcb_thick]) cube([wall, pcb_width, eps]); }; }; module lid() { difference() { lid_body(); translate([-batt_len/2-eps, 0, 0]) rotate([0, 90, 0]) cylinder(r=batt_diam/2, h=batt_len+2*eps); }; }; /* color("lightblue", 0.2) translate([-65/2, 0, 0]) rotate([0, 90, 0]) cylinder(r=18/2, h=65); */ translate([0, 30, 0]) case($fn=128); lid($fn=128);