Friday, 10 June 2011

ABS on FR4

I have been printing both ABS and PLA on PET tape for more than a year now. It works well and lasts for many months, but eventually the silicone adhesive fails and it blisters. Applying it is fiddly to avoid any overlap but also not leave gaps between the adjacent runs of tape. I have been on the lookout for a solid material to avoid these pitfalls.

Stoffel15 (Wolfgang) told me that FR4 fibreglass PCB material works well. FR4 is the most common PCB material and is a glass fibre and epoxy resin laminate. It will handle solder re-flow temperatures (~ 240°C) for short durations and can be used continuously at 140°C. As I haven't worked on single sided PCBs for many years, I had forgotten what the surface of the raw material looks like. It is actually smooth and glassy, so ideal as a bed material.

I ordered some single sided PCB material from Farnell. It works fantastically well. It seems to have a bit more grip than PET and has the advantage that there are no lines on the part from the joins in the tape. It also has no give in it, so I don't get any blistering at sharp corners like I did with tape, sometimes leaving shallow dimples.


Another advantage is that when the object cools it tends to break free because it contracts more than the bed does. With tape there is some compliance, so it usually stays stuck when the object cools and it is often hard to remove parts. With FR4, if you get the layer height spot on, the parts break free of their own accord, and if not, are very easy to snap off. This vertex bracket was loose after the bed cooled to 50°C.

Yet another advantage is that I stick the tape to a steel plate 0.9mm thick that weighs 280g. The FR4 is 1.6mm thick but it only weighs 134g, so less than half the mass.

I also tried some plain FR4 without copper and that seems to work just as well. It is 0.9mm thick and weights only 75g. The disadvantage is it is bright yellow, which makes it hard to see the white plastic on it.


I have printed a full set of Mendel parts so far on FR4 and every part has come out perfectly flat, and was easy to remove.

I don't know if it will degrade over time, but there is no sign of surface damage so far. The dark features on the picture above are marks on the aluminium plate underneath.

The nice thing about the z - probe I have on HydraRaptor is that I can change the bed without any calibration.


This is what the underside of an object looks like.


I used the same temperature I used for PET tape, which is 140°C for the first layer and 110°C after that.

I haven't tried PLA yet, but my guess is it will stick because it seems to stick to a superset of things ABS sticks to.

Great tip Wolfgang!

In the past I tried FR2 (SRBP, Paxolin) but that did not work, probably because it had a matt surface. I also tried some CAT7FR, which is another type fibreglass PCB material, but again it had a matt surface and did not work very well. I was able to build a flat object on it, but the first layer outline did not stick properly, so some holes were a bit scrappy.

The copper on the bottom of the single sided material could be used as a heater like the Prusajr heated bed design.


Thursday, 9 June 2011

Reliable connections

After eliminating lots of other sources of unreliability in my machines, electrical connection failures are now the most common failure mode.

The latest failure on my Mendel was that it started leaving a 10mm gap in the outline rectangle that it draws around the objects. Since a bed full of objects still seemed to build OK I decided perhaps it was due to an air bubble in the extruder while it was warming up. However, one time I saw the extruder motor stall and realised it was actually a bad connection.

I have come to realise that simple friction fit connectors do not work in the environment of these machines. I tried re-seating the motor plug but that did not fix it, so I figured the cable must be faulty. I wired both coils in series to my multimeter and waggled the cable until it went open circuit. That allowed me to locate the break and it was, as could be expected, at the point where the cable bends the most, i.e. just below the cable clamp on the  top right of this picture: -


On reflection this was not a good arrangement as the cable is only just long enough for the extremes of travel, so it is forced to bend sharply both ways at the clamp. After millions of movements the strands break one by one but the insulation holds the ends together making it only lose contact when it is stretched. When I pulled the ends of the wires three of them snapped very easily, indicating most if not all the strands were broken.

I had a similar problem with the mains wire to a heated bed a while ago. In that case the arcing melted the insulation and allowed the live and neutral to short out, blowing a hole in outer sheath of the cable. Not good! Normally you expect a fuse to protect against a cable fire, but if all the strands start breaking, reducing the current capability, or it breaks and arcs, the fuse offers no protection against fire. Even a low voltage heated bed could fail in this way because of the high current.

The XY table of HydraRaptor uses 9 way D-type connectors. These have been totally reliable moving connections because they are screwed together and have gold plated pins and proper strain relief. The professional stepper motor drives on HydraRaptor have screw terminal blocks for their connections, and again they have proved totally reliable. In contrast all the friction fit connectors fail if there is any movement or vibration of the wire. Some even burn out despite being run at well below their current rating. The contact resistance rises and they then start to heat up.

I rewired my Mendel extruder using a 9 way D-type at the extruder and a longer loop of cable. That necessitated resiting the extruder controller and I also replaced all of its 0.1" MTA connectors with screw terminal blocks. The wires could go straight into these but I added ferrules to allow them to be more easily removed and replaced. I just push the wire into the ferrule and then squeeze it with pliers.

