Thursday 21 January 2016

Mendel90 GitHub catch up

I finally found time to update GitHub with some Mendel90 changes that I have had in the works for a long time. The problem with releasing them sooner was that they were all not quite finished and / or would make unintended knock on changes to the kits I was producing. In particular the changes I did to make a Huxley90 in a hurry for the TCT show and the E3D mods kindly contributed by Philippe LUC that conflicted greatly with it, so needed a lot of work to merge.


I also updated to the latest version of OpenScad. The upside was that hull and some of the 2D operations are much faster. I was also able to replace all the calls to minkowski with offset as I was only using it for 2D offsetting. The net result is it is now four or five times quicker to generate the preview and the STL files. The downside is that the 2D sub-system now uses fixed point coordinates but the rest of OpenScad doesn't. This makes it difficult to get 2D and 3D geometry to match up. For example, an extruded circle now has slightly different vertices to a cylinder of the same size. This created a few degenerate triangles requiring that I changed the way I constructed some objects in order to get nice clean STL files.

The solution in the case above was to make the cylinder slightly bigger than the circle used to make the pointer.

On the up side it seems OpenScad has got better at handling unioning exactly coincident faces since I first wrote Mendel90, so I could remove some of my small offset bodges to avoid z-fighting.

Another benefit is that the X end brackets now slice correctly in Slic3r, as the bug that caused internal faces to point the wrong way has now been fixed. Skeinforge doesn't care about face orientation, it just counts edges to work out what is inside and what is outside. Other slicers got confused and filled in the nut cavity.

Along the way I discovered that, although OpenScad now has trig functions that are accurate for multiples of 90 degrees, etc., it doesn't use them in rotate, or vertex creation for circles and cylinders. It converts to radians and uses the library trig functions. Degrees can never be represented accurately as radians in floating point because Pi is irrational, not to mention transcendental. To get round this I now override the built in rotate with a user space version that uses the accurate sin and cos degree functions.

module rotate(a)
 cx = cos(a[0]);
 cy = cos(a[1]);
 cz = cos(a[2]);
 sx = sin(a[0]);
 sy = sin(a[1]);
 sz = sin(a[2]);
  [ cy * cz, cz * sx * sy - cx * sz, cx * cz * sy + sx * sz, 0],
  [ cy * sz, cx * cz + sx * sy * sz,-cz * sx + cx * sy * sz, 0],
  [-sy,      cy * sx,                cx * cy,                0],
  [ 0,       0,                      0,                      1]
 ]) children();

Not surprisingly every STL and DXF file generated is now slightly different numerically but hopefully not dimensionally. I made a stable branch to record the state before these global changes, just in case. GitHub has some excellent image and STL comparison views but unfortunately it gives up if more than a handful of files have changed and there are hundreds in the Mendel90 tree.

Wade's Block

After a few people started to report broken or cracked Wade's blocks I strengthened it a bit around the bearing block. I also made the bearing sockets a bit bigger so there is less stress created pressing them in. Kits from around March 2015 have shipped with this version.

X Carriage

When Philippe LUC created the E3D branch he fixed a few bugs. One of these was that the X carriage top was only 2mm thick, when the design intent was 3mm. This was due to the fan duct using the same variable name. Whoops! I have updated it now in the main branch. I also made the nut traps for the fan bracket screws deeper to allow for longer screws and to allow them to be withdrawn further without loosing the nuts. This makes it easier to remove and replace the duct. Simply removing the washers is an alternative.

E3D Hotend

I temporarily parked Philipp's mods in an E3D branch until I could merge them. I have now updated the master branch to support E3D V5 and V6 hot ends with this one line change to the config file. The generated files for V6 that are different from standard build are in new folders dibond_E3D and sturdy_E3D and I have deleted the temporary E3D branch.

There is no room for the right hand wing nut because it clashes with the hot end's fan. Fortunately the carriage has always had nut traps to allow the screws to be inserted from below. A plain nut above can then be used to secure the extruder.

Primarily the things that change are the Wade's block, the fan duct and the fan bracket. The Wade's block has no extension to avoid losing more Z build height than necessary and a plain screw hole on the right end instead of the hex socket.

The fan duct has to slope downwards to avoid the E3D heatsink. That creates a sloping bridge that is also skewed horizontally. I haven't found a slicer that handles this properly yet, having tried Skeinforge, Slic3r, Cura, Kisslicer and even paid for Simplify3D! I have blogged about their failings in another post here: Any other slicers I should try?

Another bug Philippe noticed is that there was almost no clearance between the fan and the belt. Fortunately the belt is twisted so it actually does clear the fan. I have added more clearance as
Philippe did. It makes the fan bracket and fan duct 2mm longer. If you print either from the new files be sure to print both or the duct will be misaligned.

