Search This Blog

Friday, May 8, 2020

CubeXY X-axis Re-redesign

One of the great things about hobbies is the lack of deadlines. Unlike in the real engineering-world, I can keep tweaking and perfecting designs as much as I want. This printer is turning out to be a great outlet for that.

I mentioned in an earlier post that the "12"mm SS rods that come with the CubeX are undersized. I finally measured them with a micrometer. They're 80um under, which for linear bearings, is WAY undersized. The THK linear bearing spec for 12mm LM shafts calls for -6 to -17 um. That probably contributed to the bad bearing wear I saw on the stock bearings. I purchased 4 new 12mm rods from PDTech on eBay: they actually listed a diameter tolerance spec, and they were case hardened, both of which are important for linear shafts (and neither are common for cheap chinese linear shafts). The only downside is that they're chrome plated steel, not stainless steel, but case hardened stainless steel shafts are very expensive, so I didn't buy those. I only purchased four since only four of them will have linear bearings on them. They ended up being about 11um undersized, which is right in the middle of the THK tolerance range. They result in noticeably smoother linear bearing movement and less (almost no) slop.

I purchased them long, partially because some of PDTech's non-standard lengths were actually cheaper than their standard lengths (455mm was cheaper than 450mm, not sure why), but mainly because I plan on making the printer taller. I mentioned this in passing in a previous post, but there is a lot of room between the top of the top aluminum cylinder shaft holders and the top of the acrylic shell. I can safely increase the length of the vertical shaft/rods by 40mm and still leave plenty of clearance between the hot end assembly and the lid. 40mm is convenient because the stock vertical shafts are 400mm long, and the stock X-axis shafts are 440mm long, so I can replace the 4x 400mm stock shafts with the two 440mm long old x-axis shafts (rear of printer) and two of the new tighter tolerance shafts (front of printer). I'll have to redrill 4 screw holes in the acrylic shell, and cut some acrylic out around the XY motors in the wire-mounting back plate, but that's pretty much it. Totally worth getting another 40mm of Z travel, for a total of about 325mm.

Taller CubeXY
While trying to find actual tension force measurements of belts in corexy printers (never found any), I stumbled across this interesting post on belt compliance. This person measured belt compliance at 10N preload (tension) + 10N. Basic 6mm GT2 fiberglass reinforced belt (like the kind I bought), has  modulus of 0.0067 %/N, while 6mm GT2 steel core belt has a modulus of 0.0024%/N. The given example is a 1kg carriage being accelerated at 3000 mm/s2 with a 1000mm belt. 1kg*3m/s2=3N. 0.0067%/N*3N = 0.02%. 0.0002*1000mm = 0.2mm, which is about half a nozzle width, which would probably result in very bad ringing. I had been planning to drive my corexy, which has approximately 2m long belts, at 6000+ mm/s2, with an approximately 1kg carriage. Doing this math for my printer yields 0.8mm of stretch, which is terrible. A steel core belt would be about 0.29mm of stretch. I bought some to try. The disadvantage of steel core belts is that they're heavier and stiffer, which means less power ends up in the motion of the carriage. Steel core belt minimum radius is also larger, mainly to prevent kinking and fatigue, so I may not be able to use them...we'll see. I'll probably start with fiberglass core belts. This post has a lot of details on belts.

X-axis Re-redesign

Due to the FEA results from the last post, I decided to completely redesign the X-axis to make it stiffer. 

The X-axis plate is flat now, and the pulley blocks also hold the linear bearings. The Hemera exttruder has been rotated 90 deg. The x-axis plate is 149g and made of aluminum. It's about 25% lighter than the previous steel design, and 45-75% stiffer, depending on the bending mode. It'll be machined out of scrap 1/4" ground plate. The pulley blocks will be machined from T6-6061 bar stock. The fan mount plate will be band sawed out of 1/8" aluminum plate, and I'm going to use flush press-in threaded inserts in it instead of threading it. The motor-carriage mount will be milled from 2x2" x 1/8" wall square aluminum tube, which holds the extruder motor on the inside almost perfectly. Unfortunately, almost all of the previous machining I did won't be used. Luckily, the nozzle ended up in very close to the same place, so the same bed plate can be used. I will have to print new bed mounts, though, because the bed has to be shifted in +Y 5mm. This system should result in  much stiffer X and Y axes. Here's a close up of the new extruder assembly:

This version is far less elegant than the previous one. The belt tensioner on the previous version was very simple and compact. This one uses the two stock X-axis belt tensioner cylinder things mounted inside of a 3D printed ratcheting assembly. I'll use a wrench on the printed hexes to tighten the belts, then tighten the button head screws down to hold the tensioner in position. Mounted off of that assembly is the inductive probe, which is conveniently closer to the nozzle now. The other side of the extruder has the fixed belt mount which takes each belt in and turns them 180 deg for plenty of belt engagement. Both the belt mount and radial fan are screwed to the 1/8" aluminum plate, which in turn is screwed to the side of the Hemera extruder motor. The fan location and duct are also less elegant. The previous duct completely encircled the nozzle. This one only has room to blow from one side. Because the belt heights are fixed by where the motors are mounted, and the requirement that belt segments be straight, the belt tensioner and fixed belt mount could only be located in the locations shown. Also, since Hemera was rotated so the length was along Y, the only place with room for the fan was on one of the X faces. Because the fan has its inlet on one side, that restricted the fan to the -X side. The fan also couldn't be located too far in +Y or it would impede the cooling flow from the hot end cooling fan. All of these things meant that the fan had to be mounted kind of high and in the location as shown. The LED light will be taped under the motor. I tried about every way I could think of to come up with a better way to configure the extruder assembly, but this was the best. While it's not as pretty or elegant, this should be a far stiffer and better performing design.

I've put in new material and screw orders. I should be able to finish machining the new X-axis plate next week. I'll start 3D printing the new plastic parts this weekend.

Tuesday, April 21, 2020

CubeXY Fabrication Part 3 and X-axis redesign part 2

I re-machined the pulley blocks today. They required a relief cut in them for the longer 450mm rail. Speaking of which, here's the "new" (ugh, see below) X-axis design.

Right pulley block

The x-axis plate is contoured for mass savings, which I extended to the 3D printed pulley blocks for aesthetics. The M3 screws were also shifted around some.

I also pressed-in the linear bearings to the old aluminum x-axis plate and test assembled it on the printer.

The good news it that is slides well, and I think I got the linear bearing spacing correct. The bad news is that this let me see a bending mode I hadn't thought of until now. Previously, I analyzed what I thought was worst case: both motors being used to apply max force such that the x-axis was maximally accelerated in y. I applied this y acceleration to the FEA model with both ends of the x-axis restrained. This is not the worst case, though. For corexy, in order to move diagonally, one motor applies force while the other does not. This causes both the X and Y axes to translate, resulting in diagonal motion. Here's the basic corexy belt layout I discussed a few posts ago:

