diff --git a/include/screw.scad b/include/screw.scad index 14c77270bb15d69f090e53ee1e3fb99f432d94db..8cf45a0f31bd3ce0d4535f2e24cd305efc951e44 100644 --- a/include/screw.scad +++ b/include/screw.scad @@ -49,6 +49,13 @@ module _screw_thread(N=10, R=10, R_min=12, R_maj=15, P=3, taper=true) { ); } +/* + P: pitch + D_maj: major diameter + tol: tolerance + h: height + taper: taper +*/ module metric_screw(P=3, D_maj=14, tol=0, h=30, taper=true) { R_maj=D_maj/2+tol; R_min=R_maj-5/16*sqrt(3)*P; diff --git a/src/pill_box.scad b/src/pill_box.scad new file mode 100644 index 0000000000000000000000000000000000000000..6fd6fd0f272a6a7580261e7b8d8043d72527feb7 --- /dev/null +++ b/src/pill_box.scad @@ -0,0 +1,124 @@ +use </home/kgy/repos/3d_models/include/screw.scad>; + +slots=8; +r=40; +corner_r=2.3; +center_gap_r=9; +edge_gap_r=3; +height=20; +center_bulge_r=8; +center_bulge=2; +bottom_thickness=1; +notch_r = 2; +screw_head_thickness=2; + +lid_height = center_bulge-0.5; + +//preview(); +print(); + +module print() { + translate([0,0,lid_height]) + rotate([180,0,0]) lid(); + /*intersection() { + linear_extrude(20) union() { polygon([ + [0,0], [50, 10], [10, 50] + ]); circle(r=13); } + box(); + }*/ + /*intersection() { + rotate([0,0,-135]) linear_extrude(20) union() { polygon([ + [0,0], [50, 10], [10, 50] + ]); circle(r=13); } + translate([0,0,lid_height]) rotate([180,0,0]) lid(); + }*/ + //translate([27,0,height+2]) rotate([180,0,0]) screw(); +} + +module preview() { + box(); + translate([0,0,height+5]) screw(); + translate([0,0,height+5]) lid(); +} + +module flower(r=10, v=1, petals=8) { + function rfn(a) = r + sin(a*petals)*v; + polygon([ for (i=[1:360]) + [ cos(i)*rfn(i), sin(i)*rfn(i) ] ]); +} + +module screw() { + intersection() { + screw_thread(taper=true); + translate([-50,-50,0]) cube([100,100,height+1]); + } + translate([0,0,height]) + linear_extrude(screw_head_thickness) + flower(v=0.8, r=10); +} + +module screw_thread(taper=false, tol=0) { + intersection() { + translate([0,0,taper ? bottom_thickness : -1]) + metric_screw(P=3, D_maj=14, tol=tol, taper=taper); + translate([-50,-50,bottom_thickness]) + cube([100, 100, 100]); + } +} + +module lid() { + union() { + linear_extrude(lid_height) difference() { + union() { + lid_tab_r = 15; + circle(r=r,$fn=200); + translate([0,r-lid_tab_r*(2/3),0]) + flower(r=lid_tab_r, v=2, petals=5); + } + circle(r=center_bulge_r+0.3, $fn=100); + segment(); + } + for (i=[-2:1]) { + rotate([0,0,(360/slots)*(i+.5)]) + translate([0, r-edge_gap_r, lid_height/2]) + intersection() { + sphere(r=notch_r, $fn=30); + translate([-50,-50,-notch_r+.3]) + cube([100,100,notch_r-.3]); + } + } + } +} + +module box() { + difference() { + union() { + cylinder(r=r, h=height, $fn=200); + cylinder(r=center_bulge_r, + h=height+center_bulge, $fn=50); + } + for (i=[1:slots]) rotate([0,0,(360/slots)*i ]) { + translate([0,0,bottom_thickness]) + linear_extrude(height) segment(); + rotate([0,0,360/slots/2]) + translate([0, r-edge_gap_r, height]) + sphere(r=notch_r, $fn=30); + } + screw_thread(tol=0.7); + } +} + +module segment() { + minkowski() { + circle(r=corner_r, $fn=20); + intersection() { + circle(r=r-corner_r-edge_gap_r, $fn=100); + alpha=360/slots; + polygon([ + [0,corner_r+center_gap_r], + [tan(alpha/2)*r,r+corner_r+center_gap_r], + [tan(-alpha/2)*r,r+corner_r+center_gap_r] + ]); + } + } +} \ No newline at end of file diff --git a/src/screw_bit_holder.scad b/src/screw_bit_holder.scad new file mode 100644 index 0000000000000000000000000000000000000000..181081d5898913fd25c2f84570df0509939d0345 --- /dev/null +++ b/src/screw_bit_holder.scad @@ -0,0 +1,106 @@ +use <../include/screw.scad>; + +$fn=100; +bit_h = 30; +bit_raise = 1; +base_r = 30; +r = base_r - 3; +corner_r = 2; +base_h = 5; +cap_h = bit_h + bit_raise*2 - base_h + /* tolerance */ + 1; +pitch = 5; + +module bit() { + translate([0,0,bit_raise]) + cylinder(r=4/sqrt(3)+0.4, $fn=6, h=bit_h); +} + +module bits() { +// https://en.wikipedia.org/wiki/Fermat%27s_spiral + b = .33; + angle_step = 137.5; + for (i = [1:30]) { + theta = angle_step*i; + r = b*sqrt(theta); + rotate([0,0,theta]) + translate([r,0,0]) + //rotate([0,0,-theta]) + bit(); + } +} + +module screw(tol=0) { + /* screw */ + R_min=r-5/16*sqrt(3)*pitch; + metric_screw(P=pitch, D_maj=r*2, + tol=tol, h=30, taper=true); + cylinder(r=R_min, h=100); +} + +module box() { + intersection() { + union() { + /* base */ + minkowski() { + translate([0,0,corner_r]) + cylinder(h=base_h - corner_r * 2, + r=base_r - corner_r); + sphere(r=corner_r); + } + translate([0,0,base_h/2]) + cylinder(h=base_h/2, r=base_r); + + translate([0,0,5]) + translate([0,0,11]) + rotate([180,0,0]) + screw(); + } + translate([-50, -50, 0]) cube([100, 100, bit_raise + bit_h / 2]); + } +} + +module cap() { + difference() { + union() { + minkowski() { + translate([0,0,corner_r]) + cylinder(h=cap_h - corner_r * 2, + r=base_r - corner_r); + sphere(r=corner_r); + } + cylinder(h=cap_h/2, r=base_r); + } + intersection() { + translate([0,0,-4]) + screw(tol=1); + cube([100,100,(cap_h - bit_raise)*2], center=true); + } + } +} + +module bottom() { + difference() { + box(); + bits(); + } +} + +module cutaway() { + rot = 10; + intersection() { + rotate([0,0,100]) union() { + bottom(); + rotate([0,0,rot]) + translate([0,0,base_h + + (rot/360)*pitch]) + cap(); + } + translate([-50,0,0]) + cube([100,100,100]); + } +} + +//cutaway(); +bottom(); +//cap(); \ No newline at end of file