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

  • Plant Stand Feet

    The houseplants have migrated indoors after spending a summer charging up in the sun on the patio, which means it’s time to replace the silicone rubber feet on the bottom of the plant shelves. This year, I printed a set of feet to fit the hex-head adjustable feet:

    Plant Stand Foot - installed
    Plant Stand Foot – installed

    The pencil-stem plant on the left, for whatever it’s worth, is a perfectly healthy Rhipsalis that greatly enjoyed the summer sun.

    The feet print upside-down to give the surface around the hex a smooth finish. I used Slic3r’s Hilbert Curve for pattern a bit more interesting than the usual parallel lines:

    Plant Shelf Foot - as built
    Plant Shelf Foot – as built

    The Hilbert curve doesn’t fit neatly into a non-rectangular shape, but it’s close enough.

    The solid model includes the support structure:

    Plant Shelf Foot - solid model - bottom
    Plant Shelf Foot – solid model – bottom

    Which pops out cleanly:

    Plant Shelf Foot - support material detail
    Plant Shelf Foot – support material detail

    Yes, that’s a shred of red filament embedded on the left side. Cleanliness is next to impossible…

    The fuzzy felt feet come from a 6 mm thick slab of the stuff:

    Plant Shelf Foot - cutting felt plugs
    Plant Shelf Foot – cutting felt plugs

    The round socket wall leaves about 2 mm of felt showing at the bottom; it’s not very compressible and that should suffice to keep the plastic off the table.

    The OpenSCAD source code:

    // Feet for a wire-shelf plant stand
    // Ed Nisley KE4ZNU October 2013
    
    Layout = "Build";			// Show Build
    
    Support = true;
    
    //- Extrusion parameters must match reality!
    //  Print with 2 shells and 3 solid layers
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;
    
    Protrusion = 0.1;			// make holes end cleanly
    
    //----------------------
    // Dimensions
    
    StandFootOD = 18.0;			// hex across flats
    StandFootDepth = 5.0;		//  ... socket depth
    
    FeltPadOD = 25.0;			// felt foot diameter
    FeltPadDepth = 4.0;			//  ... depth
    
    FootBaseThick = 6*ThreadThick;	// between foot and pad
    FootWall = 4*ThreadWidth;		// around exterior
    
    FootOD = 2*FootWall + max(StandFootOD,FeltPadOD);
    echo(str("Foot OD: ",FootOD));
    
    FootTall = StandFootDepth + FootBaseThick + FeltPadDepth;
    echo(str(" ... height: "),FootTall);
    
    NumSides = 8*4;
    
    //----------------------
    // Useful routines
    
    module FootPad() {
    
    	difference() {
    
    		cylinder(r=FootOD/2,h=FootTall,$fn=NumSides);
    
    		translate([0,0,FeltPadDepth + FootBaseThick])
    			PolyCyl(StandFootOD,2*StandFootDepth,6);
    
    		translate([0,0,-Protrusion])
    			PolyCyl(FeltPadOD,(FeltPadDepth + Protrusion),NumSides);
    
    	}
    }
    
    // Locating pin hole with glue recess
    
    module LocatingPin() {
    
    	translate([0,0,-ThreadThick])
    		PolyCyl((PinOD + 2*ThreadWidth),2*ThreadThick,4);
    	translate([0,0,-(PinLength/2 + ThreadThick)])
    		PolyCyl(PinOD,(PinLength + 2*ThreadThick),4);
    
    }
    
    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);
    }
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      Range = floor(50 / Space);
    
    	for (x=[-Range:Range])
    	  for (y=[-Range:Range])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    //-------------------
    // Build it...
    
    ShowPegGrid();
    
    if (Layout == "Show")
    	FootPad();
    
    if (Layout == "Build") {
    	translate([0,0,FootTall])
    		rotate([180,0,0])
    			FootPad();
    	if (Support)
    		color("Yellow")
    			for (Seg=[0:5]) {
    				rotate(30 + 360*Seg/6)
    				translate([0,0,(StandFootDepth - ThreadThick)/2])
    					cube([(StandFootOD - 3*ThreadWidth),
    						  2*ThreadWidth,
    						  (StandFootDepth - ThreadThick)],
    						  center=true);
    				}
    }