I also improved the internal shape of the duct a bit. From this: -

To this: -

It probably doesn't make a lot of difference but a comparative test of various fans and ducts will be the subject of a later post.

Even with the shortened Wade's block the E3D V6 hot end is 4mm lower and the V5 is a bit longer still. If you retro fit it to an old machine you will lose 4mm Z travel. If you are building a new machine then there are alternative files which add 4mm to the height of the frame and lengthen the Z smooth rods and threaded rods on the bom. That also has a knock on effect on the shape of the spool holders and the dust filter. If you use the larger sheets be sure to get the correct size rods and use the correct spool holder parts to match the frame.

New Lighting Options

I redesigned the lighting system I described here to work with some commonly available LED light strips. These consist of an aluminium PCB strip that slides into an aluminium extrusion with plastic end caps, which I discard. Instead of printing a bar to hang the lights and camera from I now add printed end caps to the light strip and uses those to hinge it from the frame edge clips. I then hang the camera from the strip with its own hinge.

The strips come in 500mm lengths but they can be cut at discrete points between every third LED. They are described as "50CM 5050 SMD 36 LED Warm White Aluminium Rigid Strip Bar Light Lamp" and I bought them from bgood2010 on eBay.

I got some from another seller and although the eBay picture looked the same the extrusions where actually not as deep. The STL files on GitHub are for 8.6mm deep extrusions and are generated by light_strip = RIGID5050_290. Setting it to Rigid5050_290 generates the clips for 7mm deep extrusion. Other sizes can easily be accommodated as long as they are rectangular. The definitions are here.

Rather than waste the off-cut I mount it above with a second pair of end caps that clip onto the main light strip. These are set back just far enough to avoid the build volume in the unlikely event you print something tall at the back edge of the bed. This is calculated by the model with lots of trig and Pythagoras maths. Set show_rays = true to see this view showing that the camera and lights are pointing at the centre of the bed and the build volume is clear.

Another light strip that can be selected is this one: FSRP3W, discovered by Alzibiff.

Again the end caps are removed and replaced with printed ones that clip into the screw channels in the extrusion. There is no room for the plug so I just solder the wires on.

It looks neater and gives a more diffuse light but is not as bright as the double strip of 5050 LEDs and is more expensive. I bought it from

The only problem with these light strips compared to my original Sanken ones is that they are unregulated, so they flicker when the bed switches on and off. I described how I fixed that here. I also need to update the mounting for the Raspberry Pi to accommodate the plethora of new Pis that have appeared since my original design.


The Huxley version is scaled down in the same way as the Sells Mendel was scaled to make the Huxley. It has a build volume of 150mm cubed and uses NEMA14 motors, 6mm smooth rods and M3 fasteners for the frame. There is a good photo of it alongside the full sized machine on Ivor O'Shea's blog post.

The NEMA14 motors have about half the torque of the NEMA17s when driven with the same current. The Y carriage and bed have about half the area hence half the mass, so that is about right. Also a NEMA14 has half the mass of a NEMA17, so the X carriage also has about half the mass.

I believe the flex in the middle of the rods is proportional to the length cubed times the weight divided by the bar radius to the power of four. The length of the X rods is almost exactly 75% of the Dibond version and the diameter is obviously 75% as well. The relative flex then boils down to 0.5 / 0.75 = 0.67. So going down to 6mm rods is justifiable as well. Everything scales very nicely physics wise.

As the design is fully parametric shrinking it should have been easy, but because vitamins don't scale perfectly lots of snags arose where things clashed. A typical example was the x_motor_bracket. The NEMA14 motors are smaller but the raised boss around the shaft is the same size. This makes the bracket a different shape and it then needs a support to print it.

Half a truncated teardrop with a crutch!

The heated bed was made with veroboard and coincidentally has the same resistance as a full sized Prusa PCB, so the machine takes the same amount of power but heats up about twice as fast. There is no room on the frame for an ATX PSU, so I used an external XBOX 200W PSU. I couldn't find a spec for the 5V standby rail but it seems to supply enough current to power a Raspberry Pi.

Direct Drive Extruder

The extruder is where the scaling fell down a bit. The original Huxley used a Bowden drive to make the carriage small. I didn't fancy that but I didn't want to have the carriage as big as a geared extruder would need, so I went for direct drive with a NEMA14 and 1.75mm filament. 

The filament needs about one third of the force to feed and a Wade's has roughly 1:3 gearing, so a direct drive NEMA17 is about equivalent. The NEMA14 has half of the torque, so it is a bit under powered. I used the smallest drive pulley I had which was a mini hyena from Laszlo Krekacs' Indigogo campaign. Unfortunately I don't think the small diameter version is available now. I could probably make one from a hobbed bolt if I needed to or hob one from scratch.

