Thing-O-Matic: Wade/ScribbleJ Filament Tensioner

Putting a geared stepper motor on the MK5 filament drive produced greatly improved print quality, which meant I could finally print ScribbleJ’s version of the classic Wade Filament Tensioner and expect that it’d come out right. It’s a rather large lump of plastic that printed quite nicely on an aluminum plate.

Wade-ScribbleJ Filament Tensioner on plate
Wade-ScribbleJ Filament Tensioner on plate

The whole thing looks like this when it’s all assembled and adjusted:

Complete Geared Stepper Extruder
Complete Geared Stepper Extruder

[Update: The motor comes directly from the usual eBay supplier. You won’t find another one like it, but this is directly from the label…

  • 38 mm case
  • Minebea-Matsushita 17PM-K150-P1V
  • No. T6824-02

]

You can see the two thermal switches near the bottom of the picture. The 100 °C switch is inside the acrylic frame on the Thermal Riser, the 40 °C switch is just taped to the filament tensioner’s base. The former is OK, the latter isn’t as secure as it should be. FWIW, Riser temperatures run around 70 °C during normal extrusion, albeit in a chilly Basement Laboratory without covers on the TOM’s windows.

A better view of the shaft bearings and filament position:

Filament tensioner - overview
Filament tensioner - overview

The four long screws are 1.5 inch 4-40 from my heap, although 2 inch screws would give more room for adjustment. Some folks mount the screws the other way around, with the nuts pressing on the springs and little knobs on the nuts. I gave up on the washers to get a bit more adjustment range.

The springs came from my Big Box o’ Little Springs, sporting absolutely no pedigree at all. They’re not quite completely compressed, so there’s a bit of push left in them to handle filament diameter variations (which is the whole point of this exercise). I added four nuts (between the shaft bearing plate and the idler block) to keep the idler block from resting against the drive gear when there’s no filament in place: inserting a new filament became much easier.

Somewhat to my surprise, the entire filament drive gear assembly is free-floating and self-aligning within the housing:

Filament drive gear detail
Filament drive gear detail

I enabled the option to put a 5 mm diameter cleanout hole in the bearing housing, which turned out to be absolutely essential for monitoring the location of the drive gear inside all the machinery. You can barely see the hole in the first picture, on the left side of the curved section.

A floating shaft means the 7-tooth motor drive gear’s position must line up with wherever the 51-tooth filament drive gear happens to be. There’s not much room to adjust the motor gear, but a few iterations sorted out the proper number and placement of all the filament drive shaft washers, nuts, and bearings.

Filament drive gear - shaft spacing
Filament drive gear - shaft spacing

You (well, I) really really must put a flat on the shaft and use full-strength Loctite to hold the setscrew in place. I used an all-thread M6x40 bolt because that’s what I had on hand, but a partially threaded M6x50 bolt would provide better support for the bearings, more clearance for the spacers, and look a lot better; it’d require a custom-turned bushing instead of the nut against the big gear, though.

Flatted filament drive shaft
Flatted filament drive shaft

I initially used low-strength Loctite. Word: a loose drive gear setscrew can convince you that Skeinforge’s Reversal plugin isn’t working after you make many changes with worsening results. Those fast reversals loosen the setscrew in short order.

The diameters of the 7- and 51-tooth herringbone gears determine the center-to-center distance between the motor shaft and the extruder shaft. Alas, two of the motor mounting bolts wind up directly behind the larger gear. I marked the gear adjacent to the bolt heads and drilled a hole that just barely admits the hex wrench:

Stepper Extruder - motor mount access hole
Stepper Extruder - motor mount access hole

If you knew where that hole was supposed to be, you could print it right into the gear, but I haven’t a clue as to how you might algorithmically determine the precise location on the as-printed gears.

The modified OpenSCAD source produces two recesses for the bolt head and nut, but I just applied an end mill to the head side of the finished idler block. There’s no room for the bolt head between the block and the motor mounting plate.

Idler housing with recessed bolt
Idler housing with recessed bolt

Of course, I modified the OpenSCAD code along the way:

  • Changing the bearing size moved the base: use front_bearing_r in the routine that punches the holes
  • Add a complete outer surface on the idler block; I thought I might want a flat metal plate to distribute the stress.
  • Add bolt head / nut recesses for idler block pulley shaft
  • Include base_wall_h in the calculation for idler_max_h
  • Tweaked spacing to get idler bolt heads out of the walls
  • Extend motor wall rightward to cover all of the base plate
  • Adjust base hole positioning: -10 / +4.0, not -10 / +3.5
    • But not all instances of 3.5 must change, I think
  • Filament offset may need further tweakage
  • Other miscellaneous tweaks

