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

  • Kenmore 158: Hall Effect Pedal Connector

    Built back in 2004, the Dell GX270 PC had PS/2 keyboard and mouse ports on its back panel, so I put a PS/2 plug on the cable from the Hall effect sensor in the foot pedal. Although the original sockets mounted on a complex system board structure that I can’t repurpose, it’s easy enough to conjure up a mount for a single socket on the back panel:

    PS2 Socket Mount
    PS2 Socket Mount

    A quick fit check verified the dimensions:

    PS2 Connector mount - trial fit on platform
    PS2 Connector mount – trial fit on platform

    Astonishingly, the socket slid firmly into its slot. I love it when that happens on the first try!

    The flat plate in front of the mount snaps into the chassis cutout to locate the 2-56 screw hole positions:

    PS2 Mount - drill guide
    PS2 Mount – drill guide

    The screws thread directly into the mount, with the holes tapped for 2-56. PLA isn’t all that strong, but there’s enough meat to hold the mount firmly enough for my simple purposes.

    And it looks pretty good, in a post-apocalyptic missing-windows sort of way:

    PS2 Connector mount - in place
    PS2 Connector mount – in place

    That was easy…

    The OpenSCAD source code:

    // PS/2 Socket Mount
    // Ed Nisley - KE4ZNU - October 2014
    
    Layout = "Build";			// Build Socket Guide
    
    //- Extrusion parameters must match reality!
    
    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
    
    Socket = [14.1,13.3,13.0];	// PS/2 socket outline, minus tabs & wires on bottom
    
    Flange = 6.0;
    
    WallThick = IntegerMultiple(2.0,ThreadWidth);
    
    Mount = Socket + [2*Flange,WallThick,WallThick];
    
    ScrewTap = 1.90;			// 2-56 tap for machine screws
    
    ScrewOC = 19.0;
    
    echo(str("Screw OC: ",ScrewOC));
    
    ChassisHole = [13.0,13.0,1.0];
    GuideLayers = IntegerMultiple(0.5,ThreadThick);
    
    //----------------------
    // 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);
    
    }
    
    //-- Build the mount
    
    module SocketMount() {
    	
    	difference() {
    		translate([0,Mount[1]/2,Mount[2]/2])
    			cube(Mount,center=true);
    		
    		translate([0,Socket[1]/2,Socket[2]/2])
    			cube(Socket + [0,Protrusion,Protrusion],center=true);
    			
    		for (i=[-1,1])							// holes centered on socket, not mount
    			translate([i*ScrewOC/2,-Protrusion,Socket[2]/2])
    				rotate([-90,0,0])
    					rotate(180/6)
    						PolyCyl(ScrewTap,Mount[1] + 2*Protrusion,6);
    	}
    }
    
    //-- Totally ad-hoc drill guide to center holes on PS/2 cutout
    
    module DrillGuide() {
    	
    	union() {
    		intersection() {
    			translate([0,0,GuideLayers])
    				cube([2*Mount[0],2*Mount[1],2*GuideLayers],center=true);
    			translate([0,-Socket[2]/2,Mount[1]])
    				rotate([-90,0,0])
    					SocketMount();
    		}
    
    		translate([0,0,Protrusion])
    			linear_extrude(height=(3*GuideLayers - Protrusion)) {
    				circle(d=ChassisHole[0],$fn=8*4);
    				translate([-ChassisHole[0]/2,0])
    					square([ChassisHole[0],(ChassisHole[1] - ChassisHole[0]/2)],center=false);
    			}
    
    	}
    }
    
    
    //----------------------
    // Build it
    
    ShowPegGrid();
    
    if (Layout == "Socket")
    	SocketMount();
    
    if (Layout == "Guide")
    	DrillGuide();
    
    if (Layout == "Build") {
    	translate([0,-Mount[2],0])
    		DrillGuide();
    	translate([0,0,Mount[1]])
    		rotate([-90,0,0])
    			SocketMount();
    }