If you spin the bottom right motor clockwise, for example, that will pull the x axis carriage in -X and the whole x-axis in +Y, resulting in diagonal movement. All of the belts are still tensioned, but belts H and D are tensioned more, by exactly the force required to accelerate the axes' masses, and that force is applied by the motor torque to the pulley. Because H (and D,  M and J, but they don't matter for this discussion) has more tension, there is a net torque on the X axis assembly about Z, which has to be countered by the Y axis linear bearings. Remember how I said linear bearings don't handle torque loads well? Oops. But there's another problem. If the X-axis is not very stiff, then the net force in segment H will cause the X-axis to be bent. My design is essentially a beam supported by two rollers, or if you think of the system as static, a pin (pulley P1) and a roller (the linear bearing under P2). This is causes a different mode shape, one that results in more deflection than the previously analyzed case, despite using the force of only one motor instead of two.

I removed the Y axis acceleration (left gravity), left the radial roller supports in the linear bearing holes, left the fixed support in one of the shoulder bolt (pulley) holes, and applied half the previous force (one motor only) to the other shoulder bolt hole. This caused negligible Z deflection, but the Y deflection of one side relative to the other was about 1.8mm! Yikes.

This is the bending mode I was seeing with just the linear bearings and aluminum x-axis plate (no steel rail)...I was able to move them about 5-10mm relative to each other. If there's any play at all in the bearings or frame (impossible to remove all of it), and if the beam connecting them isn't perfectly rigid (never is), then the linear bearings can move axially relative to each other. In the FEA case above, no displacement in X of the linear bearing surface was allowed (bearing or frame slop), so it's likely that the real world deflection would be > 1.8mm.

The frame will be stiffer when the 12mm rods/shafts are locked in place (set screws) and the acrylic shell is on, but that won't eliminate bending in the rods and aluminum brackets holding them. There's also no way to the play between the undersized rods (talked about previously) and the linear bearings...I can add some pretension, but I don't think it'll be enough. Accelerating much slower (~factor of 10, ugh) also fixes this problem, but slow printing was something about this printer I was trying to fix. Ultimately, the right way to handle this problem is to make the X-axis stiff enough to not deflect significantly, which I'm not sure how to do at this point.

The weird thing is that other corexy's aren't immune to this, including ones with rail guides. Linear rails are designed to handle torque, but they still don't limit axial motion, which is where this bending mode comes from. This X-axis design is actually stiffer than Railcore II's unsupported MGN12 rail, at least according to my FEA, so how does that printer work so well? This lead me to re-examine my model inputs, specifically what I'm using for force and acceleration.

I first used just the motor torque and pulley radius to calculate a force. I then used an online calculator for stepper motors that accounts for rotor inertia, applies a factor for reducing the holding torque to a more realistic torque value in order to reduce positioning error, and applies another factor for microstepping torque reduction. I could have written my own simulation program, and have for (much larger) linear motion applications before, but meh...if a calculator exists, why not use it. This dropped the max per motor acceleration to 3 m/s2 from a previous 32 m/s2. I also checked forums for maximum real world accelerations for other high performance corexy printers. It seems that 6-20 m/s2 are about the maximum. 20 m/s2 results in 200mm/s in 1mm and 0.01s. I'll probably redo these analyses with that.

Update: I re-ran the final design with 20m/s2 and 6m/s2. 2*20m/s2 in case 1 (the bending mode shown previously) resulted in a Y deflection of 0.062mm, and 0.55mm at the nozzle and 1mm at the unconstrained y bearing block for case 2 (the bending mode shown above). 2*6m/s2 in case 1 resulted in a Y deflection of 0.017mm, and 0.16mm at the nozzle and 0.3mm at the unconstrained y bearing block for case 2. The Y deflection for 20m/s2 is still unacceptable, and I'll probably have bad ringing at 6000mm/s2 if the motion is somewhat diagonal. Not good.

Sunday, April 19, 2020

CubeXY Fabrication part 2, and X axis plate redesign

Made some more progress fabricating.

I made 4 brass soldering iron tips for melt-in inserts. The brass rod cost $6 (only used half of it), and it took about an hour to turn these.

I designed them for combination US and metric. They cover M2-M5 and 4-40 - 10-32.

I milled the bed plate (with a lot of help, thanks Anthony). While programming prototrak is like riding a bicycle for me, mastercam apparently isn't.

bed being milled
The 1/4" cast aluminum plate stock, purchased from midwest steel supply, arrived with a few pits in it. I guess despite being ground, basic material handling of these large sheets results in pits. One of the mill clamps also left a noticeable dent in an edge. Otherwise, it came out well. I'll probably end up lightly sanding the whole top anyways to improve bonding. 

Next was test milling linear bearing holes to find a good press-fit diameter. 

I had to turn a small part to push this out after I pressed it in.
Then actually milling the x-axis plate (again, thanks Anthony). 

This felt a little flimsy. Uh oh... I went back and checked math/FEA. First thing I noticed was that the big chamfers on each side interfere with the X-axis carriage at both travel limits. Oops. I calculated what the max possible acceleration of the Y-axis could be given it's estimated mass (~1kg), the motor torques and inertia, etc. Came out to about 64 m/s2, which is likely an over estimate because it doesn't account for friction or microstepping losses. I used that and 1g applied to a mock extruder assembly, the X-axis rail, and X-axis plate in an FEA model. I added radial restraints to the inside of the linear bearing holes and fixed constraints in the shoulder screw holes. The parts were "bonded"...bolt contacts are a pain to add in solidworks simulation, and they really slow it down. Considering the close screw spacing, I expect maybe 5% more deflection in reality than predicted by the bonded contacts. The results showed a max deflection at the nozzle location of about 0.19mm in Y and 0.07mm in Z. Some of the Z deflection came from 1g, which will be accounted for because that's constant. The rest came from torquing of the X-axis plate. That amount of Z is concerning,'d probably cause poor bonding in one direction and extruder skipping in the other direction. The Y deflection is also concerning...that'd definitely be noticeable, and probably manifest as bad ringing or bulging layers. I tested both forward and reverse acceleration to see which was worse. I also did a mesh independence test. I then started modifying the design and running FEA. Took about 30 iterations, but finally settled on something better. 

I targeted half of both of the baseline deflections as my goal. I figured out I didn't have room in the Y-axis to make the plate thicker, which would have been the best way to improve bending stiffness due to Y-axis acceleration. So the plate can't be thicker than 1/4". Tests making the thin beam portion slightly wider helped Z deflection some, but didn't significantly help Y. I also tried making it thicker just around the linear bearings, where I did have some room to make it thicker, but that didn't help very much. The stress contours showed that almost all of the material around the linear bearings, except the portion near the thin rail mount beam, was essentially unloaded. Since I couldn't make the rail mount beam thicker, I had to change materials. Steel and stainless steels have a modulus of elasticity about 3x higher than aluminum. Unfortunately, they're also about 3x denser. I decided on SS304 because I can buy it for not much more than carbon steel, and it won't rust. One small advantage of using SS304 is that it's CTE will match that of the rail (some steel alloy) better than aluminum. I realized that extending the rail from 430mm long to 450mm would stiffen the transitions to the rail mount beam by effectively making that region thicker. Final results: Y deflection of 0.11mm and Z deflection of 0.038mm, 2x the mass of the X plate (about 10% more moving Y mass). Not terrible, I got most of the way to the 1/2 deflection goal. 

