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: Stronger Filament Tensioner Springs

    Stronger filament tensioner springs
    Stronger filament tensioner springs

    When I built the Wade-ScribbleJ filament tensioner, I used four of the stiffest springs available in the Little Box o’ Small Springs. They came without a pedigree, of course, and worked quite well. However, the filament would occasionally stop feeding, usually after an intense series of reversals, and it seemed more pressure on the filament was in order.

    The 1.5 inch 4-40 screws limit the available length to no more than 12 mm and the tensioner must have at least 1 mm of free travel to accommodate filament thickness variations. Those springs had fairly dense coils and they were pretty much fully compressed.

    They turned out to compress 9 mm with 2.5 pounds applied, for a spring constant of 1.2 N/mm or, for we metric-challenged Yanks, 7 lb/in. Some rummaging turned up my Brownell’s No. 71 Compression Gun Spring assortment and I found a spring that compressed 5 mm with 5 lb applied: 4.4 N/mm or 25 lb/in.

    I know you’d love pix of that process, but I was already one hand shy of having enough to push the spring scale against the [4-40 screw + washer + spring + washer] over a metric ruler, then apply enough force to compress the spring  while reading the distance between the washers. Use your imagination, OK?

    I sliced four 4.5 turn lengths from that spring with a Dremel cutoff wheel, cleaned up the ends a bit to get them all to about 13 mm, reassembled the tensioner, and cranked the screws to compress the springs down to 8 mm. The quartet now apply something like 25 lb = 110 N to the idler bearing. That’s about four times what it was before, so that filament should have no reason to slip, even under cough extreme duress.

    Tomorrow: Applying some extreme duress…

  • Thing-O-Matic: Reset on Power (Not So) Good

    Having added a dummy load to pull a minimum current from both the +5 V and +12 V supplies, it seemed reasonable to connect the ATX +Power Good signal to the Arduino’s -Reset input. That ensures a power glitch will force a hard reset, rather than produce random crashes / instability / weirdness, and make the problem obvious.

    Of course, that presumes the power supply notices the glitch and drops the +Power Good line. That’s probably an incorrect assumption, but the only way to test it requires hitting the power supply with a crowbar and I’m just not going to go there.

    Anyhow.

    This also ensures the Arduino gets a hard reset when I turn the power off by triggering the manual shutdown button on the thermal lockout control box. The Arduino draws power through the USB cable from the PC (at least on the Foxconn box I’m using) and sometimes starts up crazy; that will no longer happen.

    The +Power Good signal arrives through the Gray wire on ATX pin 8 (it also drives an LED on the lockout box) and the -Reset signal is the outside pin on the Motherboard’s manual reset pushbutton. The new connection looks like this:

    Power Good to Reset - MB Schematic
    Power Good to Reset – MB Schematic

    Being no fool somewhat cautious, however, I added a switch that can disconnect the two lines; if it turns out the +Power Good signal has any glitches, I can use the original mode while scratching my head.

    A giant blob of hot melt glue holds the switch in position:

    Power Good Enable Switch to MB Reset Button
    Power Good Enable Switch to MB Reset Button

    A wire burrows through one of the unused RS-485 connector mounting holes under the switch on its way to the ATX connector. It’s the Blue wire below the board in the previous picture, enters from the top right here, and terminates on the third pad over with the Black wire that joins the cable on the way to the Lockout box

    ATX Power Good connection
    ATX Power Good connection

    Now I’ll see whether the Thing-O-Matic begins resetting at random moments. After doing all the various mods & improvements you’ve seen over the past few months the printer has been quite reliable, so I have some hope that this change will produce … no change.

    As a quick test, I let the printer sit all day with the Thermal Core and HBP temperatures cycling around 50 °C and all four steppers enabled. Any reset would disable the steppers and make itself obvious, but after two days it’s all good.

    One good sign: the LED ring around the extruder head just barely changes brightness as the heaters cycle.

    Oh, and the steppers don’t overheat, either. This thing is starting to behave like a real 3D printer should!

    If it does start resetting, however, I’ll add a latch inside the Thermal Lockout box that captures short +Power Good glitches and lights Yet Another LED.

  • Thing-O-Matic: Revised Wipe and Splodge

    Notched wiper
    Notched wiper

    So I finally got around to properly trimming & installing the silicone wiper to suit the aluminum build plates, then measuring where it sits in XYZ coordinates.

    The notched upper edge (that’s not a shadow) more-or-less matches the nozzle shape, but I doubt that’s critical. The key part: make it short enough to miss the bottom of the insulation blanket around the Thermal Core, which is much thicker on my Extruder than yours.

    From this angle you can see the nozzle just in front of the wiper. I used a low-profile bolt, although it’s still slightly higher than the top aluminum build plate.

    Nozzle in wipe position
    Nozzle in wipe position

    This G-Code routine helped figure out all the parameters. Define the maximum Z height properly, then fiddle with everything else to center the nozzle on the platform, pause in front of the wiper, and stop at the splodge position.

    (---- manual wipe and splodge alignment ----)
    (MakerBot Thing-O-Matic with aluminum HBP)
    (Tweaked for TOM 286)
    (Ed Nisley - KE4ZNU - April 2011)
    (-- set initial conditions)
    G21		(set units to mm)
    G90		(set positioning to absolute)
    (-- home axes)
    G162 Z F1500	(home Z to get nozzle out of danger zone)
    G161 Y F4000	(retract Y to get X out of front opening)
    G161 X F4000	(now safe to home X)
    G92 X-53.0 Y-59.0	(set XY coordinate zeros)
    G92 Z116.0    (set Z for HBP with aluminum sheet platform)
    G0 X0 Y0 Z10	(pause at center to build confidence)
    G4 P2000
    (-- manual nozzle wipe)
    G0 X56 Y-57.0 Z15	(move to front of cut-down wiper)
    G0 Z5   		(down to wipe level)
    G4 P4000		(Wait for filament to stop oozing)
    G1 Y-40	F1000		(slowly wipe nozzle)
    (-- manual splodge)
    G0 X-52 Y-58  (to front left corner)
    G1 Z0.50      (just over surface)
    

    This becomes a chunk of the heavily tweaked start.gcode that Skeinforge folds into every sliced file.

    Of course, just when I get this figured out, Skeinforge 40 eliminates the Outline plug-in, shuts off the extruder before zipping off to begin the Skirt (starting from the right side!), and prints the perimeter thread of the bottom layer first. More pondering is definitely in order…

  • Building Sinc

    Finished sinc
    Finished sinc

    I built the sinc function to see if circles were doing better after re-tensioning the belts, although this was before I replaced the X axis stepper. If you look carefully, you can see the defined-out-of-existence singularity emerging from the exact dead center of the central peak.

    My Shop Assistant took it to school, where her math teacher now thinks having a 3D printer would be an asset…

    Anyhow, this view of the first ring shows some blobs that may be coming from Reversal, which is at 25 rpm / 90 ms / 90 ms / no early turn-on or turn-off.

    Building sinc - inner ring
    Building sinc – inner ring

    Building the central peak above the ring took forever, as Cool limited the speed to ensure each layer took 15 seconds. The last few layers had those stepper. LEDs. Blinking. At. Less. Than. Walking. Speed.

    Building sinc - peak
    Building sinc – peak

    Now, what would Barbie use this thing for, anyway?

  • Thing-O-Matic: Minimum Power Supply Load

    Dummy load in place
    Dummy load in place

    The ATX power supplies commonly used in PCs generally require a minimum load of about an amp on the +5 V and +12 V lines to ensure good voltage regulation, but the Thing-O-Matic Motherboard has only a 30 Ω power resistor that draws 170 mA. They’re also designed for relatively constant-current loads, which the Thing-O-Matic is not, by any stretch of the imagination, so it’s no wonder the voltages jump all over the place.

    I think, but cannot prove, that many of the random problems plaguing long-duration prints arise from power glitches. That load resistor on the +5 V line was, at best, a stop-gap measure, and this is what I had in mind from the start. There are additional constant loads here and there throughout the Thing-O-Matic, but it really does not apply a known minimum load to the power supply.

    I got a stock of 6 Ω resistors for that heater project and used a trio here: one draws 800 mA from +5 V (about an amp, including the MB load) and the other two in series draw 1 A from +12 V. The little fan runs from +12 V, although I may connect it to +5 V to make it quieter; the 16 W total power dissipation is too high for convection cooling.

    Power resistors on heat spreader
    Power resistors on heat spreader

    Note that these are 50 W resistors dissipating 6 W apiece while running at room temperature. Yes, they look like extruder heater resistors, but this is an application they’re designed for.

    A bit of machining mated a junked CPU cooler to a half-inch slab of aluminum that serves as a heat spreader. The cooler had many tabs and protuberances on its bottom surface that I simply sliced off with an abrasive wheel. Two pieces of brass shim stock filled in a mysterious recess along the right edge in this picture. The cooler’s spring clamp engages a pair of wire tabs screwed to the spreader and the force smushes a layer of thermal compound into the air gaps.

    CPU heatsink on aluminum spreader
    CPU heatsink on aluminum spreader

    The holes atop the cooler didn’t match up with any fans in my collection, but that’s why I have a Thing-O-Matic. I had to rotate the fan case to get the holes to fit, which was trivially easy in OpenSCAD.

    Fan Adapter Plate Model
    Fan Adapter Plate Model

    And then it built about like you’d expect:

    Fan adapter plate
    Fan adapter plate

    Yes, it really needs a finger guard, but that’s in the nature of fine tuning…

    Assembled dummy load
    Assembled dummy load

    The OpenSCAD source code, with a rather fat ThreadWidth setting. IIRC, this was fallout from a random walk through the Skeinforge parameter space.

    // Fan adapter plate for CPU cooler
    //  Used for Thing-O-Matic minimum current loads
    // Ed Nisley - KE4ZNU - Mar 2011
    
    // Build with...
    //	extrusion parameters matching the values below
    //	+2 extra shells
    //	3 solid surfaces at top + bottom
    
    include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>
    
    // Extrusion parameters for successful building
    
    ThreadWidth = 1.0;					// should match extrusion width
    ThreadZ = 0.33;						// should match extrusion thickness
    
    HoleWindage = ThreadWidth;			// enlarge hole dia by extrusion width
    
    // Plate dimensions
    
    PlateX = 70.0;
    PlateY = 66.0;
    PlateZ = 5.0;
    
    FrameHoleSpace = 50.0;				// mounting holes in frame
    FrameHoleXOffset = 10.0;			//  ... offset from front left
    FrameHoleYOffset = 10.0;			//  ... which are *not* symmetrical!
    FrameHoleDia = 3.0 + HoleWindage;	// from frame holes
    FrameHoleRadius = FrameHoleDia/2;
    
    FanHoleSpace = 40.0;				// fan hole separation in X & Y
    FanHoleDia = FanHoleSpace * sqrt(2);	// diameter of hole circle
    FanHoleRadius = FanHoleDia / 2;
    
    FanAngle = acos(FrameHoleSpace / FanHoleDia) - 45;
    
    FanDuctDia = 48.0;
    FanDuctRadius = FanDuctDia/2;
    
    FanCenterX = PlateX/2;
    FanCenterY = PlateY/2;
    
    FanScrewDia = 4.0 + HoleWindage;	// from fan frame holes
    FanScrewRadius = FanScrewDia/2;
    
    // Convenience settings
    
    BuildOffsetX = 3.0 + PlateX/2;		// build X spacing between top & bottom plates
    BuildOffsetY = 3.0 + PlateY/2;		//	... Y
    
    Protrusion = 0.1;					// extend holes beyond surfaces for visibility
    HoleZ = PlateZ + 2*Protrusion;
    
    //-- Build it!
    
      difference() {
    	cube([PlateX,PlateY,PlateZ],center=true);
    
    	translate([(FrameHoleXOffset - FanCenterX),(FrameHoleYOffset + FrameHoleSpace - FanCenterY),0])
    	  cylinder(r=FrameHoleRadius,h=HoleZ,center=true,$fn=6);
    	translate([(FrameHoleXOffset + FrameHoleSpace - FanCenterX),(FrameHoleYOffset - FanCenterY),0])
    	  cylinder(r=FrameHoleRadius,h=HoleZ,center=true,$fn=6);
    
    	cylinder(r=FanDuctRadius,h=HoleZ,center=true,$fn=48);
    
    	rotate(a=[0,0,FanAngle]) {
    	  for(x=[-FanHoleSpace/2,FanHoleSpace/2]) {
    		for(y=[-FanHoleSpace/2,FanHoleSpace/2]) {
    		  translate([x,y,0])
    			cylinder(r=FanScrewRadius,h=HoleZ,center=true,$fn=6);
    		}
    	  }
    	}
      }
    

    The original as-it-was-being-machined heat spreader dimensions:

    Dummy load - As-built spreader dimensions
    Dummy load – As-built spreader dimensions
  • HBP + Aluminum Build Plate Stability

    Much to my surprise, the build plate maintained its alignment during the thrashing around while installing the new X axis motor. Measuring the alignment with that routine gave these results in mm above the sub-platform:

    0.8 0.8 0.8
    0.9 1.0 1.0
    0.7 0.9 1.0

    Bearing in mind that the overall measurement accuracy isn’t any better than 0.05 mm (and I have serious reservations about that), the plate moves as perpendicular-ly to the nozzle as one could expect. I tweaked it a bit, but probably just rearranged the offsets.

    So it’s stable. I must add a Z-height probe to the plate so that the machine can set itself up as the platform expands & contracts. The trick will be getting 0.1 mm accuracy at a constant offset from the upper build plate.

  • Fastest Thing-O-Matic EVAH!

    With a pair of low-resistance and (relatively) high-torque NEMA 17 stepper motors driving the X and Y axes, I re-ran that torture test.

    At 750 mA with just the aluminum sub-plate:

    • X can traverse at 6000 mm/min
    • Y begins losing steps at 4000 mm/min

    Increasing the Y driver to 900 mA, the Y motor can traverse at 6500 mm/min. It began losing steps at 6600 mm/min.

    Increasing the X driver to 900 mA, the X motor can traverse at 6000 mm/min with both aluminum build plates.

    At 900 mA with both aluminum build plates, both axes can dependably traverse at 6000 mm/min = 100 mm/sec.

    Large moves shake the printer, small patterns rattle it like a castanet, and you (probably) can’t print plastic at that speed, but the XY axes can traverse at 100 mm/s. That’s with about 200 g of aluminum plates atop an HBP, making it far heavier than even the ABP.

    Because the firmware does not apply velocity ramping (aka control the motor acceleration), the stages must start or stop within two full step positions to avoid stalling the motors.There’s some belt deformation (not stretch), the Y idler pulley isn’t rigidly mounted, and the stages themselves have plenty of slightly bendy parts.

    At 200 full step/rev, a 17 tooth pulley, and a 2 mm pitch belt, 1 full step = 0.17 mm and 2 step = 0.34 mm. I don’t have a good measurement for the other factors, but let’s assume a little bit of slop and go for 0.5 mm of total start / stop distance.

    The acceleration required for an abrupt 100 mm/s speed change is therefore:

    (0.12)/(2 * 5x10-4) = 10 m/s2

    The entire XY stage assembly weighs about 1 kgf, so F = m·a tells us that the force is 10 N. There’s another 1 kg = 10 N from belt / pulley friction, so the total force is 20 N.

    The pulley radius is 5.5 mm, so torque = F·r tells us the required motor torque is 20 * 0.0055 = 110 mN·m.

    Although I don’t have the exact motor specs at hand (a peril of using eBay as my parts locker), NEMA 17 motors with 38 mm case lengths produce around 200-300 mN·m at 1 A. That matches the Y axis numbers pretty well, given the one-significant-figure accuracy of the measurements.

    The X stage motor has a 34 mm case length and is likely good for 150-ish mN·m at 1 A. The 0.5 kgf of X axis belt friction dominates the acceleration force, so that result is in the right ballpark, too.

    The motor have winding resistances around 2 Ω, so they’re dissipating something under 2 W at 0.9 A. The cases and driver chips get barely warm to the touch; there’s no need for heatsinks or active cooling!

    Because the motors run well within their rated currents and the winding voltage is far lower than 12 V, microstepping is in full effect. The motors hum quietly and the stages move with authority. This is the quietest motion I’ve ever heard from the Thing-O-Matic; isolating the bolt heads from the panels probably improved that, too.

    Remember to increase the per-axis speed limits in machines.xml to allow higher speeds; it’s all too easy to fool yourself that changing F6000 to F7000 in the G-Code file makes a difference, even while the XML file caps the speed at F5000.

    Now that RepG has a setting for the homing speeds, I can set the maximum XY speed to 6000 mm/s, home at 2500 mm/s, and be done with it.

    I might just saw the leadscrew off the damn Z axis motor and replace that puppy, too, although that’s not in the critical path right now.

    Note: Don’t replace the motors on your TOM without going through the whole mechanical and electrical upgrade process I’ve described over the last few months. The X axis rod follower is extremely important, but the rest of the mods I’ve described help make the printer work smoothly and reliably. Adding more power won’t make those problems Go Away; you’ll just break something else!