The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

The New Hotness

  • Six Gallon Can Lid Adapter to Platform Bird Feeder

    A House Finch suffering from Finch Eye Disease prompted me to sterilize our feeder, which meant providing a temporary feeder to keep the birds flying. Having an abundance of lids from six gallon plastic cans / buckets, this made sense:

    Can Lid Feeder - installed
    Can Lid Feeder – installed

    Which required an adapter betwixt pole and lid:

    Can Lid Feeder - assembled
    Can Lid Feeder – assembled

    Which requires a bit of solid modeling:

    Can Lid Platform Feeder Mount - solid model - bottom
    Can Lid Platform Feeder Mount – solid model – bottom

    The lids have a central boss, presumably for stiffening, so the model includes a suitable recess:

    Can Lid Platform Feeder Mount - solid model - support structure
    Can Lid Platform Feeder Mount – solid model – support structure

    As usual, automatically generated support fills the entire recess, so I designed a minimal support structure into the model and cracked it out with very little effort:

    Can Lid Feeder - support structure
    Can Lid Feeder – support structure

    The tangle off to the right comes from a bridge layer with a hole in the middle, which never works well even with support:

    Can Lid Platform Feeder Mount - Slic3r - bridge layer
    Can Lid Platform Feeder Mount – Slic3r – bridge layer

    Didn’t bother the birds in the least, though, so it’s all good.

    I loves me my 3D printer …

    The OpenSCAD source code as a GitHub Gist:

    // Adapter from steel pole to 5 gallon plastic can lid
    // Turns the lid into a improvised platform feeder
    // Ed Nisley – KE4ZNU – 2018-11
    Layout = "Build"; // Show Build
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    Protrusion = 0.1; // make holes end cleanly
    // Sizes
    ID = 0;
    OD = 1;
    LENGTH = 2;
    Wall = 10; // minimum thickness or width for anything
    Boss = [15,50,9]; // central boss on lie
    Flange = [50,110,Boss[LENGTH] + Wall];
    echo(Boss);
    echo(Flange);
    Pole = [(23.5 + 4*HoleWindage),26,45]; // small end of steel pole
    Screw = [5.0,8.0,25.0]; // 5 mm or 10-32
    ScrewOC = 80; // lid mounting screws
    NumScrews = 3;
    NumSides = NumScrews*2*4;
    $fn = NumSides;
    //———————-
    // Useful routines
    module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes
    Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
    FixDia = Dia / cos(180/Sides);
    cylinder(r=(FixDia + HoleWindage)/2,h=Height,$fn=Sides);
    }
    //———————-
    // Build it
    module Bracket() {
    difference() {
    union() {
    rotate(180/(NumSides/2)) {
    cylinder(d=Flange[OD],h=Flange[LENGTH],$fn=NumSides/2); // fewer sides is OK
    cylinder(d=Pole[OD] + 2*Wall,h=Pole[LENGTH] + Flange[LENGTH],$fn=NumSides/2);
    }
    }
    translate([0,0,-Protrusion])
    rotate(180/NumSides)
    cylinder(d=Boss[OD],h=Boss[LENGTH] + Protrusion,$fn=NumSides);
    translate([0,0,-Protrusion])
    rotate(180/NumSides)
    cylinder(d=Pole[ID],h=2*(Pole[LENGTH] + Flange[LENGTH]),$fn=NumSides);
    for (i=[0:NumScrews-1])
    rotate(i*(360/NumScrews))
    translate([ScrewOC/2,0,-Protrusion])
    PolyCyl(Screw[ID],2*Flange[LENGTH],6);
    }
    }
    module Support() {
    NumRibs = NumSides/2;
    Rib = [0.95*(Boss[OD] – Pole[ID])/2,2*ThreadWidth,Boss[LENGTH] – ThreadThick];
    color("Yellow") {
    for (i=[0:NumRibs-1]) {
    a = i*360/NumRibs;
    rotate(a)
    translate([Pole[ID]/2 + Rib.x/2,0,Rib.z/2])
    cube(Rib,center=true);
    }
    rotate(180/NumSides)
    difference() {
    cylinder(d=Pole[ID] + 10*ThreadWidth,h=1*ThreadThick,$fn=NumSides);
    translate([0,0,-Protrusion])
    cylinder(d=Pole[ID],h=Rib.z + 2*Protrusion,$fn=NumSides);
    }
    }
    }
    if (Layout == "Show")
    Bracket();
    if (Layout == "Build") {
    Bracket();
    Support();
    }