Not all of those changes made it to the printed object shown here; if I ever print another one, they’ll be included. Use at your own risk!

The OpenSCAD source, which is almost entirely ScribbleJ’s work:

//  MK5 Wade's-Style Tensioner
// (C)2011, Christopher "ScribbleJ" Jansen
//
// Released under the BSD license.

// Modifications: Ed Nisley - KE4ZNU - Mar 2011

// Parametric Settings

// INTERESTING OPTIONS
// 1 = on, 0 = off
extend_shaft = 1 ;		// 0 will allow a bridge over the front of the motor hole
make_stepper_holes = 1;	// 1 will create mounting holes for a stepper mount.
make_dc_holes = 0;		// 1 will create mounting holes for a MK5 DC motor.
motor_shaft_supports = 1;	// 1 will create angle supports to the motor shaft. (See options below for support angle/size)
generate_for_viewing  = 0;	// 1 creates the model suitable for viewing.  0 creates the model suitable for printing.

cleaning_hole_d = 5;		// The diameter of a cleaning hole to punch.  (0 = no cleaning hole)
cleaning_hole_r = cleaning_hole_d/2;
cleaning_hole_angle = 75;	// Angle offset from 9 o'clock position (i.e. directly left)

hole_protrusion = 0.05;	// surface clearance for holes and suchlike

hole_windage = 0.4;			// allowance for small hole shrinkage

// _r = radius, _d = diameter, _h = height

// REAR BEARING = bearing closest to motor
rear_bearing_d = 17.0 + hole_windage;
rear_bearing_r = rear_bearing_d/2;
rear_bearing_h = 6.0;

// EXTRA SHAFT = include an extra length of motor shaft.  This is useful
// for giving your idler bolts enough room depth-wise.
extra_shaft = 5;

// FRONT BEARING = bearing furthest from motor  (Technically, front bearing diameter must be >= than rear to print properly... so
// there are many places in the code that we assume the front bearing is the largest d.
front_bearing_d = 17.0 + hole_windage;
front_bearing_r  = front_bearing_d/2;
front_bearing_h = 6;

// EXTRA FILAMENT = extend the length of the filament column.  This is useful
// for giving your idler bolts enough room height-wise.
extra_filament = 40;

filament_margin = 3.0;	// How wide is shaft on either side of filament?
filament_d = 4;			// How wide is filament shaft hole?
filament_r = filament_d/2;

// FILAMENT OFFSET = How far from the center of the motor axis your MK5 plastic pusher gear thingy
// or hobbed bolt groove is.
filament_offset = 6;

// MOTOR WALL = "rear" wall of tensioner.
motor_wall_h = 5;  		// thickness of wall
motor_bolt_d = 3.0 + hole_windage;		// diameter of motor mounting bolts
motor_bolt_r  = motor_bolt_d/2;
motor_bolt_h = motor_wall_h;
motor_bolt_hex_d = 6.3 + hole_windage;	// diameter of motor mounting bolt hex caps
motor_bolt_hex_r  = motor_bolt_hex_d/2;
motor_bolt_hex_h = 3;			// height of hex caps
motor_dropbolts   = 2.0;		// distance to sink bolts into wall
motor_boltmargin = 5;			// Distance to allow between bolts and edges of wall.
motor_shaft_width = 5;			// How thick is the wall around the motor shaft?
motor_shaft_support_width = 10;	// How thick are the motor supports (if any)?
motor_shaft_support_angle = 0;	// if non-0, will create three supports spaced apart this many degrees.
								// 0 creates a single support if enabled above.

// 31 is distance from center to bolt holes... do not chang this without changing hardcoded numbers
// in the motor bolt generating module.
motor_wall_w = 31 + (motor_boltmargin * 2) + motor_bolt_d;
motor_wall_d = 31 + (motor_boltmargin * 2) + motor_bolt_d;

