It’s been a few weeks since I updated this page – mostly because I’ve been spending all of my time machining – but my mill is finally done! Over the past three weeks, I’ve become a much more proficient Prototrak user; designed a bad flexure; and manufactured, assembled & tested my CNC retrofit to the Benchmaster mill.
One of the major adjustments to my project that took place over the past few weeks was a shift in the scope of what I wanted to accomplish. Originally, my goal had been to design and build dual CNC-manual drivetrains for all three axes of my mill. However, as I worked, I realized it was more important to me to test the functionality of the entire system – not just the drivetrain, but the electronics, controller and software as well – to determine whether it was worth spending the extra time & money required to implement CNC control on the Y and Z axes. The design of the other axes will not differ dramatically from the X axis (they will likely be somewhat simpler, actually), and there were also other design challenges I was interested in exploring, such as the design of a flexural ball-nut mount and a proper machine control interface. Consequently, with this in mind, I decided to limit my work to only building the X-axis, plus the controller and the flexural ball-nut mount. Having completed the design process, though, I’m pretty pleased with how it’s worked out – I think I made the right call, and am now able to determine conclusively whether or not it’s worth my time to retrofit the other axes.
My CAD model did not evolve sufficiently since the last images I showed in PUPS 8, asides from some additional parts being detailed in on the handle-side of the machine. However, I did spend substantial time developing a flexural ball-nut mount for the system, which I’d like to detail.
Briefly, the rationale for implementing a flexure in the nut mount for a leadscrew/ballscrew is to accommodate any misalignment between the screw axis and the linear bearing motion axis: this way, as the nut moves along the screw, the forces produced by error motions of the screw & nut assembly are dissipated in the flexure, rather than being transmitted to the bearings & frame and propagating through to the motion of the device. For this to work, however, the flexure needs to be compliant in the directions where error motion could occur, but significantly stiffer in the direction along which intended motion occurs.
I had begun designing my flexure in Week 8, and had developed a viable topology for the flexure, but hadn’t actually designed the flexure fully (primarily, specifying the width of the different beams in the flexures). I was working to the following criteria:
- Assuming 0.1 mm maximum deflection. This is 2x the worst-case runout specified for the ballscrew. Reasonably, I should have specified something higher, given that the runout of my screw is not the only contributor to misalignment.
- Trying to keep force required to produce deflection significantly under the force required to deflect the screw that much. For the middle of the screw, assuming simple supports, I calculated this force to be 161 N.
- Maximize lateral and vertical compliance, while keeping them roughly similar; minimize axial and torsional compliance.
After a few iterations (more than those shown above), I had a flexure with the following specifications:
- Lateral stiffness: 2.81e3 N/mm
- Vertical stiffness: 3.64e3 N/mm
- Axial stiffness: 2.16e4 N/mm
The torsional stiffness was also quite high, with 2.75 N-m of torque – the maximum output of the motor + drivetrain – producing only .88 microns of error motion. Unfortunately, these specifications still did not produce a flexure that yielded any significant benefit for the ball screw: the screw would still be deflecting significantly under loading from error motions, even with the flexure. Without dramatically redesigning the flexure to introduce longer beams – a challenging task, given the spatial constraints of the Benchmaster’s table & saddle – the flexure would not provide any significant benefit. Out of curiosity, I revisited my calculations of screw loading due to bending at different positions along the screw, and found that over the length of the screw that the nut actually travels, the stiffness of the screw in simply-supported bending is never substantially higher than that of the flexure. With all of this in mind, I elected to use a simple, monolithic ball nut mount in my final assembly. I did commit to building & testing the flexure mount, though, to verify that my assertion that it wouldn’t help dramatically was correct.
Manufacturing & Machine Modifications
There were a lot of parts that went into the X axis of my machine – honestly, too many (I’d like to cut part count down when I build the Y and Z axes). Some photos, and lessons I’ve learned:
- Setup count & part count: I had tried to keep the number of setups on my parts to a minimum, with most of them requiring roughing on the waterjet and drilling/reaming on a drill press. The major exception to this was the bearing mount block, which I wound up having to machine in four different setups (way too many – I could definitely reduce this). However, even though my machining operations were relatively simple, they still took a significant amount of time because of the number of parts to machine. When I build the Y and Z axes, I’m going to carefully examine whether some parts can be combined to reduce total part count without dramatically changing the amount of machining I need to do – something which should also help reduce assembly time.
- Bearing mounting: The manufacturer specifications for mounting the angular contact bearings I’m using in my mill are extremely tight (JS4, which is -0/+0.003 mm), and way outside of my ability to produce with the tools I have. I elected to get as close as I could without going crazy, and spec’ed an H6 fit for my bearings based on recommendations for ballscrew support bearings. This fit is achievable with circularly interpolated milling followed by reaming, but the reamer is an expensive tool. I’m curious if there is a less-expensive alternative out there – perhaps grouting the bearings somehow, or designing a compliant bearing mount that would also have the benefit of not overconstraining the ball screw laterally?
- Inaccurate measurements: The most significant problem I faced in manufacturing came from the poor quality of my model of my existing system. The Benchmaster is/was not a high-quality machine when it was built. Among the many different corners that were cut, there are a number of dimensions on the machine that should be clean/round but are not; and a number of places where surfaces were left rough-cast. I faced this issue on three different occasions:
- When I tried to bore out the pocket in the center of the saddle, required to accomodate the ball-nut mount. Finding the true “centerline” of the bearing system required a range of different measurements (from bearing face to bearing face; from saddle edge to saddle edge; from saddle edge to the mounting feature for the old lead nut) before I was able to pick a location that I was sufficiently confident would get the ball nut aligned with the table.
- When I tried to install the ball nut mount in the saddle, and then run the table over it. The curved clearance zone under the table is rough-cast, with large surface imperfections and poor dimensional consistency along its length. I did not measure this area well enough/conservatively enough, and had to spend significant time machining the underside of the table so that the ball nut and mount would fit. I would almost recommend that future users who try this conversion machine out the underside of the table to a known, clean profile before they start designing parts to fit underneath it.
- When I tried to install the ball-nut mount with the table aligned. I had underestimated the amount of distance between the surface I machined to mount the ball-nut mount to, and the location of the axis defined by the two ball-screw mounts – I wound up having to place 0.1″ of shims underneath the ball nut mount, which is bad! For future axes, I plan to rough out a design; machine mounting features into the assembly; measure final distances between mounting faces; and then finalize my design & cut parts.
I also spent a fair amount of time manufacturing and assembling my flexural ball nut mount. Waterjets are not high-precision machines (particularly when they’re used as much as the Media Lab waterjet is), so before I could actually cut any parts for my flexures, I needed to characterize the waterjet’s dimensional accuracy. I created a simple test part that cut flexure beams of similar sizes to both the vertical and lateral flexure beams on my part, with the thickness of the beams increasing in increments between 0.01″ and 0.005″. From this test part, I found the dimensions I should tell the waterjet to cut to get the final product I was looking for.
With the flexure parts cut out, I prepared for assembly. I first drilled out the press-fit holes in the main flexure & slip-fit holes in the outer plates that would have dowel pins pressed into them, and then cleaned and prepared all surfaces that would be bonded. I then pressed the dowel pins into place in the main flexure. After applying epoxy to the non-flexural surfaces of the main flexure, I then placed the outer plate in position on the main flexure, loaded the assembly into the arbor press, and squeezed.
The final product came out passably, but there are definitely changes I would make for the next flexure I build:
- Epoxy/bonder: I used a machineable, reasonably hard epoxy (Hardman 04002) to bond the three components together. There are a few spots where the epoxy clearly did not bond well to the outer plates, and bonding was a messy operation that I had to rush to complete to avoid having the epoxy cure on me. In the future, I would either look for a specialized epoxy intended for these applications, or explore other bonding solutions – tape, or even CA adhesives.
- Part clearance: While the epoxy layer may provide some nominal clearance between the flexure beams of the main body and outer plates in my flexure, I can’t be sure of this. Taking even a .005″ pass off of the flexure areas before waterjetting my flexures would ensure that there is no rubbing or interference between the flexure’s parts.
The assembly process for the X-axis was largely trouble-free, with a few minor exceptions – particularly, the machining I needed to do to the underside of the mill’s table, and the shims I needed to install underneath the ball nut mount.
The assembly process is not rapid, though, with each layer of the both the handle- and motor-side mounts needing to be removed in sequence to actually disassemble the axis. I’ve detailed this assembly/disassembly & alignment process in my User’s Guide. There are a number of tweaks I could make to improve this process, which I strongly suggest future users do:
- Improve assembly of bearing mounts: The bearing mounts for this device are troublesome. Because both ends of the ball screw are used (one to attach to the motor, one to attach to the handwheel), both ends of the shaft have shaft couplings attached – difficult to assemble, when the shaft couplings sit inside bearing mount blocks that have to be put in place before the shaft couplings can be! Currently, I mount the motor-side bearings + shaft coupling + motor assembly completely; and then install the handle-side shaft coupling, using a small hole that I drilled in the bottom of the bearing mount block. If I could instead insert the handle-side shaft, bearings and coupler assembly through the bearing mount block from the inside face, assembly would be much easier.
- Add clearance holes for screw access: There are a few locations on the motor and handle mount plates where holes could be placed to give better access to screws inside the assembly.
- Alignment features for ball-nut mount: As I was beginning to assemble my system, I realized I had completely forgotten to design alignment features for the ball nut mount. It turned out to be okay: one of the edges of the pocket I cut in the saddle was perfectly located to touch the front face of the ball nut, allowing me to align the screw axis parallel to the bearing axis by pressing the two faces together. However, I would strongly recommend that future users design in both lateral and axial alignment features for the ball nut mount, and be extremely careful about the parallelism/squareness of these features to the bearing rails. As an aside,whether or not the screw is perfectly aligned to the axis is probably the biggest uncontrollable error in my system right now. I would also suggest that future users consider attaching the ball nut mount with screws coming from the other side, so that they can loosen & realign it as they assemble the axis, to compensate for any machining inaccuracy.
As mentioned earlier, to fully evaluate the success or failure of this project, I needed to build not only the mechanical components of the X-axis, but also the drive system and control interface for the axis. I’d settled on a high-level control architecture earlier, in PUPS 7, but now needed to fully detail the design of the controller and associated electronics.
I started out by defining the following functional requirements for my controller:
- Control 3 CNC axes using specified stepper motors & external drivers: Obviously, the most critical requirement of this controller is that it be able to drive all three of the stepper motors that I’ve selected during my axis design. The driver board that I’m using – the Protoneer Raspberry Pi CNC board – doesn’t have the power to drive all of the steppers that I’m working with (especially the 4A stepper that will eventually drive the Z axis), so I’ll need to use external drivers.
- Spindle start/stop control: My spindle currently is driven by a basic 1/3″ HP, single-phase AC motor. Currently, I just plug and unplug the motor to start and stop it, which is dangerous. I’d like a proper start- and stop-button on the front of my interface.
- Safety Features: I’d like the following safety features in my controller:
- Emergency stop to cut power to spindle AND stepper drivers, but keep control computer running
- Keyed lockout for emergency stop.
- Endstops in both directions for all three axes
- Local interface for conversational programming: I want to be able to perform on-machine conversational programming for basic CNC tasks like drill patterns and pocket cutting.
- Capacity for expanded functionality: Eventually, I would like to be able to use add-ons that GRBL/RasPiCNC enable, like spindle control and tool probing – I want to make sure my controller can expand to accomodate these features.
From these FRs, and using hardware I had been able to purchase and scrounge together, I developed the following circuit layout:
Obviously, these were first-draft notes. The large white square in the middle of the page represents the stacked Raspberry Pi, RPi CNC board, Arduino and RPi Touchscreen. It also doesn’t show any of the connections between the controller and the stepper drivers – although those are pretty self-explanatory.
After a fair amount of wrestling with poor crimp connections, I finally got my controller box wired together. Here it is:
The enclosure securely mounts all of the components; has plenty of room for expansion (I added lots of extra button holes at the bottom of the front plate, and each one of the stepper output plugs has four extra connectors for peripherals). Its biggest weakness at the moment is the lack of covers on the outside of the enclosure: I was absolutely petrified when I was doing my final testing that a chip would fall inside the enclosure and short out the 125V circuit (you can see that I covered the enclosure with a bag during final testing in the videos below). I’ve got a good idea of how to build a quick, clean enclosure for the cabinet, though – I will definitely do this before I do any more milling!
With my mill reassembled and ready to cut, it was time to start characterizing its performance post-modifications. The characteristics I was most curious about were the accuracy and repeatability of the axes; the resolution of the system in manual mode; the axial stiffness of the system; the performance of the flexural ball-nut mount I had designed; and finally (and in some ways, most importantly), the qualitative performance of the system while cutting and operating in both manual and CNC modes.
- Resolution: Resolution in manual mode is defined by the rotational distance between two detents on the stepper motor – any manual move will wind up “falling” into a detent at its conclusion, so the smallest move you can make is from one detent to the next. I had designed my system to provide 0.0005″ resolution over one detent, which is a nice, round number useful for machining. To analyze resolution, I indicated off of the table, and moved the handle manually between detents over a reasonable range. I found an average resolution of 0.000533 in, with a standard deviation of 7.453e-05 in. – close enough for my purposes.
- Accuracy and Repeatability: There are many ways to analyze the accuracy and repeatability of a CNC positioning system, but the method I’m most familiar with is described by the ISO 230-2 standard, which I worked with while at NIST. Because of the limitations of my test equipment and time, I performed a significantly reduced version of the 230-2 linear axis positioning test – I only tested four positions over a 1″ segment of the axis, and didn’t consider uncertainty of measurement (although I am confident that my measurement uncertainty is significantly smaller than the accuracy/repeatability signals I’m looking at) – so this shouldn’t be considered to be a valid ISO 230-2 test. However, it’s a good start for looking at the system’s performance.
The above plot shows the results from my ISO 230-2 analysis. I report a bidirectional repeatability of positioning of .025″, and a bidirectional accuracy of .030″. Part of this is due to significant backlash in my axis – I estimate about .010″ backlash – which is visible in my data, and which accumulated over the three trials. I believe this backlash is due to insufficiently clamped components in my ballscrew mount bearing assembly: either the nut that clamps the inner race of the bearing isn’t tightened fully, or the outer race has displaced after clamping further than the .010″ clamp distance that I designed into the clamping tube. Currently, this is the single greatest problem with the mill, and I’ll be examining it over the next few weeks – it should be a quick fix. In the meantime, my data and detailed calculations can be seen in the design workbook, below.
- Axial Stiffness: One of my major concerns with the design of my X-axis was the predicted reduction in stiffness I would see in the axis, thanks to the smaller diameter screw. Back in PUPS 8, I had measured the stiffness of the preexisting X-axis drivetrain to be 5.07e7 N/m, and predicted that the stiffness of the new X-axis drivetrain would be considerably lower, at 1.67e7 N/m. However, upon repeating my test, I was pleased to find that the stiffness of the axis had actually improved, to 6.26e7 N/m!
(Note on plot/data: To calculate the stiffness for the axis, I’m only using data from tests 4, 5, and 6. Tests 1 and 2 were conducted with the motor de-energized, which could have allowed the system to backdrive slightly, and Test 3 – the first test run with the motor energized – showed a large displacement that didn’t go away on reversal, suggesting that the backlash in the system had not been taken out before the test was run.)
- Flexure Performance: I also experimentally examined the stiffness of my flexure ball-nut mount, in both the axial and vertical directions, using my stiffness tester. (I didn’t test the lateral direction because of the difficulty associated with fixturing and testing with my equipment
I had predicted 2.16e4 N/mm stiffness in the axial direction and 3.64e3 N/mm stiffness in the vertical direction. As the plot above shows, I measured 1.11e4 N/mm stiffness in the axial direction and 3.33e3 N/mm stiffness. This is reasonably close (8.4% error) to expected in the vertical direction, but significantly different (nearly 50% error) in the axial direction. I believe that the differences between the fixturing I was able to test axial stiffness with (shown above) and the fixturing I simulated with are to blame – I will be testing & updating this later this week. However, regardless, my initial assertion that the flexure’s performance was insufficient to warrant its inclusion is still supported.
Update 2016-05-17: I re-ran my FEA analysis of the axial stiffness of the flexure, with a physical setup that tries to approximate the test setup shown above. As shown below, I restrained the flexure against the side faces of the anchor points rather than against the clamped faces. I also tried to model the load that my stiffness tester applied to the part more closely by extruding a section at the bottom of the loaded face of the part and applying load exclusively there. Finally, I measured roughly at the same point that my dial indicator was located, as shown above.
With this loading/measurement configuration, I measured a stiffness of 1.49e4 N/mm. This is still a 26% error versus the experimentally measured stiffness, but is substantially closer to the measured value. What this really indicates is a serious problem with my test setup. Because a) the load was not applied through the center of stiffness of the flexure, and b) the measurement was not taken at the center of stiffness of the flexure, torque has been applied to the system, and torsional + translational deflection picked up by the indicator. If I repeat this test, I will make sure to 1) mount the flexure as it is used in the final machine, by clamping it down to a surface, and 2) making a dummy ball-nut that I can install inside the flexure, and press against with the stiffness tester/indicate off of.
- Qualitative testing: Finally, I was ready to move on to qualitative testing of cutting performance and usability. My primary goals were to examine the machine’s cutting performance under CNC control (and especially to see if the motor would bog or lose steps under heavy cuts); test the functionality of the controller & its safety systems; and crucially, verify that the axis could be satisfactorily controlled in both CNC and manual modes without significant intervention. I started by walking through the entire startup and operation procedure for the machine – including verifying that the emergency stop cuts power to both the spindle and steppers – as shown in the following video:
I then mounted a vise with a 6061-T6 aluminum block, and performed a series of test cuts. I started with a light (.005″) full-height finishing pass along the exposed side of the block:
I then performed two different cuts to test the CNC axis’ performance under heavy load, and to compare performance when climb vs. conventional milling. Both cuts were taken with a 1/2″ two-flute endmill, and the cuts measured 0.5″ x .167″. Both cuts were made in the same direction, but on opposite sides of the block, making one a climb pass (upper image), and one a conventional pass (lower image). The cuts were cooled manually with isopropanol.
The machine plowed through both cuts – far heavier cuts than I would have ever attempted to take while operating the machine manually – without any evidence of lost steps or bogging. As the pictures of the test block show, the climb pass is actually slightly cleaner than the conventional pass, although I’m not convinced yet that this will be repeatable. The conventional pass left a very thin wall on the outside of the cut, which reduced the ability of chips to evacuate from the cut and may have produced the “gunking” seen in the corner of the cut.
Finally, I experimented with dual CNC/manual use – which works perfectly. When the enable pin disables the stepper drivers, the resistance felt at the drive wheel is minimal (and actually has the benefit of introducing some damping and inertia to the drive wheel’s motion). The biggest issue here is that since the steppers are open-loop, the controller doesn’t detect when the drive wheel changes the system’s position. The solution to this will be to a) initially, install the DROs that I’ve purchased and use them to manually update the system’s internal position when I move the system manually, and b) long-term, have the system automatically update position every time the stepper drivers are enabled from the DRO inputs.
Overall, I am extremely pleased with the outcome of these tests. The backlash observed in the axis is a major problem for CNC usability, but I’m quite confident it can be fixed/will improve the system’s positioning accuracy and repeatability when it does. Asides from this issue, the machine has performed better than expected, and my tests have given me confidence that converting the rest of the machine to CNC is a worthwhile exercise.
Finally – here are my final documents for this project! In the future, as I work on this system further, I will continue to update these documents. I will be posting written updates to the system design to a separate page, but these links should always connect to the most recent version of these documents.
- PUPS 9 – Final Design Notes
- Error Budget
- Design Spreadsheet (includes data from stiffness & ISO 230-2 testing)
- Link to CAD (Document is public, and can be copied & edited – Onshape user account required. All part drawings that I created – which are NOT fully/properly dimensioned – are included in this document)
- Final Presentation
- User Manual
There is still a lot of work left to be done before my mill is working as well as I’d like it to. Among the tasks I’ll be working on in the future are (in rough order of priority):
- Design covers for transmission, electronics box and Y-axis ways.
- Source and correct backlash in X-axis.
- Implement DROs for X, Y and Z axes.
- Implement end stops on X, Y and Z axes. I’ve purchased Hall-effect endstop sensors for all three axes – I want to have them installed before I start any serious machining.
- Remanufacture ball nut mount, with alignment & potentially shear-loading features. The current ball-nut mount is far smaller than it needs to be, with only two screws clamping it in place. I’d like to machine a new mount that supports more of the nut; and clamps to a larger area of the saddle with more screws.
- Implement CNC control on Y and Z axes. I have almost all of the stock parts I’ll need to do this, and I’m optimistic that I’ll be able to do this using my existing drivetrain designs with minimal modification.
- Conduct Square-Diamond-Circle artifact cutting test. The SDC artifact test is a neat way to characterize the performance of CNC machines directly from a cut part. Once I have control of all three axes, I’d like to cut one of these parts!
- Integrate DROs into controller. Finally, over the very-long-term, I’d like to integrate my DROs into the controller as described above. This is going to take a fair amount of programming, though – it won’t happen for a while!
Over the past few weeks, I’ve run across a bunch of technology that seemed worthy of a Seek-And-Geek, but just haven’t had time to post any of them. Here are two of my favorites, though:
- Cardboard & Paperclip CNC Plotter: First, harkening back to the all-paper CNC stage that I developed way back for PUPS 3, I saw this awesome CNC plotter made almost entirely out of cardboard and paper clips.
From a limited-materials machine design perspective, it does cheat a little bit, in that the designer still relies on threaded rod & nuts to actually create the linear motion. However, the insane ways that they’ve used paper clips in this build – as buttons, as encoders, and as structural members – more than makes up for this. I’m particularly interested in the bearing design they’ve come up with, both on their smaller machine (sliding bearings) and on the larger machine (rolling bearings).
- Drop-Seq: Finally, I wanted to share a technology in biology that I find incredibly cool – and am actually ever so slightly involved in! The technique is called Drop-Seq, and was developed by the McCarroll Lab at Harvard Medical School, where my partner is a Ph.D candidate and researcher.
Drop-Seq is a technique for genetic analysis of extremely large numbers of individual cells in a single process. It works by taking a large sample of cells; tying each one to a DNA barcode; and then sequencing them all together, while still allowing information about individual cells to be extracted. My understanding of the downstream details is limited, but the part that really excites me is the device shown above – a microfluidic chip which flows cells, DNA-barcoded “beads”, and oil together in sequence to create droplets containing a single bead and a single cell, which act as reaction vessels where the cell and bead DNA can be bound. These chips are fairly precise devices, with differences of single microns having significant impact on performance in certain areas, but are actually relatively easy to produce. I’ve worked briefly on modifying chip designs to improve performance, and it’s a fascinating scale of fluid mechanics to be working on.