Hackster is hosting Hackster Holidays, Ep. 6: Livestream & Giveaway Drawing. Watch previous episodes or stream live on Monday!Stream Hackster Holidays, Ep. 6 on Monday!
Scorch
Published © CC0

Hole-y Grail

Drain holes cause liquid to drain into the foot of this goblet. With the liquid in the foot there is a trick to drink the liquid.

IntermediateShowcase (no instructions)7 hours62
Hole-y Grail

Things used in this project

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)

Story

Read more

Custom parts and enclosures

Hole-y Grail

Hole-y Grail

Schematics

Cross Section

Cross section showing the internal channel.

Code

hole-y_grail.scad

SCAD
OpenSCAD code used to generate the STL file of the Hole-y Grail
Dextruder = .4;
Dpipe=2;
t=Dpipe+Dextruder*9;

OD=69;
H=140;
fnpipe=10;
cup_shapen=30;

dia=OD;
r2=dia/2;
r1=r2*3/2;
length=r1*2;


render() cup_model();

module cup_model()
{
    difference()
    {
        difference()
        {
            cup();
            drain_tubes();
        }
        // This is for taking a cross section
        //translate([0,-500,0])cube(1000);
        tubes();  
    }    
}




module cup()
{
    difference ()
    {
        union()
        {
            //////////////////////////
            // Bottom of bottom cup //
            //////////////////////////
            cylinder(d=OD,h=t/2);
            
            /////////////////////
            // Make bottom Cup //
            /////////////////////
            rotate_extrude ()
            {
                hull()
               {
                translate ([OD/2,t/4]) circle (d=t/2,$fn=25);
                translate ([OD/2,30])  circle (d=t/2,$fn=25);
                }
            }
            ///////////////////////////////////
            // Make flair ar bottom of stem  //
            ///////////////////////////////////
            translate([0,0,t/2])
                linear_extrude(10,scale=.1)circle(d=OD/2);
            
            ///////////////
            // Make Stem //
            ///////////////
            Dstem=9.0;
            linear_extrude (H/2,scale=1,twist=280)
            {
                translate([4,0])circle (d=Dstem,$fn=20);
                translate([-4,0])circle (d=Dstem,$fn=20);
                translate([0,4])circle (d=Dstem,$fn=20);
                translate([0,-4])circle (d=Dstem,$fn=20);
            }
            ///////////////////////////////////
            // Sphere at bottom of upper cup //
            ///////////////////////////////////
            translate([0,0,75])
                sphere(d=25);
            ///////////////////////
            // Upper cup Outside //
            ///////////////////////
            translate ([0,0,H])
                cup_shape(delta=t/2,dia=OD,n=cup_shapen);
        }
        
        //////////////////////////
        // Holes in Bottom Cup  //
        //////////////////////////
        for (a=[0:15:360])
        {
            rotate(a)
            {
                translate([OD/2,0,21+5])
                rotate([0,90,0])
                cylinder(d=6,h=10,center=true,$fn=25);
            }
        } 
        ////////////////////////////////
        // Cutout inside of upper cup //
        ////////////////////////////////
        translate ([0,0,H+1])
            cup_shape(delta=-t/2,dia=OD,n=cup_shapen);
        
        ///////////////////
        // Make Dimples  //
        ///////////////////
        Ddimple=6;
        for (a=[0:30:360])
        {
            rotate(a)
            {
                translate([OD/2+Ddimple+.0,0,H-9]) sphere(Ddimple);
            }
        } 

    }
    ///////////////////
    // Make Cup Rim  //
    ///////////////////
    translate([0,0,H])
    rotate_extrude()
    {
        $fs=1;
        $fa=1;
        translate([OD/2+1,0])circle(d=t*1.1,$fs=.1);
    }

}



/////////////////////////////////////////////////////////////////////////////////
function yyy(xx,r1,r2)= sqrt(r2*r2 * (1-(xx*xx)/(r1*r1)) / (1/( 1-0.6/r1*xx)) );

module cup_shape(delta=0.0,dia=6,n=25)
{
    $fn=n;
    step=(r1*2)/n;
    width=2*r2*cos(45);
    