(Preliminary) Design of new X-axis plate

Final FEA run,100x exaggeration, showing contours of Y-axis deflection 
Contoured ends and pockets under the rail resulted in about 30% mass savings over solid. I also redesigned the X-axis belt tensioner part to accept the chamfers. The pulley blocks will need a chunk milled out for the longer rail and a M3 hole relocated, and the linear bearing blocks will need to be re-designed and re-printed. 

I'll probably go ahead and press the linear bearings into the old x-axis plate and use it to test the Y-axis shaft spacing and motion. 

To do:
1. Finalize re-design
2. Buy a longer MGN9 rail. oof
3. Buy a piece of SS304 bar stock
4. Re-machine pulley blocks
5. Re-print linear bearing blocks
6. Mill new X-axis plate
7. Get back on track.

Sunday, April 12, 2020

CubeXY Fabrication Part 1

Most of the 3D printed parts have been printed. All done on my Wanhao I3. Here's a pic of most of the parts that have been fabricated so far:

Apologies for the stained garage floor
The following is a picture of one of the top front rod holder/pulley blocks having one of its pockets CNC milled. Turns out ProTrak mill programming is like riding a bicycle.

If you look closely at the vise, you'll see two black vise blocks. These were 3D printed solid, and have a cylinder boss that interfaces with the 12mm rod holes. They allowed me to align the part. I then used a gauge to pick up the inside of the other 12mm hole, the center of which became my zero.

The last few 3D printed parts are currently printing:

The following picture series shows modifications to the acrylic shell.

Taped-on paper template + coping saw
Finished screen hole. Used a file to clean up edges
Test fitting the bezel
Screen and bezel installed!
Letters glued on
Template for power socket
Power socket installed. I actually cut out the corners shown in the
previous picture so I could orient the socket the other way around.
Left to fabricate:
  • CNC mill Y-axis pulley blocks
  • CNC mill X plate
  • CNC mill bed plate
  • Turn brass melt-in insert soldering iron tips
  • Drilling and installing melt inserts
  • Wiring
After that, lots of assembly. 

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 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 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. 

Introducing CubeXY

Wow, went off the deep end with this one. It's absorbed almost all of my free time the past few weeks. Given the current corona virus mess, stay at home order, etc, I guess it's good I've had a project.

I finally finished the design. The more I examined the original design, the more problems I found. I could probably write another post of just problems with the original design, but that's kind of pointless, so I won't. This post (sorry for the length) will detail the (re)design of this printer. Because I can't think of a better order, I'll start with a general overview, then go from the bottom up. Fabrication has begun, but that'll be in a separate post.


Without acrylic shell

Major changes include moving the bed frame around 180 deg, switching to a single extruder, making the bed significantly larger, and changing the X and Y axes to CoreXY. The name "CubeXY" comes from merging the original printer name, "CubeX", with "CoreXY".

Major features and specs:

  • CubeX Trio Shell + major frame components
  • E3D Hemera Extruder
  • 350x350mm build area
  • ~280mm usable Z height
  • CoreXY
  • Hiwin MGN9 linear guide for X-axis
  • Kinematic bed mount
  • Ground aluminum bed plate
  • Three independent steppers for Z, automatic bed leveling/tramming
  • Raspberry Pi 4B + 2x SKR v1.3 with TMC2209 drivers + 5inch HDMI touch screen
  • Internal horizontal spool holder

So, without further ado, let's start with the base.


The screw on AL feet, multi-layer 3/16" acrylic base plate(s), 12mm stainless steel shafts, and AL base shaft holders are all used from the original CubeX. The main acrylic base plate has a few modifications. A bunch of holes will be drilled in it for M3 melt-in inserts, and a plug was 3D printed out of clear PETG to plug the largest hole, which was a clearance hole for one of their poorly designed, oft-jammed, proprietary filament holders.  

Original base plate. I have not added all the melt-in insert holes to CAD.

PETG plug. Screws in from the bottom with 7 M3 flat head screws.
Two holes for M4 melt-in inserts for the SSR.

