Search This Blog

Thursday, April 9, 2020

CubeX and CubeXY Z axis and Bed Design Discussion

This post is specifically about the CubeX's Z axis design, the redesign of that for CubeXY, and CubeXY's bed design.

CubeX Z-axis


Top down view of CubeX Trio. Right: original Z axis motion system. 

The original Z-axis design used a single NEMA23 stepper motor located at the center back. It drove a 10mm lead screw, which attached to a flimsy, milled polycarbonate plate, which attached to two custom machined 12mm linear bearing blocks, which attached to the two cantilevered bed arms, which supported the bed via three long M5 screws + springs. The whole design is mess, and one of the primary complaints about this printer. If the bed is very light, cantilevered bed designs work ok. However, this bed is far too large to be cantilevered. Fundamentally, linear bearings on shafts are only designed to support radial loads. They are NOT designed to counter torque loads. The proper way to handle torques on linear shafts is to have two linear bearings spaced far enough apart such that the applied torque results in applied radial loads lower than the radial load rating limit of the individual linear bearings. Unfortunately, there isn't much vertical room in a 3D printer for spacing linear bearings far apart. To be fair though, the original designers did attempt to do this. The Z axis linear bearing blocks, which are about 80mm long, had two short 12mm linear bearings in them, with a small amount of space between them. However, given the high wear on these bearings and the resulting play (+/- 1/8" at the front of the bed), this clearly wasn't enough spacing.

Side note time. This is partly why linear guides, e.g. MGN9 or MGN12, have gained popularity over linear bearings in high end 3D printers: linear guides are actually designed to handle torques about all axes, as well as restricting motion to 1 degree of freedom. Here is a screenshot of the MGN (Hiwin brand) linear guide specs:



MR, MP, and MY are all moment loads. You can see that a MGN9H, which has a 9mm wide rail, has a dynamic load rating of 2550 N and moment ratings of ~20, 19, and 19 Nm. If you think about that, it's pretty incredible. That's a lot of force and torque! All MGN12 used in 3D printers are super overkill, even the MGN9's are. However, not all linear guides are created equal. Misumi, THK, and Hiwin are good brands, and also pretty expensive. I bought a new genuine Hiwin MGN9H 430mm rail + carriage off eBay for $89. Railcore's entire MGN set costs less than that, because they are sourced from cheaper Chinese manufacturers. These knock-off MGNs are nowhere near as high quality, and have to be rebuilt and lubricated (lots of youtube videos on this process) before use. For 3D printing though, super high accuracy isn't important, so this is typically ok. I just didn't want to spend an hour rebuilding a rail, but if I had to buy 6+ of them, I'd probably do the buy-cheap-and-rebuild thing.

Anyways, back to the CubeX's Z axis. The Z linear bearings were subjected to a sustained torque that they were not designed to withstand, and so wore out, resulting in a lot of play. This caused the bed to bounce at high speeds, which ultimately limited the printer's speed to ~25 mm/s. It's probably also why the NEMA23 was used...they bearings and/or lead screw probably started binding, so instead of fixing the problem, they just used a higher torque motor. I decided that all of that would have to go.

CubeXY Z-axis

There are hundreds of variations on bed and Z-axis designs for cube-ish gantry style 3D printers, and an equal amount of misinformation. I tackled the redesign by starting from scratch and using proper mechanical design principles. The bed/Z axis needs to be fully constrained (old design was under constrained), but not over-constrained. Because 3 points determine a plane, exactly three Z vertical supports (lift points) are required to support the bed. If a bed only has one vertical support, it can pitch and roll about it. If it has two, it will pitch or roll about the line between the two points. If it has four or more, then the bed will be warped by the extras if rigidly attached to them, or not rest on more than 3 (and tip like an uneven four legged chair) if it is not rigidly attached to them. This means that I needed to design a system to raise/lower the bed frame from 3 points. There are two main ways of doing this in 3D printers: lead screws + nuts, or belts. Since the current frame design seemed to be more amenable to lead screws, I opted for those.

Note: I used "bed" and "bed frame" sort of interchangeably here. This will be clear later, but it is possible to have a bed without a bed frame, and since I hadn't yet fixed the bed design at this point, the bed/bed frame is amorphous.

