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

  • Sewing Machine Bulb: LED Replacement Doodle

    Mary wants more light directly around the needle of her Kenmore Model 158 sewing machine, as the existing light (a 120 V 15 W incandescent bulb tucked inside the end housing) casts more of a diffuse glow than a directed beam:

    Kenmore Model 158 Sewing Machine - lamp
    Kenmore Model 158 Sewing Machine – lamp

    The end cap fits snugly around the bulb, but I thought a pair of 10 mm white LEDs, mounted side-by-side and aimed downward at the cover plate, would work. Of course, plugging a pair of white LEDs into a 120 VAC socket won’t work, but some judicious rewiring and a new 12 V DC wall wart will take care of that.

    The bulb has a dual-contact bayonet base, with both pins isolated from the shell and connected to the non-polarized (!) line cord through the power switch. I didn’t know it was called a BA15d base, but now I do.

    A 12 V automotive brake/taillight bulb (type 1157, I think) pulled from the Big Box o’ Bulbs has a slightly different pin arrangement that keys the filaments (which are not isolated from the shell) to the surrounding reflector:

    BA15d Bayonet Bulb Bases - 120V vs. 12V pins
    BA15d Bayonet Bulb Bases – 120V vs. 12V pins

    So I conjured a mockup to see if it would fit, using 2-56 screws to mimic whatever hardware might be practical:

    BA15d Bulb - LED Adapter
    BA15d Bulb – LED Adapter

    The solid model shows how it all fits together:

    Sears Lamp LED Adapter - Show view
    Sears Lamp LED Adapter – Show view

    The two tiny ruby-red pins represent filament snippets in alignment holes, barely visible in real life:

    LED holder parts
    LED holder parts

    I glued those pieces together, using a tiny machinist’s square as a jig to keep them perpendicular:

    LED holder clamping
    LED holder clamping

    Some random 10 mm LEDs served for testing:

    BA15d Bulb - 10 mm LEDs
    BA15d Bulb – 10 mm LEDs

    It actually fit pretty well, ignoring the fact that the LEDs point 90° from the intended direction (so I could see how the holes came out inside the pivot, honest), and lit up the area quite well, but it’s such a delicate affair that removing the entire socket and replacing it with a dedicated metal bracket / heatsink for two high-power SMD LEDs will be better.

    The OpenSCAD source code:

    // Adapter for LEDs in Sears sewing machine lamp socket
    // Ed Nisley - KE4ZNU - January 2014
    
    Layout = "Show";		// Build Show LEDTab LEDPlate ShellMount
    
    //- Extrusion parameters must match reality!
    //  Print with 2 shells and 3 solid layers
    
    ThreadThick = 0.20;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;			// extra clearance
    
    Protrusion = 0.1;			// make holes end cleanly
    Gap = 2.0;					// spacing between Show parts
    
    AlignPinOD = 1.70;			// assembly alignment pins: filament dia
    
    inch = 25.4;
    
    //----------------------
    // Dimensions
    
    //-- LED mounting plate
    
    LEDDia = 10.0;				// LED case OD
    LEDFlangeOD = 10.7;
    
    LEDPlateThick = 2.0;		// mounting plate thickness
    LEDMargin = 2.0;
    
    LEDSpaceOC = LEDDia + LEDMargin;		// LED center-to-center distance (single margin between!)
    
    LEDTabLength = 15.0;		// base to screw hole center
    
    LEDTabThick = 4.0;			// tab with hole for mounting screw
    LEDTabScrewOD = 2.0;
    LEDTabWidth = (3.0*2) + LEDTabScrewOD;
    
    LEDMountHeight = 25.0;		// estimated mounting screw centerline to bottom of LEDs
    
    //-- Lamp base adapter
    //		hard inch dimensions!
    
    ShellOD = 0.600 * inch;				// dia of metallic shell
    ShellOAL = 0.66 * inch;				//  ... total length
    ShellInsert = 7/16 * inch;			//  ... length engaging socket
    
    ShellSides = 4*4;
    
    BulbOD = 0.75 * inch;				// glass bulb
    BulbLength = 1.14 * inch;
    
    InsulOD = 0.485 * inch;				// insulating stub around contact pins
    InsulThick = 0.070 * inch;			//  ... beyond end of shell
    
    ContactOD = 2.0;					// contact holes through base (not heads)
    ContactOC = 0.300 * inch;			//  ... center-to-center spacing
    
    BayonetOD = 0.080 * inch;			// bayonet pin diameter
    BayonetOffset = 0.125 * inch;		// from end of metal base
    
    LampOAL = InsulThick + ShellOAL + BulbLength;
    echo(str("Overall Length: ",LampOAL));
    
    //-- Miscellany
    
    //----------------------
    // 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) {
    
      Range = floor(50 / Space);
    
    	for (x=[-Range:Range])
    	  for (y=[-Range:Range])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    }
    
    //-- Tab for screw mounting LED holder
    //		AddLength remains below Z=0 for good union
    
    module LEDTab() {
    
    	difference() {
    		linear_extrude(height=LEDTabThick)
    			hull() {
    				circle(d=LEDTabWidth);
    				translate([LEDTabLength/2,0,0])
    					square([LEDTabLength,LEDTabWidth],center=true);
    			}
    		translate([0,0,-Protrusion])
    			rotate(180/6)
    				PolyCyl(LEDTabScrewOD,(LEDTabThick + 2*Protrusion),6);
    		for (i=[-1,1])
    			translate([LEDTabLength/2,i*LEDTabWidth/4,LEDTabThick/2])
    				rotate([0,90,0]) rotate(180/4)
    					PolyCyl(AlignPinOD,(LEDTabLength/2 + Protrusion),4);
    	}
    }
    
    //-- Plate holding LEDs
    
    module LEDPlate() {
    
    	difference() {
    		union() {
    			linear_extrude(height=LEDPlateThick)
    				hull() {
    					for (i=[-1,1])
    						translate([i*LEDSpaceOC/2,0,0])
    							circle(d=(LEDDia + 2*LEDMargin));
    					translate([0,(LEDFlangeOD/2 + LEDTabWidth/2),0])
    						square([LEDTabThick,LEDTabWidth],center=true);
    				}
    		}
    		for (i=[-1,1])
    			translate([i*LEDSpaceOC/2,0,-Protrusion])
    				rotate(180/12)
    					PolyCyl(LEDDia,(LEDPlateThick + 2*Protrusion),12);
    		for (i=[-1,1])
    			translate([0,(i*LEDTabWidth/4 + LEDFlangeOD/2 + LEDTabWidth/2),3*ThreadThick]) rotate(180/4)
    				PolyCyl(AlignPinOD,(LEDTabLength/2 + Protrusion),4);
    
    	}
    }
    
    //-- Bulb shell mounting adapter
    
    module ShellMount() {
    
    	difference() {
    		union() {
    			cylinder(r1=InsulOD/2,r2=ShellOD/2,h=(InsulThick + Protrusion),$fn=ShellSides);
    			translate([0,0,InsulThick])
    				cylinder(r=ShellOD/2,h=(LampOAL - LEDMountHeight + LEDTabWidth/2),$fn=ShellSides);
    		}
    
    		translate([0,ShellOD,(InsulThick + BayonetOffset)])		// bayonet pin hole
    			rotate([90,0,0]) rotate(180/4)
    				PolyCyl(BayonetOD,2*ShellOD,4);
    
    		translate([0,ShellOD,(InsulThick + LampOAL - LEDMountHeight)])		// LED mount screw hole
    			rotate([90,0,0])
    				PolyCyl(LEDTabScrewOD,2*BulbOD,6);
    
    		translate([0,0,(InsulThick + ShellOAL + LampOAL/2)])		// slot for LEDTab mount
    			cube([2*ShellOD,(LEDTabThick + 2*Protrusion),LampOAL],center=true);
    
    		for (i=[-1,1])											// contact pin holes
    			translate([i*ContactOC/2,0,-Protrusion])
    				rotate(180/6)
    					PolyCyl(ContactOD,2*LampOAL,6);
    	}
    
    }
    
    //- Build it
    
    ShowPegGrid();
    
    if (Layout == "LEDTab")
    	LEDTab();
    
    if (Layout == "LEDPlate")
    	LEDPlate();
    
    if (Layout == "ShellMount")
    	ShellMount();
    
    if (Layout == "Show") {
    	LEDPlate();
    	translate([-LEDTabThick/2,(LEDFlangeOD/2 + LEDTabWidth/2),(LEDTabLength + LEDPlateThick + Gap)])
    		rotate([0,90,0])
    			LEDTab();
    	for (i=[-1,1])
    #	translate([0,(i*LEDTabWidth/4 + LEDFlangeOD/2 + LEDTabWidth/2),(LEDPlateThick + Gap/4)])
    		rotate(180/4)
    		cylinder(r=AlignPinOD/2,h=Gap/1,$fn=4);		// fake the pins
    
    	translate([0,(LEDFlangeOD/2 + LEDTabWidth/2),(LampOAL - LEDTabWidth/2)])
    		rotate([0,180,0]) rotate(90)
    			ShellMount();
    }
    
    if (Layout == "Build") {
    	translate([0,LEDDia,0])
    		LEDPlate();
    
    	translate([-10,-(LEDMargin + LEDTabWidth),0])
    		rotate(-90)
    			LEDTab();
    
    	translate([10,-(LEDMargin + LEDTabWidth),0])
    		ShellMount();
    }
    

    The original doodles for the bulb dimensions and adapter layout:

    Bulb dimensions - adapter doodles
    Bulb dimensions – adapter doodles