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

  • 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);
    
    }
    
  • Thing-O-Matic: USB Power Backfeed Prevention

    The Arduino Mega 2650 board used in the Thing-O-Matic gets its power from the +12 V ATX supply plugged into the TOM Motherboard. It will also automagically switch to +5 V from the USB connection when the +12 V external power Goes Away.

    Come to find out that the Foxconn Atom I’m using doesn’t shut off the power to the USB ports when it’s “turned off”. That keeps the Arduino alive and, by a quirk of the circuitry, backfeeds +5 V into the +12 V supply, which makes its way back to the ATX power supply and keeps the fan running. Slowly, but it’s ticking over in there.

    Rather than keep unplugging the USB cable, I added a diode in series with the Motherboard +12 V trace going to the Arduino connector:

    USB backfeed prevention diode
    USB backfeed prevention diode

    The orange stuff is nail polish rejected by my Shop Assistant, which covers a slit gouged in the +12 V trace. The diode bridges the gouge and passes current only into the Arduino.

    Any diode will do, as the next step in the +12 V supply chain is that poor overworked Arduino regulator responsible for shaving it down to +5 V. I used a good old 1N4001 and it’s perfectly happy.

    [Update: the Arduino will remain powered up overnight, even with everything else turned off. When you turn the Thing-O-Matic on the next morning, pop the Reset button to get the Arduino’s attention.]

  • LED Flashlight Switch Repair Failure

    This didn’t work out, but it came close. Eventually I’ll figure out what material can replace the boot, at which point I’ll need to remember these steps…

    That LED flashlight + laser pointer has a rubber boot over the push-on / push-off switch stem that makes it sorta-kinda waterproof. Although I wouldn’t trust it in more than a sprinkle, it’s my pocket flashlight and tends not to get soaked very often.

    Anyhow, the rubber boot wore through:

    Broken switch boot
    Broken switch boot

    Taking it apart, now that I know how, was easy enough:

    Switch button parts
    Switch button parts

    Note that the mushroom part goes on the outside, which means the stem will vanish if the boot rips apart.

    I planned to mold a boot from acrylic caulk, so I wrapped narrow strips of electrical tape to match the stem to the mushroom head, then wrapped a bit around that to make the final boot fit loosely:

    Wrapped switch stem
    Wrapped switch stem

    A thin layer of oil served as mold release, over which I smoothed a blob of caulk. This looks awful, but the majority of the blob at the bottom will get trimmed off:

    Switch stem covered with acrylic caulk
    Switch stem covered with acrylic caulk

    Unfortunately, the cured caulk turned out to be remarkably fragile. Each individual blob felt tough, but it’s really not designed to form thin membranes; I got about what I expected.

    Pourable silicone rubber seems like the right hammer for the job: make an outer mold to surround this thing (or a 3D printed replica) and pour it on. I must get some of that, one of these days.

    So I put the flashlight back together with the mushroom on the inside to keep the stem in place… and I generally avoid getting more than knee-deep in liquids, so not having a good seal won’t matter too much.