// IDLER BEARING = the bearing that holds the plastic against the hobbed bolt/MK5 plastic pusher.
// You should include about an extra 2mm over your actual bearing measurements here so it can spin freely.
idler_bearing_d = 19 + 3;
idler_bearing_r  = idler_bearing_d/2;
idler_bearing_h = 6 + 2;
h_i = idler_bearing_h/2;
idler_bearing_bolt_d = 5;	// This is the size of the bolt holding the bearing in place.
idler_bearing_bolt_r = idler_bearing_bolt_d/2;

idler_bolt_d = 3.0 + hole_windage;		// This is the size of the (4) bolts holding the idler block in place.
idler_bolt_r  = idler_bolt_d/2;
idler_bolt_margin = 4;	// How much room to allow between bolt holes and edge of block.
idler_bolt_hex_d = 7.0 + hole_windage;
idler_bolt_hex_r  = idler_bolt_hex_d/2;
idler_bolt_hex_h = 5;         // Arbitrarily large to be sure to punch through supports/shaft.
idler_dropbolts   = 2.0;           // Try negative numbers here to catch your nuts on the supports.

idler_wall = 2.5;			// thickness of wall to left of idler bearing

idler_recess_dia = 9.0 + hole_windage;		// recess idler shaft bolt head & nut
idler_recess_r = idler_recess_dia/2;
idler_recess_depth = 3.0;

// BASE = the bottom part that bolts onto the hot end.
base_wall_h = 6;		// How thick or tall is the base.
base_h=base_wall_h;
base_bolt_d  = 3.0 + hole_windage;		// Size of bolts used to hold base -- rest of base settings are same as motor wall settings above.
base_bolt_r   = base_bolt_d/2;
base_bolt_hex_d = 6.3 + hole_windage;
base_bolt_hex_r  = base_bolt_hex_d/2;
base_bolt_hex_h = 5;
base_dropbolts = 1.5;
base_boltmargin = 6;
base_filament_offset_x = 6;

// 30/14.0 is distance from center to bolt holes...
// do not change this without changing hardcoded numbers
//  in the base bolt generating module.
base_w = 30 + (base_boltmargin*2) + base_bolt_r;
base_d  = 14.0 + (base_boltmargin*2) + base_bolt_r;

// base_z_extra is used for configurations where base wall or motor wall
//  would be unprintable due to differential in height.
// shrinks or grows the base to fit.
base_z_extra = ((idler_bearing_h/2) + rear_bearing_h + motor_wall_h) - ((base_d/2) + 3.5);
base_filament_offset_z = -3.5;  // How far the filament hole is from the bolts furthest from the motor.
base_d_use = base_d + base_z_extra;

// make up difference between bottom of wall and base... not really necessary but more support more better.
motor_wall_extra = front_bearing_r + (extra_filament/2) + base_h - (motor_wall_d/2);

// Calculate maximum space for idler block.
idler_max_h = idler_bearing_d + extra_filament + ((-base_bolt_hex_h+base_dropbolts)*2) - base_wall_h;
half_idler_max_h = idler_max_h/2;
idler_bolt_y = half_idler_max_h - idler_bolt_r - idler_bolt_margin;

//idler_max_w = .55 * idler_bearing_d;
idler_max_w = idler_bearing_r + idler_wall;			// enforce wall thickness on right side

idler_max_d = extra_shaft+front_bearing_h+idler_bearing_h+rear_bearing_h+((-motor_bolt_hex_h+motor_dropbolts)*2);
half_idler_max_d = idler_max_d/2;
idler_bolt_z = half_idler_max_d - idler_bolt_r - idler_bolt_margin;

echo(str("Idler block size: ",idler_max_d," x ",idler_max_h," x ",idler_max_w));
echo(str("Idler bolt spacing: ",2*idler_bolt_z," x ",2*idler_bolt_y));

// This module generates the bolt pattern for the idler, trying to fill the maximum space available.
module IDLERBOLTS()
{
	// echo(idler_bolt_r, idler_bolt_d, idler_max_d, idler_bolt_z, half_idler_max_d);
	// echo(idler_bolt_r, idler_bolt_d, idler_max_h, idler_bolt_y, half_idler_max_h);

	translate([idler_bolt_z,idler_bolt_y,0]) cylinder(r=idler_bolt_r, h=40);
	translate([idler_bolt_z,-idler_bolt_y,0]) cylinder(r=idler_bolt_r, h=40);
	translate([-idler_bolt_z,idler_bolt_y,0]) cylinder(r=idler_bolt_r, h=40);
	translate([-idler_bolt_z,-idler_bolt_y,0]) cylinder(r=idler_bolt_r, h=40);

