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

  • LED Floodlight Rehabilitation

    I picked up a pair of 12 V 4 W 3-LED floodlights (datasheet, newer datasheet, and catalog) with 34 degree and 24 degree beams from All Electronics, with the intent of making some task lighting fixtures for the shop. Somebody decommissioned the lamps by snipping off a pin, so they’re not immediately useful.

    The back pulls off with a bit of difficulty, after removing the two obvious screws and holding the connector body in place while pulling. I didn’t try to remove the circuit board, which would require unsoldering the clearly marked Anode and Cathode LED wires that enter from the bottom of the board.

    LED Floodlight - interior
    LED Floodlight – interior

    I plan to build these lamps right into the fixtures, so soldering a wire directly onto the pin makes sense; I expect they’ll outlast my usage and a socket won’t add any value. As an intermediate step, I soldered a short brass tube onto the pin stump:

    LED Floodlight - repaired pin
    LED Floodlight – repaired pin

    In new condition, these retail somewhere beyond $60, so cutting 6 mm from one pin shaved about fifty bucks off the price. I suspect they were extracted from somebody’s shiny new, recently abandoned, and probably foreclosed, office complex and were ruined to prevent resale-as-new. The fact that the reflectors got a bit scuffed up along the way wouldn’t help their value any, either.

    They draw 330-odd mA from a 12 V supply, run from AC or DC (either polarity), and seem to have a constant-current driver inside. I wouldn’t buy ’em new, but for eight bucks a pop they’re a pretty good deal.

  • Target Unit Pricing Amusement

    I’m not sure whether all unit prices must be converted to “per 100 count” or not, but it really doesn’t work out well for CFL bulbs (clicky for more dots):

    CFL 2-bulb pack
    CFL 2-bulb pack

    That’s $549.50 per 100 bulbs, if you can’t make it out.

    On the shelf below, however, a single-bulb pack priced out to $979 per 100 count, so the 2-pack is definitely a better deal!

  • Thing-O-Matic: Oozebane Turds

    Printing those fairing mounting plates gave me an opportunity to explore the Oozebane parameter space. I wasn’t quite sure how it would work and now I’m certain that it can’t.

    Here’s the joint at the start/end of the perimeter extrusion around one of the plates, with Oozebane set for a 4 mm early shutdown:

    Perimeter joint - Oozebane
    Perimeter joint – Oozebane

    You’re looking straight down at three edges (bottom = 2 layers, middle & top = 3 layers), but the shadow obscures the vertical faces; they’re firmly joined. The nozzle enters the picture from the left, slows and stops at the joint, then departs for another location.

    The turd appears on the far side of this picture, just above the left hole:

    Fairing mount - outside
    Fairing mount – outside

    Here’s the same joint, but with Oozebane turned off:

    Perimeter joint - normal
    Perimeter joint – normal

    Any questions?

    Ah: layer thickness 0.3 mm, w/t=1.7 → width =0.56 mm, 45 mm/s feed, 255 PWM flow.

    As nearly as I can tell, Oozebane can’t possibly work the way it’s currently defined, at least for the DC extruder on my Thing-O-Matic. The problem is that Oozebane simultaneously shuts off the extruder and slows the feed rate, but the pressure on the molten plastic inside the extruder continues to force it out at about the same rate for quite some time.

    Thus, with the feed rate reduced to some unknown (and unprogrammable) value and the flow continuing at the original rate, each thread endpoint accumulates an oversized turd.

    Maybe Oozebane works for somebody else, but a stepper extruder is the right solution…

  • Tour Easy: Zzipper Fairing Upper Mount Plates

    The stock Zzipper fairing handlebar mount consists of an aluminum bar with a plate welded to each end at more-or-less the correct angle to match the fairing curve. The plate has a 1/4 inch hole in one end, wherein a 1/4-20 nylon machine screw clamps the fairing to the plate, with a nylon washer distributing the stress. That doesn’t cope well with the vibrations caused by riding around here, let alone our summer vacation trips on crushed-stone rail trails, and the fairings tend to stress-crack at the holes.

    These 3D printed plates are just the latest in a long series of attempts to distribute the stress over a larger area. The outside view:

    Fairing mount - outside
    Fairing mount – outside

    The open hole gets another screw to hold the plates in position. The bump on the far side is an Oozebane turd, about which more later.

    The view from inside the fairing:

    Fairing mount - inside
    Fairing mount – inside

    You can’t see the layer of black foam rubber salvaged from a mouse pad between each plate and the fairing. That should prevent any local stress concentration at the screw and ease the transition to the tapered plate edges.

    The solid model looks about like you’d expect:

    Fairing Mount Plates - Upper
    Fairing Mount Plates – Upper

    The hole position depends on the fairing position, as the fairings have three holes. The pictures show the fairing on my bike; it’s in the lowest position, with the screw in the topmost hole. The OpenSCAD file has an option to put the holes where you need them.

    The plates are only 8 layers thick, printed with 4 solid layers top and bottom to eliminate any fill. You could do the same by setting the fill to 100%, I suppose. Using 4 outer shells (3 additional) makes the flanged edge nice and flat and uniform.

    The layer height is 0.33 mm, with w/t=1.7 for a width of 0.56 mm. Feed rate = 43 mm/s and flow rate = 255. DC Extruder, alas.

    Running the first layer at feed = 0.5  and flow = 0.75 produces some fluffing in the fill, but there’s no way to get a lower flow from the DC extruder motor. Flow = 0.75 corresponds to PWM=191; anything lower sometimes fails to start the motor. If it starts, it’ll run, but … that’s not dependable.

    I printed them on an aluminum plate for a nice flat bottom surface.

    The OpenSCAD source code:

    // Clamp plates for Zzipper fairing on Tour Easy recumbents
    // Ed Nisley - KE4ZNU - Mar 2011
    
    // Build with...
    //	extrusion parameters matching the values below
    //	4 outer shells
    //	4 solid surfaces at top + bottom
    //  slow feeds to ensure hole perimeters stick to fill
    
    include </home/ed/Thing-O-Matic/lib/MCAD/boxes.scad>
    include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>
    
    // Select hole layout
    // The if statement seems to work only for CSG object trees
    // Fortunately, I need only two different layouts...
    
    HoleSelect = 1;						// 0 = his, 1 = hers
    
    HolesTop 	= (0 == HoleSelect) ? [0,1,1] : [1,0,1];
    HolesBottom = (0 == HoleSelect) ? [0,1,1] : [1,0,1];
    
    // Set these to match the extrusion parameters for successful building
    
    ThreadZ = 0.33;						// extrusion thickness
    ThreadWidth = 0.57;					// extrusion width = ThreadZ x w/t
    
    HoleWindage = ThreadWidth;			// enlarge hole dia by extrusion width
    
    // Plate dimensions
    
    HoleDia = 0.25 * inch;				// these are 1/4-20 bolt holes
    HoleSpace = (1) * inch;				// center-to-center spacing
    									//  usually 1 inch, but 15/16 on one bike
    
    CornerR = 5.0;						// corner rounding
    
    Layer1X = 90;						// against fairing surface
    Layer1Y = 32;
    Layer1Z = 2*ThreadZ;
    
    Layer2Margin = 1.5;					// uncovered edge
    Layer2X = Layer1X - 2*Layer2Margin;
    Layer2Y = Layer1Y - 2*Layer2Margin;
    Layer2Z = 3*ThreadZ;
    
    MountX = 46.3 + HoleWindage;		// handlebar mounting bracket end plate
    MountHoleSpace = 13.0;				//  end to hole center
    MountY = 16.3 + HoleWindage;
    MountZ = 4*ThreadZ;					// recess depth
    MountCap = 3.0;						// endcap arc height
    MountR = (pow(MountCap,2) + 0.25*pow(MountY,2)) / (2*MountCap);	// ... radius
    
    Layer3Margin = 1.5;
    Layer3X = Layer2X - 2*Layer3Margin;
    Layer3Y = max((Layer2Y - 2*Layer3Margin),(MountY + 8*ThreadWidth));
    Layer3Z = 3*ThreadZ;
    
    PlateZ = Layer1Z + Layer2Z + Layer3Z;
    
    // Convenience settings
    
    BuildOffset = 3.0 + Layer1Y/2;		// build Y spacing between top & bottom plates
    
    Protrusion = 0.1;					// extend holes beyond surfaces for visibility
    
    //---------------
    // Create plate with selectable holes
    
    module Plate(hs) {
    
      difference() {
    
    	union() {
    		translate([0,0,Layer1Z/2])
    		  roundedBox([Layer1X,Layer1Y,Layer1Z],CornerR,true);
    		translate([0,0,Layer1Z + Layer2Z/2])
    			roundedBox([Layer2X,Layer2Y,Layer2Z],CornerR,true);
    		translate([0,0,Layer1Z + Layer2Z + Layer3Z/2])
    			roundedBox([Layer3X,Layer3Y,Layer3Z],CornerR,true);
    	}
    
    	if (0 != hs[0]) {
    	  translate([-HoleSpace,0,PlateZ/2])
    		  cylinder(r=(HoleDia + HoleWindage)/2,
    					h=(PlateZ + 2*Protrusion),
    					center=true,$fn=10);
    	}
    
    	if (0 != hs[1]) {
    	  translate([0,0,PlateZ/2])
    		  cylinder(r=(HoleDia + HoleWindage)/2,
    					h=(PlateZ + 2*Protrusion),
    					center=true,$fn=10);
    	}
    
    	if (0 != hs[2]) {
    	  translate([HoleSpace,0,PlateZ/2])
    		  cylinder(r=(HoleDia + HoleWindage)/2,
    					h=(PlateZ + 2*Protrusion),
    					center=true,$fn=10);
    	}
    
      }
    
    }
    
    //---------------
    //-- Build the things...
    
    translate([0,BuildOffset,0]) Plate(HolesTop);
    
    translate([0,-BuildOffset,0])
      difference() {
    	Plate(HolesBottom);
    
    	translate([-(HoleSpace + MountHoleSpace - MountX/2),0,PlateZ - MountZ/2 + Protrusion/2])
    	  intersection() {
    		cube([MountX,MountY,(MountZ + Protrusion)],center=true);
    		union() {
    		  cube([(MountX - 2*MountCap),MountY,(MountZ + Protrusion)],center=true);
    		  translate([ (MountX/2 - MountR),0,0])
    			cylinder(r=MountR,h=(MountZ + Protrusion),center=true);
    		  translate([-(MountX/2 - MountR),0,0])
    			cylinder(r=MountR,h=(MountZ + Protrusion),center=true);
    		}
    	  }
      }
    

    I loves me my Thing-O-Matic, despite its annoyances…

    [Update: Stepper extruder parameters and a tweak to make the mount plate track the hole position correctly.]

  • Thing-O-Matic: Thermal Lockout Circuit

    Thermal lockout control box
    Thermal lockout control box

    This is a proof-of-concept lashup of a circuit to shut off the Thing-O-Matic’s power should the Thermal Core overheat. It vaguely resembles those doodles, but with the thermal switch cases grounded and an indicator for the main thermal switch.

    [Update: You should read the rant at the bottom of that post to understand why this isn’t a firmware mod and doesn’t contain a microcontroller.]

    Operation is straightforward:

    • The black NO (Normally Open) momentary switch energizes the DPDT relay, one NO pole of which then holds the relay power on.
    • The red NC (Normally Closed) momentary switch interrupts that circuit and releases the relay.
    • An NC thermal switch detects an overheated Thermal Core, opens that circuit, and releases the relay.

    The other NO relay pole connects / disconnects the ATX power supply’s -Power On line from the Thing-O-Matic Motherboard. That connection requires a circuit-board cut to splice the relay into the Motherboard.

    The LEDs:

    • Lower Green = ATX AC power on (from +5VSB power)
    • Upper Green = +Power On signal active
    • Red = Test / Fault (on = relay inactive)
    • Yellow = low over-temperature alarm
    • Orange atop box = high over-temp switch active

    I included a second NO thermal switch that activates at a lower temperature, mostly because I had one, but that’s certainly not required. The multitude of LEDs makes for a happy-looking box; labels would be a nice touch, I agree.

    When you turn on the ATX power supply, the Lower Green and Red LEDs turn on: the “Test” part of the “Test / Fault” indicator. Push the black button, the Red LED goes off, the Upper Green LED goes on, and the Thing-O-Matic is up & running. Push the red button, the TOM shuts down, and you’re back to the starting condition.

    The Yellow LED goes on when the lower temperature switch goes on.

    Shortly thereafter, presumably, the higher temperature switch opens, the Orange LED goes on, the TOM shuts down, and you’re left with the Lower Green, Yellow, and Orange LEDs: zowie! When the  high temp switch cools off a bit, the Orange LED goes off and the Red LED goes on. After a while, the Yellow LED will go off, and you’re back to Square One again.

    What’s not yet done: mounting the thermal switches to the Thermal Core in a way that’s mechanically solid, electrically isolated, and thermally dependable. I just got a bag of 100 °C NC switches, which make more sense than the 65 °C NC switches I’d been fooling with.

    The wiring uses 4P4C and 6P6C modular phone connectors and cables, which are cheap & readily available, if not exactly proof against high temperatures. In normal use, failures tend to be open-circuit that will shut off the heater power. Take care not to position the cables so they melt first; they’re not intended as thermal switches.

    Achtung: modular cable color codes are not standardized, particularly on the jack side, so pay more attention to the pin numbers than the colors. If I ever meet the guys who rearranged the jack colors, There. Will. Be. Gibbage.

    A back view of the box shows a nice rectangular hole that’s obviously a manual CNC job on the Sherline, with no corner filing whatsoever. Hot melt glue holds the connectors in place, so I’m not showing off the inside:

    Thermal lockout box - rear
    Thermal lockout box – rear

    The -Power On connection to the Motherboard requires the single cut shown in yellow:

    Motherboard PCB Modification
    Motherboard PCB Modification

    It looks like this in real life, with the wire soldered to the Arduino header pin. Another dab of my Shop Assistant’s orange nail polish seals the PCB wound:

    Motherboard -Power On modification
    Motherboard -Power On modification

    The remaining wires attach to the ATX power connector pins on the bottom of the board. The yellow wire passes through an unused mounting hole on its way to the top side, as above. Use a cable tie to tie the cable to the board, through a pair of otherwise unused RS-485 connector mounting holes.

    Motherboard Connections - Bottom
    Motherboard Connections – Bottom

    While you’re chopping away at the Motherboard, add that isolating diode to keep +5 V USB power from turning the ATX fan with the power off.

    The overall schematic (clicky for more dots):

    Thermal Lockout Schematic
    Thermal Lockout Schematic

    There is no corresponding PCB layout, because the circuitry forms a point-to-point hairball inside the box. If you were doing this for real, you’d want a PCB with a bazillion connections, but …

    For example, here’s the FET driver for the Orange (it just looks Red) high temperature LED before a liberal application of heat stink shrink tubing:

    Overtemperature LED driver hairball
    Overtemperature LED driver hairball

    You can test the thermal switches using a butane lighter.

  • 3D Printed Pactec Box Panel

    As part of the Thermal Lockout project, I planned to put a pair of big pushbutton switches on the end of a little Pactec box, thusly:

    Pactec box - printed panel
    Pactec box – printed panel

    I was in the midst of figuring out how to clamp that tiny panel to the Sherline milling machine’s table and gnaw out those big holes, when I realized I could just print out a new panel with the holes already in place:

    Pactec panels with switches
    Pactec panels with switches

    No muss, no fuss, no exciting chips… and no tedious corner filing, either.

    The 3D model has the hole for an LED that I added later; the panel shown above acquired that hole during a brief conference with Mr Drill Press.

    Thermal Cutout Box - switch plate model
    Thermal Cutout Box – switch plate model

    In actual point of fact, I had to do a bit of edge filing for the switches, as the holes came out slightly undersized. The HoleWindage setting should take care of that for the next time around. The panel was a drop-in replacement for the original: all the outside dimensions & thicknesses were spot on.

    The OpenSCAD source code:

    // End panel for PacTec 61191-01 box
    //    Panel 61580-01
    // Ed Nisley - KE4ZNU - Feb 2011
    
    Layer1Z = 1.50;
    Layer2Z = 1.00;
    
    HoleWindage = 0.55;                // approximately equal to extrusion width
    Protrusion = 0.1;                // stick out over top and bottom
    
    SwitchOffsetX = 15.0;
    
    SwitchX = 16.0 + HoleWindage;
    SwitchY = 12.0 + HoleWindage;
    SwitchZ = Layer1Z + Layer2Z;
    
    LedR = (5.0 + HoleWindage)/2;
    LedZ = SwitchZ;
    
    difference() {
     union() {
     translate([0,0,Layer1Z/2]) cube([55,22.5,Layer1Z],center=true);
     translate([0,0,(Layer1Z + Layer2Z)/2]) cube([52.6,19.5,Layer1Z + Layer2Z],center=true);
     }
    
     translate([SwitchOffsetX,0,SwitchZ/2])
     cube([SwitchX,SwitchY,SwitchZ + 2*Protrusion],center=true);
    
     translate([-SwitchOffsetX,0,SwitchZ/2])
     cube([SwitchX,SwitchY,SwitchZ + 2*Protrusion],center=true);
    
     translate([0,0,LedZ/2])
     cylinder(r=LedR,h=LedZ + 2*Protrusion,center=true,$fn=10);
    
    }
    
  • Sherline Collet Pusher Pin Holder

    Locking pin holder in use
    Locking pin holder in use

    Although that collet pusher works fine, the locking pin holder often teleported itself inside the vacuum cleaner. It recently reappeared on the far end of the main workbench, a good 15 feet away from the Sherline as the swarf flies. This, to misquote Churchill, is an impertinence up with which I shall not put.

    Herewith, a replacement offering several advantages:

    • Won’t fit up the vacuum’s snout
    • Easy to grip
    • Perfect pin alignment
    • 3D printing FTW!

    It’s a flat block resting on the flat top of the pulley, with a nice arc matching the pusher’s OD. A small hole for the pin at exactly the right altitude makes the whole thing rock-solid stable: it slides firmly into position.

    The 3D model looks like you’d expect:

    Pin holder - OpenSCAD model
    Pin holder – OpenSCAD model

    The finger grips were just for pretty, as you don’t need that much traction to extract the thing.

    A similar view of the real object with the bottom surface up and some flash around the edges:

    Locking pin holder - spindle end view
    Locking pin holder – spindle end view

    The as-printed block put the pin about 0.2 mm above the spindle hole, so I rubbed it on Mr Belt Sander (with the power off) until it fit. I printed the block on the aluminum plate platform; the Z height home setting evidently needs a tweak. However, the hole was exactly the correct distance from the top surface: flipping the block over fit perfectly.

    The OpenSCAD source code:

    // Collet extractor locking pin holder for Sherline spindle
    // Ed Nisley - KE4ZNU - Feb 2011
    
    include </home/ed/Thing-O-Matic/lib/MCAD/boxes.scad>
    include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>
    
    PusherOD = 17.35;					// Shell of collet pusher
    
    PulleyOD = 65.5;					// For 3k rpm head
    
    PinHoleCtr = (3/16) * inch;			// pin hole center above pulley surface
    PinDia = 2.50;						// pin is about #40 drill
    PinHoleDepth = 10.0;				// hole depth from PusherOD
    
    HoleWindage = 0.55;					// Approximate extrusion width
    Padding = 0.1;						// A bit of spacing to make things obvious
    
    HolderWidth = 2 * PusherOD;						// Overall holder width
    HolderProtrusion = 15;							// sticks out beyond pulley
    HolderLength = PulleyOD/2 + HolderProtrusion;	//	... length
    HolderThickness = 2*PinHoleCtr;					//	... thickness
    HolderRounding = HolderWidth/5;					// corner rounding
    
    GripLength = 0.70 * HolderWidth;	// grip notch
    GripWidth = 0.25 * GripLength;
    GripIndent = HolderProtrusion/2;
    
    difference() {
    
    // main slab
    
      translate([-HolderLength/2,0,0])
    	roundedBox([HolderLength,HolderWidth,HolderThickness],HolderRounding,true,$fn=4*8);
    
    // pin hole
    
      translate([-(PusherOD/2 + PinHoleDepth/2 - Padding),0,0])
      rotate([0,90,0])
    	cylinder(r=PinDia/2,h=(PinHoleDepth + Padding),center=true,$fn=8);
    
    // upper grip
    
      translate([-(HolderLength - GripIndent),0,(HolderThickness/2)])
      rotate([90,0,0])
    	cylinder(r=GripWidth/2,h=(GripLength - GripWidth),center=true);
    
      translate([-(HolderLength - GripIndent),((GripLength - GripWidth)/2),(HolderThickness/2)])
    	sphere(r=GripWidth/2,$fn=10);
    
      translate([-(HolderLength - GripIndent),-((GripLength - GripWidth)/2),(HolderThickness/2)])
    	sphere(r=GripWidth/2,$fn=10);
    
    // lower grip
    
      translate([-(HolderLength - GripIndent),0,-(HolderThickness/2)])
      rotate([90,0,0])
    	cylinder(r=GripWidth/2,h=(GripLength - GripWidth),center=true);
    
      translate([-(HolderLength - GripIndent),((GripLength - GripWidth)/2),-(HolderThickness/2)])
    	sphere(r=GripWidth/2,$fn=8);
    
      translate([-(HolderLength - GripIndent),-((GripLength - GripWidth)/2),-(HolderThickness/2)])
    	sphere(r=GripWidth/2,$fn=8);
    
    // spindle shaft
    
      cylinder(r=(PusherOD/2)+HoleWindage,h=(HolderThickness + 2*Padding),center=true);
    
    }