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.

Author: Ed

  • Left Turn on Red

    Coming out of Adams, we’re ready to make a left turn onto Rt 44:

    Left turn on red - 2014-07-24
    Left turn on red – 2014-07-24

    He was one car back in the left-turn storage lane when his light went yellow-to-red, crossed the stop line on the red, and was one car length over the stop line and accelerating when our light changed to green.

    We’re ready to start rolling on green, but we’ve learned to wait a few heartbeats for just such occasions; what counts as a fender-bender for you would be a fatality for us.

    Y’know how motorists get very, very angry at cyclists? I’ve always wondered why they don’t get that angry when motorists do those same stupid things, at higher speeds with much more energy.

    We ride as though we’re thin cars, which is how it’s supposed to be done, and generally don’t get too much hassle.

    One thing that is annoying, though: short-stroke yellow cycles that last maybe two seconds. We can cross the stop line on green, accelerating firmly through the intersection, and still get caught in the middle as the signal changes to green-to-yellow-to-red behind us and red-to-green for opposing traffic. No, we didn’t run the yellow, but that’s what it looks like.

  • Large Spool Adapter: Right-angle Version

    Mary recently learned that large spools of thread have a cross-wound lay that should feed over the end, not from the side as do ordinary stack-wound spools. So I built a right-angle adapter that fits over the not-quite-vertical spool pin on the sewing machine and aims directly at the thread tensioner:

    Large spool adapter - on sewing machine
    Large spool adapter – on sewing machine

    The solid model shows off the fluted rod that passes through the spool:

    Large Spool Adapter - solid model - mount
    Large Spool Adapter – solid model – mount

    It’s more impressive from the other end:

    Large Spool Adapter - solid model - spool end
    Large Spool Adapter – solid model – spool end

    The first pass at the rod had six flutes, but that seemed unreasonably fine; now it has four. The round base on the rod provides more griptivity to the platform while building and has enough space for the two alignment pins that position it in the middle of the dome:

    Large Spool Adapter - solid model - alignment holes
    Large Spool Adapter – solid model – alignment holes

    The dome gets glued to the rod base plate:

    Large spool adapter - clamped
    Large spool adapter – clamped

    The spool pin hole is a snug fit around the pin on the sewing machine, because otherwise it would tend to rotate until the spool pointed to the rear of the machine. The fluted rod is a snug friction fit inside the (cardboard) spool. Some useful dimensions:

    • Spool pin (on Model 158): 5 mm OD, 40 mm tall
    • Large spool cores: 16 mm ID, 27 mm OD, 70 mm long

    I had all manner of elaborate plans to make an expanding fluted rod, but came to my senses and built the simple version first. If that rod isn’t quite big enough, I can build another adapter, just like this one, only slightly larger. The source code includes a 0.5 mm taper, which may suffice.

    Back in the day, shortly after the Thing-O-Matic started producing dependable results, one of the very first things I made was a simple adapter to mount large spools on the pin in the most obvious way:

    Large spool adapter - old TOM version
    Large spool adapter – old TOM version

    Now we all know better than that, my OpenSCAD-fu has grown stronger, and the M2 produces precise results. Life is good!

    The OpenSCAD source code:

    // Large thread spool adapter
    // Ed Nisley - KE4ZNU - August 2014
    
    Layout = "Show";			// Build Show Spindle Spool
    
    Gap = 10.0;					// between pieces in Show
    
    //- Extrusion parameters must match reality!
    //  Print with 4 shells and 3 solid layers
    
    ThreadThick = 0.20;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;			// extra clearance
    
    Protrusion = 0.1;			// make holes end cleanly
    
    AlignPinOD = 1.70;			// assembly alignment pins: filament dia
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    //----------------------
    // Dimensions
    
    LEN = 0;											// subscripts for cylindrical objects
    ID = 1;
    OD = 2;
    
    Spindle = [40.0,5.0,14.0];							// spool spindle on sewing machine
    Spool = [70.0,16.0,27.0];							// spool core
    
    Taper = 0.50;										// spool diameter increase at base
    
    CottonRoll = [65.0,Spool[OD],45.0];					// thread on spool
    
    Mount = [Spindle[LEN],(Spindle[ID] + 4*ThreadWidth),1.0*Spool[ID]];
    
    Flutes = 4;
    Flange = [2.0,Spool[OD],Spool[OD]];
    
    ScrewHole = [10.0,4.0 - 0.7,5.0];					// retaining screw
    
    PinOC = Spool[ID]/4;								// alignment pin spacing
    
    //----------------------
    // 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);
    }
    
    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);
    
    }
    
    //- Locating pin hole with glue recess
    //  Default length is two pin diameters on each side of the split
    
    module LocatingPin(Dia=AlignPinOD,Len=0.0) {
    	
    	PinLen = (Len != 0.0) ? Len : (4*Dia);
    	
    	translate([0,0,-ThreadThick])
    		PolyCyl((Dia + 2*ThreadWidth),2*ThreadThick,4);
    
    	translate([0,0,-2*ThreadThick])
    		PolyCyl((Dia + 1*ThreadWidth),4*ThreadThick,4);
    		
    	translate([0,0,-(Len/2 + ThreadThick)])
    		PolyCyl(Dia,(Len + 2*ThreadThick),4);
    
    }
    
    //----------------------
    // Spindle 
    
    module SpindleMount() {
    
    	render(convexity=4)
    	difference() {
    		union() {
    			resize([0,0,Mount[OD]])							// spool backing plate
    				translate([0,CottonRoll[OD]/2,0])
    					sphere(d=CottonRoll[OD],center=true);
    			translate([0,CottonRoll[OD]/4,0])				// mounting post
    				rotate([90,0,0])
    					cylinder(d=Mount[OD],h=CottonRoll[OD]/2,center=true);
    		}
    		
    		translate([0,(2*Mount[LEN] - Protrusion),Mount[OD]/4])				// punch spindle hole
    			rotate([90,0,0])
    //				PolyCyl(Spindle[ID],2*Mount[LEN],6);
    				cylinder(d=Spindle[ID],h=2*Mount[LEN],$fn=6);
    				
    		for (i=[-1,1]) {									// punch alignment pin holes
    			translate([i*PinOC,CottonRoll[OD]/2,0])
    					LocatingPin(Len=Mount[OD]/3);
    		}
    				
    		translate([0,0,-CottonRoll[OD]])					// remove half toward spool
    			cube(2*CottonRoll[OD],center=true);
    	}
    
    }
    
    //----------------------
    // Spool holder
    
    module SpoolMount() {	
    
    	difference() {
    	
    		union() {
    				
    			translate([0,0,(Flange[LEN] - Protrusion)])
    				difference() {
    					cylinder(d1=(Spool[ID] + Taper),d2=Spool[ID],h=Spool[LEN],$fn=2*Flutes);						// fit spool ID
    					
    					for (a=[0 : 360/Flutes : 360-1])						// create flutes
    						rotate(a + 180/Flutes)
    							translate([Spool[ID]/2,0,-Protrusion])
    								rotate(180/16)
    								cylinder(r=Spool[ID]/4,h=(Spool[LEN] + 2*Protrusion),$fn=16);
    								
    					translate([0,0,(Spool[LEN] - ScrewHole[LEN])])			// punch screw hole
    						PolyCyl(ScrewHole[ID],(ScrewHole[LEN] + Protrusion),6);
    
    				}
    			cylinder(d=Flange[OD],h=Flange[LEN]);							// base flange
    		}
    		
    		for (i=[-1,1])												// punch alignment pin holes
    			translate([0,i*PinOC,0])								//  ... orients solid flange up
    					LocatingPin(Len=Flange[LEN]);	
    	}
    
    }
    
    
    ShowPegGrid();
    
    if (Layout == "Spindle") {
    	SpindleMount();
    }
    if (Layout == "Spool") {
    	SpoolMount();
    }
    
    if (Layout == "Show") {
    	translate([0,Mount[OD]/4,2.0]) {
    		rotate([90,0,0])
    			SpindleMount();
    		translate([0,Gap,CottonRoll[OD]/2])
    			rotate([-90,0,0]) rotate(90)
    				SpoolMount();
    	}
    	color("Orange") {
    		translate([0,0,2])
    			cylinder(d=Spindle[ID],h=Spindle[LEN],$fn=6);
    		cylinder(d=Spindle[OD],h=2.0,$fn=18);
    	}
    		
    }
    
    if (Layout == "Build") {
    	translate([-5,0,0])
    		rotate(90)
    			SpindleMount();
    	translate([Flange[OD]/2,0,0])
    			SpoolMount();
    }
    
  • Easy Reacher Pack: New Elastic Cord

    The elastic cord behind the left-side under-seat Easy Reacher pack on my Tour Easy snapped some time ago, probably due to wear against the brace I installed to keep it from flopping around. Quite contrary to what I expected, the repair turned out to be almost trivially easy.

    The cord terminates in a pair of plastic lugs, each with a ferrule that slipped off under moderate persuasion to reveal a pair of wedges that engaged the cord:

    Easy Reacher pack - elastic cord clamp
    Easy Reacher pack – elastic cord clamp

    I expected the ferrule to have a positive lock engaging those wedges, but, nope, there’s (at most) a small ridge. Pry the wedges out and the cord slides out of the lug without a protest; the wedges don’t quite meet in the middle with the ferrule in place and there’s plenty of retention force on that flexy cord.

    One of the shorter bungie cords in my collection turned out to be exactly the right diameter and length, with ends secured in its hooks using a simple crimped wire. Bending the ends of the wire at right angles freed the cord from its embrace:

    Easy Reacher pack - unclamping new elastic cord
    Easy Reacher pack – unclamping new elastic cord

    The original stainless steel hook lies by the edge of the road along my usual bicycling route, but a slightly reshaped S hook (made, alas, of ordinary steel) fits around the cord well enough. When this one rusts away, I have plenty more.

    Insert cord into lugs, push ferrules over locking wedges, remove one ferrule and lug, install reshaped S hook, reinstall lug and ferrule, install new cord on pack:

    Easy Reacher pack - new elastic cord
    Easy Reacher pack – new elastic cord

    Install pack on bike: done!

    I have no explanation for how well this worked out; I fear the Universe is saving up spit for something truly awful.

  • Tour Easy Kickstand Adapter Plate

    The venerable Greenfield kickstand on my Tour Easy doesn’t quite match the mounting plate under the frame, with the result that it can pivot just enough to make the bike tippy with a moderate load in the rear panniers. I’ve carried a small block to compensate for sloping ground, but I finally got around to fixing the real problem.

    The solution turned out to be a spacer plate that fills the gap between the back of the kickstand casting and the transverse block brazed to the mounting plate:

    Tour Easy kickstand adapter plate
    Tour Easy kickstand adapter plate

    That little lip is 2 mm wide, so it’s not off by much.

    The aluminum came from a Z-shaped post that contributed its legs to a previous project. I flycut the stub of one leg flush with the surface, then flycut a slot 2 mm from the edge:

    Tour Easy kickstand adapter - flycutting recess
    Tour Easy kickstand adapter – flycutting recess

    For no reason whatsoever, the width of that slot turned out exactly right.

    Bandsaw along the left edge of the slot, bandsaw the plate to length, square the sides, break the edges, mark the actual location of the mounting plate hole, drill, and it’s done!

    An identical Greenfield kickstand on Mary’s identical (albeit smaller) Tour Easy (the bikes have consecutive serial numbers) fits perfectly, so I think this is a classic case of tolerance mismatch.

  • Kenmore 158: ET227 Transistor Drive Gain

    A closer look at the collector voltage and current for the brute-force ET227 NPN transistor motor drive:

    Model 158 - 77 mA base VCE 200 mA div
    Model 158 – 77 mA base VCE 200 mA div

    The motor current (200 mA/div) never goes to zero, but the ET227 collector voltage hits zero as the transistor saturates: the motor winding soaks up all the available line voltage and the transistor dissipation drops close to zero. The datasheet suggests VCE(sat) < 0.1 V for IC < 5 A, albeit with IB = 30 A (!).

    The ET227 base drive was 77 mA, measured on a better meter than the low-resolution one in the power supply, and the transistor gain works out to 8 = 620 mA / 77 mA along those flat tops.

    Eyeballometrically speaking, the dissipation averages 50 W = 90 V x 620 mA during those spiky sections where the transistor must absorb the difference between the line voltage and the motor voltage. The cursors say that takes 5 ms of the 8.3 ms period of the 120 Hz full wave rectified power, so the duty cycle is 42% and the average average dissipation works out to 20 W. That’s still enough to warm up that big heatsink; the motor driver will need a thermal sensor and a quiet fan.

    That commutation noise looks pretty scary, doesn’t it?

    The test setup:

    Kenmore 158 - AC motor FW ET227 drive - test setup
    Kenmore 158 – AC motor FW ET227 drive – test setup

    The bridge rectifier doesn’t really need a heatsink, but it looked better for a Circuit Cellar picture…

  • Image File Recovery Redux

    Took a picture of the sewing machine setup with the Sony DSC-F717, transferred it into DigiKam, got the “done transferring, you can disconnect the camera” message, believed it, disconnected the camera, deleted the image file, and then discovered that DigiKam mislaid the image file.

    Rather than re-set-up and re-take the shot, I followed my own directions and recovered the image from the Memory Stick:

    dmesg | tail
    [43176.079853] usb 2-1.6.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    [43176.079855] usb 2-1.6.3: Product: Sony PTP
    [43176.079856] usb 2-1.6.3: Manufacturer: Sony
    [43198.073652] usb 2-1.6.3: USB disconnect, device number 22
    [43333.788533] sd 9:0:0:0: [sdc] 1947648 512-byte logical blocks: (997 MB/951 MiB)
    [43333.803292] sd 9:0:0:0: [sdc] No Caching mode page found
    [43333.803299] sd 9:0:0:0: [sdc] Assuming drive cache: write through
    [43333.824681] sd 9:0:0:0: [sdc] No Caching mode page found
    [43333.824688] sd 9:0:0:0: [sdc] Assuming drive cache: write through
    [43333.825491]  sdc: sdc1
    sudo dd if=/dev/sdc of=/tmp/pix.bin bs=1M
    ^C615+0 records in
    614+0 records out
    643825664 bytes (644 MB) copied, 38.5841 s, 16.7 MB/s
    strings -t x pix.bin | grep Exif | head
      68006 Exif
     208006 Exif
     3f8005 _Exif
     7b8006 Exif
    13d8006 Exif
    15b0005 wExif
    1798005 CExif
    19c0006 Exif
    1b90006 Exif
    1f98005 %Exif
    dd if=pix.bin of=image03.jpg bs=$((16#1000)) count=1K skip=$((16#3f8))
    1024+0 records in
    1024+0 records out
    4194304 bytes (4.2 MB) copied, 0.0121431 s, 345 MB/s
    display image03.jpg
    convert image03.jpg dsc00656.jpg
    

    Obviously, there was a bit more flailing around than you see here, but that’s the gist of the adventure. For what it’s worth, image01 was a random blurred shot and image02 is the ID picture I keep on all my cameras.

    The convert step discards all the junk after the end of the image, so the dsc00656.jpg file doesn’t include anything unexpected.

    The picture isn’t all that much to look at, even after cropping out the background, but …

    Kenmore 158 - stepper drive test
    Kenmore 158 – stepper drive test

    The advantage of the manual method: renewing one’s acquaintance with tools that come in handy for other tasks.

  • Flashlight Switch: Poor Solder Joints

    My desk flashlight has three “functions”:

    • 5 UV LEDs
    • 10 white LEDs
    • laser pointer

    A four-click rotary pushbutton switch actuates the three functions (plus “off”) in sequence:

    Flashlight switch - internal wiring
    Flashlight switch – internal wiring

    All three lights became intermittent, which suggested a poor return connection at the far end of the battery. The case is, of course, aluminum, with coarse-cut threads that grate as you tighten the parts. I cleaned the crud out of the threads, anointed them with Ox-Gard compound, and discovered that the laser and UV LEDs were still flaky.

    Taking the thing apart and unsoldering the switch connections revealed the problem:

    Flashlight switch - bad solder joints
    Flashlight switch – bad solder joints

    Yup, two lousy solder joints. They’re not exactly cold solder joints, because there’s not really a joint there to begin with; the switch tabs never got hot enough to bond with the molten solder before it cooled.

    A dab of flux and touch from a hot soldering iron solved that problem.

    Assemble in reverse order and it works better than it ever did before!