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.

Category: Home Ec

Things around the home & hearth

  • Dehumidified Processor Crackers

    The cracker recipe I’m using produces eight sets of crackers, so this time I added a variety of toppings to see what would work out best:

    • Plain
    • Salt
    • Sugar
    • Cinnamon
    • Garlic
    • Chopped chocolate
    • Chopped cashews
    • Chopped walnuts

    Garlic wins over everything else, hands-down, no contest, but the mixture of all the toppings in the bottom of the cooling bowl was wonderful.

    The crackers went into a large pot with a bag of desiccant:

    Whole wheat crackers with desiccant
    Whole wheat crackers with desiccant

    It pulled out 30 grams of water while reducing the humidity to 20% overnight; the crackers started out crisp and became really snappy. Definitely the right way to get the job done.

    These vaguely resemble the Processor Crackers recipe in Flatbreads & Flavors (Alford & Duguid):

    • 3 C hard whole wheat flour
    • 1 tsp salt
    • 1 C warm water, more as needed
    • Toppings
    • Water sprayer

    I’m using coarse-ground red wheat that doesn’t soak up the water like fine-ground flour. The original recipe called for 1-½ C water, which produced a sticky ball.

    • Blend wheat & salt in food processor
    • Add water in a slow stream until dough firms up
    • Blend another minute
    • Knead half a minute on cutting board
    • Cover
    • Let rest 30 minutes while you prepare toppings

    Finely chopped toppings work best; the nuts were too coarse.

    • Preheat oven to 500 °F
    • Divide dough in eight pieces, cover

    For each piece of dough:

    • Roll to about 2 mm
    • Put dough on vented pizza pan
    • Cut cracker shapes with pizza cutter
    • Sprinkle topping
    • Spritz with water
    • Put in oven on top rack
    • Punch timer for 3 minutes
    • Prepare next piece
    • Swap pans
    • Iterate

    Toss the crackers into a big bowl to cool, sampling as needed.

    When crackers cool:

    • Dump into large pot
    • Add desiccant bag & humidity card
    • Cover
    • Snarf combined toppings from bowl
    • Leave crackers to dry overnight

    Wonderful!

    Memo to Self: Shredded Parmesan cheese would be pretty good…

  • Shagbark Hickory Nut Season

    Mary managed to outcompete the local squirrels to the tune of 10 pounds of Shagbark Hickory nuts, which we’ve been enjoying after supper. The thickly armored nuts shrug off ordinary nutcrackers, so we deploy heavy weaponry: good old 10WR Vise-Grip pliers:

    Cracking nickory nuts with a Vise-Grip
    Cracking nickory nuts with a Vise-Grip

    She describes the process better than I; for what it’s worth, I work on one nut at a time. We both celebrate when a shell releases its nut with minimal damage; most often, we extract fragments into a pile like the one shown. I can process half a dozen nuts before deciding I’ve had enough.

    I’d be in favor of a genetic modification producing a fluorescent green shell, because overlooking a minute piece of shell in that pile of nutmeat is a Very Bad Thing…

    Some Vise-Grip history may be of interest.

  • Monthly Image: Bees in Squash Flower

    Back in August, the squash vines were in full flower:

    Bees in Squash Flower - overview
    Bees in Squash Flower – overview

    Here’s a closer look:

    Bees in Squash Flower - detail
    Bees in Squash Flower – detail

    Pop quiz: how many bees do you count?

    With the benefit of watching them move, I counted nine bees in that blossom!

    Winter squash vines bear large flowers (that blossom is the size of my outstretched hand) that attract large bees: bumblebees and their cousins, carpenter bees. Quite often, bumblebees spend the night huddled inside the blossom and emerge early the next day when they reach flying temperature. Honeybees, being more social, return to their hives overnight; we’re pleased to see that there’s at least one feral hive in the neighborhood.

  • Kitchen Spatula Handle Anchoring

    Shortly after we bought this kitchen scraper spatula (or whatever it’s called), the handle pulled out of the blade and left it sitting in a bowl of batter. That turned out to be unsurprising, given that neither side of the interface has any mechanical locking features. I rinsed the batter off, stuck some urethane glue inside, rammed the handle in place, and hoped for the best. Lacking any mechanical interlock and not bonding to either surface, the adhesive didn’t improve the situation.

    So I recently added a pair of stainless 4-40 setscrews standing just proud of the handle’s surface that should dig into the blade and hold it in place:

    Spatula handle enhancement
    Spatula handle enhancement

    Another item for the shopping list…

  • Samsung Quiet Jet Vacuum: Floor Brush Wheels

    After rebuilding the front end of the Samsung vacuum’s floor brush, I’d hoped that was the end of it; other than replacing the brush strips every now and again, it’s been cooperative. Recently, however, one of the wheels popped off, which revealed the minimal mechanism holding them in place:

    Samsung Quiet Jet - floor brush wheel interior
    Samsung Quiet Jet – floor brush wheel interior

    Those four delicate latches have worn themselves and the hub to the point where they ride over the edge at the slightest provocation. I pulled both wheels off and packed three turns of insulated wire (one turn is visible in the photo, as it was an iterative process) around the outside of the clips, with the intent of restoring enough force to hold the wheels in place until we exhaust the lifetime supply of bags I bought for the thing…

  • Broom Handle Screw With Dedendum: Effect of Printing Orientation

    Although the current OpenSCAD could produce a solid model with the screw thread’s dedendum, I’d never actually printed one of them:

    Broom Handle Screw - full thread - solid model
    Broom Handle Screw – full thread – solid model

    I need some fondlestuff illustrating how to handle overhangs, so I ran one standing vertically, which (pretty much as I expected) didn’t work well at all:

    Broom Handle Screw - dedendum - vertical
    Broom Handle Screw – dedendum – vertical

    The trick is to split the model down the middle:

    Broom Handle Screw - horizontal top
    Broom Handle Screw – horizontal top

    And put holes in each half for alignment pins:

    Broom Handle Screw - horizontal bottom
    Broom Handle Screw – horizontal bottom

    Then you can print it lying down:

    Broom Handle Screw - horizontal - as-printed top
    Broom Handle Screw – horizontal – as-printed top

    The internal overhang would probably call for some support material, particularly in the square recess at the end, but in this case it’s a lesson:

    Broom Handle Screw - horizontal - as-printed bottom
    Broom Handle Screw – horizontal – as-printed bottom

    Glue some filament snippets into the holes, snap it together, and it looks just fine over there on the right:

    Broom Handle Screw - orientation comparison
    Broom Handle Screw – orientation comparison

    Doesn’t matter how many I print, it still doesn’t make any economic sense as a broom repair…

    The OpenSCAD source code now has a Layout variable to control the orientation and, not as shown in the model, the alignment pins have glue gutters in the first layer:

    // Broom Handle Screw End Plug
    // Ed Nisley KE4ZNU October 2013
    
    Layout = "Horizontal";		// Vertical Horizontal Pin
    
    UseDedendum = true;			// true to create full thread form
    
    //- Extrusion parameters must match reality!
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;
    
    Protrusion = 0.1;			// make holes end cleanly
    
    //----------------------
    // Dimensions
    
    PostOD = 22.3;				// post inside metal handle
    PostLength = 25.0;
    
    FlangeOD = 24.0;			// stop flange
    FlangeLength = 3.0;
    
    PitchDia = 15.5;			// thread center diameter
    ScrewLength = 20.0;
    
    ThreadFormOD = 2.5;			// diameter of thread form
    ThreadPitch = 5.0;
    NumSegments = 32;			//  .. number of cylinder approximations per turn
    
    BoltOD = 7.0;				// clears 1/4-20 bolt
    BoltSquare = 6.5;			// across flats
    BoltHeadThick = 3.0;
    
    RecessDia = 6.0;			// recesss to secure post in handle
    
    OALength = PostLength + FlangeLength + ScrewLength;
    
    SplitOC = 1.25*FlangeOD;	// separation in Horizontal layout
    PinOD = 1.75;				// alignment pin diameter = filament stub
    PinLength = 7.0;			//  ... length
    
    $fn=8*4;					// default cylinder sides
    
    echo("Pitch dia: ",PitchDia);
    echo("Root dia: ",PitchDia - ThreadFormOD);
    echo("Crest dia: ",PitchDia + ThreadFormOD);
    
    Pi = 3.14159265358979;
    
    //----------------------
    // Useful routines
    
    // Wrap cylindrical thread segments around larger plug cylinder
    
    module CylinderThread(Pitch,Length,PitchDia,ThreadOD,PerTurn) {
    
    CylFudge = 1.02;				// force overlap
    
        RotIncr = 1/PerTurn;
        PitchRad = PitchDia/2;
    
        Turns = Length/Pitch;
        NumCyls = Turns*PerTurn;
    
        ZStep = Pitch / PerTurn;
    
        HelixAngle = atan(Pitch/(Pi*PitchDia));
        CylLength = CylFudge * (Pi*(PitchDia + ThreadOD) / PerTurn) / cos(HelixAngle);
    
    	for (i = [0:NumCyls-1]) {
    		assign(Angle = 360*i/PerTurn)
    			translate([PitchRad*cos(Angle),PitchRad*sin(Angle),i*ZStep])
    				rotate([90+HelixAngle,0,Angle])
    					cylinder(r1=ThreadOD/2,
    							r2=ThreadOD/(2*CylFudge),
    							h=CylLength,
    							center=true,$fn=12);
    	}
    }
    
    // Build complete plug
    
    module ScrewPlug() {
    	difference() {
    		union() {
    			cylinder(r=PostOD/2,h=PostLength);
    			cylinder(r=PitchDia/2,h=OALength);
    			translate([0,0,PostLength])
    				cylinder(r=FlangeOD/2,h=FlangeLength);
    			color("Orange")
    			translate([0,0,(PostLength + FlangeLength)])
    				CylinderThread(ThreadPitch,(ScrewLength - ThreadFormOD/2),PitchDia,ThreadFormOD,NumSegments);
    		}
    
    		translate([0,0,-Protrusion])
    			PolyCyl(BoltOD,(OALength + 2*Protrusion),6);
    
    		translate([0,0,(OALength - BoltHeadThick)])
    			PolyCyl(BoltSquare,(BoltHeadThick + Protrusion),4);
    
    		if (UseDedendum)
    			translate([0,0,(PostLength + FlangeLength + ThreadFormOD/2 - ThreadPitch/(2*NumSegments))])
    				rotate(-90 - 360/(2*NumSegments))
    				CylinderThread(ThreadPitch,ScrewLength,PitchDia,ThreadFormOD,NumSegments);
    
    		for (i = [0:90:270]) {
    			rotate(45 + i)					// 45 works better with Horizontal layout
    				translate([PostOD/2,0,PostLength/2])
    					sphere(r=RecessDia/2,$fn=8);
    		}
    	}
    }
    
    // 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 == "Vertical")
    	ScrewPlug();
    
    if (Layout == "Pin")
    	LocatingPin();
    
    if (Layout == "Horizontal")
    	for (i=[-1,1])
    		difference() {
    			translate([i*SplitOC/2,PostLength/2,0])
    				rotate([90,180*(i + 1)/2,0])
    					ScrewPlug();
    
    			translate([0,0,-FlangeOD/2])
    				cube([2*OALength,2*OALength,FlangeOD],center=true);
    
    			for (j=[-1,1], pin=[-1,1])
    				assign(PinX = i*SplitOC/2 + pin*(PostOD + BoltOD)/4,
    					   PinY = j*PostLength/4) {
    					translate([PinX,PinY,0])
    						rotate(45)
    							LocatingPin();
    					echo("i j pin: ",i,j,pin);
    					echo("X Y: ",PinX,PinY);
    				}
    		}
    
  • 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);
    				}
    }