Saturday, 12 December 2020


Continuing my series of adventures in 3D printing holes the correct size, I turned my attention to countersink holes. 

I don't normally use countersunk screws in 3D printed parts because they create lateral stress, whereas other forms of screw exert a purely compressive force, which can be spread by a washer. However, I am currently designing a part that needs flush screws in its base that is only 4mm thick, so there is no room for a counter-bore to bury a flat head.

First I had to improve my countersunk screw model because I previously just used a 45° cone with a sharp edge. In practice the edge has a nominal thickness of 1/10th of the screw diameter. That means if you countersink the hole with a normal conical countersink drill bit it has to be oversized to sink the head flush, and then leaves a gap around the circumference.

So the ideal shape for a 3D printed hole is an improvement because it can have a straight section at the top.

The complications are that, like horizontal holes, we have to take into account the rounded staircase produced by the filament layers and also, like vertical holes, we need to use polyholes to get the correct diameter when printed.

The cone makes contact with the rounded filament edge above, rather than the centre of the extrusion, where the slicer samples the model, as shown below:

In order for the extrusion to not overlap the cone it has to be offset outwards by a distance $x$, which is simply $(\sqrt2-1) r$ where $r$ is half the layer height. Applying that to the line equation of the cone and limiting the result to be in the range between the screw clearance radius and the screw head radius gives the correct placement for the rings of filament that just touch the cone without overlapping.

To make each of the rings print the correct size I make a stack of polyholes to subtract from the model.

These are double sided so they can be subtracted from the either the top or the bottom of a hole. As the slope is 45° they should be printable either way up.

This is what it looks like subtracted from a part:

I have added an OpenSCAD module called screw_polysink() to NopSCADlib to make printed countersinks. I haven't tried printing it yet but it should certainly work on a top surface. It might get a bit scrappy printed as an overhang without support.

Thursday, 23 July 2020

Over cooked it

When I was printing 24/7 for about 5 years I never had a problem with filament absorbing moisture because the heat from the machines kept the rooms they were in hot and dry and the filament was stored in the same rooms as the printers. In fact in winter it was so dry I had to buy a long conductive ESD mat that runs the length of my workshop and wear ESD ankle straps to prevent getting sparks off everything I touched.

Since I retired I print more sporadically and tend to go away in winter and leave the heating at only 12°C. I still didn't have a problem with the white ABS that I got from Germany for kit production. It was unusual in that its natural colour was white instead of cream and it didn't smell much while printing. I used to find that I might get one or two bubbles in the skirt round the object but after that the rest of the print was fine. It appeared that filament sitting in the extruder from the last print would absorb some moisture over time but the rest on the spool that hadn't been melted did not, no matter how long it was left.

I also got some black ABS from the same German company and that is totally different. It bubbles very badly and needs to be dried. It also smells like ABS when it is printed. I never got good results from printing it, so I put off using it for years until I ran out of white. I then decided to tackle the moisture problem. Inspired by RichRap's heated dry box, I designed a parametric heated dry box that I could tailor to fit any size spool.

When I made the Dibond version of Mendel90 I noticed the dummy load resistors for the ATX PSU ran a lot cooler than they did on the MDF version. I came to realise that Dibond makes quite a good heat spreader even though the aluminium layers are only 0.3mm thick.

I also had lots of 47 Ω 50W TO220 resistors from various heated bed iterations that didn't go too well. Since this doesn't need to get very hot or need much power I thought it would be a good way to use them up.

I have a parametric box in NopSCADlib that is made from Dibond panels and printed brackets that can be scaled to any size that fits my CNC mill, so it was easy to wrap that around my large 2.4kg spools and add 12 resistors along three sides. The spool runs on 608 ball bearings between penny washers, there is a thermistor to monitor the temperature and a small fan to stir the air around.

I ran the resistors in series from half rectified mains to give a total wattage of 51W. I earthed all the panels and covered all the connections with heat shrink sleeving but it wouldn't pass any safety standards as the wiring isn't double insulated. Safe enough for me though as I don't need to put my hands inside it but I wouldn't recommend it. 

For my smaller 1kg spools I use 9 resistors and wire them in parallel for 12V operation. That gives 28W, which is enough for the reduced surface area and much safer.