	translate([0,0,-idler_bolt_hex_h])
	{
		translate([idler_bolt_z,idler_bolt_y,0]) cylinder(r=idler_bolt_hex_r, h=idler_bolt_hex_h,$fn=6);
		translate([idler_bolt_z,-idler_bolt_y,0]) cylinder(r=idler_bolt_hex_r, h=idler_bolt_hex_h,$fn=6);
		translate([-idler_bolt_z,idler_bolt_y,0]) cylinder(r=idler_bolt_hex_r, h=idler_bolt_hex_h,$fn=6);
		translate([-idler_bolt_z,-idler_bolt_y,0]) cylinder(r=idler_bolt_hex_r, h=idler_bolt_hex_h,$fn=6);
	}

}

// This module generates an idler block, filling the maximum space available.
module IDLER()
{
	difference()
	{
		translate([0,0,(idler_max_w/2)-(.25 * idler_bearing_bolt_d)]) cube([idler_max_d, idler_max_h, idler_max_w], center=true);
		translate([0,0,(-.5 * idler_bearing_bolt_r) + idler_max_w]) rotate([0,180,0]) IDLERBOLTS();
		#rotate([0,90,0]) cylinder(h=idler_max_d+1, r=idler_bearing_bolt_r,center=true);
		#rotate([0,90,0]) cylinder(h=idler_bearing_h, r=idler_bearing_r, center=true);
		translate([(idler_max_d/2 - idler_recess_depth),0,0])
		  rotate([0,90,0])
		  #cylinder(r=idler_recess_r,h=(idler_recess_depth + hole_protrusion),$fn=10);
		translate([(-idler_max_d/2 + idler_recess_depth),0,0])
		  rotate([0,270,0])
		  #cylinder(r=idler_recess_r,h=(idler_recess_depth + hole_protrusion),$fn=10);
	}
	echo(str("IDLER BEARING BOLT LENGTH REQUIRED (longer is OK): ", idler_max_d, "mm"));
}

// This module creates the motor shaft hole pattern.
module MOTORSHAFT()
{
	// idler bearing
	cylinder(h=idler_bearing_h, r=rear_bearing_r, center=true);
	// front bearing
	translate([0,0,h_i]) cylinder(h=front_bearing_h, r=front_bearing_r);
	if(extend_shaft == 1)
	{
		translate([0,0,h_i]) cylinder(h=front_bearing_h+(extra_shaft/2)+50, r=front_bearing_r);
	}
	// rear bearing
	translate([0,0,0 - h_i - rear_bearing_h - (extra_shaft/2) - motor_wall_h])
		cylinder(h=         rear_bearing_h + (extra_shaft/2) + motor_wall_h, r=rear_bearing_r);

	echo(str("MOTOR SHAFT/BOLT LENGTH REQUIRED (longer is OK): ", front_bearing_h+idler_bearing_h+rear_bearing_h+motor_wall_h+(extra_shaft/2), "mm"));
	echo(str("MOTOR SHAFT LENGTH FROM REAR OF MOUNT TO FILAMENT:", motor_wall_h+(extra_shaft/2)+rear_bearing_h+(idler_bearing_h/2), "mm"));
}

// This module creates an MK5 mount motor hole pattern with optional hex insets for bolt heads/nuts.
module MK5_MOTORHOLES(include_dc = 1, include_stepper = 1, include_hex = 1)
{
	// The hardcoded numbers in the module below are simply the coordinates of the motor holes,
	// relative to the center of the motor shaft.