I reprapped a bracket to attach the DB9 connector to the back of  Wade's extruder bracket.

The pins are four motor connections, two heater, two thermistor and one heatsink fan that shares a 12V feed with the heater.

Here is the new arrangement :-


The cable loop is much longer, so it bends through a much smaller angle. The top end goes through two cable clamps before it goes to the extruder controller. I found that if you put a bunch of wires though a single clamp you can get some movement at the other side of the clamp. Using two eliminates any movement of the wire relative to the board, less critical now I that have screw terminals, but still a good idea.

It should last a lot longer than the previous cable (which lasted for 15 months of continuous use) and can be easily replaced. I have seen people use corrugated tubing to protect the cable, but I didn't fancy adding any more drag on the extruder as it would increase backlash.

Interestingly, although my extruder stepper motor connections have failed several times, I have never damaged the Allegro driver chips.




Monday, 25 April 2011

Auto bed leveling

One thing I find tedious is leveling the bed of my machines, so I decided to make use of the Z-probe on HydraRaptor to measure the incline of the bed and compensate for it in software.

First I had to increase the resolution of my Z axis. When I first built the machine I did not realise that I would need fine resolution on Z, so I used an old 24V unipolar motor that I had in my junk collection. With half stepping it gave me 0.05mm resolution. I thought that it was a 200 step motor and that the lead screw had a pitch of 20mm. It turns out it must have been a 250 step motor because the pitch is actually 25mm. I replaced it with a Keling KL23H251-24-8B NEMA23 left over from my Darwin and I now drive it with a x10 microstepping controller the same as I use on X and Y. That gives me a resolution of 0.0125mm and also makes it the fastest axis on my machine. It can easily do 150 mm/s but seeing the nozzle approaching the bed at that speed and then stopping within 0.3mm is very unnerving, so I limit the speed to 50mm/s!

I no longer need the heat sink and fan because the new motor is more efficient and is directly mounted on the axis, which takes the heat away.


I use 6mm aluminium tooling plate so I make the assumption that the bed is a flat plane (rotated slightly around the X and Y axes and offset a little in Z). That means I only need to measure the height at three arbitrary points in order to characterise that plane. I then use the method here to calculate the equation of the plane in the form ax + by +cz +d = 0. The method puts two vectors through the three points and takes the cross product to get a vector at right angles to both of them. That is the normal to the plane and its components are the coefficients a, b and c. Substituting the first point into the equation gives d.

It is important that the three points are ordered anti-clockwise, otherwise the normal vector would point downwards and the machine would try to build the object upside down under the surface of the bed!

Given the bed's plane I then have to make the model coordinates relative to that inclined plane and transform them to the coordinate system of the machine. To do that I calculate two orthonormal basis vectors on the plane using it's equation and use the normalised normal vector for the third. I then multiply the model coordinates by those vectors and add the origin to find where they are in the machine's coordinates. Here is the Python code I used: -

class Plane:
    "A plane in 3D."

    def __init__(self, p0, p1, p2):
        "Construct from three anti-clockwise points"
        #
        # Calcluate the normal vector
        #
        v1 = p1.minus(p0)
        v2 = p2.minus(p0)
        normal = v1.cross(v2)
        if normal.z < 0:
            raise Exception, "Probe points must be anti-clockwise"
        #
        # Coefficients of the plane equation ax + by + cz + d = 0
        #
        a = normal.x
        b = normal.y
        c = normal.z
        d = -a * p0.x -b * p0.y -c * p0.z
        #
        # Generate three basis vectors aligned with the plane
        #
        self.origin = vector( 0, 0, -d / c)

        self.k = normal                      # k axis is simply the normalised normal
        self.k.normalize()

        px = vector( 1.0, 0.0, -(a + d) / c) # an arbitrary point on the x axis: x = 1, y = 0
        self.i = px.minus(self.origin)       # find direction to it from origin
        self.i.normalize()                   # make a unit vector

        self.j = self.k.cross(self.i)        # make a third vector mutually at right angles to the other two
        self.j.normalize()                   # make a unit vector, probably is already

    def transform(self, p):
        "Transform a point to be relative to the plane"
        return self.origin.plus(self.i.times(p.x)).plus(self.j.times(p.y)).plus(self.k.times(p.z))

To test the principal I put a 1mm thick washer under one corner support of the bed to give it an extreme slant compared to normal misalignment. I then built a 100 x 100 x 5mm cube with 0.35mm layers. This would normally be impossible without the bed being level to a small proportion of the layer height. The result was that it came out fine.


As the nozzle traverses the object in XY the Z axis moves a few microsteps. It is barely visible but I can hear it and feel it if I hold the stepper motor shaft. The object is built perpendicular to the plane of the bed, so the sides are very slightly slanted with respect to the machine axis and the nozzle. I am not sure how well it would work on Mendel as the z-axis is geared down so much. It would probably still work as the movement required is so small when the bed is reasonably level. I can't test it as there isn't room for a z-probe on my carriage due to the large heat sink.