To reduce the energy consumption I obviously needed to insulate the outside of the box, so I suspended it inside another slightly larger box and filled the gap with cotton wool. It is a lot nicer to work with than fiberglass or rockwool and quite cheap in the quantities needed. It is also just the right thickness to fill the gap, which is dictated by the corner fixing blocks. Even without the cotton wool the air gap gave quite good insulation. The only connection between the inner and outer cases is a few printed standoffs and the wires and filament exit guide.

It is completed by a hinged double door made of acrylic sheets with a hygrometer and thermometer module in the inner door. An arduino Leonardo with an LCD, some buttons and a couple of MOSFETs controls the temperature and the fan and keeps a record of the heater duty cycle. Again parts I had to use up.

So basically I created a 3D printed fan oven! 

The base of the outer box is extended, so it bridges the frame stays of my Mendel90s after removing the spool holders. Four fixing blocks stop it sliding off but are only screwed to the base, not the printer., so it can be lifted off and they then act as feet.

The mains version is controlled by a stand alone Arduino thermostat I had previously built to control a beer fridge. Another reason the first version was mains operated.

I have parts to make a third one the same as the second, after that I will probably make it headless with an ESP8266 and an I2C temperature and humidity sensor.

To dry the ABS filament I set the temperature to 80°C for a few hours and then left it at 50°C, even when the printer is not in use. The relative humidity in the box drops to about 19%. In the room it is about 60%. When I was printing 24/7 it used to be well below 50%.

As well as stopping bubbles it improves surface finish making it more glossy, makes bridges pull tighter, completely stops nozzle ooze at the end of a print and even reduces the ABS smell while printing to almost nothing.

At the end of a print I retract an extra 1mm and turn off the heater before moving Z back to the top. Without the dryer I used to get 10 to 20mm ooze out of the nozzle as the extruder cooled down. I had always assumed this was due to gravity but it is in fact due to moisture turning to steam pushing the filament out. When it is dry the surface tension must be sufficient to stop any flow due to gravity.

I was used to snapping off the ooze before I start a build, it had become an unconscious action, but now there is nothing to remove. It will be a big advantage when I make a multi material machine as there should be no ooze from the idle extruders while another is being used.

The reduction in smell was a complete surprise. Before I dried the black ABS it seemed to smoke as it came out of the nozzle. I now realise that was water vapour and it must carry off some volatile products. It now hardly smells at all when printing but if I stick my nose in the dryer it does smell of hot plastic, even though it is only at 50°C.  I guess the moisture it has driven off carries some VOCs with it.

About a year ago I got some wood coloured ABS in the UK which was even more affected by moisture than the black, so that is when I built the second smaller dry box, around October. After drying it printed very well. I made this replacement handle for a curtain puller with it.

After switching the dry boxes off when we went away for the winter I turned them on again in March and they have been on ever since. I last printed with the brown plastic at the end of May and it was fine but when I tried to use it yesterday it has gone super brittle. The coil has a very strong heat set, something I don't like about 3mm filament on 1kg spools, and bending it straight now causes it to snap.

I was trying to use it on my original MDF Mendel90 that is now encased in a box with a chamber heater. The filament feeds from the top of the box rather than through a PTFE tube that runs all the way to the extruder. The part that was outside of the dry box for about seven weeks was still ductile but had moisture in it. When I pulled the dry part from the box through it just snaped, so I can no longer print it on that machine. 

It does still seem to work on my Dibond machines that do have the PTFE tube all the way to the extruder. That keeps some of the coil's curve and doesn't require it to be fully straightened. 

And the printed objects don't seem to be brittle at all. I haven't done any proper strength tests but a quick test bending a small 100% filled block with pliers it bent and got white bruises like ABS normally does.

So keeping brown ABS at 50°C for a few months seems to completely denature it but a melt cycle seems to restore it. I have heard of PLA going brittle on the spool but nobody seems to know for sure what causes it. PLA is also somewhat brittle but ABS isn't at all. Presumably the long polymer chains must get shorter somehow and then reform when melted. I am not sure if the temperature is the problem or if it is too dry. I have read there is an optimum moisture level for processing plastic at, rather than as dry as possible, not sure why.

The black ABS hasn't gone brittle yet and it has been in its heated box for longer.

My prototype MDF Mendel90 runs with a chamber temperature of 45C and I have noticed that the printed parts it is made of seem to become brittle over time. The extruder runs a lot hotter of course and the Wade's block tends to crumble after a few years and needs to be replaced regularly. They last a lot longer on my unboxed machines. 

