MakerGear M2: Slic3r Start G-Code for PETG / V4 / 24 V / Whatever

The already ponderous chunk of G-Code that slic3r prepends to the outgoing file got a bit more complex with all the changes going on around here.

As it stands now, the starting G-Code looks like this:

;-- Slic3r Start G-Code for M2 starts --
;  Ed Nisley KE4NZU - 2015-03-07
;  Makergear V4 hot end
; Z-min switch at platform, must move nozzle to X=135 to clear
M140 S[first_layer_bed_temperature]	; start bed heating
G90				; absolute coordinates
G21				; millimeters
M83				; relative extrusion distance
M17				; enable steppers
G4 P500			;  ... wait for power up
G92 Z0			; set Z to zero, wherever it might be now
G1 Z10 F1000	; move platform downward to clear nozzle; may crash at bottom
G28 Y0			; home Y to clear plate, origin in middle
G92 Y-127
G28 X0			; home X, origin in middle
G92 X-100
G1 X130 Y0 F15000	; move off platform to right side, center Y
G28 Z0			; home Z to platform switch, with measured offset
G92 Z-2.10
G0 Z2.0			; get air under switch
G0 Y-127 F10000	; set up for priming, zig around corner
G0 X0			;  center X
G0 Y-125.0		; just over platform edge
G0 Z0 F500	; exactly at platform
M109 S[first_layer_temperature]	; set extruder temperature and wait
M190 S[first_layer_bed_temperature]	; wait for bed to finish heating
G1 E20 F300		; prime to get pressure, generate blob on edge
G0 Y-123 F500		; shear off blob
G1 X15 F15000	; jerk away from blob, move over surface
G4 P500			; pause to attach
G1 X45 F500		; slowly smear snot to clear nozzle
G1 Z1.0 F2000	; clear bed for travel
;-- Slic3r Start G-Code ends --

The blow-by-blow description…

Lines 9-10: Manually enable stepper drivers and wait half a second

Changing to a 24 V power supply for the motors doesn’t affect the winding current (because the drivers control that), but it does increase the current’s rate-of-change (because inductor voltage = L di/dt and the applied voltage is 26% higher) during each microstep. That means the motors snap to a whole-step position a bit faster when the Marlin firmware enables the drivers and the higher di/dt induces more glitch voltage in, say, the endstop cable, triggering a false contact sense (as the circuit depends on the Arduino’s 20+ kΩ internal pullup resistor). In any event, a half-second snooze avoids the problem.

Lines 18-19: Home Z-axis & set platform switch offset

The only way to set the offset accurately is to compare the actual height of a printed object (or the skirt around it) with the nominal value. I use 5 mm tall thinwall open boxes and, after setting the Extrusion Multiplier properly, they’re good test objects.

Lines 22-24: Extruder final heating

PETG tends to stick to the nozzle, so the nozzle now sits just over the edge of the glass plate and flush with the top surface, so that the initial drool forms a glob anchored to the side of the plate. It looks like this:

V4 PETG - preheat position
V4 PETG – preheat position

Notice the curl attached to the nozzle: I generally pick those off with a tweezer, but let this one remain to show how this mess works.

Line 31: Prime the extruder

With the hot end and platform temperatures stabilized, I ram 20 mm of filament into the extruder to refill it and stabilize its internal pressure. Because it’s been drooling ever since the plastic melted, not very much plastic comes out, but what does emerge enlarges the blob and bonds with the plastic stuck on the nozzle, thusly:

V4 PETG - extruder priming
V4 PETG – extruder priming

Lines 28-29: Detach the blob

Moving 2 mm onto the platform leaves most of the snot hanging on the edge of the glass, with just a bit on the far side of the nozzle. Doing that relatively slowly gives the plastic time to flow around the nozzle and remain with the blob, then zipping to X=15 encourages it to detach.

Lines 30-31: Wipe away what’s left

Pause for half a second to allow whatever’s left to attach to the platform, then slowly move to X=45, and watch the remaining snot leave a trail on the platform as it oozes off the nozzle.

Then hop up 1 mm to clear the platform and pass control to the rest of the G-Code with a clean nozzle!

That’s the ideal outcome, of course. Sometimes a recalcitrant blob hangs on, but it generally oozes off while the nozzle trudges around three skirt outlines…

Calibration Boxes for 3D Printing

The OpenSCAD script now produces either a thinwall open box or a solid box with the same outside shape and dimensions:

