commit 5a07b367027aa19d311e7854bf51903a5f1183a0 Author: Felizitas Ritter Date: Mon Nov 7 19:53:36 2022 +0100 Moved into fresh repository. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9bd4ee0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.gcode +*.stl \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..905ee63 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# A Parametrizeable pill dispenser + +A printable object for storing pills that can be parametrized to fit most round tablets. + +Originally designed between December 2019 and January 2020 to keep loose pills intact. diff --git a/pill_dispenser.scad b/pill_dispenser.scad new file mode 100644 index 0000000..3869931 --- /dev/null +++ b/pill_dispenser.scad @@ -0,0 +1,146 @@ +// short for "render hack" +rhck=0.01; + +// print quality/robustness/material params +wall_t=1; +bottom_t=0.6; +clr=0.3; +$fn=60; + +// parameters regarding tablet size and amount +diameter = 7.3; // diameter of compartment +heigth = 3.4; // heigth of compartment +amount = 8; // amount of compartments +keyring=false; // adds a keyring +splitting_aid=true; // splitting aid + + +// implementation +translate([0,15,0])color([0.6,0.7,0.8]){ + carrier(amount,diameter,heigth,with_splitter=splitting_aid); +} +translate([0,30,wall_t+clr])color([1,1,1,0.6]){ + shroud(amount,diameter,heigth,with_gap=1,with_keyring=keyring); +} + +// carrier: carries the actual contents +module carrier(n=6,d_t=7,h_t=3.5,with_splitter=1){ + // derived params + r_t=d_t/2; + carrier_h=h_t+bottom_t; + rad_end=r_t+wall_t; + difference(){ + union(){ + cylinder(carrier_h+wall_t+0.5,rad_end,rad_end); + translate([(n-1)*(d_t+wall_t),0,0]){ + cylinder(carrier_h,rad_end,rad_end); + } + cylinder(carrier_h+bottom_t,rad_end,rad_end); + for(i=[1:n])translate([i*(d_t+wall_t),0,0]){ + cylinder(carrier_h,rad_end,rad_end); + } + translate([0,-r_t,0]){ + cube([(n)*(d_t+wall_t),d_t,carrier_h]); + } + } + for(i=[0:n])translate([i*(d_t+wall_t),0,bottom_t]){ + if(i==0){ + // grip piece + if(with_splitter){ + translate([0,0,h_t])cylinder(h_t+wall_t+1+rhck,r_t+clr/2,r_t+wall_t); + }else{ + translate([0,0,h_t])cylinder(h_t+wall_t+1+rhck,r_t+clr/2,r_t+clr); + } + }else{ + // compartments + cylinder(h_t+wall_t+1+rhck,r_t+clr/2,r_t+clr/2); + } + } + } + // edge of pill splitter + if(with_splitter){ + translate([0,0,h_t])rotate([0,45,0]){ + cube([3*d_t/8,d_t+wall_t,3*d_t/8],center=true); + } + } +} + +// shroud: keeps the contents in the carrier +module shroud(n=6,d_t=7,h_t=3.5,with_gap=1,with_keyring=0){ + // derived params + r_t=d_t/2; + carrier_h=h_t+bottom_t; + rad_end=r_t+wall_t; + inner_r=rad_end+clr; + outer_r=inner_r+wall_t; + inner_h=carrier_h+clr; + shroud_h=wall_t+wall_t+carrier_h+clr; + translate([0,0,-wall_t-clr]){ + difference(){ + union(){ + // positive of spring end + cylinder(shroud_h,outer_r,outer_r); + // rear end + translate([((with_keyring)?(n+1.5):(n))*(d_t+wall_t),0,0]){ + cylinder(shroud_h,outer_r,outer_r); + } + // middle part + translate([0,-outer_r,0]){ + cube([((with_keyring)?(n+1.5):(n))*(d_t+wall_t),outer_r*2,shroud_h]); + } + } + + // cylindrical cutout on spring end + translate([0,0,-rhck]){ + cylinder(shroud_h+2*rhck,inner_r,inner_r); + } + // rectanguar hollow + translate([0,-inner_r,wall_t]){ + cube([n*(d_t+wall_t),inner_r*2,inner_h]); + } + // half-cylinder hollow + translate([n*(d_t+wall_t),0,wall_t]){ + cylinder(inner_h,inner_r,inner_r); + } + + //cutout on spring end + translate([0,-inner_r,-rhck])cube([inner_r/2,inner_r*2,shroud_h+rhck*2]); + translate([0,-inner_r/2,-rhck])cube([inner_r,inner_r,shroud_h+rhck*2]); + for(i=[0,1])mirror([0,i,0]){ + translate([inner_r/2,inner_r/2,-rhck]){ + cylinder(shroud_h+rhck*2,inner_r/2,inner_r/2); + } + } + translate([-outer_r,0,-rhck])rotate([0,0,45]){ + translate([-inner_r,-inner_r,0]){ + cube([2*inner_r,2*inner_r,shroud_h+2*rhck]); + } + } + + // optional keyring + if(with_keyring)translate([(n+1.5)*(d_t+wall_t),0,-rhck]){ + cylinder(shroud_h+rhck*2,r_t,r_t); + } + + if(with_gap){ + // cutout for printability + translate([0,0,shroud_h-wall_t-rhck]){ + translate([0,-inner_r+1.7,0]){ + cube([n*(d_t+wall_t),2*inner_r-(2*1.7),wall_t+2*rhck]); + } + translate([n*(d_t+wall_t),0,0]){ + cylinder(wall_t+2*rhck,inner_r-1.7,inner_r-1.7); + } + } + } + + // cutaway to look inside (for modelling purposes) + //translate([0,0,2])cube([100,100,100]); + } + + // spring ends + for(i=[48,-48])rotate([0,0,i+180])translate([inner_r+wall_t/2,0,0]){ + cylinder(shroud_h,2*wall_t/3,2*wall_t/3); + } + } +}