I also think ABS shrinks over time, even at room temperature. I made a test print with some holes in it a four years ago when I was having an interesting discussion about Polyholes with Giles Bathgate. I tested it with plug gauges but as I didn't have a case for them I left them standing in it on a shelf near a north facing window. When I went to use them for my Horiholes test I found they were stuck in it much tighter than I remembered and the plastic has yellowed slightly.

I made a case for them with a screw top using my thread utility in NopSCADlib, printed in the black ABS.

So now I have dropped the temperature of my dry boxes to 30°C as surely that won't degrade the plastic much more than in a hot room without sunlight. That vastly reduces the power consumption of course. 50°C needed about 50% duty cycle but 30°C is only 4%, only a shade over one Watt. The hygrometers are still reading 19% after a day at the lower temperature. I find that odd because, for a given air water content, reported relative humidity should increase as temperature falls.

So I think I will try initially drying new plastic at 80°C overnight and then reducing to 30°C for long term storage from now on and see how that goes. A good measure of whether it is dry enough is the complete lack of ooze at the end of the build.

Monday, 20 July 2020

Horiholes 2

As whosawhatsis pointed out in a comment on my last post, the edges of the filament staircase are actually semicircular and that makes a big difference as to where they should be to meet the circle tangentially. Not sure why I missed that as I have done several posts about extruded filament shape, I must be losing it!

This is what my previous shape actually produces.

The circle only touches at four points. The correct shape is obtained by calculating where the semicircles meet the circle.

The centres of the ends of the filament lie on a circle with a radius of the hole plus half the filament height. The end of the filament is then offset inwards horizontally by half the filament height. I.e. the slicer samples the layer at the central tip but the filament touches the circle on a tangent.

To make the shape geometrically I make a teardrop with a radius of the hole plus half the filament width, split it in half and shift the two halves together by half the filament width. As can be seen here that goes through all the filament tips, i.e., where the slicer samples.

This is what it looks like relative to the target hole.

Interestingly it is the same as my previous attempt at the top, bottom and sides, i.e. the only four points it touched before.

I made a test with the new formula.

The plug gauges all fit, but more snugly than before, so this is definitely a better solution for supporting a bearing in a pocket. At every layer it should have a tangential support from the rounded edge of an extrusion.

Here is a close up of the 6mm hole that is aligned on a layer boundary and the 1mm hole above it.

I have updated NopSCADlib on Github to use this method.

Saturday, 18 July 2020


Back in 2011 I came up with polyholes to get around the problem of 3D printed vertical holes coming out too small. Horizontally printed holes also come out too small but for a different reason: the slicer creates a staircase approximation of the hole, but because it samples the model at the middle of the layer, the top or bottom corners intrude into the circle.

 This shows a 6mm truncated teardrop sliced with 0.25mm layers, with red highlighting the overlap.

A long time ago I mitigated this by adding 1/4 of the layer height to the radius, for reasons I can't remember now, but it isn't very accurate. There is some slight interference vertically and gaps at the sides.

I am currently designing a gearbox with ball bearings in 3D printed pockets, which I want positioned accurately, so I decided to revisit the problem.

The correct solution is simple: the compensated shape for the teardrop is simply the hull of itself shifted up half a layer and shifted down half a layer. That compensates the top half so that the bottom of the layer ends up on the circle and the bottom half so that the top of the layer ends up on the circle.

So now all the tips of the stairs sit exactly on the circle, except near the top where the 45 degree overhang would be exceeded.

This is what the hole looks like before it is sliced.

It does of course make the model specific to being sliced at a certain layer height, but my models tend to be designed that way anyway,

I printed this test piece with 6mm holes at different offsets from the layer boundary as well as holes from 1mm to 5mm and I tested it with plug gauges.

The gauges fit all the holes easily. Some are snug and some have a little play vertically depending on how the top edge aligns with the layer boundaries.

The bridge layers over the top come out a bit low because the filament forms a cylinder from a volume that would normally almost fill a rectangle, making it a slight interference fit when the top  lines up exactly with the layers. In other cases there is a bit of vertical play due to the 45 degree limit at the top of the teardrop. This won't be an issue with my gearbox because it will be split into top and bottom halves and the top half will be printed upside down.

I have updated teardrop_plus() in NopSCADlib to use this method and also added a plus option to all the other variants like tearslot(). See and where you can find the code to make the test STL. 

It should work universally as long as all slicers slice in the centre of the layer. Obviously it makes less difference with smaller layer heights.