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

  • MakerGear M2: PETG Motor Mount

    The M2’s extruder motor mounts in a printed holder that attaches to the X-axis linear rail. The wire guide on the original holder snapped when I installed it, with the fractured end showing poor infill and bonding, but the rest of the mount held together and, my initial misgivings notwithstanding, I never had much motivation to print a replacement. With the PETG settings working pretty well, I fetched the updated STL file, oriented it for printing, and ran off a motor mount:

    M2 Motor Mount - PETG on platform
    M2 Motor Mount – PETG on platform

    That’s at 40% 3D Honeycomb infill, three perimeters and three top/bottom layers, which seems plenty strong enough for the purpose: I can’t bend the wire guide at all, no how, no way!

    Despite a few hairs, the nozzle didn’t deposit any boogers. Things are looking up…

    A cap should fit over the cable guide, presumably for neatness, but I didn’t see much point in that. Instead, I added a steel rod to support the loom and provide some strain relief beyond the end of the guide, as the wires want to flex at that spot:

    M2 Motor Mount - PETG installed - cable brace
    M2 Motor Mount – PETG installed – cable brace

    Because the V4 hot end mounts to that aluminum plate, rather than the filament drive, the whole operation didn’t disturb the nozzle position at all. Whew!

  • Sienna Hood Rod Pivot: PETG Edition

    Our Larval Engineer reports that the PLA pivot for the Sienna’s hood rod didn’t survive contact with the van’s NYS Inspection. I’m not surprised, as PLA tends to be brittle and the inspection happened on a typical February day in upstate New York. Seeing as how PETG claims to be stronger and more durable than PLA, I ran off some replacements:

    Toyota Sienna hood rod pivot - small - PETG
    Toyota Sienna hood rod pivot – small – PETG

    The square cap fit snugly over the bottom of the post; PETG tolerances seem pretty much the same as for PLA.

    A slightly larger loop may be more durable, so I changed one parameter in the OpenSCAD code to get this:

    Toyota Sienna Hood Rod Pivot - up-armored - solid model
    Toyota Sienna Hood Rod Pivot – up-armored – solid model

    Which printed just like you’d expect:

    Toyota Sienna hood rod pivot - large - PETG hairs
    Toyota Sienna hood rod pivot – large – PETG hairs

    Despite the hairs stretching between each part, the nozzle didn’t deposit any boogers during the print. The top and bottom use Hilbert Curve infill, which looks pretty and keeps the nozzle from zipping back and forth quite so much; perhaps that’s a step in the right direction.

    Tapping the holes for 6-32 stainless machines screws went easily enough:

    Toyota Sienna hood rod pivot - PETG - assembled
    Toyota Sienna hood rod pivot – PETG – assembled

    She gets one of each and I keep the others for show-n-tell sessions.

    The OpenSCAD source code, which differs from the original by a constant or two:

    // Sienna Hood Rod Pivot
    // Ed Nisley KE4ZNU November 2013
    
    //- Extrusion parameters must match reality!
    //  Print with 2 shells and 3 solid layers
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;
    
    Protrusion = 0.1;			// make holes end cleanly
    
    inch = 25.4;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    //----------------------
    // Dimensions
    
    ShellOD = 20.0;
    ShellID = 8.75;
    ShellLength = 10.0;
    
    TaperLength = 1.5;
    TaperID = 11.4;
    
    BaseWidth = 20.0;
    BaseThick = 3.0;
    
    PegSide = 9.5;					// mounting peg through sheet metal
    PegLength = 7.0;
    PegCornerTrim = 0.75;
    PegHoleOD = 0.107*inch;			//  6-32 tap hole
    
    PegTrimSide = sqrt(2)*PegSide - PegCornerTrim;
    
    ClampWall = 3.0;				// clamping cap under sheet metal
    ClampHoleOD = 0.150*inch;		//  6-32 clearance hole
    ClampCap = 3.0;					// solid end thickness
    
    PanelThick = 2.0;				// sheet metal under hood
    
    NumSides = 6*4;
    
    //----------------------
    // Useful routines
    
    module PolyCyl(Dia,Height,ForceSides=0) {			// based on nophead's polyholes
    
      Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
    
      FixDia = Dia / cos(180/Sides);
    
      cylinder(r=(FixDia + HoleWindage)/2,
               h=Height,
    	   $fn=Sides);
    }
    
    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);
    
    }
    
    //----------------------
    // Build it
    
    //ShowPegGrid();
    
    // pivot
    
    translate([-ShellOD,0,0])
    	difference() {
    		union() {
    			cylinder(r=ShellOD/2,h=ShellLength,$fn=NumSides);		// housing
    			translate([-ShellOD/2,0,0])								// filler
    				cube([ShellOD,(ShellOD/2 + BaseThick),ShellLength],center=false);
    			translate([0,(ShellOD/2 + BaseThick/2),ShellLength/2])	// foot
    				cube([BaseWidth,BaseThick,ShellLength],center=true);
    
    			translate([0,											// peg
    						(ShellOD/2 + PegLength/2 + BaseThick - Protrusion),
    						PegSide/2])
    				intersection() {
    					cube([PegSide,(PegLength + Protrusion),PegSide],center=true);
    					rotate([0,45,0])
    						cube([PegTrimSide,2*PegLength,PegTrimSide],center=true);
    				}
    		}
    
    		PolyCyl(ShellID,ShellLength,NumSides);		// central hole
    
    		translate([0,0,-Protrusion])				// end bevels
    			cylinder(r1=TaperID/2,r2=ShellID/2,h=(TaperLength + Protrusion),$fn=NumSides);
    		translate([0,0,(ShellLength + Protrusion)])
    			rotate([180,0,0])
    				cylinder(r1=TaperID/2,r2=ShellID/2,h=(TaperLength + Protrusion),$fn=NumSides);
    
    		translate([0,0,PegSide/2])					// screw tap hole
    			rotate([-90,0,0])
    				PolyCyl(PegHoleOD,(ShellOD + BaseThick + PegLength),6);
    
    	}
    
    // anchor cap
    
    translate([2*PegSide,0,0])
    	difference() {
    		translate([0,0,(PegLength + ClampCap)/2])					// overall shape
    			cube([(PegSide + ClampWall),(PegSide + ClampWall),(PegLength + ClampCap)],center=true);
    		translate([0,0,(PegLength/2 + ClampCap + Protrusion)])		// peg cutout
    			cube([(PegSide + ThreadWidth),(PegSide + ThreadWidth),(PegLength + Protrusion)],center=true);
    		translate([0,0,-Protrusion])								// screw clearance
    				PolyCyl(ClampHoleOD,2*PegLength,6);
    	}
    
  • Build Platform Chisel Handle

    My father used a little chisel for some unknown purpose while he was an instrument repair tech at Olmstead AFB during the mid-60s. Its homebrew wood handle eventually disintegrated and I made a quick-and-truly-dirty replacement from epoxy putty and heatshrink tubing, promising that I’d eventually do better.

    Seeing as how I use it to pop objects off the M2’s build platform and being in need of a tall, skinny object to see how PETG works with towers, that chisel now has a nice magenta handle:

    Platform Chisel - PETG handle
    Platform Chisel – PETG handle

    Well, OK, it may not be the prettiest handle you’ve ever seen, but it’s much better than an epoxy turd, as measured along several axes.

    Incidentally, epoxy putty bonds to clean steel like there’s no tomorrow. I had to file the last remaining chunks off and sandpaper the residue down to clean steel again.

    The solid model shows it in build-a-tower mode:

    Chisel Handle - solid model
    Chisel Handle – solid model

    I think at least one rounded end would improve its appearance. Two rounded ends would make it un-printable in that orientation, although a low-vertex polygonal approximation might have enough of a flat bottom to suffice. Given how long it took me to replace the epoxy, that could take a while.

    The central slot fits snugly around the handle, requiring persuasion from a plastic mallet to set in in position.

    Once again, the nozzle shed a small brown PETG booger after the first few layers:

    PETG Chisel Handle - oxidized plastic
    PETG Chisel Handle – oxidized plastic

    I’m beginning to think PETG infill needs more attention than I’ve been giving it: that’s 15% 3D Honeycomb combined over three layers.

    The OpenSCAD source code:

    // Chisel Handle
    // Ed Nisley KE4ZNU - March 2015
    
    Layout = "Show";			// Show Build
    
    //-------
    //- Extrusion parameters must match reality!
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;
    
    Protrusion = 0.1; 				// make holes end cleanly
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    //-------
    // Dimensions
    
    Shank = [16.0,2.4,59];			// width, thickness, length to arched end
    
    BladeWidth = 27.0;
    
    HandleSides = 8;
    
    //-------
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      RangeX = floor(95 / Space);
      RangeY = floor(125 / Space);
    
    	for (x=[-RangeX:RangeX])
    	  for (y=[-RangeY:RangeY])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    module PolyCyl(Dia,Height,ForceSides=0) {			// based on nophead's polyholes
      Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
      FixDia = Dia / cos(180/Sides);
      cylinder(r=(FixDia + HoleWindage)/2,h=Height,$fn=Sides);
    }
    
    
    
    module Handle() {
    	difference() {
    		scale([1.0,0.5,1.0])
    			rotate(180/HandleSides)
    				cylinder(d=BladeWidth/cos(180/HandleSides),h=Shank[2],$fn=HandleSides);
    		translate([0,0,Shank[2]/2])
    			cube(Shank + [0,0,2*Protrusion],center=true);
    	}
    }
    
    //-------
    // Build it!
    
    //ShowPegGrid();
    
    if (Layout == "Show") {
    	Handle();
    }
    
    if (Layout == "Build") {
    	translate([0,0,0])
    		rotate([0,0,0])
    			Handle();
    }
    
  • Detergent Cap Holder

    Although chain mail provides a good test of the M2’s setup and slicing parameters, it doesn’t offer much in the way of infill. To test that, I designed a holder for the cap of the bulk laundry detergent container:

    Detergent Cap Holder - in place
    Detergent Cap Holder – in place

    The container must rest on its side, but if you snap the cap back in place, detergent will ooze out between the cap and the container and drip on whatever’s below. The never-sufficiently-to-be-damned Whirlpool high-efficiency front loading washer vibrates like crazy during the spin cycle, shaking anything from its top to the floor. The cap must sit in a cup to catch the inevitable ooze down its side, the wire shelf already has a bunch of other crap on it, and I needed a bulky test object, soooo ….

    We regard that detergent container and its cap as a botched design.

    Anyhow.

    The holder has pair of holes in its back surface for the copper (!) hangers:

    Detergent Cap Holder - solid model - rear
    Detergent Cap Holder – solid model – rear

    I stripped a length of 10 AWG wire, straightened & annealed it, bent up a pair of hooks, then hammered them just flat enough to work-harden the copper, and they were all good.

    Printing that massive block with 20% infill showed that the nozzle collected enough PETG during the first few layers to leave a substantial booger behind:

    Detergent cup holder - oxidized PETG
    Detergent cup holder – oxidized PETG

    Fortunately, that was the only one and it ended up on the inside, tucked out of sight.

    The PETG deposit on the outside of the nozzle gradually darkens from the original magenta to brown, which I’m pretty sure means that it’s oxidizing / decomposing / going bad. There’s no obvious way to remove the booger during the print; I’ve taken to wiping the nozzle after each object, while it’s still hot and the PETG remains flexible.

    Because the nozzle didn’t accumulate any more PETG during the rest of the print, it’s not a constant problem, but I have seen boogers several times so far.

    Perhaps continued refinement of the slicing parameters will help? One can always hope…

    The OpenSCAD source code:

    // Detergent Cap Holder
    // Ed Nisley KE4ZNU - March 2015
    
    Layout = "Show";			// Show Build
    
    //-------
    //- Extrusion parameters must match reality!
    
    ThreadThick = 0.20;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;
    
    Protrusion = 0.1; 				// make holes end cleanly
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    //-------
    // Dimensions
    
    RecessX = 45.0;								// cap recess
    RecessDia = 55.0;
    RecessDepth = 10.0;
    RecessSides = 16*4;
    
    BaseThick = 5.0;							// block thickness below cap
    
    PinDia = 2.5;
    PinLength = 20.0;
    PinOC = 65.0;
    PinInset = 7.0;
    PinZ = BaseThick;
    
    Block = [RecessX,PinOC + 2*PinInset,30.0];	// overall block size (X to cap center)
    
    FairingRadius = Block[2] - RecessDepth - BaseThick;
    
    //-------
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      RangeX = floor(95 / Space);
      RangeY = floor(125 / Space);
    
    	for (x=[-RangeX:RangeX])
    	  for (y=[-RangeY:RangeY])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    module PolyCyl(Dia,Height,ForceSides=0) {			// based on nophead's polyholes
      Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
      FixDia = Dia / cos(180/Sides);
      cylinder(r=(FixDia + HoleWindage)/2,h=Height,$fn=Sides);
    }
    
    module Holder() {
    	difference() {
    		union() {									// main shape
    			translate([-Block[0]/2,0,Block[2]/2])
    			cube(Block,center=true);
    			cylinder(d=Block[1],h=Block[2],$fn=RecessSides);
    		}
    		for (j=[-1,1])								// mounting pin holes
    			translate([-(Block[0] + Protrusion),j*PinOC/2,PinZ])
    				rotate([0,90,0]) rotate(180/6)
    					PolyCyl(PinDia,PinLength + Protrusion,6);
    		translate([0,0,Block[2]])					// fairing arc
    			rotate([90,0,0])
    				cylinder(r=FairingRadius,h=2*Block[1],center=true);
    		translate([Block[0]/2,0,Block[2]/2 + RecessDepth + BaseThick])	// flat top
    			scale([1,2,1])
    				cube(Block,center=true);
    		translate([0,0,BaseThick])
    			cylinder(d1=RecessDia,d2=1.1*RecessDia,h=Block[2]);
    	}
    }
    
    //-------
    // Build it!
    
    //ShowPegGrid();
    
    if (Layout == "Show") {
    	Holder();
    }
    
    if (Layout == "Build") {
    	translate([0,0,0])
    	rotate([0,0,0])
    	Holder();
    }
    
  • MakerGear M2: PETG Chain Mail

    After the initial slicing parameter setup, I ran off several chain mail patches for fine tuning; they test platform adhesion, first layer thickness, bridging, and general quality.

    The first layer started out a bit squashed:

    Chain Mail - PETG on nozzle - platform switch clearance
    Chain Mail – PETG on nozzle – platform switch clearance

    The clearance under that switch lever doesn’t amount to much…

    The patch came out looking pretty good, though:

    Chain Mail - 4-wide - PETG hairs - bridging
    Chain Mail – 4-wide – PETG hairs – bridging

    The small red blob on the right side of the nozzle in the first picture tells a tale: the nozzle tends to pull fine hairs from one perimeter to the next, despite 1 mm of retraction. Fiddling with the retraction on subsequent patches didn’t improve matters.

    Even though the infill isn’t overstuffed, the nozzle tends to collect and redeposit small amounts of PETG as it travels over the surface. Those small blobs turn into fine hairs when the nozzle moves from one island to the next.

    Reducing the bars from six threads to four threads shows that bridging (at 25 mm/s and 0.9 flow rate) seems messier than PLA:

    Chain mail - 4 strand PETG bridging
    Chain mail – 4 strand PETG bridging

    Despite that, all the links came out OK and the sheet was reasonably flexible. After some fiddling with speeds and patterns, these small-link patches popped off the platform easily and were just as flexy as the PLA sheet below them:

    Chain Mail - PETG patches atop PLA patch
    Chain Mail – PETG patches atop PLA patch

    So far, so good.

  • RPi: Static WiFi Addressing

    Having configured ssh on the Raspberry Pi for public keys, the next step is to cut the cord by configuring the USB WiFi dongle to automagically come up with a static IP.

    [Update: As of 2017, set a static IP by tweaking /etc/dhcpcd.conf instead. Search the blog for that to find recent descriptions. ]

    Make /etc/network/interfaces look like this:

    auto lo
    
    iface lo inet loopback
    
    #iface eth0 inet dhcp
    
    auto eth0
    #iface eth0 inet static
    iface eth0 inet manual
     address 192.168.1.209
     gateway 192.168.1.1
     netmask 255.255.255.0
     network 192.168.1.0
     broadcast 192.168.1.255
    
    allow-hotplug wlan0
    
    #iface wlan0 inet manual
    iface wlan0 inet static
     address 192.168.1.9
     gateway 192.168.1.1
     netmask 255.255.255.0
     network 192.168.1.0
     broadcast 192.168.1.255
    
    #wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    
    iface default inet dhcp
    

    Then set up /etc/wpa_supplicant/wpa_supplicant.conf thusly:

    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    
    network={
    	ssid="whatever it might be"
    	psk="choose your own password"
    }
    

    You want different IP addresses for the eth0 and wlan0 devices, because you never know when you’ll be forced to use them at the same time.

    Using wpa-conf rather than wpa-roam prevents the machinery from automagically doing things when you’re not watching.

    The router can hand out IP addresses based on MACs, but that means bottling up all that configuration in a single device that might go toes up. Forcibly configuring each device to a static IP adds a bit of resilience to the network, right up to the point where you must change all of them at once.

    Alas, the router seemed to lose track of the Pi after a day. Pinging from my desktop box reported Destination Host Unreachable, even though signing on through the USB keyboard showed the USB WiFi link (a netis WF2123) was still up. Signing on to the router and refreshing the DHCP list (even though the RPi has a static IP) knocked things loose: suddenly the RPi became pingable.

    It seems the WiFi link turns itself off after a while, which can be averted by tweaking the options:

    sudo nano /etc/modprobe.d/8192cu.conf
    # Disable power saving
    options 8192cu rtw_power_mgnt=0 rtw_enusbss=0
      
    

    The WordPress sourcecode tag seems to turn underscores into blanks [Update: on the last line of a sourcecode block, which I’ve now forced to be a blank line; the options should read rtw_power_mgmt and rtw_enusbss, respectively.

    Anyhow, the rtw_enusbss option prevents the USB interface from going down. It was already zero in the default configuration, but I presume there’s no harm in clearing it again.

  • LED Bulb in High-Vibration Environment

    The garage door opener just ate another rough-duty bulb, so let’s see how a $7 LED bulb fares:

    Walmart 60 W LED Bulb - garage door opener
    Walmart 60 W LED Bulb – garage door opener

    It has no external heatsink fins and the color temperature looks just like the old-school incandescent bulb it’s replacing, so they’re getting a clue about what’s acceptable to ordinary folks.

    That’s equivalent to a 60 W incandescent bulb, too, at least according to the package:

    Walmart 60 W LED Bulb - package data
    Walmart 60 W LED Bulb – package data

    I love the “Return the package and reciept for replacement or money back” part…