	// STEPPER MOUNT HOLES
	if(include_stepper == 1)
	{
		translate([15.5,15.5,-motor_dropbolts-hole_protrusion])	cylinder(r=motor_bolt_r, h=motor_bolt_h+(2*hole_protrusion));
		translate([15.5,-15.5,-motor_dropbolts-hole_protrusion])	cylinder(r=motor_bolt_r, h=motor_bolt_h+(2*hole_protrusion));
		translate([-15.5,-15.5,-motor_dropbolts-hole_protrusion])	cylinder(r=motor_bolt_r, h=motor_bolt_h+(2*hole_protrusion));
		translate([-15.5,15.5,-motor_dropbolts-hole_protrusion])	cylinder(r=motor_bolt_r, h=motor_bolt_h+(2*hole_protrusion));

		if(include_hex == 1)
		{
			translate([15.5,15.5,motor_bolt_h-motor_dropbolts-hole_protrusion])	cylinder(r=motor_bolt_hex_r, h=motor_bolt_hex_h + (2*hole_protrusion), $fn=6);
			translate([15.5,-15.5,motor_bolt_h-motor_dropbolts-hole_protrusion])	cylinder(r=motor_bolt_hex_r, h=motor_bolt_hex_h + (2*hole_protrusion), $fn=6);
			translate([-15.5,-15.5,motor_bolt_h-motor_dropbolts-hole_protrusion])	cylinder(r=motor_bolt_hex_r, h=motor_bolt_hex_h + (2*hole_protrusion), $fn=6);
			translate([-15.5,15.5,motor_bolt_h-motor_dropbolts-hole_protrusion])	cylinder(r=motor_bolt_hex_r, h=motor_bolt_hex_h + (2*hole_protrusion), $fn=6);
		}
	}

	// DC MOUNT HOLES
	if(include_dc == 1)
	{
		// DC MOUNT HOLES
		translate([0,-15.5,-motor_dropbolts])					cylinder(r=motor_bolt_r,h=motor_bolt_h);
		rotate([0,0,-60])  translate([0,-15.5,-motor_dropbolts]) 		cylinder(r=motor_bolt_r,h=motor_bolt_h);
		rotate([0,0,-120]) translate([0,-15.5,-motor_dropbolts])	cylinder(r=motor_bolt_r,h=motor_bolt_h);
		rotate([0,0,-180]) translate([0,-15.5,-motor_dropbolts])	cylinder(r=motor_bolt_r,h=motor_bolt_h);
		if(include_hex == 1)
		{
			translate([0,-15.5,motor_bolt_h-motor_dropbolts])					cylinder(r=motor_bolt_hex_r,h=motor_bolt_hex_h, $fn=6);
			rotate([0,0,-60])  translate([0,-15.5,motor_bolt_h-motor_dropbolts]) 	cylinder(r=motor_bolt_hex_r,h=motor_bolt_hex_h, $fn=6);
			rotate([0,0,-120]) translate([0,-15.5,motor_bolt_h-motor_dropbolts])	cylinder(r=motor_bolt_hex_r,h=motor_bolt_hex_h, $fn=6);
			rotate([0,0,-180]) translate([0,-15.5,motor_bolt_h-motor_dropbolts])	cylinder(r=motor_bolt_hex_r,h=motor_bolt_hex_h, $fn=6);
		}
	}
}

// This module creates MK5 hot-end hole patterns with optional hex heads for the bolts/nuts.
module MK5_BASEHOLES(include_MK5boltheads = 1, include_filament = 1, include_hex = 1)
{

	// The hardcoded numbers in the routine below are simply the coordinates of the base holes,
	// relative to the filament hole.
	if(include_filament == 1)
	{
		translate([0,0,100/4]) cylinder(r=filament_r, h=100,center=true);
	}

	translate([-15,4.0,-base_dropbolts-hole_protrusion]) cylinder(r=base_bolt_r,h=base_h+(2*hole_protrusion));
	translate([-15,-10,-base_dropbolts-hole_protrusion]) cylinder(r=base_bolt_r,h=base_h+(2*hole_protrusion));
	translate([15,4.0,-base_dropbolts-hole_protrusion]) cylinder(r=base_bolt_r,h=base_h+(2*hole_protrusion));
	translate([15,-10,-base_dropbolts-hole_protrusion]) cylinder(r=base_bolt_r,h=base_h+(2*hole_protrusion));

	if(include_MK5boltheads == 1)
	{
		translate([17,9.5,-hole_protrusion]) cylinder(r=3, h=4);
		translate([17,-15.5,-hole_protrusion]) cylinder(r=3, h=4);
		translate([-17,9.5,-hole_protrusion]) cylinder(r=3, h=4);
		translate([-17,-15.5,-hole_protrusion]) cylinder(r=3, h=4);
	}