Side note: McMaster "Tapered Heat-set inserts for plastics" are my absolute favorite way to add threads to plastic parts. After using about 500 of them on some (very large) acrylic research slosh tanks, I can say with authority that they are the easiest way to add threads to plastic. They are also incredibly strong...I ran some tests on them, and the short 4-40 ones can easily hold 50 lbs continuous when set in acrylic. I literally could not pull them out. Another easy way to add threads to plastic parts, particularly 3D printed ones, and if you don't have enough depth and have a free edge, are drop in square or hex nuts (more on that later). Be wary of the cruddy knock-off brass melt-in inserts on amazon and eBay; they don't work nearly as well. McMaster has the CAD of the ones they offer, so you can see what a well designed insert looks like. They get melted in with a soldering iron (Weller SP40N, you can get it for 1/2 the price mcmaster sells it for), and special tips, but again, you can get these elsewhere for less than mcmaster, or turn your own out of brass stock (what I'm doing...about 1/10th the price). Pro-tip: For small inserts, plug and unplug the weller to regulate gets too hot for small inserts. Also, if you can't afford the brass tips, you can use a normal soldering iron tip on the smaller inserts, but you'll have to get a pair of needle nose pliers to hold the insert in the part while you pull the iron out because the insert will stick to the iron's conical tip. 

I'll be covering electronics in their own section, but I designed some 3D printed trays for the SKRs, Pi, relay board (for remote 24V power on/off for the SKRs), and 30mm SKR cooling fans. The SKRs have 3mm mounting holes, so I just designed the trays with through holes through the standoffs. M3 cap screws go through the SKR board, the tray, and into M3 melt-in inserts in the base plate. The relay board's tray is designed the same way. The PI has 2.5mm holes, which is kind of inconvenient. While M2.5 inserts exist, they and their tips would be another ~$20-30. Instead, I designed the Pi tray with two countersunk M3 holes in the bottom, the screw for which will screw into two more M3 melt-in inserts in the base plate. The Pi is held down to the tray with 4x M2.5 (actually english #2) self-tapping screws. The 30mm fan mount also uses M3 screws + M3 melt-in inserts, as do the filament guides. Disclaimer: I did not create CAD models of the SKRs, Pi, power switch, relay board, or screen: just downloaded them from GrabCAD or other sites. Thank you nice people who uploaded them. 

Gray trays just visible under SKRs and Pi. Also visible: 30mm fan + mount and two filament guides. 

Bottom left: 24V PSU; top: SKR v1.3 + fan; right: SSR for bed heater; bottom right: relay board
The last major component attached to the base plate is the spool holder. I looked on thingiverse (btw, how in the heck did they manage to make the thingiverse interface EVEN WORSE??) for some horizontal spool holders, but I didn't like any of the designs I saw, so I made my own. Here's a side view and cross section of a 1kg spool and the holder:

There's a base, which screws down to the acrylic base plate with 3 M3 countersunk screws, a standard skateboard ball bearing between the base and the bottom cone, a M3 threaded rod secured to the bottom cone that goes up to the top cone, which compresses the spool via a nut in a knob on the threaded rod. It had to be compact enough to fit under the bed when the bed is fully lowered, yet large enough to hold a full size 1kg filament spool. I also wanted it to be able to hold various smaller spool sizes, and the cones+threaded rod design allow this. I've already printed and assembled it, and initial tests seem to show it will work. Filament guides (shown earlier) guide the filament to a PTFE tube via a push-to-connect fitting. The tube goes up the back of the printer, secured using the original tube-securing acrylic pieces, and into a push-to-connect fitting in the Hemera.

Z-axis and Bed

Now is a good time to review the previous Z axis design and everything that was wrong with it. Due to the length of the discussion required to address that topic, I created a separate post for it, which also includes some more details of CubeXY's Z-axis and bed design.

The Z-axis stepper motors (formerly the NEMA17 extruder motors) are attached to the 12mm frame shaft/rods with custom 3D printed clamp mounts. One is located where the previous NEMA23 was at the center back of the printer, and two are located at the front, one on each corner (see second figure of this post). These steppers drive, via plumb couplers, 8mm lead screws (T8x2), which move brass lead nuts that are secured to three points on the bed frame, which has been rotated 180 deg from original orientation in order to allow this. 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. Zyletch sells the couplers and lead screws/nuts. Their precut lead screws are about half the cost of custom length ones, so I purchased 400mm long ones. I plan on leaving the Z-axis lead screws long. They don't interfere with anything, and this will allow for possible future Z expansion by replacing the four vertical frame rods with longer ones (along with wiring and acrylic shell modifications). Since three points determine a plane, using three lead screws/nuts prevents over-constraining the bed frame in rotation about X and Y and controls linear motion in Z. To counter linear motion in X and Y, and rotation about Z, two new THK 12mm linear bearings are used in place of the old Z-axis linear bearings. The new front linear bearing block-nut block combinations are 3D printed out clear PETG, and are 20mm shorter than the old bearing blocks (thus adding 20mm to the usable Z height). Thanks to the three Z nuts countering bed rotation about X and Y, the linear bearings shouldn't be torqued anymore, allowing for shorter ones. The bed mounts and rear nut block are also 3D printed out of PETG. The flimsy polycarbonate bed frame back plate (now front plate) was recut out of 3/16" acrylic with a cube logo etched in it. The bed mounts are actually a Maxwell type kinematic coupling, and the bed interfaces with the bed frame coupling via stainless steel balls. The bed plate is CNC milled out of 1/4" thick ground aluminum plate. It's asymmetric due to the asymmetry of the Hemera extruder: only the possible print area + 5mm on each edge is left to save weight and minimize excess aluminum (heat sink). I purchased the 800W, 350x350mm bed heater from Keenovo, which I didn't realize is a Chinese company...long shipping times. It comes with preapplied adhesive for attaching it to the bottom of the bed. I'll be insulating the bottom of the bed with a sheet of 3mm carbon welding blanket held on with high temperature aluminum tape. I got it off eBay; it's cheaper than cork and most other high temperature insulators. I'm planning to print directly on the aluminum bed, but if adhesion becomes a problem, thin PEI sheet can be purchased and adhered to the top. A thermal fuse will be adhered to the bed to prevent thermal run-away. Please refer to this post for more details on the Z-axis and bed mechanical designs.

X-Y Axes


The original CubeX Trio had two steppers for Y, both mounted at the back of the printer, one on +X and one on -X. Each side had a 6mm GT2 belt that looped around a pulley on the NEMA17 motor shaft and a smooth idler in the front frame corner cylinder things, and clamped to the Y carriage between laser cut plates. One of the Y carriages had another stepper motor on it with a pulley, and the other had a smooth idler pulley. A belt looped around these and was attached to the X axis extruder carriage. The extruder carriage was a water jetted and bent piece of steel, with three extruders + hot ends mounted to it. Just the extruder-carriage assembly probably weighed around 1.5kg, which I'm sure contributed to this printers' slow speed. There are more pics of these in previous posts, but here's one showing the whole X axis mechanism and part of the Y.

Apart from the high moving mass, the unbalanced mass probably didn't help speed and accuracy either. The X-axis stepper motor weighs 350g (in fact, all of the NEMA17 stepper motors were identical, even the extruder motors). That side's linear bearing block was also heavier. As a result of this mass imbalance, accelerations in Y would cause a torque on the X-axis. This is exacerbated by the very heavy X-axis, especially if when a Y move is done while the X axis is far off center.  Since linear bearings are not designed to handle torques (only radial loads, see this post for more info), this would cause high bearing wear and slop over time. In fact, when I took the X-Y axis apart, the Y-axis bearings were very worn, likely because of this. The proper way to use linear bearings where torques will be present is to space two far apart so that the torque becomes two radial loads, but 3D printers rarely have room for this. Another option is to reduce the X-axis carriage/extruder assembly mass and balance the y-carriage masses, which is precisely what I did.


It took a few iterations, with intermittent reciprocating application of my head to a wall (ow, ow, ow, ow), but I realized I could convert the X-Y axis to a CoreXY arrangement. CoreXY is the current de facto standard for X-Y axes in cube-like 3D printers. Here are some great links about it: 1, 2, 3. There are many other good discussions/videos about the CoreXY mechanism available online, but I'll cover the basics here. A CoreXY geometry allows for X and Y motion of the extruder carriage with only two, fixed motors. It It uses two long-ish timing belts and pulleys to redirect forces/motion to achieve this. It also has a low moving mass, allowing for higher accelerations and speeds, compared to more standard X-Y mechanisms, like stock CubeX's.  Here is a basic CoreXY layout:

Taken from link #1 above

The blue belt is slightly higher than the red belt. If you think about rotating each motor in different direction combinations (CW, CCW, etc), then follow the belts around, you'll see that different rotation combinations can achieve X and Y motion of the central carriage. One of the biggest advantages of this is that, if the carriage is translating in +X, both belts on the right of the carriage are under tension, which applies force on the extruder carriage, as well as the Y carriage on that side, symmetrically, eliminating torque imbalances that are seen in other XY designs, e.g. H-bot  There are a few variations of CoreXY. Here's one that stacks the pulleys, which reduces the number of pulley shafts required and minimizes layout area.

Taken from link #3 above
The reason the motor pulleys are larger and offset outboard is to make sure segments G and A are straight. In fact, all of the segments except K, M, M (probably should have been labeled N), and J in the above figure must be straight and aligned with their axes. If they are not, then the belt tension will change as carriage position changes, which is obviously bad. Link 2 spends about 2000 words + figures trying to explain that last sentence in about every possible way. But logically, if you think about how the belt angles would change (and therefore their hypotenuse = length) as the Y and X axes move around, you can see how that the only configuration in which their length would not change is when they are parallel to their axes, as in the above picture. Taking belt thickness into account is actually important for proper corexy design. If you don't, then the belts won't be perfectly parallel, and you have the problem mentioned above. That link also showcases some spectacularly bad examples of corexy implementations where this rule was not followed, along with a lot of other helpful information I won't repeat here.

Another key consideration are the pulleys themselves. You want to use toothed pulleys if the teeth are in contact with the pulley, like A motor, B motor, upper and lower P3, upper and lower P4, lower P1, and upper P2 in the above figure. You want to use smooth pulleys if the back of the belt is in contact with the pulley (like upper P1 and lower P2). While you can have belt teeth in contact with a smooth pulley, the recommended smooth pulley size is large (equivalent diameter of a ~40T pulley, which is about 25mm for GT2). Another option is to twist the belts such that the belt backs contact the smooth pulleys. This is done in the BLV MGN corexy printer.

The main disadvantages of corexy are the long belts, which act like springs, and lots of pulleys, which can seize if they're poor quality and require careful support/structure design. Fiberglass or steel reinforced belts are strongly recommended, and upgrading from 6mm to 9mm wide can help too. I'm using 6mm fiberglass reinforced GT2 belt I got off eBay for $7/5m; It's very difficult to stretch, and should be sufficient when properly tensioned. Good quality pulleys are also important. I'll be using the stock Y axis motors and their pulleys for driving the belts. I bought 4 Gates GT2 aluminum idler smooth pulleys (5mm ID, 12mm OD, 15mm flange diameter) from Mcmaster ($9 each, ouch). They're slightly cheaper from printed solid. These are high quality: smooth bearings, well machined, etc. I also bought 4 Zyltech brand ones (5mm ID, 12mm OD, 18mm flange diameter) for $2 each. These were significantly worse quality. 3/4 had crunchy bearings that weren't pressed in very straight. Only 1/4 was immediately usable. And zyltech is actually a decent chinese reseller...I can't imagine how bad the no-name ones off of amazon or ebay are. The only nice thing about the Zyltech ones is that they're about 1mm thinner overall, which fits the vertical belt spacing slightly better. I did manage to get 2/3 bad ones working well by pressing the ball bearings in straighter, as well as oiling all of them. But one is still crunchy. Another option is to make your own pulleys from radial ball bearings + flanges, or from two flanged radial ball bearings, but I found that those could actually be more expensive depending on the bearings purchased. Anyways, if I can't get the Zyltech ones to work better (or replacements), I'll buy more of the Gates ones.

UPDATE (4-18-2020): Zyltech sent me a replacement pulley. I had to straighten the bearings in this one, too, and it also has a crunchy bearing. I'll just try using it anyways...if it fails, I'll put a Gates pulley in its place. Note to people buying cheap pulleys: buy about 2x the number you need, you might get a good full working set that way. I looked into replacing the bearings in them...if you manage to get the bearings out, new bearings cost more than the pulleys with the bearings, so I'm not sure that makes sense.


I've talked a lot about corexy in general, and some of the small details, but I haven't talked about how I implemented it for CubeXY. I think I came up with a new CoreXY layout, at least it's one I haven't seen before. I'm going to call it horizontal motor CoreXY, or HMCoreXY.

The original CubeX's Y axis motors are mounted horizontally.

The original belt came out of the two holes (center of picture), traveled in Y to the pulley at the front of the printer, looped around this, and was secured to the Y axis carriage on this side. My CoreXY implementation involves twisting both of ends of the belts coming out of those holes 90 degrees so that their backs face in towards the inside of the printer. Same deal with the other side, twist the belt 90 degrees so that the backs of the belt face in towards the inside of the printer. The result of doing this is that the belts always contact pulleys with their backsides, without the need to impart 180 deg belt twists anywhere in the system. The following is a top down view of the new HMCoreXY belt setup. What were "upper" and "lower" belts in the above corexy diagrams are now "A" and "B" belts corresponding to the motors that drive them. Both A and B belts have portions that are on the upper and lower "paths".

HMCoreXY Belt Layout. Click to enlarge.

Here is a picture of one of the front left (-X) top frame pulley block, which is the stock front left top left block re-machined to hold two pulleys vertically (rather than one horizontally). You can see the 5x30mm precision shoulder screw (from McMaster) head, both pulleys, and spacers.

The following picture is of the right (+X) Y-axis carriage linear bearing block + pulley block. This one has two lower pulleys in it. The "B belt, upper path" belt travels through the pulley block above the two lower pulleys. The pulleys use 5x30mm shoulder screws and spacers. The pulley block is machined from 1.5x1.5, 1/4" wall (1x1" inside) square aluminum tubing. The MGN9 linear guide rail, which is used for X axis travel, is screwed to the back of the X-axis plate, which is CNC cut from the same 1/4" ground aluminum plate stock that the bed is cut from. The X-axis plate is screwed to 3D printed bearing blocks, and both have a light press fit with the 12mm linear bearing (THK LM12LUU, same as Z axis).

The left side (-X) one looks almost identical except the pulleys are both upper, the "A belt, lower path" belt travels through the pulley block below the two upper pulleys, and the X axis limit switch is screwed to the 3D printed bearing block.

The MGN9 linear guide rail is a genuine Hiwin linear guide, with an MGN9H carriage. I wrote more about linear guides in this post. Unlike linear bearings, linear rails/guides are designed to handle torques about all axes. Turns out they can handle quite a lot of dynamic force and torque, especially given their size...MGN9 rails are oversized for all normal-size 3D printers, MGN12 doubly so. Their torque rating is almost equal about all axes, so it didn't matter if the rail was mounted on its side like this, facing up with the extruder sitting on top of the carriage, etc. However, the nozzles in compact extruder-hot ends like the Titan Aero and Hemera don't reach far enough in -Z to clear the 1/4" aluminum plate backing the MGN9 rail when the extruders are mounted on top...I would have been stuck with a volcano extruder if I had wanted to do that. So I just turned the rail on it's side, which happens to make mounting a Hemera easier due to the nice mounting features on the sides of its extruder motor. Experienced readers will probably note now that some printers, e.g. Railcore, use an unsupported MGN12 rail for the X-axis. If I had done that, I could have mounted the rail facing up and still used a compact extruder-hot end. However, this goes directly against the recommended (Hiwin) installation guidelines of MGN series linear rail guides. Linear guide rails are not supposed to be subjected to bending moments. Their job is to constrain the carriage, not take large bending loads, which affect their accuracy. That being said, (good brand) MGN rails are made of high strength carbon steel. The loads that a 3D printer extruder assembly could apply to a MGN12 rail will not be able to cause a deflection significant enough to cause noticeable defects in parts. That's why railcore and other printers are able to get away with an unsupported X-axis rail.

Here is a picture of the extruder assembly. I designed everything to be as compact as possible. The Hemera extruder takes up one whole side. It's bolted to a 1/8" aluminum carriage plate, which is also bolted to the MGN9H carriage, which is buried under the fan (black) and 3D printed belt holder/tensioner assembly (white). I actually managed to obtain a 24V, 1.75mm Hemera (box says "Hermes", lol) before they all sold out due to the covid19 mess. I made sure to orient it such that the hot end's cooling flow is towards -Y, so that the carriage plate wouldn't block this flow (the passages in the hot end heat sink redirect the air flow all in one direction). The inductive Z probe is shown bottom center. Underneath this assembly is a custom designed cooling duct for the fan, printed out of clear PETG, and a thin 12V LED light that screws to the bottom of the extruder motor. The right (+X) side of the belt holder is static. The left (-X) side is the actual tensioner. Since both belts have one end secured to this tensioner, and since both belts should be the same length, both belts can be tensioned with one tensioner. The belts press into the tooth-ed slots and mesh together further in, effectively preventing them from being pulled out (tested to about 50lbf, no failures).

The tensioner consists of a belt mount that runs on a printed track, kind of like a T-slot, but angled so it's actually printable (after a lot of trial and error searching for proper tolerances). Here's a back view of it without any other components:

The tensioning is done by tightening a long M4 cap head screw into an M4 heat-set insert in the other part of the assembly. I should be able to get approximately 30 mm of tightening with it, which should be more than enough. You can see the slot that the MGN9H sits in. Note how it is forked: it's designed to slide on from the +X side, which allows it to be taken on/off without unbolting the extruder. This assembly screws to the carriage plate with three M3 screws, and one M4 screw from the radial cooling fan.

The X and Y extents of the whole X axis extruder carriage assembly was carefully controlled to maximize X-Y build area, which is right around 354x354mm, which I rounded down to 350 x 350mm. Due to the asymmetry of the Hemera extruder, specifically the nozzle being closer to one end than the other, the build area is not symmetric about the central YZ plane of the printer; it's shifted in +X by about 20mm. This drove the bed to be asymmetric. All of these design decisions result in a nice, compact, strong, stiff, space efficient extruder/x-axis assembly.

I mentioned earlier that the belts coming from the motor pulleys are twisted 90 degrees so that their backs are facing the inside of the printer, and the teeth are facing out. If the 90 deg twist is located right at the motor pulleys, i.e. if the belt length between a Y carriage pulley and the motor pulley is very short (happens at the +Y travel limit), then the twist will make the belt want to come off the pulley. Luckily, the motor pulleys have large flanges that will prevent the belts from slipping off, but the twist could cause uneven belt wear. To minimize this problem, the Y axis pulleys were located as far in -Y (towards front of printer) as possible. In fact, the two furthest in -Y partially slip inside pockets in the left and right front top frame rod/pulley blocks.

This requirement and drove the Hemera to be mounted on the +Y side of the carriage plate, with the X-axis plate and rail as far towards -Y as possible. That, along with build area maximizing decisions, drove the Y-axis linear bearings to entirely on the +Y side of the X-axis plate.

The X-axis plate was designed such that the +Z side is just below the required lower pulley Z location, and the MGN9 rail was designed to flush with this top surface. This, along with careful X-axis extruder carriage plate design, maximized the usable Z build height, which can utilize all of the vertical frame rod height except for 62 mm (60 mm tall vertical linear bearing blocks + 1 mm on each side for buffer).

Potential Problems and Disadvantages

I've talked a lot about the advantages of the HMCoreXY setup. It will have all of the standard corexy disadvantages (mentioned above), but also one more. Note how both belt ends on one side of the X carriage are high and both belt ends on the other side are low. Because there isn't a mix of upper and lower like in normal CoreXY, there will be a net torque about Y due to belt tension, which will be exacerbated by -X accelerations. Luckily the moment arm is small, and I estimated that the maximum torque from this imbalance is around 1Nm. The MGN9H carriage can handle ~19 Nm about this axis, so this should not be a problem. There is no possible way to have one upper and one lower belt end on each side (and thus be able to stack the Y carriage pulleys) without heavily modifying the way the motors are mounted, or adding some sort of belt collision avoidance hardware when the belts are crossed vertically (usually a bad idea anyways). I tried for a few hours sketching out every possible permutation of belt positioning, and the one presented above is the only viable one with horizontally mounted motors.

A potential problem I haven't touched on yet is related to the linear shafts/rods. The 12mm linear shafts/rods they used for both the frame and motion shafts are about 0.08mm undersized on the diameter. This causes noticeable slop, even with the new THK linear bearings (though not nearly as bad as the old worn out linear bearings). My mitigation plan for this is to move the vertical rods closer together in X by about 0.2mm, by grinding down the rods oriented along Y slightly if necessary. This will preload the linear bearings radially, which should prevent them from rocking on the slightly undersized shafts.

The trio of proprietary extruders+hot ends were sacrificed to achieve 3x the build area of the original printer. I think this was worth the trade-off, especially since tool changers seem to be the future of multi-filament FDM printing.


The acrylic shell is the next major sub-assembly. I plan on keeping the CubeX Trio shell and modifying it a little. There are a few pictures of it in some of my earlier posts and online. The shell isn't just a cosmetic part. It screws into the 8 corner frame cylindrical blocks, providing torsional stiffness to the frame.

The lid was lost sometime before I obtained the printer, so I had to laser cut a new one from 3/16" acrylic. I included matching 10mm holes in the top. I designed small 3D printed cups to go in these holes, and the cups hold 6mm neodymium disk magnets, which honestly don't seem to do much to hold the lid on...appears to mostly be held on by its weight. I might try gluing in 10mm disk magnets if I find that the lid needs to be held on.

The big openings on the front and sides do not have doors. I will probably laser cut some 3/16" acrylic door panels and use some small hinges to create doors for them at some point. If I do that, then the printer will be sealed, which means I need an exhaust fan. I'd probably put these in the side doors.

The acrylic shell held the original touch screen. This was also lost before the printer came to me, but it looks a little small in the pictures I've seen of CubeX Duos/Trios. I decided to use a 5 inch HD capacitive touch screen. I also decided to recess it in the front in the same place the old touch screen was. This required cutting the hole bigger and some fairly complicated bevel design. The bevel is made of three 3D printed parts (not including letters). One front plate (bezel) and two back plates. Four M3x10 countersunk screws go through the back plates, through the holes in the screen PCB, and into M3 square nuts that are held in the front plate behind the bezel. The back plates and front plate sandwich the acrylic, holding the screen and bezel in place. The bevel and screen stick out only 0.8mm.

Bevel back

Bevel cross section

I 3D printed the bezel parts out of white PLA. I designed the "CubeXY" letters with the same font and size as the decal on the front of the printer, and I printed them out of shiny silver PLA flipped so that the smooth side would be be seen. They were glued on with CA. The hole was enlarged with a fine toothed coping saw and file.

I'm not sure how the original CubeX Duo/Trio got power into it. For CubeXY, I bought a combination fuse, switch, and C14 power socket (bottom right of first picture in this section). The socket has countersunk holes for M3 screw, which will screw into melt-in inserts in the acrylic. The hole will be cut in the same was as the screen. 


 List of controller requirements:

  • At least 6 stepper drivers capable of 1.7A
  • 32 bit controller
  • 24V power
  • Good community development for troubleshooting help
  • Lots of peripheral inputs
  • Ability to use a touch screen
  • WiFi

Most 3D printer stepper driver boards have 5 stepper drivers: X,Y,Z, and two extruders (or two Z's). The need to drive 6 stepper motors made finding the control electronics a little tricky. That, along  with the other requirements, really narrowed down my options to the following:
  1. Duet2 Wifi + Duex2 or Duex5 + PanelDue 5i (~$360)
  2. Duet3 6HC + Raspberry Pi 4 + touch screen (~$320)
  3. Raspberry Pi 4B + two SKR v1.3s + touch screen (about $200) running klipper
  4. Like 3, but with two ramps boards (about $150) instead of the SKRs
The RAMPS boards would have had to been modified for 24V operation, and are generally less feature rich, so I disregarded that one. Options 1 and 2, even knock-offs, would be expensive. Thus, I chose Option 3. The Raspberry Pi 4B will run Klipper firmware and Octoprint. My current work flow is: STL-Cura on my laptop-slice gcode-save to SD card -move SD card to my printer-use screen on printer to select the file -print. Octoprint will allow me to STL-Cura-slice-print...much easier.

The SKR v1.3's will also run Klipper. Klipper splits the processing up among the Pi and the control boards, and has an active development community. Since I'm planning to use Klipper, I wouldn't see much of a performance increase from the faster chip on the SKR v1.4 Turbo. I bought the SKR v1.3's with 10x TMC2209 drivers from Amazon (BigTreeTech brand). I could have saved a little bit if I had bought them directly from BigTreeTech, but I figured I'd get them faster from Amazon and with a better return policy. I don't need 10 drivers, but it was the same price as getting 5+1, so why not. I haven't researched the various TMC2209 options, but I'll at least do 16 or 32 microstepping. I bought the Pi 4B from PiShop, along with a 5 inch waveshare HDMI touchscreen, 3A USB C power supply, Pi heat sinks, etc.

The mounting features for the Pi and SKRs are described in the base section above, and the screen mounting is described in the shell section above. The screen requires a HDMI (full) connection and a micro USB connection to the Pi, which has a miniHDMI and USB-A. Cables come with the screen, including a mini-full HDMI adapter, but the HDMI cable is too short, so I bought a 3ft HDMI-miniHDMI cable from pishop along with the screen. I'll probably need to get a longer USB cable, too. The screen bezel/mount was designed with clearance for the connectors and buttons on the sides of the screen.

I bought some makerbot-style PCB limit switches, which have an analog filter implemented. This link has a good discussion on switch filtering and a picture of the type of switch I bought near the bottom. I plan on using one for the min X limit and one for max Y limit. The X axis limit switch will be screwed to one of the Y axis linear bearing blocks and trigger off the back of the extruder motor. It will have to modified slightly because the PCB is too long as-is. My plan is to bend the cable connector vertical and cut off some of the PCB. The Y axis limit switch will screw to a small 3D printed part that uses one of the left motor's mounting screws to hold it in place. The Y axis linear bearing block has a feature for pressing the Y limit switch.

Mechanical switches have excellent accuracy and repeatability. Even better are inductive probes, but they require an electrically conductive surface to sense off of. Since the bed will be aluminum, an inductive probe will work well for the Z limit switch (max Z), as well as for bed probing. I purchased a "LJ12A3 4 Z/BX" NPN NO inductive probe from pishop along with the Pi. The inductive probe triggering distance is related to the driving voltage...24V is the recommended minimum for this probe. The SKR's (and most controller board's) probe/switch inputs are 5V. If the probe's power is 24V, then when the switch closes, it will try to drive the signal line to 24V, which will fry the control board. I think the Duet2's have built in circuitry for inductive probes, but the SKR's do not. There's a neat trick to get around this problem, though. A BAT85 diode is put in the signal line and oriented such that when the probe signal wire is high (triggered, 24V), no current will flow to the SKR input pin, so the SKR pin will read high (5V) due to its internal pull-up resistor, which can be activated in the firmware. When the probe signal wire is low (open 0V, not triggered), current will flow from the SKR through the diode and probe to ground, which will pull the SKR pin low. The Voron uses a Pi with two SKR v1.3's. Here are a couple links from its documentation explaining the inductive probe wiring: 1, 2 pg. 6. While I'm not 100% sure, I think this will only work with NPN NO inductive probes. You could always use a voltage divider,  voltage regulator, or opto-isolator on the signal line to drop the 24V down to 5V if you're uncertain.

As mentioned in the shell section, I'm not sure how the original CubeX Duo/Trio got AC power into it. For CubeXY, I bought a combination fuse, switch, and C14 power socket off eBay and will mount it into the side of the acrylic shell.
It's rated for 10A, and I'll be using a 10A fuse in it. The bed heater is 800W, the 24V PSU is 200W, and Pi is ~15W, which is bit more than 9A at 110VAC. I doubt I'll ever see that power draw level, though...worse case load on the 24V PSU is about 100W. The switch will be wired in the hot and neutral lines. The hot line will split and go to: 1. the relay board, 2. the solid state relay (SSR), 3. the Pi wall wart power supply. I bought the relay board off of eBay for $7.

The two channel one was cheaper than the one channel ones, go figure. This takes 3.3 or 5V logic and controls, via opto-isolators, AC relays. The hot line coming from one of these relays goes to the 24V PSU hot input screw terminal. The control pin, 5V, and ground come from some of the Pi's GPIO pins. This allows the 24V PSU power to be controlled by the Pi. Since the Pi is powered by an independent power source, remote turning on and off of the SKRs will be possible. As implied by the last sentence, the 24V PSU DC power screw terminals are wired to the SKR input power terminals. The second hot AC split goes to a AC pin on the SSR. The other AC pin on the SSR connects to the bed heater hot line. The control side of the SSR is connected to a SKR's bed heater output terminals. The 5.1V, 3A usb wall wart power supply for the Pi was actually cheaper than an unpackaged 5V PSU. I'll either sacrifice an extension cord for the socket, or connect AC power to its prongs with female blade terminal connectors and heat shrink over them. The neutral AC line splits after the switch and goes to: 1. the 24V PSU neutral input screw terminal, 2. the neutral line of the bed heater, and 3. the Pi wall wart power supply. The incoming AC ground line will split and go to: 1. the 24V PSU ground input screw terminal, 2. the 3D printer's frame, and 3. the heated bed. This link had a wiring diagram that's pretty close to what I'll be doing. The mounting features for the relay board, SSR, and 24V PSU are described in the base section above.

The bed heater is a Keenovo 110VAC, 800W, 350x350mm silicon heating pad. It comes with an adhesive back for adhering to the bottom of the bed. I opted for an AC heater due to the large thermal mass of the bed. While a lower power DC heater would work, it would take a lot longer to heat up. More about the bed itself is in the base section above and in this post. The heater connects to the neutral power line and the hot line coming from the SSR. I purchased the SSR from Zyltech. It's rated for 25A (probably more like half that...), but I won't be putting anymore than about 9A through it. Inline with the hot line, and adhered to the bottom of the bed under the insulation, will be a thermal cutoff (TCO) fuse. This is important for high power heaters in case of a temperature sensor failure. If the bed temperature sensor fails, it can cause the bed heater controller (embedded in the SKR firmware in this case) to think the bed is cold, thus applying full heating power continuously to the bed, which would probably start a fire. The thermal fuse will blow around 150C, preventing thermal runaway. I'll probably be using a normal thermistor for the bed temperature sensing, and it will be connected to the SKR bed temperature sense terminals.

The inductive Z probe is mounted to the X-carriage next to the radial part cooling fan. This fan is a  Sunon MF50151VX-B00U-A99, the most powerful (highest flow and static pressure rating) 5015 cooling fan you can buy (I've spent hours looking), and I've been using it on my Wanhao I3 for years now with great success. Unfortunately, it's 12V, and they don't make a 24V version, so I'll probably have to use a buck converter (cheap on eBay) to drop the voltage from 24V to 12V. If I connect the inputs to the buck converter to the 24VDC + and -, which are also connected to the SKRs, I should be able to just connect the +12V output of the buck converter to the fan, and the - line coming from the SKR fan terminal to the fan because the SKRs use the - pin for PWM/switching. Oddly, there aren't any 24V 5015's that are as powerful. Mounted under the extruder motor is a 12V LED light, which came from CubeX's X-carriage. The SKRs have 5V and input voltage (24V) outputs, so I'll probably have to use another buck converter (or possibly the same one) for that. Also might be able to run that off of the Pi's GPIO with a transistor or relay so that the Pi can be used to turn the light on and off. The 24V version of the Hemera has a 24V cooling fan, NEMA17 stepper motor, 24V heater core, and a hot end thermistor, all of which will be connected to a SKR.

The SKRs have their own 24V, 30x30x10mm cooling fans, which I bought from Zyltech. These will be connected to their controller cooling fan terminals. I aimed them so they'd mostly blow across the motor driver heat sinks.

Since the shell has three big openings in it, I don't have any exhaust fans at the moment. If I add doors to the openings, I'll also add exhaust fans, which I'll connect to a SKR's exhaust fan terminal.

The three Z motors will be connected to one SKR. The X,Y, and extruder stepper will be connected to the other.

I purchased good quality stranded 22 AWG, 3 and 4 conductor shielded wire off eBay. 22 AWG was chosen because it's large enough gauge for the motors and heater core, while still being small enough for standard JST crimp connections. It's important to use stranded wire if the wire will be moving, e.g. the X-axis limit switch. I could have used smaller conductor cable for the switches, but 22 AWG wasn't much more expensive, so I bought that for future possible projects. Shielding the motor cables (4 conductors) is important for reducing noise. The 3-conductor cable is for the limit switches and Z probe. One 4-conductor cable will be used for the 12V LED light and the radial cooling fan. The shielding drain wires will all be connected to chassis ground on one end. I also bought a JST crimp connector kit, which included a bunch of connectors, pins, and the crimping tool off Amazon for $28 (though it still isn't here yet due to covid19 delays). The wiring harnesses for CubeX were all custom jobs, with white sleeving. I don't plan on putting that much effort into the cables. They'll be properly routed and restrained with adhesive cable clips, and run through drag chains/cable trays where necessary. I'll probably 3D print the drag chains if the ones that came with CubeX don't work. The AC power wiring will be with ~14 AWG stranded silicon wire, which I had left over from some other (abandoned) projects. I'll be using crimp/solder fork terminals for the 24V PSU connections, and other terminals where necessary. Cable management is important!

On the software side of things, I haven't delved into Klipper yet. I plan on starting with Voron's configuration files and modifying them for my needs. I'm a decent hobbyist programmer, so I'm pretty sure I'll be able to handle it, and there's great documentation. The basic way it works is: First, you SSH into the Pi with your PC. Then you install Octoprint and Klipper on the Pi. You use Klipper on the Pi to generate Klipper firmware files for the SKRs, which you copy back to the PC with SCP. Then you copy that firmware file onto each of the SKR's SD cards one at a time, then put them back in the SKRs and power them up. Then you configure octoprint and create the printer configuration file, which will contain info about your printer's configuration, how to talk to both SKRs, etc. After that, and assuming the hardware is all set up, it's time to run calibration and checkout tests, such as testing movement directions and limit switches. Automatic bed tramming, where the independent Z axis motors are used to level the bed, is done with the "z tilt" klipper script. After that is run, "bed mesh calibrate" can be run to perform a mesh calibration. Given the ground aluminum bed plate and automatic bed tramming, the mesh calibration should show an almost dead flat bed. All of these calibrations and checkout tests will probably take the better part of a day assuming no major problems. There's also configuring octoprint and installing add-ins, such as the one for PSU control and bed mesh height map visualization. I'll probably have a whole post dedicated to software/firmware setup.


I endeavored to keep CubeX's aesthetic intact. Everything is color coordinated: silvers, clear, translucent, with a little bit of black and white. As an example, the new screen's bevel is white, just like the original, and I matched the "CubeX" (decal on front of the printer) font and color for the 3D printed "CubeXY" letters under the screen.


By fixing the major design problems with the original CubeX Trio, I've created a design for what will hopefully be an excellent 3D printer.


Fabrication is probably about half done and will be discussed in a separate post. Parts acquisition is about 80% done. Covid19, while possibly providing a little more time for me to work on this, also threw a wrench in the economy, which I'm feeling as massive shipping delays for some components, e.g. anything from Amazon. Thus, I've been trying to buy things off of eBay or locally, even if they're a little more expensive. Probably a good thing to do anyways, since Amazon is scary big now.
  • First fabrication post
  • Finish fabrication
  • Finish acquisition 
  • Assemble printer
  • Install electronics, wire them
  • Software setup
  • Checkout and calibration tests