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.

Day: January 16, 2012

  • Dishwasher Rack Protectors

    After a decade of stacking the plates in the dishwasher the same way every time, the flexible coating over the steel rods has worn through:

    Dishwasher rack abrasion
    Dishwasher rack abrasion

    We can’t stack them the other way, because the rotor spray rattles them unmercifully, and a fix is in order. Apparently, one can purchase touchup paint for this very purpose, but what’s the fun in that? Besides, I’d expect it to wear through even faster than the original coating, if only because adhesion is never as good as you’d expect from reading the label.

    So this little dingus fits around a vertical pin and rests atop the horizontal rod, with the edge of the plate nestled into the joint between the two cylinders:

    Dishwasher rack protector - solid model
    Dishwasher rack protector – solid model

    Being very small, they build best in large groups:

    Dishwasher rack protectors - on build platform
    Dishwasher rack protectors – on build platform

    The horizontal half-cylinders require internal support, shown here adjacent to the protector for easy viewing:

    Dishwasher rack protector - support model
    Dishwasher rack protector – support model

    Those fins just barely clear the interior of the horizontal cylinder, so the two parts don’t bond together very well (that’s the ideal condition, of course). The flat plate glues the support fins firmly to the build platform, which is easier to see on these somewhat shorter prototypes with a layer or two of orange filament on their bottoms:

    Dishwasher rack protectors - support
    Dishwasher rack protectors – support

    The support chops out neatly with a repurposed nail set punch:

    Dishwasher rack protector - removing support
    Dishwasher rack protector – removing support

    Actually, I stood each one vertically on an aluminum chunk, held the punch in place with finger pressure, and whacked it with a small brass hammer. The OpenSCAD code now adds a small tab each end to help align the punch for the first whack.

    The rod (vertical) hole came out just about exactly the right size (admittedly, with a 0.4 mm HoleFinagle adjustment), but required a pass with a drill in a pin vise to clear out the Reversal Zittage. The result slides easily over undamaged pins, but some pins had rust at either the top or bottom that required a bit of cleanup. This is a trial fit:

    Dishwasher rack protectors - trial fit
    Dishwasher rack protectors – trial fit

    I put a blob of acrylic caulk on the abraded spots to (attempt to) seal them from further damage, then squished the protectors in place. The dishwasher demonstrated that it’s perfectly capable of blasting an unglued protector (without a plate) up and off the pin, ingesting it into the trash grinder, chewing it up, and spitting the pieces down the drain. Lost a couple of prototypes before I figured that out, too.

    Ya learn something new every day…

    The OpenSCAD source code:

    // Dishwasher rack protector
    // Ed Nisley KE4ZNU - Jan 2012
    
    Layout = "Show";                    // Show Build Support
    
    Support = true;                     // true to add support inside rod half-cylinder
    
    include </home/ed/Thing-O-Matic/lib/visibone_colors.scad>
    
    //-------
    //- Extrusion parameters must match reality!
    //  Print with +0 shells
    //  Infill = 1.0, line, perpendicular to Bar axis on first bridge layer
    //  Multiply = at least four copies to prevent excessive slowdown
    
    ThreadThick = 0.25;
    ThreadWidth = 2.0 * ThreadThick;
    
    HoleFinagle = 0.4;
    HoleFudge = 1.00;
    
    function HoleAdjust(Diameter) = HoleFudge*Diameter + HoleFinagle;
    
    Protrusion = 0.1;           // make holes end cleanly
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    function IntegerMultipleMin(Size,Unit) = Unit * floor(Size / Unit);
    
    //-------
    // Dimensions
    
    PinDia = 4.0 + 0.5;                 // upright pin diameter + clearance
    PinRadius = PinDia/2;
    
    PinSpace = 35.0;                    // pin spacing along bar
    
    PinOC = 3.4;                        // bar center to pin center
    
    PinTubeLength = 15.0;               // length of upright tube along pin
    
    BarDia = 4.7 + 0.2;                 // horizontal bar diameter + clearance
    BarRadius = BarDia/2;
    
    BarTubeLength = PinSpace - 5.0;     // length of horizontal half tube along bar
    
    TubeWall = 4*ThreadWidth;           // wall thickness -- allow for fill motion
    
    TubeSides = 4 * 4;                  // default side count for tubes (in quadrants)
    $fn = TubeSides;
    
    SupportClear = 0.85;                // support structure clearance fraction
    
    //-------
    
    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=HoleAdjust(FixDia)/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);
    }
    
    //--------
    // Support under bar tube shells
    
    module SupportStructure() {
    
      color("cyan")
      difference() {
        union() {
          for (Index=[-4:4])
            translate([Index*(BarTubeLength/8.5),0,0])
              rotate([0,90,0])
                rotate(180/TubeSides)
                  cylinder(r=SupportClear*BarRadius,h=2*ThreadWidth,center=true);
    
          rotate([0,90,0])
            rotate(180/TubeSides)
              cylinder(r=SupportClear*BarRadius,h=10*ThreadWidth,center=true);
    
          translate([0,0,ThreadThick])
            cube([(BarTubeLength + 4*ThreadWidth),BarRadius,2*ThreadThick],center=true);
        }
    
        translate([0,0,-(BarRadius + Protrusion)/2])
          cube([(BarTubeLength + 2*Protrusion),
              BarDia,
              (BarRadius + Protrusion)],center=true);
    
      }
    
    }
    
    //-------
    // Put it together
    
    module Protector() {
    
      difference() {
        union() {
          translate([0,PinOC,0])
            rotate(180/TubeSides)
              cylinder(r=(PinDia + 2*TubeWall)/2,h=PinTubeLength);
          translate([-BarTubeLength/2,0,0])
            rotate([0,90,0])
              rotate(180/TubeSides)
                cylinder(r=(BarDia + 2*TubeWall)/2,h=BarTubeLength);
        }
    
        translate([0,PinOC,-Protrusion])
          rotate(180/TubeSides)
            PolyCyl(PinDia,(PinTubeLength + 2*Protrusion),TubeSides);
    
        translate([-BarTubeLength/2,0,0])
          rotate([0,90,0])
            rotate(180/TubeSides)
              translate([0,0,-Protrusion])
                cylinder(r=BarRadius,h=(BarTubeLength + 2*Protrusion));
    
        translate([0,0,-(BarRadius + TubeWall + Protrusion)/2])
          cube([(BarTubeLength + 2*Protrusion),
              BarTubeLength,
              (BarRadius + TubeWall + Protrusion)],center=true);
      }
    
    }
    
    //-------
    // Build it!
    
    ShowPegGrid();
    
    if (Layout == "Support")
      SupportStructure();
    
    if (Layout == "Show") {
      Protector();
      translate([0,-10,0])
        SupportStructure();
    }
    
    if (Layout == "Build")
      rotate(90) {
        if (Support)
          SupportStructure();
        Protector();
      }