	if(include_hex == 1)
	{
		translate([-15,4.0,base_h-base_dropbolts-hole_protrusion]) cylinder(r=base_bolt_hex_r,h=base_bolt_hex_h+(2*hole_protrusion), $fn=6);
		translate([-15,-10,base_h-base_dropbolts-hole_protrusion]) cylinder(r=base_bolt_hex_r,h=base_bolt_hex_h+(2*hole_protrusion), $fn=6);
		translate([15,4.0,base_h-base_dropbolts-hole_protrusion]) cylinder(r=base_bolt_hex_r,h=base_bolt_hex_h+(2*hole_protrusion), $fn=6);
		translate([15,-10,base_h-base_dropbolts-hole_protrusion]) cylinder(r=base_bolt_hex_r,h=base_bolt_hex_h+(2*hole_protrusion), $fn=6);
	}

}

// This module generates the mounting part of the Wade's-style tensioner.
// The generated item is centered on the motor shaft in X,Y and the filament in Z.
module MOUNT()
{

	difference()
	{

	union()
	{
		translate([0,0,-1 * (motor_wall_h/2)])
		{  // MOTOR SHAFT RELATIVE TO FILAMENT IN Z, MOTOR SHAFT IN X,Y
			cylinder(h=front_bearing_h + idler_bearing_h + rear_bearing_h + extra_shaft + motor_wall_h, r=front_bearing_r+motor_shaft_width, center=true);
			translate([base_filament_offset_x,0,0]) cube([filament_d + (2 * filament_margin),   front_bearing_d + extra_filament,  front_bearing_h + idler_bearing_h + rear_bearing_h + extra_shaft + motor_wall_h], center=true);

			if(motor_shaft_supports == 1)
			{
				translate([0,0,(motor_wall_h/2)]) {
				intersection()
				{
					cylinder(	h=front_bearing_h + idler_bearing_h + rear_bearing_h + extra_shaft,  r1=(motor_wall_w/2),  r2=front_bearing_r+motor_shaft_width, center=true);
					rotate([0,0,90]) translate([0,50,0]) cube([motor_shaft_support_width, 100, front_bearing_h + idler_bearing_h + rear_bearing_h + extra_shaft], center=true);
				}
				intersection()
				{
					cylinder(	h=front_bearing_h + idler_bearing_h + rear_bearing_h + extra_shaft,  r1=(motor_wall_w/2),  r2=front_bearing_r+motor_shaft_width, center=true);
					rotate([0,0,90-motor_shaft_support_angle]) translate([0,50,0]) cube([motor_shaft_support_width, 100, front_bearing_h + idler_bearing_h + rear_bearing_h + extra_shaft], center=true);
				}
				intersection()
				{
					cylinder(	h=front_bearing_h + idler_bearing_h + rear_bearing_h + extra_shaft,  r1=(motor_wall_w/2),  r2=front_bearing_r+motor_shaft_width, center=true);
					rotate([0,0,90+motor_shaft_support_angle]) translate([0,50,0]) cube([motor_shaft_support_width, 100, front_bearing_h + idler_bearing_h + rear_bearing_h + extra_shaft], center=true);
				}
				}
			}
		}

		translate([0,motor_wall_extra/-2,((motor_wall_h/-2) + rear_bearing_h+(extra_shaft/2)+motor_wall_h+(idler_bearing_h/2)) * -1])
		{ // MOTOR WALL RELATIVE TO MOTOR SHAFT X,Y
			  union() {
				cube([motor_wall_w, motor_wall_d+motor_wall_extra, motor_wall_h], center=true);
				translate([base_filament_offset_x - (motor_wall_w - base_w)/2 + motor_wall_w/4,0,0])
				  cube([motor_wall_w/2,motor_wall_d+motor_wall_extra, motor_wall_h],center=true);
			  }
		}

		translate([filament_offset, -1* (front_bearing_r + (extra_filament/2) + (base_h/2)), base_filament_offset_z])
		{  // BASE RELATIVE TO FILAMENT HOLE IN Z,X
			translate([0,0,-(base_z_extra/2)])
			  cube([base_w, base_h, base_d_use], center=true);
			// extend filament shaft
			translate([0,(front_bearing_d + extra_filament + base_h)/2, 0])
			  cube([filament_d + (2 * filament_margin), front_bearing_d + extra_filament, base_d], center=true);
		}

	}

	// Punch motor holes
	translate([0,0,-1*((idler_bearing_h/2) + (rear_bearing_h) + (motor_wall_h) + (extra_shaft/2))])
	  # MK5_MOTORHOLES(include_stepper=make_stepper_holes, include_dc = make_dc_holes);
	// Punch motor shaft
	MOTORSHAFT();
	// Punch idler bolt holes
	translate([filament_offset - filament_margin - (filament_r) + idler_dropbolts,0,0])
	  rotate([90,90,90]) # IDLERBOLTS();
	// Punch baseplate holes
	translate([filament_offset, -1* (front_bearing_r + (extra_filament/2) + base_h), 0])
	  rotate([-90,180,0]) # MK5_BASEHOLES();
	// Punch idler bearing clearance
	translate([filament_offset + idler_bearing_r - filament_r, 0,0])
	  cylinder(h=idler_bearing_h + front_bearing_h + rear_bearing_h + extra_shaft + hole_protrusion, r=idler_bearing_r, center=true);
	// Punch cleaning hole
	rotate([-1 * cleaning_hole_angle,-90,0])
	  cylinder(h=50,r=cleaning_hole_r);

	}
}

