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

  • Thing-O-Matic: Heated Build Platform Center Screw

    While I was rebuilding the HPB heater wiring, I drilled / countersunk / tapped a 4-40 hole in the middle of the aluminum sub-plate for a screw to secure the middle of the heater PCB:

    HBP center attachement screw - top
    HBP center attachement screw – top

    Remember: this plate is firmly secured to the plywood build platform with three leveling screws over springs. Another aluminum plate, with Kapton tape as the build surface, sits on top, providing an absolutely flat build platform. If you’re using a single plate, you could backfill the hole with a dab of JB Industro Weld epoxy atop a lightly greased screw, then file the top flush with the plate.

    A flat-head screw harvested from a chunk of electronic junk came from the Drawer o’ Short 4-40 Screws and fit perfectly:

    HBP center attachment screw - bottom
    HBP center attachment screw – bottom

    Mirabile dictu, the screw was short enough that it didn’t require any trimming to stay below the top surface.

    Securing the center of the PCB to the aluminum plate cuts the heater’s free span in half: the PCB originally had screws only along the left and right edges. Its thermal expansion visibly bowed it away from the plate and I hope this will reduce that problem. Of course, now the PCB’s expansion has nowhere to go and those thermal stresses will probably begin chewing up the mounting holes.

    While I was at it, I removed the MBI “heat spreader” tape from the PCB. I’d been reluctant to do that, for fear of peeling the traces right off the board, but the surface was in fine shape. Whew!

    More on the wiring and epoxy blobbed brass tube later…

  • Platform Level Test Pattern

    Unlike that pattern, this OpenSCAD program produces an STL file that gets sliced in the usual manner, so that the end result shows exactly how the first layer of all other objects gets laid down.

    Thread Thickness Test - solid model
    Thread Thickness Test – solid model

    It’s two threads wide and one thread thick: customize the OpenSCAD code to match the settings in Skeinforge (or Slic3r or whatever you’re using) to make it build properly.

    The two tabs mark the +X and +Y directions. The bottom surface will be wonderfully shiny from the build plate, so the symmetry along the diagonal shouldn’t pose a problem.

    Should the thickness vary more-or-less linearly along any of the bars, then you know which way to level the platform. If it varies non-uniformly, then either the build plate isn’t flat or the printer has other problems.

    The actual width depends on the actual thickness, of course: a too-low nozzle will create a too-wide pattern regardless of the extrusion settings. The thickness should be uniform across the entire pattern, so you can still adjust the platform leveling screws.

    If you’re using a Z-minimum platform height sensor, now’s the time to adjust the switch touch-off height to make the thread thickness come out right.

    When the thread thickness comes out right, then the width should match the extrusion settings: the bottom layer will be exactly like all the others. That’s the ideal situation, anyway.

    A thickness snap gauge comes in handy for this sort of thing.

    The OpenSCAD source code:

    // Platform Level test pattern
    // Ed Nisley KE4ZNU - Dec 2011
    
    //-------
    //- Extrusion parameters must match reality!
    
    ThreadThick = 0.25;
    ThreadWidth = 2.0 * ThreadThick;
    
    //-------
    // Dimensions
    
    BoxSize = 80;
    
    //-------
    
    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);
    }
    
    //-------
    
    ShowPegGrid();
    
    for (Index=[0:3])
      rotate(Index*90)
        translate([0,BoxSize/2,ThreadThick/2])
          cube([BoxSize,2*ThreadWidth,ThreadThick],center=true);
    
    for (Index=[-1,1])
      rotate(Index*45)
        translate([0,0,ThreadThick/2])
          cube([sqrt(2)*BoxSize,2*ThreadWidth,ThreadThick],center=true);
    
    translate([BoxSize/2,0,ThreadThick/2])
      cube([BoxSize/6,2*ThreadWidth,ThreadThick],center=true);
    
    translate([0,BoxSize/2,ThreadThick/2])
      rotate(90)
        cube([BoxSize/6,2*ThreadWidth,ThreadThick],center=true);
    
  • Windows XP Restoration

    Although Thanksgiving is Update Your Parents’ Browser Day, I ended up rebuilding their old Dell Dimension 2350 PC over their New Year visit: it had succumbed to a nasty case of bit rot. It may have had the odd malware infestation, although booting with the invaluable System Rescue CD and unleashing a ClamAV scan didn’t turn up anything exciting.

    I had full partition backups from August 2010, so I set up a new hard drive (well, an old drive from my heap, but new to them) with the restored partitions before they arrived, swapped it into the PC, then attempted to boot the Windows Recovery Console from their Windows CD to restore the MBR. Alas, I didn’t set the Dell Utility partition to type DE, thus throwing off the drive letter sequence, and the subsequent thrashing (including a steel-cage death match with fixboot and chkdsk) wrecked the Windows partition.

    Figuring that situation out from a simple NTLDR missing boot message took a while.

    But after restoring the partition again and doing the WRC dance, we had a perfectly serviceable Windows XP installation that inhaled a year’s worth of Windows updates in a surprisingly short process that required only a single (!) reboot. I tossed a bunch of obsolete & unused software over the side, emptied the Recycle bin, manually deleted a bunch of files in the various temporary directories, updated Firefox, installed LibreOffice, imported the Outlook Express address book from the rotted drive, did not import the email messages, and away they drove.

    I had suggested it was time for a new PC, but … maybe next time.

    Notes:

    • My USB-to-SATA adapter cable injected occasional read errors (which partimage caught), but a klunky drop-in-the-slot vertical desktop adapter worked OK.
    • A CHKDSK fixed one or more files message doesn’t really prepare you for the discovery that it obliterated the entire directory structure and left a vacant drive behind.
    • The PC had 512 MB of DDR RAM in two 256 MB sticks. I swapped in a 512 MB stick (harvested from an old PC on its way to the recycler) and, as you’d expect, 768 MB of RAM dramatically improved the poor thing’s attitude.
    • System Rescue CD is invaluable for this sort of thing.
    • What is it with Firefox being stuck at V3 forever, then ratcheting instantly to V9? Version envy?
  • Kitchen Countertop Splice

    When we rearranged the kitchen after installing the laminate flooring, I conjured up a countertop to replace the ancient one over a cabinet left standing in one end of the kitchen where the new refrigerator didn’t fit. This was a temporary measure until we built an additional cabinet adjacent to the old one and laid a single countertop over the whole affair. Having several short lengths of generic gray countertop left over from the Black Bathroom, laundry, and the other side of the kitchen, I butt-glued two hunks together with a small block of wood underneath as a support.

    Time passes, we never did get around to building the other cabinet, and eventually the weight of the microwave and mixer bowed the poorly supported joint until it broke free and deposited the mixer on the floor.

    Both pieces being bowed, I screwed some angle bracket underneath to straighten them out, clamped them together, laid a piece of tape over the joint, and match-marked the dowel locations:

    Countertop - match-marked joint
    Countertop – match-marked joint

    Drilled holes for 1/4 dowel pins that I sliced off a length of aluminum rod (no sissy wood pins for me!):

    Countertop - dowel hole jig
    Countertop – dowel hole jig

    Slobbered epoxy over the pins with enough into the holes for good adhesion, then buttered up the joint to fill the voids:

    Countertop - underside braces and joint
    Countertop – underside braces and joint

    Put more tape over the countertop, sliced out the gap, and buttered up the top surface to fill the joint:

    Countertop - filling joint
    Countertop – filling joint

    That works because JB Industro-Weld Epoxy turns out to be a nearly perfect color match:

    Countertop - final joint
    Countertop – final joint

    Those angle brackets remain in place underneath the surface in the hope they’ll prevent it from bowing again. An aluminum strip (not yet installed in these pix) fills the recess below the backsplash to level it with the underside of the countertop, providing more support over the back of the cabinet case.

    The whole affair took a few days, what with curing successive epoxy applications overnight. Got to use some tools that don’t often see the light of day, too, which is always good fun.

    Maybe we’ll build that other cabinet some day…

  • Thing-O-Matic: Improved EC Thermistor Connector Orientation

    Given that the SMD pads fell off the HBP circuit board and I must replace the connector, I figured I may as well also replace the remarkably stiff MBI thermistor cable with a much more flexible CD-ROM audio cable. Although the EC end of the MBI cable looks like a standard CD-ROM audio connector, it’s been rewired. No problem: this is not an audio application and I’m going to do exactly the same thing.

    The Extruder Controller, however, doesn’t have a matching connector and the recommended attachment involves simply jamming the connector onto the pin header, per this detail cropped from that photo in the MBI assembly instructions:

    MBI EC HBP Thermistor Connector Alignment - Detail
    MBI EC HBP Thermistor Connector Alignment – Detail

    Here’s a better closeup of my EC, taken from the other side:

    MBI Extruder Controller - HBP thermistor connector
    MBI Extruder Controller – HBP thermistor connector

    The header block breaks out the Arduino’s Analog Input pins, with A6 in the front of that photo. From left to right, the pins under the HBP connector are A6 / +5 V / Gnd. Unfortunately, the connector wiring and alignment puts the thermistor signal on the cable shield, with the Gnd and +5 V wires safely tucked inside. This is, shall we say, suboptimal.

    The Gnd connection provides a low-impedance connection to the least-noisy part of the circuit, so putting it on the shield tends to prevent the relatively high-impedance signals within from picking up noise. This isn’t always successful, for a number of reasons, but it’s a Good Idea.

    Although probably doesn’t make much difference (it’d just add a bit of noise to the HBP temperature signal), but if I’m going to be rewiring it anyway, the cable shield will be at ground potential with the signal  wire inside. Here’s my cable & connector, rearranged to make that so:

    EC HBP thermistor connector - revised
    EC HBP thermistor connector – revised

    The analog audio connector on the back of old-school CD-ROM drives, back before digital audio output from the drives actually worked, had four pins:

    • Left (white) and Right (red) audio channels on the outer pair
    • Ground (black) on at least one of the central pair

    So the red wire will be in the far right-hand socket of the connector shell; depress its locking tab, slide it out of the shell, poke it into the socket between the other two wires, push to click, and you’re set. Conveniently, this puts the +5 V supply on the red wire, which is sorta-kinda standard. Your cable colors may vary; pay attention to the actual wiring and ignore the color code!

    Tape the connector in place (with the empty socket now toward the board edge) to prevent the tangle of wires in the Thing-O-Matic’s electronics bay from dislodging it at an inopportune moment:

    EC HBP thermistor connector - secured
    EC HBP thermistor connector – secured

    Admittedly, that arrangement still tucks the +5V wire right next to the signal wire inside the shield, but it’s a step in the right direction.

    You could flip the MBI cable around, too, as long as you also rearranged the pins at the HBP end to match.

  • Thing-O-Matic: HBP Connector Failure

    This has been a long time coming, as the connector shell over that pin connecting the MOSFET to the heater has been getting crispier despite my attention, cleaning, and occasional DeoxIT application.

    Burned-out HBP connector
    Burned-out HBP connector

    Notice that the burned pin now stands at a slight angle to the others. The PCB pad has no additional copper traces on that side to conduct the heat away from the failing connection, so the joint got hot enough to put the solder into its semi-liquid state, whereupon the springy connector rammed it upwards through the softened plastic shell. If the PCB fab shop used 60-40 lead solder, that’s around 188 °C. Silver solder would reach 220-ish °C. If the solder was eutectic, it would turn liquid and just drip off.

    What doesn’t show: the SMD pads that pulled free from the PCB surface, fortunately only under the rightmost three pins leading to the thermistor. Repairing the pads and connector makes no sense, so I think I’ll go with pigtail leads anchored to the plywood, with offboard connectors to reduce the strain on those pads. Powerpoles will be bulky, but maybe pigtails long enough to get them onto the case might work.

    As a general rule, soldering wires or connectors to SMD pads with no mechanical support is a Bad Idea and applying repeated mechanical stress to those connectors is a Very Bad Idea. Doing all that on a PCB running well over 100 °C with current right up near the connector’s absolute maximum, well…

  • Extruder Speed Control Puzzle

    The Retraction speed in the Skeinforge Dimension plugin sets the E axis speed while it’s inhaling molten filament at the end of each thread and exhaling it at the start of the next thread. For a Retraction speed of 60 mm/s = 3600 mm/min and a Retraction Distance of 2 mm, the G-Code at the very start of the Skirt thread looks like this:

    G1 F3600.0
    G1 E2.0
    

    So far, so good; that, I can understand. The extruder spins at a pretty good clip, but only while moving 2 mm of filament.

    The Dimension plugin doc explains the settings for its parameters, but isn’t forthcoming on the subject of what to use for the Flow rate in the Speed plugin. The Speed plugin doc doesn’t help much; it seems the Flow rate uses either PWM or mm/s, depending on something imponderable. Per that discussion, you should apparently set both Feed and Flow to the same value (in mm/s), which I have done. Given that G-Code has only one speed setting for coordinated motion, that seems reasonable.

    For a Feed speed of 60 mm/s = 3600 mm/s (which may seem aggressive, but that’s what acceleration limiting enables), the G-Code at the start of the second layer looks like this:

    G1 X-3.5302 Y-26.3671 Z0.5 F3600.0 E141.3026
    G1 X2.7622 Y-22.7342 Z0.5 F3600.0 E141.4484
    G1 X9.0546 Y-26.3671 Z0.5 F3600.0 E141.5941
    

    However, that seems to mean the extruder rams filament into the hot end at 3600 mm/min = 60 mm/s, which simply isn’t what’s going on. The pinch wheel / gear / whatever turns at maybe 2 rev/min, which corresponds to about 60 mm/min: roughly 1/60 the speed indicated by the F3600.0 parameter.

    The SJFW M201 parameter was set to E60, which should set 60 mm/min as the minimum speed. But Skeinforge doesn’t know anything about the firmware’s internal minimum (or maximum!) speed limits.

    So I tried a few manual variations with the extruder heated up, feeding in commands like G1 E10 Fnn, with various nn values for the F speed, while measuring the elapsed time. If F sets the extruder speed in mm/min, then the time to extrude 10 mm of filament should vary inversely with the speed. Some results:

    • F240 → 10 s
    • F360 → 10 s
    • F400 → 11 s
    • F450 → 1 s
    • F480 → 1 s

    Huh. Now that, I do not understand.

    Setting M201 E120, which should double the minimum speed, produces these reasonable results:

    • F1 → 10 s
    • F2 → 7 s
    • F3 → 6 s
    • F4 → 3 s
    • F5 → stalls because the extruder can’t maintain that pace

    The first line seems to indicate that extruding 10 mm of filament at 1 mm/min requires 10 seconds, which is off by a neat factor of 1/60. The ratio of the lines is more-or-less right, as long as you allow more measurement windage than seems appropriate and ignore the gross overall speed mismatch. The difference between the two sequences is not the ratio of the two M201 settings, however.

    I have the extruder set to accelerate at 250 mm/s2, which implies it can reach 120 mm/min = 2 mm/s in 0.008 mm, which is basically instantly. Relevant equation: x = v2/2a.

    Given the incoming filament diameter and the outgoing extrusion thread dimensions, Skeinforge knows their cross-sectional areas.  Multiplying the extrusion thread’s cross-section area by the Pythagorean XY distance for a segment gives the extrusion volume, dividing that by the filament cross-section area gives the incoming filament length, and dividing that by the Filament Packing Density fudges the answer to come out right.

    From the coordinates in the first two lines of G-Code we have:

    • XY distance = 7.27 mm
    • extrusion distance = 0.15 mm

    Given the corresponding extrusion settings:

    • 0.25 mm layer height and 0.50 mm width = 0.125 mm2
    • 2.89 mm filament dia = 6.56 mm2
    • FPD=0.95

    The incoming distance works out to (0.125 * 7.27 / 6.56) / 0.95 = 0.15 mm, which is dead on the G-Code value. So I understand the volume part, at least.

    At the Feed rate of 60 mm/s, the extruder covers the XY distance in 7.27 / 60 = 0.12 s. The extruder must consume 0.15 mm of filament in that same time, which works out to 0.15 / 0.12 = 1.2 mm/s = 72 mm/min.

    Obviously, the extruder filament drive is not running at the F3600.0 value set by the G-Code, nor is it running at 1/60 that speed.

    I have not the foggiest idea what’s going on in there, but … it seems to work. Equally obviously, because Skeinforge doesn’t know which firmware I’m using, all the firmware usable with Dimension behaves the same way.

    One possibility: perhaps the E axis (definitely not XY and probably not Z) runs in something resembling EMC2’s inverse time mode, wherein the firmware adjusts the speed to complete the move in a fixed time. In this case, the firmware knows both the distance (given by Skeinforge in the E parameter) and the time for the XY move (found by dividing that XY Pythagorean distance by the F parameter), so it can compute the speed required to make the extruder poot out the right amount of plastic in that time, presumably while imposing (trapezoidal?) acceleration limiting along the way.

    That might also account for the weird behavior with M201 E60 shown above: perhaps the firmware uses a stale time left over from the most recent XY motion to compute the speed for a move involving only the E axis. I suppose I could puzzle through the source; it’s rather daunting.

    Anybody have any clues or pointers to the obvious doc I’ve overlooked?