It feeds PLA fine at 200C but isn't able to pull it off a spool. I will try a spool holder with a central bearing rather than the rim bearings to see if that is low enough friction. If that doesn't work I might try a powered filament supplier like the one on the first Up printer preserved here. Or maybe even try Bowden drive.

The design is parametric so there is a NEMA17 version suitable for Mendel90. I just need to adapt it for a commonly available drive pulley. It should just be a matter of adding a description here.

It can also use the E3D hot end but that doesn't fit between the bars on a Huxley90.

So that is Github up to date and hopefully correct although I haven't tested a lot of these changes.

I noticed that Blogger is now a lot worse than it used to be. Headings and pictures are now a nightmare.


  1. Hi nophead. How much torque would you say is required to direct drive the E3D V6 lite with a 1.75mm filament. I have a Prusa i3 Plus which uses a direct drive extruder, and I am finding its sometimes skipping steps. The stepper is a SX17-1003LQEF which rated as having a holding torque of 0.3Nm (

    1. Hi Giles,
      I don't know as I haven't tried an E3D yet. It also depends greatly on the nozzle size and the drive pulley radius of course. I am surprised a NEMA17 struggles though. What current are you using?

      On my todo list is to make a jig to measure the force needed to extrude for various speeds, temperatures, plastics, nozzle sizes and hots ends. Too much suck it and see in the RepRap world and not enough hard data. I intend to do a lot of experiments before I design my next machine.

    2. Its a 0.4mm nozzle. There was a firmware update in which the current was lowered to make the printer run quieter (its a rambo mini where current can be altered from an rc circuit connected to pwm output) Perhaps I will change back to the value in the old firmware, just for the extruder.

      Ideally I should measure Vref on the board but I am not sure what it should be...(ok I found your motor math page.) "The motor current is equal to the reference voltage divided by 8 times the sense resistor." and the sense resistor on the mini-rambo is 0.1ohm. So for 1 Amp current, I want vref to be 0.8 volts?

      That's a really good idea about making a jig to measure extrusion force. I looked into force meters, the spring ones look cheap enough but I don't know how accurate the results would be. Digital ones are very expensive!

  2. Yes 0.8V gives "1 Amp" but that is the peak current into one coil. The motor holding torque spec is actually with both coils on at 1A. With microstepping drivers the current is 1/sqrt(2) when both coils are on. That said RepRap machines never use enough current to get the rated torque because the motors run too hot for plastic mountings and most drivers can't do 1.4A due to lack of adequate heat sinking.

    I did buy a digital force meter for this job but haven't got round to using it yet.

  3. i do love your physics investigations and experiments - have you ever run the numbers on extruders?
    i'd be happy if you check my work.
    how can a printer do so well with such horrible numbers?
    (i didn't compute microsteps)

    1. Your figures look correct to me. If you take the Mendel90 case of 0.4mm nozzle, x 16 micro stepping ~7mm hob then it works out to be about 0.1mm, which is about the target resolution of RepRap.

      What is vitamin G?

    2. Vit G is a 20,000 step/rev (full steps) extruder we needed to print with wax filament for lost wax casting.

    3. The gear ratio also limits how fast you can retract / fast forward. The speed that you need to do that depends on the pressure you need to build up / release, i.e. flow rate, nozzle size and viscosity. So there is definitely an optimum gear ratio that is a balance between accurate deposition and clean starts and stops. This is something I intend to explore in the future.

    4. What is the maximum step rate one should expect from firmware on arduino?
      Is it a practical limit on speed?
      (my 50MHz 486 gives me @ 8000 steps per second - hardly a screamer)
      I'll be eagerly awaiting your report - you do excellent science - all the theory with real empirical bricks. Solid.

  4. Marlin has a maximum interrupt rate of 10kHz, above that it starts doubling up steps and above 20kHz it does four steps per interrupt. So it goes up to 40,000 microsteps per second but you effectively have a quarter of the microstep resolution during the high speed part.

    1. That's pretty smart! Thanks for the info.
      Printing in machineable wax, 3mm

    2. Maybe you can use this:

  5. Is there a way I can generate a view of the Direct extruder assembly in OpenSCAD? Preferrably a fully-built one, and an "exploded" one so I can see what goes where?

    1. Yes. If you open scad/direct.scad in OpenSCAD and press F5 it should draw the assembly view. If you add $exploded = 1; before the first line it will explode the view.

    2. Thanks for your continued curation of this project! Happy New Year!