I decided on a three-stepper motor system to drive the three lead screws directly. Originally, I planned on using a large loop timing belt with one stepper to drive all three screws. Each lead screw would have a pulley and radial bearings at the base. However, after looking at how difficult it is to splice belts, I decided against doing this. That left using one stepper motor per screw. This had the unfortunate affect of resulting in 6 total stepper motors (extruder, X, Y, 3 Z). Most 3D printer stepper driver boards only have 5 stepper drivers. Thus, I had to buy a second driver board (SKR v1.3, but could have used a cheaper board, see the Electronics section in this post). This cost was partially offset by not having to buy materials and pulleys for the lead screws, since I already had 3 identical NEMA17 stepper motors from the CubeX Trio's extruders. I did a quick estimate of load on the lead screws considering the bed, bed frame, and max potential part mass, and determined that these three NEMA17's with T8x2 lead screws would be more than sufficient for the Z axis drive. A bonus of using three independent Z-axis motors is that automatic bed tramming and leveling will be possible.

Now I have a way of supporting the bed frame from three points and moving it up and down (Z-axis). This also happens to support rotation about X and Y (pitch and roll torques). However, the bed/bed frame is not constrained in yaw (rotation about Z) or linearly in X and Y. The lead screws do have some lateral stiffness, but it is not enough, so some other way of constraining the bed frame in those axes is necessary. I considered two different approaches: 1. Linear rail guides, 2. linear bearings.

