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: Machine Shop

Mechanical widgetry

  • HP 7475A Plotter: Refilling Disposable Liquid Ink Pens

    A while back, Keith Ward sent a Big Box o’ Plotter Pens that:

    • Should suffice for the rest of the plotter’s life… if not mine
    • Obliterate any need for my Sakura pen adapters

    After a bit of sorting, I had a quartet of “disposable” liquid ink pens with contents ranging from desiccated to gummy. With nothing to lose (and having already cut a clearance slot in the plotter case), I drilled a small hole in the top of each reservoir, squirted some inkjet printer ink into the void, and taped the hole closed.

    Surprisingly, a little liquid love restored all but the black pen to working condition, if not perfect heath:

    HP7475A disposable liquid pen - refilled
    HP7475A disposable liquid pen – refilled

    I think the blurred white disk floating in the reservoir sealed the end where you jam the tip in place to activate the pen. The blob of dark gunk shows the reservoir didn’t start with yellow ink, but I had nothing to lose.

    The top pen in this picture is another style / brand with a smaller reservoir:

    HP7475A pens - disposable liquid  and ceramic tip
    HP7475A pens – disposable liquid and ceramic tip

    The white pen in the foreground has a 0.3 mm ceramic tip, contains its original green ink, and works as well as it ever did; it might be refillable, too.

    The liquid-ink pens have a serpentine vent in the tip. This is a Genuine New-Old-Stock pen in a four-pen case labeled HP 5061-7566:

    HP7475A disposable liquid pen - new
    HP7475A disposable liquid pen – new

    The serpentine path connects the exterior vent opening (facing you) to a tiny hole (on the other side of the blue shaft) into the ink chamber. As it turns out, a new hole drilled in the reservoir admits enough air to drain the (freshly refilled) liquid ink through the serpentine path all over the workbench. Having some experience with refilling inkjet cartridges, I deployed a towel decorated with colorful splotches in anticipation of such an unexpected event, although my fingers looked considerably more cheerful than usual for a few days.

    The black pen never worked quite right, but the other three did fine. The ceramic pen is at the top:

    HP7475A - KBR to YCM Refilled disposable pens - G ceramic pen
    HP7475A – KBR to YCM Refilled disposable pens – G ceramic pen

    Protip: the blown contrast and rear-surface bleedthrough behind the yellow ink should tell you it isn’t visible in normal room light. I must mix yellow with another color if I ever refill that pen that again.

    KiCad uses only one pen for the entire schematic, even when you select “plot in color”, suggesting nobody has sent the “plotter” output stream to an actual plotter in a long, long time.

    Despite the charm of watching the plotter crank out an entire schematic page, it’s not a compelling enough user experience to replace an inkjet printer. For an art project, one might be seeking an entirely different user experience and the answer might be different, too.

    Selah.

  • Garden Hose Valve Knobs: One Wrench To Rule Them

    A sampling of the various Y connectors and manifolds that water Mary’s gardens:

    Those little handles don’t turn nearly as easily as they should and some require far more finger pressure than Mary can exert. Lubrication being unavailing, the solution is to apply torque through a wrench, rather than fingertips, but fiddling around to match the proper wrench with the valve in hand isn’t acceptable.

    The first pass at a Universal Wrench:

    Hose Valve Knob - with measurements
    Hose Valve Knob – with measurements

    The embossed sheet (the back of my Geek Scratch Paper) carried the knob shapes & dimensions from the garden to the desk, where I measured & laid out the wrench:

    Hose Connector Knob - Build layout
    Hose Connector Knob – Build layout

    I filched the knob design from the OXO Can Opener Handle, made it somewhat taller, and applied a scale() operation to mash it into an ellipse aligned with the wrench slot. That huge hexagonal socket in the middle bridged just fine, even though the threads came out as distinct cylinders:

    Hose Connector Knob - bridge layer - Slic3r preview
    Hose Connector Knob – bridge layer – Slic3r preview

    Adding one thread width of clearance around the stem to form the socket produced a slip fit, with a dollop of fast-cure epoxy holding the pieces together.

    The wrench fits the largest valve knob with enough clearance to eliminate fiddling. A cylinder punched into the middle of the slot accommodates those teardrop handles:

    Hose Connector Knob - Show layout - bottom view
    Hose Connector Knob – Show layout – bottom view

    It’s oversized for the smallest “knob”, a vicious triangular stalk that’s murder on the fingers (and not shown here), but fits well enough that, should we deploy any of those, she’ll be ready.

    The stem diameter can’t be any larger, because the knobs on Valve 1 don’t allow any clearance. It could be more circular, but I doubt that buys anything. The open ends of the slot won’t let mulch pack into the recesses.

    I expect a wrench jaw will eventually snap off as the layers delaminate. In that case I’ll either sink a pair of steel pins into each jaw or, more likely, combine the handle & stem into one object, split the whole affair across the jaws, print the two halves, and glue them together so that the threads run in the proper direction to meet the stress.

    Be that as it may, as of right now this is The Best Thing I’ve Ever Built

    The OpenSCAD source code:

    // Hose connector knob
    // Ed Nisley KE4ZNU - June 2015
    
    Layout = "Build";				// Show Build Knob Stem
    
    //- Extrusion parameters - must match reality!
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    Protrusion = 0.1;
    
    HoleWindage = 0.2;
    
    //------
    // Dimensions
    
    StemOD = 30.0;					// max OD for valve-to-valve clearance
    
    BossOD = 16.0;					// single-ended handle boss
    
    SlotWidth = 13.0;
    SlotHeight = 10.0;
    
    StemInset = 10.0;
    StemLength = StemInset + SlotHeight + 25.0;
    StemSides = 2*4;
    
    KnobOD1 = 70;						// maximum dia without chamfer
    KnobOD2 = 60;						// top dia
    
    KnobSides = 4*4;
    
    DomeHeight = 12;					// dome shape above lobes
    
    KnobHeight = DomeHeight + 2*SlotHeight;
    
    DomeOD = KnobOD2 + (KnobOD1 - KnobOD2)*(DomeHeight/KnobHeight);
    
    DomeArcRad = (pow(KnobHeight,2) + pow(DomeOD,2)/4) / (2*DomeHeight);
    
    //- Adjust hole diameter to make the size come out right
    
    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);
    }
    
    //-- Stem for valve handles
    
    module Stem() {
    
    	difference() {
    		rotate(0*180/StemSides)
    			cylinder(d=StemOD,h=StemLength,$fn=StemSides);
    		translate([0,0,SlotHeight/2 - Protrusion/2])
    			cube([2*StemOD,SlotWidth,(SlotHeight + Protrusion)],center=true);
    		translate([0,0,-Protrusion])
    			cylinder(d=BossOD,h=SlotHeight,$fn=2*StemSides);
    	}
    
    }
    
    //-- Hand-friendly knob
    
    module KnobCap() {
    	difference() {
    		scale([1.0,0.75,1.0])
    		intersection() {
    			translate([0,0,(KnobHeight-DomeArcRad)])
    				rotate(180/KnobSides)
    					sphere(r=DomeArcRad,$fa=180/KnobSides);
    				rotate(180/KnobSides)
    					cylinder(r1=KnobOD1/2,r2=KnobOD2/2,h=KnobHeight,$fn=KnobSides);
    				rotate(180/KnobSides)
    					cylinder(r1=KnobOD2/2,r2=KnobOD1/2,h=KnobHeight,$fn=KnobSides);
    		}
    		translate([0,0,-Protrusion])
    			rotate(0*180/StemSides)
    				cylinder(d=(StemOD + 2*ThreadWidth),h=(StemInset + Protrusion),$fn=StemSides);
    	}
    }
    
    //- Build it
    
    if (Layout == "Knob")
    	KnobCap();
    
    if (Layout == "Stem")
    	Stem();
    
    if (Layout == "Build") {
    	translate([-KnobOD1/2,0,0])
    		KnobCap();
    	translate([StemOD/2,0,StemLength])
    		rotate([180,0,0])
    			Stem();
    }
    
    if (Layout == "Show") {
    	translate([0,0,0])
    		Stem();
    	translate([0,0,StemLength - StemInset])
    		KnobCap();
    }
    
  • Michelin Pilot City Tire Bead-Carcass Joint Failure

    A year or so ago, I picked up a Michelin Pilot City tire (700x32C) to see how they compare with the twice-as-expensive Schwalbe Marathons we’ve been using on the Tour Easy recumbents.

    Having replaced a worn-out Marathon last summer, this was unexpected:

    Michelin Pilot City Protek tire - blown bead
    Michelin Pilot City Protek tire – blown bead

    I’d blame that failure on overpressure, but I’ve been running the back tires around 70 psi, well inside their 87 psi (that’s a nice, round 6 bar) sidewall rating.

    Being able to swap a back tire in the Basement Laboratory Repair Facility made up for a lot…

  • Tour Easy: Cracked Fork Autopsy

    A look inside the cracked fork lug from my Tour Easy shows that it really did fracture at the top of the fork blade:

    Tour Easy - cracked fork - interior flash
    Tour Easy – cracked fork – interior flash

    Minus the flash, plus contrast enhancement:

    Tour Easy - cracked fork - interior
    Tour Easy – cracked fork – interior

    Looks rather grotendous in there, doesn’t it? Yeah, show me the interior of your fork…

    The front is at the top, blade on the left and crown on the right. The little shiny rectangle at 1 o’clock on the crown was probably the last fragment holding the blade in place.

    Finished!

  • Random LED Dots: Hardware Layout

    Quite some time ago, Sophi gave me a common-anode RGB LED panel and told me to make something of it. In a spate of desk-clearing, I hammered out a quick-and-dirty multiplexed display from found materials: 2N2907 transistors as row source drivers and 74HC595 shift registers abused as column sink drivers, plus the obligatory Arduino Pro Mini and 3D printed holder:

    Random LED Dots - circuit board
    Random LED Dots – circuit board

    A sheet of milk-white acrylic diffuses the glittery LED dots into pastel disks. I think it might look better without the diffuser; it certainly has a harder-edged tech look:

    Random LED Dots - overview - no diffuser
    Random LED Dots – overview – no diffuser

    A neutral-density filter would boost the contrast without hiding any of the details.

    It obviously needs an enclosure, but, around here, that’s in the nature of fine tuning.

    The transistors and shift registers  cower under the panel:

    Random LED Dots - circuit layout - top
    Random LED Dots – circuit layout – top

    The bottom view exposes the hand wiring, plus the slot required to adapt the LED panel’s non-100-mil layout to the protoboard’s holes. I chopped out the slot with a Dremel saw, attached socket strips to the panel, and epoxied the floating strip in place:

    Random LED Dots - circuit layout - bottom
    Random LED Dots – circuit layout – bottom

    The prospect of wiring 32 discrete resistors filled me with dread, so I just tombstoned SMD resistors onto the protoboard solder blobs:

    Random LED Dots - circuit layout - RB SMD resistors
    Random LED Dots – circuit layout – RB SMD resistors

    The slot required slightly longer bridge wires:

    Random LED Dots - circuit layout - G SMD resistors
    Random LED Dots – circuit layout – G SMD resistors

    The layout, such as it is, made those short, direct wires possible. A PCB with SMD chips would be even better.

    More on the circuitry tomorrow…

  • Proto Board Holder: 80×110 mm Version

    A simple holder for 80×110 mm prototyping boards:

    Random LED Dots - circuit board
    Random LED Dots – circuit board

    It’s similar to the holder for the LED current controller board, minus the center screws, plus nicely rounded corners and a cutout for wires emerging from underneath:

    Proto board holder
    Proto board holder

    Slic3r’s Hilbert Curve infill definitely looks better than the usual straight-line pattern:

    Circuit Board Holder - Slic3r preview
    Circuit Board Holder – Slic3r preview

    The OpenSCAD source code:

    // Test support frame for Hall Effect LED Blinky Light
    // Ed Nisley KE4ZNU - Sept 2013
    
    Layout = "Fancy";				// Fancy Plain
    
    PlainColor = "LightBlue";
    
    ClampFlange = true;
    
    //- Extrusion parameters - must match reality!
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    Protrusion = 0.1;
    
    HoleWindage = 0.2;
    
    //- Screw sizes
    
    inch = 25.4;
    
    Tap4_40 = 0.089 * inch;
    Clear4_40 = 0.110 * inch;
    Head4_40 = 0.211 * inch;
    Head4_40Thick = 0.065 * inch;
    Nut4_40Dia = 0.228 * inch;
    Nut4_40Thick = 0.086 * inch;
    Washer4_40OD = 0.270 * inch;
    Washer4_40ID = 0.123 * inch;
    
    //- PCB sizes
    
    PCBSize = [110.0,80.0,1.5];
    PCBShelf = 2.0;
    
    Clearance = 2*[ThreadWidth,ThreadWidth,0];
    
    WallThick = IntegerMultiple(5.0,ThreadWidth);
    FrameHeight = 8.0;
    
    ScrewOffset = 0.0 + Clear4_40/2;
    
    OAHeight = FrameHeight + Clearance[2] + PCBSize[2];
    
    FlangeExtension = 5.0;
    FlangeThick = IntegerMultiple(2.0,ThreadThick);
    Flange = PCBSize
    			+ 2*[ScrewOffset,ScrewOffset,0]
    			+ 2*[Washer4_40OD,Washer4_40OD,0]
    			+ [2*FlangeExtension,2*FlangeExtension,(FlangeThick - PCBSize[2])]
    			;
    
    echo("Flange: ",Flange);
    NumSides = 4*5;
    
    WireChannel = [Flange[0],15.0,3.0 + PCBSize[2]];
    WireChannelOffset = [Flange[0]/2,25.0,( + FrameHeight + PCBSize[2] - WireChannel[2]/2)];
    
    //- Adjust hole diameter to make the size come out right
    
    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);
    }
    
    //- Put peg grid on build surface
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      RangeX = floor(100 / Space);
      RangeY = floor(125 / Space);
    
    	for (x=[-RangeX:RangeX])
    	  for (y=[-RangeY:RangeY])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    //- Build it
    
    ShowPegGrid();
    
    difference() {
    	union() {									// body block and screw bosses
    		translate([0,0,OAHeight/2])
    			color(PlainColor)
    			cube(PCBSize + Clearance + [2*WallThick,2*WallThick,FrameHeight],center=true);
    		for (x=[-1,1], y=[-1,1]) {
    			translate([x*(PCBSize[0]/2 + ScrewOffset),
    						y*(PCBSize[1]/2 + ScrewOffset),
    						0])
    				color((Layout == "Fancy") ? "Orchid" : PlainColor)
    				cylinder(r=Washer4_40OD,h=OAHeight,$fn=NumSides);
    		}
    		if (ClampFlange)
    			color((Layout == "Fancy") ? "SeaGreen" : PlainColor)
    			linear_extrude(height=Flange[2])
    				hull()
    					for (i=[-1,1], j=[-1,1]) {
    						translate([i*(Flange[0]/2 - Washer4_40OD/2),j*(Flange[1]/2 - Washer4_40OD/2)])
    							circle(d=Washer4_40OD,$fn=NumSides);
    					}
    	}
    
    	for (x=[-1,1], y=[-1,1]) {				// screw holes and washer recesses
    		translate([x*(PCBSize[0]/2 + ScrewOffset),
    					y*(PCBSize[1]/2 + ScrewOffset),
    					-Protrusion])
    			rotate((x-1)*90)
    			PolyCyl(Tap4_40,(OAHeight + 2*Protrusion));
    		translate([x*(PCBSize[0]/2 + ScrewOffset),
    					y*(PCBSize[1]/2 + ScrewOffset),
    					OAHeight - PCBSize[2]])
    			PolyCyl(1.2*Washer4_40OD,(PCBSize[2] + Protrusion),NumSides);
    	}
    
    	translate([0,0,OAHeight/2])					// through hole below PCB
    		cube(PCBSize - 2*[PCBShelf,PCBShelf,0] + [0,0,2*OAHeight],center=true);
    
    	translate([0,0,(OAHeight - (PCBSize[2] + Clearance[2])/2 + Protrusion/2)])	// PCB pocket on top
    		cube(PCBSize + Clearance + [0,0,Protrusion],center=true);
    
    	translate(WireChannelOffset)									// clearance for cable on solder side
    		cube(WireChannel + [0,0,Protrusion],center=true);
    }
    
  • Tour Easy: New Front Fork

    A view from the wheel side shows the crack in my Tour Easy’s fork lug had opened a bit more to the rear, which is about what you’d expect from the forces involved:

    Tour Easy - cracked fork lug
    Tour Easy – cracked fork lug

    Removing the handlebar stem from the fork steerer tube requires removing the fairing, its mounting brackets, the fender, a speed sensor, then snipping cable ties to release all the cables and wires. Minus the prep work, removing the fork from the bike isn’t anything special.

    The lower bearing (a YST 8311N in black) has rollers, not balls. The headset has J.I.S. 1 inch dimensions, captured in a screen grab to forestall link rot:

    YST 8311N headset data
    YST 8311N headset data

    Which means cheap & readily available ISO standard headsets aren’t a drop-in replacement. The incomparable Harris Cyclery has J.I.S. ball-bearing headsets in stock and their Tange Levin CDS HD1002 needs just 1.6 mm of additional washer to match the YST’s 35 mm stack height…

    The front side of the crown got rather graunched over the last 14 years, but I punted the problem by rotating the race half a turn to put the eroded spots toward the rear, where they’ll be under minimal stress:

    Tour Easy crown bearing - damage
    Tour Easy crown bearing – damage

    Re-seating the race brought an ancient Headsetter tool from the drawer:

    Tour Easy fork with Headsetter
    Tour Easy fork with Headsetter

    It’s basically galvanized pipe, chamfered on one end, with a set of nuts & washers on a length of all-thread rod just slightly too short for the occasion: this might be the second time I’ve used the thing and I had to supply my own all-thread & nuts. Ah, well, it probably predates the Tour Easy’s design by a decade.

    The lower headset race looked to be in pretty good shape, so I left it alone. Normally, such bearing damage gives you indexed steering, but Tour Easy handlebars provide so much lever arm that nothing interferes with the bike’s steering.

    The new fork didn’t have a notch for the keyed washer isolating the locknut from the upper bearing race. The usual advice is to file off the key and apply threadlocker, which makes adjusting the two nuts tedious, so I restored the notch in the steerer threads:

    Tour Easy - filed steerer tube key slot
    Tour Easy – filed steerer tube key slot

    Yes, that’s a lethally sharp steel shaving from the not-very-well-reamed ID curling up in the middle of the notch.

    The fender mount bridge on the new fork sits half an inch higher in relation to the brake bosses, putting the fender against the V-brake cable hardware.  Anything touching the V-brake messes up the pad-to-rim alignment, so I conjured a snippet of aluminum to lower the fender just enough to clear the brakes:

    Tour Easy - new fork - fender extender
    Tour Easy – new fork – fender extender

    I think that calls for a nice 3D printed bracket, too, but the snippet got me back on the bike faster. When I preemptively replace the fork on Mary’s bike, then I’ll do a proper bracket for both of us.

    The garish red silicone tape replaces the previous black cable ties. It matches the tube paint surprisingly well and doesn’t look good on the fork, so I’ll replace it with cable ties in due course.

    A few miles of shakedown riding settled the crown race against the fork, another 1/6 turn of the upper race / lock nut snugged up the bearings, and it’s all good again.

    Wow, it’s great to be back on the bike!

    (Due to the vagaries of writing this stuff up ahead of time, there’s actually two weeks of realtime between the post that appeared on Monday and this one.)