if(generate_for_viewing == 1)
{
	MOUNT();
	translate([filament_offset + idler_bearing_r,0,0]) rotate([0,90,0]) IDLER();
}
else if(generate_for_viewing == 0)
{
	translate([15.5+motor_boltmargin+motor_bolt_r+2.5,    0,   (motor_wall_h+(extra_shaft/2)+rear_bearing_h+(idler_bearing_h/2))]) MOUNT();
	translate([(idler_max_d/-2)-2.5, 0, (-.5 * idler_bearing_bolt_r) + idler_max_w]) rotate([180,0,0]) IDLER();
}

Just. Do. It.

10 thoughts on “Thing-O-Matic: Wade/ScribbleJ Filament Tensioner

  1. How fast are you able to test extrude at? I can get up to 5rpm very nicely, but by the time I get to 10 I get major slippage. I still have nice prints, but it does put a limit on my reversal rpms.

    1. I don’t recall, but I think more than a few seconds at 10 rpm outran the extruder’s heating ability. That may be what you’re seeing: the motor can’t force solid plastic through the nozzle!

      Right now I have reversal set to 100 ms in both directions at 20 rpm, which seems to work fine.

      Those poor springs are pretty much at their limit and I want to tweak that arrangement. For now, though, I have some other stuff that needs doing… hard though that may be to imagine!

  2. The heating aspect did not occur to me. Interesting.

    Yesterday I tore my plastruder apart to see if there was any blockage after a print failure. Turns out the grub screw loosened again. Pesky thing. I flattened the shaft even more and added threadlock. Maybe that sucker will stay in place now.

    Anyway. While apart I took the opportunity to see how much filament pressure a reversal took. It only took a small fraction of what it takes to push. That was expected. What was not expected was how useless on the thread output to pull it back more than a mm or two. After seeing that in action I am much less concerned about not using values anywhere near as large as the default values in the reversal plugin.

    1. useless on the thread output to pull it back more than a mm or two

      Even after pulling it back, the plastic seems to flow downward to the nozzle. I’ll post some pix of the little snots that accumulate onto the object’s perimeter as the nozzle orbits while cooling between the first layer and all the rest. They also cling to the interior, but I really don’t care much about those.

      I think a little reversal is great and more isn’t necessarily better. What does matter is matching the reverse and push-back times; sucking up more than you extrude doesn’t work for long!

      Given that, very high reversal speeds may not buy anything, other than loosening the setscrew. I’m slowly dialing both settings downward, print by print, to see what happens.

  3. yesterday we build a wade extruder on our makerbot.

    Otelo Freistadt

    did you change the firmware?
    what options did you change in skeinforge?
    what do you change in thingomatic.xml?

    greets koiti

    1. Looks good; my Shop Assistant tells me to stock up on black filament.

      The firmware was the standard 2.7 and, as 2.81 doesn’t seem to add any features I need, I haven’t updated it yet.

      That post gives the details of calculating new values for the entry in thingomatic.xml. I copied the definition for a MK6 Stepstruder and tweaked the copy, just so I’d have reference values.

      Right now I have oozebane turned off and Reversal set to 25 rpm, 125 ms in/out, and no early action. The Threshold value must be zero to avoid that problem. It still leaves zits at the end (or start?) of each thread and I’m slowly searching the parameter space to figure out what causes that.

      After you get it set up, you’ll love it!

Comments are closed.