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

  • Improved M2 Heated Build Platform: First Light

    Although the M2’s heated build platform works well enough, somebody who knows what he’s doing (you know who you are: thanks!) sent me an improved version. It’s a PCB heater, laid out to compensate for the usual edge cooling, firmly attached to a tempered glass plate with genuine 3M thermally conductive tape:

    Improved M2 HBP - test setup
    Improved M2 HBP – test setup

    They designed the heater around the 30 VDC power supply used in their other equipment. Although I had high moderate hopes that a boost power supply would convert the 24 V supply I already had for the stepper driver bricks into the 30 V for the heater, it was not to be. So there’s a 36 V 9.7 A 350 W supply arcing around the planet that (I think) should work better: adjust the voltage down as far as it’ll go, soak up another few volts in the solid-state relay, and Things Should Be Close Enough to 30 V. One can buy a genuine 30 V supply, but it costs surprisingly more than either 24 V or 36 V supplies on the surplus / eBay market and won’t really provide the proper voltage without upward tweaking anyway.

    I replaced their standard 0.156 inch square terminals with Anderson Powerpoles, soldered a length of shielded cable to the 100 kΩ thermistor pads, and gimmicked up a connection to the 24 V supply; it delivered 23.7 V at the PCB terminals. The thermistor is 100 kΩ at 25 °C and 11.4 kΩ at 77 °C. The PCB heater is 5.9 Ω at 25 °C and 7.3 Ω at 77 °C; it dissipates 77 W at 77 °C (no, that’s not a typo).

    The ultimate temperature looks to be about 90 °C with a 24 V supply, which isn’t quite enough for ABS (which I’m not using in the M2 right now, but probably will eventually). The time constant, assuming the 1-e-1 point is 66 °C, works out to about 9 minutes; it’ll be up to final temperature in half an hour. Those numbers aren’t quite as accurate as one might wish, because the heater power drops as the temperature rises and the copper resistance increases.

    A 30 V supply would dissipate 120 W at 77 °C and rumor has it that the ultimate temperature is around 125 °C, which would be fine for ABS. Goosing the power a bit would produce more heat, but I’v been running the Thing-O-Matic at 110 °C and that’s good enough. More power, of course, gets it to the temperature setpoint faster, which is probably a Very Good Thing.

    Obviously, you need PWM to control the temperature; given a 9 minute time constant, a bang-bang controller will work perfectly well.

    The original data, including the thermistor resistance after I got my act together, plus a cute little temperature-vs-time graph:

    Improved M2 HBP - 24 V supply
    Improved M2 HBP – 24 V supply

    The colored flyspecks are part of the paper; I salvaged a stack of fancy menu cards from a trash can and padded them up as geek scratch paper.

  • Baofeng UV-5RE: BL-5 Battery Overview

    After I mentioned I was thinking of repurposing the nearly unused lithium-ion batteries from the Wouxun KG-UV3D radios for a blinky light, Dragorn of Kismet introduced me to his Baofeng UV-5 radio. The radio itself seems to be the worst amateur radio you’d be willing to use, but when seen as a standardized battery and drop-in charger with a free radio and antenna tossed into the deal, it’s not all that bad:

    Baofeng UV-5RE radio - overview
    Baofeng UV-5RE radio – overview

    The Wouxun and Baofeng 7.4 V batteries allegedly have similar capacities: 1700 vs 1800 mA·h. The Baofeng also has a 3800 (or 3600) mA·h pack that extends well below the base of the radio (not all large packs seem to be compatible with the UV-5RE radios I got); that would be roughly equivalent to the larger packs that power the Wouxun / APRS / voice gadgetry on the bike.

    The Baofeng battery pack is smaller and has features that seem less likely to misbehave on a bike.

    It has a latching tab with a ramp and a positive notch, with ridges around the edge that engage the radio shell:

    Baofeng UV-5RE radio - battery latch tab
    Baofeng UV-5RE radio – battery latch tab

    The radio body (which is what I must duplicate) has a movable latch tab above the battery contact pins, so the latch holds the battery into the compartment. The spring-loaded pin pairs are wired in parallel, presumably for redundant contact with each battery terminal:

    Baofeng UV-5RE radio - battery compartment latch and contacts
    Baofeng UV-5RE radio – battery compartment latch and contacts

    The battery terminal pads are reasonably well protected by the tab:

    Baofeng UV-5RE radio - battery contact pads
    Baofeng UV-5RE radio – battery contact pads

    The battery slides into the radio compartment and latches with a snap. Two holes on the battery base engage a pair of pegs on the radio case:

    Baofeng UV-5RE radio - battery base detail
    Baofeng UV-5RE radio – battery base detail

    The holes are rounded rectangles and the pegs have one corner sliced off. The pegs seem entirely too fragile and not well suited for 3D printing, so some metalwork may be in order. The pegs must resist only pulling forces perpendicular to the case back, not sliding forces, and the case constrains side-to-side motion.

    The two square posts (with two others not shown) form the “feet” that support the radio when it’s standing on the desk or in the charger.

    Now, to doodle up the dimensions and measure the actual capacity.

    Speaking of capacity, BL-5 batteries on eBay range from $23 for “genuine Baofeng” that may or may not actually have that name on the label, all the way down to $8 for the usual no-name equivalent.

  • Monthly Science: Basement Safe Silica Gel Equilibria

    A month ago I tossed a new bag of silica gel into the basement safe and put the used one on the workbench to see how much more water it would adsorb. The numbers worked out like this:

    • Bag + staples: about 8 g
    • Dry weight: 500 g of silica gel beads
    • At 24%RH: 575 g = +67 g water
    • At basement ambient, about 50%RH: 652 g = +144 g water
    • At upstairs ambient, about 65%RH: 673 g = +165 g water

    Referring to the Sorbent Systems charts

    At 50%RH, the capacity is about 27% = 135 g of water, which is close to the measured 144 g. The logger recording groundwater temperature says the average humidity hovers just under 55%RH, in which case 28% capacity = 140 g of water: as close as you could possibly hope for.

    At 65%RH, the capacity is about 32% = 160 g of water, which is very close to the measured 165 g.

    The safe humidity remains flatlined at the logger’s 15%RH minimum level, with one blip when I installed the door gasket strips:

    Basement_Safe - 2013-08-28
    Basement_Safe – 2013-08-28

    After I accumulate a few more used bags, we’ll see how well they regenerate.

  • Tour Easy: Another Kickstand Plate

    I managed to lose another kickstand platesooo

    Kickstand plate
    Kickstand plate

    The horrible paint crazing came from “priming” the bare plywood scrap (yes, that’s a stray hole from its previous life) with a specialty white paint intended for plastic lawn furniture; it apparently gets along poorly with the forget-me-not fluorescent red topcoat. Doesn’t matter in this application and uses up more of both rattlecans, so it’s all good.

    Of course, after tucking it in the bike’s underseat bag, I spotted the lost plate along the DCRT: now I have a spare!

  • Creating a Curvelicious Cookie Cutter

    So, for reasons I need not go into, I needed an OpenSCAD solid model of a custom cookie cutter produced on an Afinia 3D printer from a Trimble Sketchup model:

    Afinia Robot Cutter - on raft
    Afinia Robot Cutter – on raft

    The cutter is still attached to the raft that, it seems, is required for passable results on the Afinia’s platform.

    Having already figured out how to wrap a cutter around a shape, the most straightforward procedure starts by extracting the cutter’s shape. So, lay the cutter face down on the scanner and pull an image into GIMP:

    Afinia Robot - scan
    Afinia Robot – scan

    Blow out the contrast to eliminate the background clutter, then posterize to eliminate shadings:

    Afinia Robot - scan enhanced
    Afinia Robot – scan enhanced

    Select the black interior region, grow the selection by a pixel or two, then shrink it back to eliminate (most of) the edge granularity, plunk it into a new image, and fill with black:

    Afinia Robot - scan filled
    Afinia Robot – scan filled

    Now the magic happens…

    Import the bitmap image into Inkscape. In principle, you can auto-trace the bitmap outline and clean it up manually, but a few iterations of that convinced me that it wasn’t worth the effort. Instead, I used Inkscape’s Bézier Curve tool to drop nodes (a.k.a. control points) at all the inflection points around the image, then warped the curves to match the outline:

    Afinia Robot - Bezier spline fitting
    Afinia Robot – Bezier spline fitting

    If you’re doing that by hand, you could start with the original scanned image, but the auto-trace function works best with a high-contrast image and, after you give up on auto-tracing, you’ll find it’s easier to hand-trace a high-contrast image.

    Anyhow, the end result of all that is a smooth path around the outline of the shape, without all the gritty details of the pixelated version. Save it as an Inkscape SVG file for later reference.

    OpenSCAD can import a painfully limited subset of DXF files that, it seems, the most recent versions of Inkscape cannot produce (that formerly helpful tutorial being long out of date). Instead, I exported (using “Save as”) the path from Inkscape to an Encapsulated Postscript file (this is a PNG, as WordPress doesn’t show EPS files):

    Afinia Robot - Bezier Curves.eps
    Afinia Robot – Bezier Curves.eps

    It’s not clear what the EPS file contains; I think it’s just a list of points around the path that doesn’t include the smooth Bézier goodness. That may account for the grittiness of the next step, wherein the pstoedit utility converts the EPS file into a usable DXF file:

    pstoedit dxf:-polyaslines Afinia\ Robot\ -\ Bezier\ Curves.eps Afinia\ Robot\ -\ outline.dxf
    

    Unfortunately, either the EPS file doesn’t have enough points on each curve or pstoedit automatically sets the number of points and doesn’t provide an override: contrary to what you (well, I) might think, the -splineprecision option doesn’t apply to whatever is in the EPS file. In any event, the resulting DXF file has rather low-res curves, but they were good enough for my purposes and OpenSCAD inhaled the DXF and emitted a suitable STL file:

    Afinia Robot - shape slab
    Afinia Robot – shape slab

    To do that, you set the Layout variable to “Slab”, compile the model, and export the STL.

    Being interested only in the process and its results, not actually cutting and baking cookies, I tweaked the OpenSCAD parameters to produce stumpy “cutters”:

    Afinia Robot - solid model
    Afinia Robot – solid model

    You do that by setting the Layout variable to “Build”, compile the model, and export yet another STL. In the past, this seemed to be a less fragile route than directly importing and converting the DXF at each stage, but that may not be relevant these days. In any event, having an STL model of the cookie may be useful in other contexts, so it’s not entirely wasted effort.

    Run the STL through Slic3r to get the G-Code as usual.

    The resulting model printed in about 20 minutes apiece on the M2:

    Robot Cutter - stumpy version
    Robot Cutter – stumpy version

    As it turns out, the fact that the M2 can produce ready-to-use cutters, minus the raft, is a strong selling point.

    Given a workable model, the next step was to figure out the smallest possible two-thread-wide cutter blade, then run variations of the Extrusion Factor to see how that affected surface finish. More on that in a while.

    The OpenSCAD source isn’t much changed from the original Tux Cutter; the DXF import required different scale factors:

    // Robot cookie cutter using Minkowski sum
    // Ed Nisley KE4ZNU - Sept 2011
    // August 2013 adapted from the Tux Cutter
    
    Layout = "Build";				// Build Slab
    
    //- Extrusion parameters - must match reality!
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    MaxSize = 150;				// larger than any possible dimension ...
    
    Protrusion = 0.1;
    
    //- Cookie cutter parameters
    
    Size = 95;
    
    TipHeight = IntegerMultiple(3.0,ThreadThick);
    TipThick = 1.5*ThreadWidth;			// 1.5* = thinnest 2-thread wall, 1.0* thread has gaps
    
    WallHeight = IntegerMultiple(1.0,ThreadThick);
    WallThick = 4.5*ThreadWidth;
    
    LipHeight = IntegerMultiple(1.0,ThreadWidth);
    LipThick = IntegerMultiple(5,ThreadWidth);
    
    //- Wrapper for the shape of your choice
    
    module Shape(Size) {
      Robot(Size);
    }
    
    //- A solid slab of Tux goodness in simple STL format
    // Choose magic values to:
    //		center it in XY
    //		reversed across Y axis (prints with handle on bottom)
    //		bottom on Z=0
    //		make it MaxSize from head to feet
    
    module Tux(Scale) {
      STLscale = 250;
      scale(Scale/STLscale)
    	translate([105,-145,0])
    	  scale([-1,1,24])
    		import(
    		  file = "/mnt/bulkdata/Project Files/Thing-O-Matic/Tux Cookie Cutter/Tux Plate.stl",
    		  convexity=5);
    }
    
    module Robot(Scale) {
        STLscale = 100.0;
        scale(Scale / STLscale)
    			scale([-1,1,10])
    				import("/mnt/bulkdata/Project Files/Thing-O-Matic/Pinkie/M2 Challenge/Afinia Robot.stl",
    					convexity=10);
    }
    
    //- Given a Shape(), return enlarged slab of given thickness
    
    module EnlargeSlab(Scale, WallThick, SlabThick) {
    
    	intersection() {
    	  translate([0,0,SlabThick/2])
    		cube([MaxSize,MaxSize,SlabThick],center=true);
    	  minkowski(convexity=5) {
    		Shape(Scale);
    		cylinder(r=WallThick,h=MaxSize,$fn=16);
    	  }
    	}
    
    }
    
    //- Put peg grid on build surface
    
    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 it
    
    ShowPegGrid();
    
    if (Layout == "Slab")
    	Shape(Size);
    
    if (Layout == "Build")
    	difference() {
    	union() {
    		translate([0,0,(WallHeight + LipHeight - Protrusion)])
    		EnlargeSlab(Size,TipThick,TipHeight + Protrusion);
    		translate([0,0,(LipHeight - Protrusion)])
    		EnlargeSlab(Size,WallThick,(WallHeight + Protrusion));
    		EnlargeSlab(Size,LipThick,LipHeight);
    	}
    	Shape(Size);					// punch out cookie hole
    	}
    
  • Basement Safe: Foam Door Seal

    A bit of rummaging in the Big Box o’ Weatherstripping produced the stub end of a spool bearing 1/4 x 1/8 foam tape that exactly fills the gap between the Basement Safe’s door and liner:

    Basement Safe - Foam door seal - latch side
    Basement Safe – Foam door seal – latch side

    The hinge side of the door has tape between the door liner and the safe wall, because that closes in compression rather than shear:

    Basement Safe - Foam door seal - hinge side
    Basement Safe – Foam door seal – hinge side

    There should be a big bump in the humidity record marking that installation, but I don’t expect any immediate difference. If the silica gel lasts more than two months, I’ll consider it a win.

  • Arduino Pro Mini Pin Coordinates

    Arduino Pro Mini - top
    Arduino Pro Mini – top

    Measured from the Official PCB Layout, with the board origin at the lower-left corner of the PCB, down there by the D9 pin, in mils (0.001 inch):

    • D9 = (50,50)
    • D10 = (650,50)
    • A5 = (535,805)
    • A4 = (535,705)
    • A7 = (535,393)
    • A6 = (535,293)
    • FTDI header = (100,1250) to (600,1250)
    • Reset button = (350,105)
    • D13 LED = (540,100)
    • PWR LED = (350,850)
    • Upper fiducial = (160,1140)
    • Lower fiducial = (490,100)

    Subtract 50 mils from each of those coordinates to put the origin at the middle of the D9 pin, which may be more useful. Doing that in inches produces:

    • D9 = (0.000,0.000)
    • D10 = (0.600,0.000)
    • A5 = (0.485,0.755)
    • A4 = (0.485,0.655)
    • A7 = (0.485,0.343)
    • A6 = (0.485,0.243)
    • FTDI header = (0.050,1.200) to (0.550,1.200)
    • Reset button = (0.300,0.055)
    • D13 LED = (0.490,0.050)
    • PWR LED = (0.300,0.800)
    • Upper fiducial = (0.110,1.090)
    • Lower fiducial = (0.440,0.050)

    Trust, but verify…

    Yes, this is a knockoff PCB from the usual eBay vendor, not from Sparkfun. Contents may settle during shipment. Enlarged to show texture. Your mileage may vary. No warranty, either express or implied, no lie. Do not eat.