The rounded corners prevent edge glitches from throwing off the measurement, plus they verify that small segments print properly.

lengthy writeup on why I like the thinwall open box so much may be more than you want to know on the subject. Just do it, OK?

The solid box lets you check the outside dimensions (20 x 20 x 5 mm) and the slicer’s infill parameters.

The first few attempts with a new setup won’t look very good, but that’s the whole point:

M2 V4 Calibration Objects
M2 V4 Calibration Objects

Getting a workable profile and accurate Z-axis setting required maybe a dozen quick prints & parameter changes. After that, they’re good for verifying that any change you make hasn’t screwed up something beyond recovery.

Put five of them on the platform to verify overall alignment (“leveling”) and first-layer thickness:

Thinwall Calibration Cubes - 5 copies
Thinwall Calibration Cubes – 5 copies

A few iterations will generate plenty of show-n-tell tchotchkes:

Thinwall open boxes from platform leveling
Thinwall open boxes from platform leveling

As nearly as I can tell, if you can’t print these reliably, there’s no point in trying to print anything else.

Even better, when you suddenly can’t print anything else reliably, these simple boxes will tell you what’s gone wrong…

[Update: The revised version works better.]

The OpenSCAD source code:

// Calibration boxes
//  Thin wall open box - set Extrusion Multiplier
//  Solid box - verify infill settings
// Ed Nisley - KE4ZNU - 2015-03

Layout = "Open";					// Open Solid

//- Extrusion parameters must match reality!

ThreadThick = 0.25;
ThreadWidth = 0.40;

Protrusion = 0.1;           // make holes end cleanly

function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);

// Dimensions

Height = IntegerMultiple(5.0,ThreadThick);

WallThick = 1*ThreadWidth;

CornerRadius = 2.0;
CornerSides = 4*8;

SideLen = 20.0 - 2*CornerRadius;

Rotation = 45;


module ShowPegGrid(Space = 10.0,Size = 1.0) {

  Range = floor(50 / Space);

    for (x=[-Range:Range])
      for (y=[-Range:Range])


module Solid() {
	hull() {
		for (i=[-1,1], j=[-1,1])

module Thinwall() {
	difference() {
		hull() {
			for (i=[-1,1], j=[-1,1])
					cylinder(r=(CornerRadius - WallThick),h=(Height + 2*Protrusion),$fn=CornerSides);



	if (Layout == "Open")

Backyard Turkey Flock

The turkey flock that normally lives along the Wappingers Creek valley, downslope from the back yard, has emerged for the ritual spring foraging:

Turkey flock - 0
Turkey flock – 0

And posturing:

Turkey flock - 1
Turkey flock – 1

And just moseying around:

Turkey flock - 2
Turkey flock – 2

You can match the trees and identify some duplicated birds, but the flock seems stable around a dozen. They used to deploy skirmish lines upwards of two dozen bird and we’ve recently counted 19; we think foxes have been encouraging better control of wandering chicks.

Turkeys are good folks…

Backyard Deer Herd

One deer might be cute:

Deer Herd - outlier
Deer Herd – outlier

But the rest of the herd makes up for it:

Deer Herd - main
Deer Herd – main

You’ll note the complete lack of understory vegetation; the only remaining plants can withstand continuous deer browsing. Deer have clipped all of the evergreens five feet off the ground, even through they don’t normally eat evergreens…

In fact, there’s no new tree growth in the Hudson Valley, because tree seedlings don’t stand a chance.

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,

module ShowPegGrid(Space = 10.0,Size = 1.0) {

  Range = floor(50 / Space);

	for (x=[-Range:Range])
	  for (y=[-Range:Range])


// Build it


// pivot

	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

			translate([0,											// peg
						(ShellOD/2 + PegLength/2 + BaseThick - Protrusion),
				intersection() {
					cube([PegSide,(PegLength + Protrusion),PegSide],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)])
				cylinder(r1=TaperID/2,r2=ShellID/2,h=(TaperLength + Protrusion),$fn=NumSides);

		translate([0,0,PegSide/2])					// screw tap hole
				PolyCyl(PegHoleOD,(ShellOD + BaseThick + PegLength),6);


// anchor cap

	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

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])


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() {
			cube(Shank + [0,0,2*Protrusion],center=true);

// Build it!


if (Layout == "Show") {

if (Layout == "Build") {