Exit Full View
Up

/Garden/SunUmbrellaConnector.foocad

SunUmbrellaConnector

I have a ground spike for a rotary clothers line, and a sun umberlla whose pole is wider than the ground spike.

So, let's buy a piece of steel tube and connect the parts together...

Alas, I couldn't easily but a tube with the correct width for the ground spike, so I also printed an adaptor. Actually, my first attempt will re-use a spare old metal tube. It isn't very wide, so I'm going to pour in some concrete. Concrete reinforce steel ;-))

These parts have to be strong enough to contend with the wind. Layer lines aren't an issue, as all the forces are horizontal.

Set the number of perimeters such that the thickness around the circles are all perimeters (not infill). The infill percentage can be very low.

NOTE.

Position the umbrella so that the wind PULLS it away from the post???

The "default" diagram shows a VERY short pole - make it much taller!

Which plastic is best? IDK! I went with ASA, for it resistance to UV.

FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
import uk.co.nickthecoder.foocad.cup.v1.*
import static uk.co.nickthecoder.foocad.cup.v1.Cup.*
import uk.co.nickthecoder.foocad.smartextrusion.v1.*
import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.*

class SunUmbrellaConnector : Model {

    // I have an old pole, which is 25.4mm diameter, and 1mm thick. A classic mix of imperial an metric!
    @Custom( about="Diameter of the plain pole. Add extra for clearance" )
    var poleDiameter = 26

    @Custom( about="Diameter of the umbrella's pole. Add extra for clearance" )
    var umbrellaDiameter = 50.0

    @Custom( about="Plastic thickness" )
    var thickness = 3.0

    @Custom( about="Height of the plastic" )
    var height = 50.0

    @Custom( about="Diameter of the ground-spike. (The spike's internal diameter will include clearance)" )
    var groundSpikeDiameter = 32.0

    @Custom
    var adaptorHeight = 180.0

    @Piece
    meth testFit() : Shape3d {
        return bottomPiece().translateZ(-thickness*2) intersection
            Cube( 200, 200, 1 ).centerXY()
    }

    @Piece
    @Slice( perimeters=2 )
    meth bottomPiece() = figure8( umbrellaDiameter, poleDiameter, 3 )

    @Piece
    @Slice( perimeters=5 )
    meth topPiece() = figure8( poleDiameter, umbrellaDiameter, thickness )

    meth figure8( d1 : double, d2 : double, thickness : double ) : Shape3d {
        val c1 = Circle( d1 / 2 ).leftTo(1)
        val c2 = Circle( d2 / 2 ).rightTo(-1)
        val inside = (c1 hull c2).toPolygon()
        val outside = inside.offset( thickness )
        
        val base = (outside - c2).toPolygon()
            .smartExtrude( 2 )
                .bottom( Chamfer(1) )

        val walls = (outside - inside)
            .smartExtrude( height )
                .top( Chamfer(thickness/4) )
            .bottomTo( base.top )

        // NOTE. This part is deliberately NOT attached to the walls.
        // This forces the slicer to use ALL the perimeters around the 2 circles,
        // where the strength is more needed.
        // The locator needs no strength. F11 to preview the GCode.
        val locator = (inside - c1 - c2)
            .intersection( inside.offset(-0.2) )
            .toPolygon()
            .smartExtrude(height - thickness/4)
                //.top( Chamfer( thickness/4 ) ) // Doesn't work :-(
            .bottomTo( base.top )
        return base + walls + locator
    }

    @Piece
    meth adaptorTestFit() = adaptor().translateZ(-10).intersection( Cube( 100, 100, 2 ).centerXY() )

    @Piece
    @Slice( fillDensity=5, solidInfillEveryLayers=20, brimWidth=10 )
    meth adaptor() : Shape3d {
        val outside = Circle( groundSpikeDiameter/2 )
        val thick = groundSpikeDiameter/2 - poleDiameter/2

        val chamfer = Math.min( 1.0, (groundSpikeDiameter - poleDiameter)/6 )

        return Cup( outside, adaptorHeight, thick )
            .baseThickness( thickness )
            .insideTop( Chamfer(chamfer) )
            .outsideTop( Chamfer(0.5) )
            .outsideBottom( roundedChamfer( 3 ) )
    }

    // Screw this to a sacrificial piece of wood,
    // and place it on top of the ground-spike.
    // Whack the wood to drive the spike into the ground.
    @Piece
    meth whack() : Shape3d {
        val spikeThicknessAndClearance = 2
        val insideRadius = groundSpikeDiameter/2 + spikeThicknessAndClearance
        val inside = Circle( insideRadius )
        val outside = inside.offset( 2 )
        val ring = outside - inside

        val prong = Square( 7, 8 ).centerY().rightTo(0) +
            Circle( 8/2 ) -
            Circle( 3/2 )

        val prongs = prong
            .leftTo( insideRadius )
            .repeatAround( 3 )

        val base = ( ring + prongs )
            .extrude(3)
    
        val walls = (outside - inside)
            .extrude(10)

        // The custom values don't have the external diameter of the ground spike.
        // My 32mm ground spike is 35 mm wide.
        val groundSpike = Circle( 35/2 ).extrude(100).previewOnly()

        return base + walls // + groundSpike
    }
    @Piece
    @Slice( solidInfillEveryLayers=1 )
    meth whack2() : Shape3d {
        val thickness = 2
        val diameter = 37
        val height = 16
        return Circle( diameter/2 + thickness )
            .cup( height, thickness ).baseThickness( 3 ) -
            Cylinder( 10, diameter/2 - 3 ).bottomTo(0.6)
    }

    @Piece( printable = false )
    override fun build() : Shape3d {
        val b = bottomPiece()

        val umbrella = Cylinder( 300, umbrellaDiameter/2 )
            .rightTo( b.right - thickness )
            .bottomTo( thickness )
            .previewOnly()

        val pole = Cylinder( 300, poleDiameter/2 )
            .leftTo( b.left + thickness )
            .translateZ( -adaptorHeight )
            .previewOnly()

        val t = topPiece()
            .rotateY(180)
            .topTo(pole.top+thickness)

        val adaptor = adaptor()
            .leftTo( b.left )
            .topTo( -20 )

        return b + t + pole + umbrella + adaptor
    }
}