    hull()
    {
    rotate([0,180,0])
    translate ([0,0,r1/3])
        rotate_extrude()
            for (xx=[-r1/3:step:r1])
            {
                hull()
                polygon(points=[
                [0,xx],
                [0,xx+step],
                [yyy(xx+step,r1,r2)+delta,xx+step],
                [yyy(xx,r1,r2)+delta,xx]
                ]);
            }
    }
}

module tubes()
{
    dia=OD;
    r2=dia/2;
    r1=r2*3/2;
    length=r1*2;
    
    r2=dia/2;
    r1=r2*3/2;
    echo(r1,r2);
    length=r1*2;
    step=(r1*2)/n;

    ///////////////////////////////////
    // Make straw tubes              //
    ///////////////////////////////////
    
    // starting at the bottom of the cup
    tube_points = [
                    [0,18,t  ],
                    [0,18,t/2],
                    [0,0     ,t/2],
                    [0,0     ,H-r1*4/3-5]];
                    
    for (i=[1:len(tube_points)-1])
    {
        hull()
        {   
            translate(tube_points[i-1])sphere(d=Dpipe,$fn=fnpipe);
            translate(tube_points[i]  )sphere(d=Dpipe,$fn=fnpipe);
        }
    }
    
    // Followin the arc up
    step = 2;
    mini = 4;
    maxi = floor(r1*4/3-t)-10;
    fudge=.6;
    for (i=[mini:step:maxi-step])
    {
        hull()
        {
        
        translate([0, yyy(r1-i-step,r1,r2),H-r1*4/3+i+step+fudge])
            sphere(d=Dpipe,$fn=fnpipe);
        translate([0, yyy(r1-i     ,r1,r2),H-r1*4/3+i+fudge     ])
            sphere(d=Dpipe,$fn=fnpipe);
        }
    }
    
    minz = H-r1*4/3+mini+fudge;
    minr = yyy(r1-mini ,r1,r2);
    

    
    maxz = H-r1*4/3+maxi+fudge;
    maxr = yyy(r1-maxi ,r1,r2);

    hull()
    {
    translate([0, minr,minz])  sphere(d=Dpipe,$fn=fnpipe);
    translate(tube_points[3])  sphere(d=Dpipe,$fn=fnpipe);
    }

    ang=0;
    rotate(ang)
    {
        for (i=[maxi:step:maxi+7])
        {
            hull()
            {
            translate([0, yyy(r1-i-step,r1,r2),H-r1*4/3+i+step])
                sphere(d=Dpipe,$fn=fnpipe);
            translate([0, yyy(r1-i     ,r1,r2),H-r1*4/3+i     ])
                sphere(d=Dpipe,$fn=fnpipe);
            }
        }
        hull()
        {
            translate([0, yyy(r1-(maxi+6)-step,r1,r2),H-r1*4/3+maxi+6+step])
                sphere(d=Dpipe,$fn=fnpipe);
            translate([0,t+ yyy(r1-(maxi+6)-step,r1,r2),H-r1*4/3+maxi+6+step])
                sphere(d=Dpipe,$fn=fnpipe);
        }
    }

    ///////////////////////////////////
    // trick vent hole tubes         //
    ///////////////////////////////////
    //translate([0,0,maxz])
    //rotate_extrude()
    //{
    //    translate([maxr,0])circle(d=Dpipe,$fn=fnpipe);
    //}
    
    
    

    
}

module drain_tubes()
{
    ///////////////////////////////////
    // Make drain / fountain tubes   //
    ///////////////////////////////////

    drain_points = [
                    [0,0 ,H-r1 ],
                    [0,0 ,79+11],
                    [0,30,27]];
    //color("green")
    for (alpha=[60:120:360-45])
    {
        rotate(alpha)
        {
            for (i=[1:len(drain_points)-1])
            {
                hull()
                {   
                    translate(drain_points[i-1])sphere(d=Dpipe*2,$fn=fnpipe);
                    translate(drain_points[i]  )sphere(d=Dpipe*2,$fn=fnpipe);
                }
            }
        }
    }
    ///////////////////////////////////   
}

Credits

Scorch

Scorch

-1 projects • 0 followers
Always working on something.

Comments