As discussed above, and showcased by Railcore, linear rail guides are a great way to constrain motion to 1-axis. I could have followed Railcore's example and used one guide per Z-axis lead screw. Each guide would full constrain each nut to travel only in Z. Now if you were following my discussion earlier, you'll realize that this is actually now over-constraining the bed/bed frame. Assuming the bed frame is rigid, having three linear guides (which constrain motion in all axes but vertical, including all rotations) rigidly attached to it is bad. Railcore II solved this with something called a kinematic mount, which I devote a whole section to further down. However, due to the overconstraint issue of linear guides and the fact that I already had 4 nice vertical 12mm linear shafts that I could utilize (in the CubeX's frame), I decided to go with option #2: linear bearings. Now wait, didn't I just rant about how the Z axis linear bearings in CubeX were it's downfall? The key here is that when linear bearings are properly implemented, they are excellent in linear motion applications.

Linear bearings support radial loads. The three vertical lift points (from the nuts on the three Z axis lead screws) support the pitch and roll torques, which the linear bearings can't handle. Adding one vertical linear bearing to this system will support X and Y linear loads (which are radial from the linear bearings perspective). However, the bed frame will still be (somewhat) free to rotate about that bearing in the Z axis. So one more linear bearing must be added. Thus, the two linear bearings counter X and Y linear forces and torque about Z, and the three lift points control Z linear motion, and counter torques about X and Y. There is a little bit of over-constraining due to the two linear bearings: they will be able to handle some torque about X and Y. Also, the lead screws have some bending stiffness. But if everything is properly aligned and somewhat level, these "secondary" over-constraints should not cause any problems.

Since the old bed frame already had provisions for connecting to two linear bearing blocks, I decided to reuse the bed arms. I flipped them around 180 deg, so that the vertical linear bearings would be on the two front shaft posts. This allowed two of Z motors+ lead screws to be in the front corners and one in the center of the back (as before). If the bed hadn't been rotated, there'd be a lead screw right in the middle front of the printer, which would be ugly and make getting parts out difficult.

To help take any lead screw non-straightness out of the equation, I purchased three plumb couplers (5mm-8mm) from Zyltech to connect the motor shafts to the lead screws. The lead screws are also Zyltech: 400mm pre-cut T8x2 with brass nuts. Helpful tip: the precut ones are 1/2 the cost of the custom cut length ones. These are single start lead screws with a 2mm pitch. Smaller pitch is better on a Z axis because it doesn't move quickly and it needs to be very accurate. You don't want to use T8x8 (4 starts) on a Z axis. I'm also not using anti-backlash nuts; they're worthless considering the weight of the bed+bedframe (5+kg's), even when doing Z hops. Since stepper motors aren't designed to handle much axial load, I also purchased three 5mm ID x 12mm OD x 4mm thick thrust bearings off eBay (McMaster has some very nice thrust and needle bearings with larger OD's, but they're a little pricey). These will go on the motor shafts between the motor face and couplers. The motor mounts are described in this post. Here are two pictures of the lower part of CubeXY, including the Z axis system.

note: lead screw threads not rendered



The lead screw nuts are bolted with M3 lock nuts and screws to 3D printed clear PETG blocks. I used PETG for its heat resistance (close to bed), and clear because it matches the printer's color scheme. The front blocks are integrated with the new linear bearing blocks, which contain THK LM12LUU 12mm linear bearings. I opted for name brand linear bearings because they're only about 2x as expensive as cheap knock-offs when purchased from overstock sellers, e.g. Radwell. The LUU's are 57mm long, so I made the blocks 60mm tall, which is 20mm shorter than stock, which results in 20 mm more usable Z print space. The back nut block is integrated with a beam that the bed frame arms screw into.

Rear nut block + bed mount

Front bearing + nut block


The two front blocks bolt to a laser cut piece of 3/16" thick acrylic plate that spans the front of the printer. This replaces the flimsy polycarbonate one from the back of CubeX. I also etched a cube logo into it for fun. I integrated the linear bearing clamping mechanism with the slot that this plate gets bolted into; when the plate's bolts are tightened, the linear bearing is clamped in place. I used a combination of square nuts and melt-in inserts for these. Square nuts were used where I either didn't have the depth for melt-inserts, or I couldn't get the soldering iron in position. There are cylindrical cavities in the blocks for clearance over the Z motor couplers. This was done to maximize Z travel. The Z axis is now able to use all but 62mm (60mm tall blocks + 1 mm on either side for clearance) of the vertical shafts for print volume.

Side note: As mentioned earlier, the Z-motors are the former extruder motors. In fact, all of the NEMA17's from CubeX are the same motor: Motion Control M42STH47-1684S. This line appears to be defunct, but I was able to track down a data sheet for them. Max current per phase is 1.68A, Holding torque is 43.1 Ncm, 48mm long, and 350g. This means the whole extruder assembly weighed at least 1.5 kg, making the whole X-axis somewhere north of 3 kg probably, which is kind of crazy...probably part of the reason this printer was so slow. These motors were way overkill for extrusion...no idea why they didn't use a smaller motor from the same line. It's not like they were trying to keep BoM size down or anything, considering the rest of the printer. Anyways...

The result of all of this is a Z-axis and bed frame for CubeXY that is properly constrained and rigid. The next section discusses the bed itself.

CubeXY Bed

3D printer bed and bed mount requirements:

  • Surface must be flat
  • Melted plastic must be able to stick to the surface
  • Bed material must be thermally conductive for even and fast heating
  • Bed must be level-able, but stable enough to not require constant re-leveling, despite thermal expansion of the bed. 
The first requirement is best met with either glass or ground-flat cast metal plate, both of which are usually flat within 0.005". Melted plastic stick to both well, but both can also have a thin sheet of PEI bonded to them for enhanced adhesion. Glass is actually thermally insulating and difficult to attach to (can't easily drill holes in it), which is why it's often placed on top of a thin aluminum bed, which acts as a heat spreader and mount. Unfortunately, these thin aluminum beds often are not very flat because they aren't cast and ground, resulting in uneven contact, and thus uneven heating of the glass. A ground cast aluminum plate without any glass is a far superior bed surface. It's thermally conductive and easy to attach to for mounting. It is also electrically conductive, allowing the use of inductive Z-probes, which are one of the most accurate methods of bed location sensing (for travel limiting and mesh-based bed leveling). Railcore, Voron, Jubilee, and many other high end printers all use cast aluminum plate for heated beds. The only disadvantage is that its heavy and has a lot of thermal mass. The thinnest cast ground plate you can purchase in the US is 1/4" thick. Midwest Steel has the best prices I could find on cast ground aluminum plate and bars. The stock for CubeXY's bed and X-axis arm (20x21x1/4") was ~$90 shipped at the time of writing this. Some of the high end printers actually mill out a pocket in the underside of the bed for the heater to sit in. This reduces mass, so it's lighter and heats faster, without reducing stiffness much (because the edges are still full thickness). I decided not to mill out a pocket for the heater in the underside of CubeXY's bed. I don't think the performance increase was worth the extra cost of CNC time to do so, and the spec'd 800W heater should be more than sufficient for rapid heating.

The above discussion covers the first three requirements. The fourth is more complicated, and it's probably best answered by reviewing my design process. I had two basic options for the bed: 1. Ditch the bed frame, vertical linear shafts, and linear bearings for rail guides and go full railcore/jubilee style with the bed stiff enough to support itself, or 2. Keep the bed frame and put a bed on it. 

Option 1 would basically require throwing out the entire (well, what's left of it) CubeX printer, including the Z axis discussed above.  It was partially because of this that I went with Option 2. This decision is also why I mentioned earlier that the bed/bed frame terminology was nebulous...I designed the Z-axis and the bed format together. Instead of somewhat-arbitrarily disregarding Option 1, I'm going to walk you through my design/thought process, which starts with a review of what Railcore and Jubilee do and why they do it.

Pictures are best. Here are Railcore II and Jubilee:

Railcore

Railcore with kinematic bed mount
Jubilee showing off its tool changer

Jubilee kinematic bed mount 
We'll start with the Z-axis, which is similar for both. The Z-axis uses three linear guides (not shafts+bearings) accompanied by three lead screws driven by independent steppers with plumb connectors. The steppers + leadscrew arrangement is very similar to what I have planned for CubeXY, but everything else is different. The linear guides technically constrain each corner (also calling the middle back of the bed a "corner") of the bed fully except in Z, which is handled by the screw nut. So each corner is fully constrained. This would normally cause mechanical problems if a bed and/or bed frame was rigidly attached to all three: the system is overconstrained. Neither of them use a bed frame, but the bed is milled from ground 1/4" aluminum plate, which is stiff enough to not need one. The first few versions of railcore rigidly attached the bed to the linear guides (see first railcore picture above)...while no specific issues were reported, this was fixed for the ZL, "Z leveling", version via the use of a "Kelvin kinematic mount" for the bed. Jubilee also utilizes a kinematic mount, though of the Maxwell type. I go into much more detail below about these, but for now, all that needs to be said is that a kinematic coupling perfectly constrains, but not over constrains, whatever is being coupled. Thus, the bed is not actually over-constrained for these printers, despite each Z column being fully constrained.

Thus, I could have replicated this type of Z axis and bed for my printer. Railcore II ZL and jubilee have nice mechanical designs. However, I wanted to keep some of CubeX in CubeXY, so this simply wasn't an option. I did make some design decisions with this in mind for the future though...if I ever decide I don't want CubeXY anymore, I can transplant a lot of it to a new printer frame based on Railcore/Jubilee.

I mentioned "kinematic coupling" earlier. A kinematic coupling is a fixture that exactly constrains a part, providing a precise and repeatable alignment, as well as compensation for thermal expansion/contraction. The principle of exact constraint means that the number of contact points equals the number of degrees of freedom. In order to exactly constrain something in 6 DoF (3 linear, 3 rotational), precisely 6 contact points are needed. The following picture depicts two types of kinematic mounts.

Left: Kelvin, Right: Maxwell
From the wikipedia article on kinematic couplings: the Kelvin mount consists of three spherical surfaces that rest on a concave tetrahedron, a V-groove pointing towards the tetrahedron and a flat plate. The tetrahedron provides three contact points, while the V-groove provides two and the flat provides one for a total required six contact points. The Maxwell kinematic system consists of three V-shaped grooves that are oriented to the center of the part, while the mating part has three curved surfaces that sit down into the three grooves. Railcore II implemented a Kelvin type kinematic mount. Jubilee and, as I show further down, CubeXY implement a Maxwell type. Railcore and Jubilee's beds have attached stainless steel balls or rollers that interface with the other pieces of the coupling (groove, rollers, flat plate, etc) on the blocks that attach the individual Z nuts and linear guide carriages. Looking at the above picture, the bed would correspond to the upper piece. However, it's harder to understand the correspondence for the lower piece. Kinematic couplings require the things they couple to be rigid. 1/4" aluminum plate beds are rigid. However, the rest of the coupling (the lower piece in the above figure) is made up of the Z blocks, linear carriages and Z lead screws, the aluminum extrusion that the linear guides attach to, which transfer load to the base frame, and around to the other vertical aluminum extrusions. In other words, the entire bottom half of the printer makes up the lower piece in the above figure, which clearly isn't ideal from a stiffness perspective. This is another reason I decided against Option 1; having a stiff bed frame is a potentially superior lower coupling part than half of a 3D printer's frame.

This and this website have some excellent descriptions of kinematic mounts and some other concepts. This website has some more info applicable to a 3D printer bed, specifically of a Kelvin type kinematic mount.

Going back to the previous section, CubeXY's Z-axis consists of a fairly rigid bed frame that is attached to 3 Z lead screw nuts and two vertical linear bearings. This system is fully constrained, and somewhat over-constrained in rotation about X and Y due to the vertical linear bearings. If the bed were not heated, it'd be perfectly acceptable to simply rigidly attach (bolt) it to the bed frame. However, if that's done to a heated bed, the bed and bed frame would experience large stresses due to the thermal expansion of the bed. Thus, I need to connect the bed to the frame in a way that does not over-constrain it and allows for thermal expansion.

Side note: This is a good point to talk about the classic screws+springs method of mounting beds to 3D printers. The reason these are often finicky is that they do not allow for thermal expansion. When the bed expands, it moves/bends the screws. When it contracts, the move back. Each cycle results in a slightly different final position, which ultimately requires the bed to be re-leveled often. This problem is made worse if they have four screws+springs, one at each corner, because not only does this not allow for thermal expansion, it also over-constrains the bed (remember the four legged table analogy from above). This is why it's often recommended to remove one of the corner screws+springs, and I actually did this with my Wanhao I3. However, that doesn't solve the thermal expansion problem. So why is this bed mounting method still the norm? Because it sort of works and is very cheap to implement. Back to the original discussion...

Thus, to meet requirement #4 in the list at the beginning of this section, I use a 1/4" thick cast ground aluminum plate bed mounted to the bed frame via a Maxwell kinematic coupling. Now all of the requirements for a heated 3D printer bed are met. Next, I'll discuss my implementation.

Ideally, kinematic mounting surface are made of very hard materials, e.g. ceramics. This helps prevent deformation (dents) of the surface, which can compromise the integrity of the kinematic coupling. However, for the purposes of 3D printer applications, where the forces on the bed are small and the bed will not be removed and reattached often (not to mention that micrometer precision is not possible in FDM printers anyways), this requirement can be relaxed. Annealed stainless steel should be sufficient, and also inexpensive.

I originally designed small stainless steel V-groove blocks, which I was going to cut with a 90 degree point end mill. However, the cost of the steel stock and end mill ended up being about $30. I figured that, if I insulate the bottom of the bed heater (which I was planning to do anyways), I could use PETG for the blocks that the bed mounts to. This allowed me to use 1/8" SS304 rod stock (~$1) to simulate a V-grove. You might have caught this earlier in the picture of the front nut block, but here it is again:



Here are the sides:

Front left bed mount. Screwed to bed arm.


Front right bed mount.

The bed plate has 3x 8mm SS304 threaded balls (from eBay, search for M3 or M4 balls), which are screwed to the bottom of the bed using M3 countersunk screws. Each ball rest in a groove formed by two parallel 1/8" SS304 rods. These 6 contact points are the only contact points between the bed and the rest of the printer. 6 contact points: 6 constrained DoFs. The rods are held by the (clear) PETG 3D printed blocks. All kinematic couplings require some positive pressure to keep the two parts together: this can be with properly designed bolts (not-constraining) or springs (no lateral stiffness). I decided to do what Jubilee and Railcore do: attach a tension spring between a small screw in the bed and a small screw near the corresponding coupling block. While the weight of the bed would probably be sufficient, the springs provide some extra force to keep the coupling engaged. 3D printing the Z nut blocks and bed mounts of PETG (on my old Wanhao I3...took about 8 hours to get the settings tuned, ugh) saved a lot of CNC machining time, which is expensive compared to 3D printing time, and allowed me to design things to be more integrated, resulting in a lower part count.

The angles of the grooves (rods) and the location of the balls are very important for a Maxwell kinematic coupling. The video in this link explains how to layout a Maxwell kinematic mount. There are other various online resources that cover this material, as well. Basic method: First, draw a triangle by connecting all of the center of the balls. The center of a ball must lie in the plane of the contact forces (middle of the rods in my case), and the normal to the plane of the contact forces at each point must bisect the local angle of the previously drawn triangle. Here's a helpful diagram I found online (ignore all of the notation, just look at the ball/grooves):

Maxwell mount diagram


That completes this post. I hope I managed to convey some useful information for 3D printer Z axis and bed designs. If something wasn't clear, or if you have any corrections, please leave a comment. 

No comments:

Post a Comment