Contemplating CNC Milling Circuit Boards

Another activity that we will be investigating in addition to CNC engraving is the potential of making our own circuit boards. Mechanically speaking, milling circuit boards are very similar to engraving. Both types of tasks stay within a very shallow range of Z, and would suffer little impact by our wobbly Z axis. Milling boards could involve larger tools than a pointy engraving tool, but they should still be relatively small and not drastically strain our limited gantry rigidity.

Experimentation will start with the cheapest option: blank circuit boards that have a layer of copper on one side. (“single-sided copper clad”) This will be suitable for small projects with a few simple connections that we had previously tackled with premade perforated board and some wires. For example, Sawppy’s handheld controller could have easily been a single-layer board. We would need to go to dual layer for more sophisticated projects like the Death Clock controller board, and the ambition for this line of investigation is for the machine to make a replacement control circuit board for itself.

We don’t yet know how feasible that will be. As the level of complexity increases, at some point it won’t be worth trying to do board ourselves and we’re better off sending the job to a professional shop like OSH Park. And the first few boards are expected to be indicative of amateur hour and a disaster, hence we didn’t care very much about the quality of the initial batch of test boards. They were purchased from that day’s lowest bidder and second lowest bidder on Amazon. (*)

But even though circuit board milling is mechanically similar to engraving, the software side is an entirely different beast that will need some ramp-up time. And before we start cutting metal in the form of a thin layer of copper, we need to pay some attention to the machine’s needs.


(*) Disclosure: As an Amazon Associate I earn from qualifying purchases.

Comparing CNC Engraving Tool To Milling Tool

The decision to explore CNC engraving was so we can learn machine tool operation while sidestepping the weaknesses currently present in our project CNC machine. Projects staying within a single Z depth will suffer minimally from the Z-axis wobble imparted by our bent Z-axis ballscrew. But engraving also helps reduce impact from the lack of rigidity due to differences in our cutting tools.

CNC with cutter 80mm past motor bearing

Here’s the 1/4″ diameter endmill as it was installed in our CNC spindle. In the pursuit of rigidity I wanted the largest diameter that we can put in a ER11 collet not realizing the large diameter also meant longer length. I bought this one solely because it could be available quickly but a more detailed search found no shorter cutters. The end of this particular cutting tool extends roughly 80mm beyond the spindle motor bearing.

In comparison, the engraving tool had a 1/8″ diameter. Judging just by diameter, the 1/8″ diameter tool would be weaker. But that overlooks the fact it is also shorter, resulting in its tip extending only about 55mm beyond the spindle motor bearing. So not only is the engraving bit removing less material and placing less stress on the spindle as a result, it also has a 30% shorter leverage arm to twist the Z-axis assembly about.

Now I understand why such simple inexpensive mills and small diameter tools are a common part of modest desktop CNC mills. (*) The load imparted by such a Z-axis assembly is very modest, making it possible to have machines that are barely any more rigid than a 3D printer. (And in some cases, not even as rigid.) While our Parker XY table is far more capable than the XY stage in these machines, our Z-axis isn’t much better (yet) so we’ll stay in a similar arena low lateral load and material removal.


(*) Disclosure: As an Amazon Associate I earn from qualifying purchases.

Arduino Mozzi Wilhelm Exercise

After completing a quick Mozzi exercise, I found a few problems that I wanted to fix in round 2.

The first problem was the use of audio clip from Portal 2. While Valve Software is unlikely to pursue legal action against a hobbyist exercise project for using one short sound from their game, they indisputably own the rights to that sound. If I wanted a short code exercise as any kind of example I can point people to, I should avoid using copyrighted work. Hunting around for a sound that would be recognizably popular but less unencumbered by copyright restrictions, I settled on the famous stock sound effect known as the Wilhelm scream. Information about this effect — as well as the sound clip itself — is found all over, making it a much better candidate.

The second problem was audible noise even when not playing sampled audio. Reading through Mozzi sound code and under-the-hood diagram I don’t understand why this noise is coming through. I explicitly wrote code to emit zero when there’s no sound, which I thought meant silence, but something else was happening that I don’t understand yet.

As a workaround, I will call stopMozzi() when playback ends, and when the button is pressed, I’ll call startMozzi(). The upside is that the noise between playback disappears, the downside is that I now have two very loud pops, one each at the start and end of playback. If connected to a powerful audio amplifier, this sudden impulse can destroy speakers. But I’ll be using it with a small battery-powered amplifier chip, so the destruction might not be as immediate. I would prefer to have neither the noise nor the pop, but until I figure out how, I would have to choose one of them. The decision today is for quick pops rather than ongoing noise.

This improved Arduino Mozzi exercise is publicly available on Github.

CNC Exploration Via Flat Cutting Projects

We got far enough on the project CNC mill (built out of mostly salvaged parts) to make test cuts, and evaluate results. I honestly didn’t think we would get this far. Back when I first plugged in the salvaged Parker motion control XY table I had only a vague clue where I might go with it, only knowing that I will be learning a lot as I go. Now here’s a machine capable of making a decent effort executing G-code programs generated from Autodesk Fusion 360.

There was never a real solid goal for this project, no “North Star” to guide the direction nor a finish line to mark completion. I think I can now articulate the underlying goal for this project: to learn as much as I can about the world of automated machine tools with the smallest possible budget. This is why I didn’t worry overly much about imperfections like a bent Z-axis ballscrew or a Z-axis gantry lacking in rigidity: they were good enough to move forward and learn lessons.

At this point the Parker XY table, our old industrial equipment at the heart of everything, has proven to be a solid core. In contrast, our problematic Z-axis has proven to to be the weak point. We could fix those problems, but solutions all cost money. So before I pull out the credit card again, a question: are there things we can learn with excellent XY axis but lackluster Z?

The answer is yes: there exists CNC projects with exacting requirements in XY axis but much less demanding of Z. We’ve briefly toyed with one category: pen plotters. For a pen holder, it only matters that a pen is put on paper at the appropriate time and lifted otherwise. Factors like precisely square vertical alignment are not important.

Since we’ve already had some fun with pen plotting, I decided to start exploring the next step up in difficulty: CNC engraving. We will be using a cutting tool in our spindle to remove some minimal material. So while the Z-axis demands are similar to pen plotters, engraving requires a little more rigidity and precision than pen plotting. All the same toolpath generation tasks apply, so as a Hello World to CNC engraving, I engraved “SGVHAK” into the previously prepared surface. With this success, we can look at other projects we can use to learn CNC tasks with the flawed machine we have.

Evaluating Results Of Cutting Tests On Our CNC Project

Our project CNC, pieced together from stuff around the shop, has performed several very informative test cuts. Several items we’ve suspected might be potential issues have been proven as such. Our Z-axis was indeed unreliable in its vertical alignment due to a bent ball screw. Beyond the ball screw, the entire gantry assembly for Z-axis doesn’t have the rigidity to avoid tool chatter when pushing a quarter inch diameter endmill through MDF. The Z-axis rollers prone to loosening were only the weakest link in this chain, we’re confident there are additional problems lying in wait.

On the upside, some items we worried about have not become limiting factors. Using an inexpensive ESP32 for stepper motor control timing was a question mark. We knew the real time guarantees of a shared core were not going to be as precise as a dedicated real-time processor like the PRU of a Beaglebone. But we didn’t know if it was good enough. And finally, we didn’t know if the salvaged Parker motion control XY stage at the heart of this project had hidden problems that could have sunk the project. We think it might have been retired due to an electrical problem we fixed, but it might have been retired due to some other problem we couldn’t fix. Given the consistency we saw between runs, it looks like an ESP32 running Grbl is a fine match for the decades old (but still precise) Parker table.

We’ve learned a lot of lessons in the software realm as well. From configuring GRBL to switching G-code sender to bCNC to CAM parameters of Fusion 360. It feels like there are tons more to learn on the software side of CNC projects, so that’s where the focus will remain for the near future. It’d be wonderful to have a rigid and dependably vertical axis capable of swinging large tools, but even without, there’s lots to learn using what we’ve put together to date. The next area of exploration will be CNC engraving.

Looping Video Advertisement Player Module

While I was at Costco for grocery shopping and checking out rechargeable batteries, I walked through the electronics section. For certain items, the actual merchandise is not available in the shopper-accessible warehouse. Instead the warehouse pallet hold sheets of cardboard that shoppers take to the cashier. Once paid, the receipt is shown to a secure caged area attendant who delivers the actual merchandise.

Familiar with this system, I was not surprised to see pallets stacked full of cardboard sheets in the camera section and didn’t think much of it until my peripheral vision reported unexpected motion. GoPro camera packaging always advertise with beautiful people having amazing adventures, but one of these was moving. Cardboard doesn’t do that.

Bluefin Ad Player 20-3000-1232

Stopping to investigate, I found one of the cardboard sheets has been modified. A rectangular hole was cut, and a video-playing LCD screen complete with associated electronics was inserted. A USB flash drive presumably held the GoPro promotional video, and that was the extent of the modification. There was no rear enclosure so it was easy for me to take a picture for further research once I returned home.

Given the information visible, I searched for Bluefin Technology “Ad Player” Model 20-3000-1232. This led to the manufacturer’s website and some minimal specifications. While the product label clearly labeled the device as made in China, the web site lists an office in Georgia that I presume was their USA distributor. So I was surprised that I couldn’t seem to find this module for purchase online, the only units I found for sale were secondhand on eBay. Most surprisingly, typing the model number into Alibaba and AliExpress also came up empty! I infer this to mean the company only sells to other businesses and there’s no retail sales channel.

I had thought this device would make a promising platform for hacks depending on price. Second hand eBay Buy-It-Now price of $70 is not terribly promising, I had been hoping for something closer to $30. But until I find a retail source or decide to buy in bulk directly from the manufacturer, none of that matters.

Putting AA Batteries in C or D Clothing

In case it wasn’t obvious, my ambition to revive some old NiCad C batteries is more for curiosity than any practical reason. Yes, replacement would cost a few bucks, but hardly breaking the bank. In fact the C cell battery holders I bought to help charge them cost about half the cost of the battery cell, so I definitely can’t hide behind cost saving as an excuse.

Buying replacements isn’t the only thing we can try, either. I was amused when I learned that battery size adapters existed. Apparently, modern NiMH rechargeable batteries in AA form factor can meet electrical demands that formerly required C or D cell alkaline batteries, so it’s possible to put those NiMH AA cells into a sleeve that helps them fit into space designed for C or D cells.

Far from an unauthorized use or hack, such adapters are occasionally bundled along with batteries as seen at my neighborhood Costco. This pack of Energizer branded NiMH rechargeable cells are bundled with four AA to C adapters, and four AA to D adapters.

Inconveniently (or possibly simply a result of Murphy’s Law) Emily’s printer takes five batteries, and there are only four adapters of each size. This is irritating not just because of the current project, but that there are six AA NiMH batteries in this package. Thus they did not include enough adapters to use all six AA batteries…. nor would six batteries be enough to fill all eight adapters. It’s the hot dog & hot dog bun packaging issue all over again, except this mismatch is in the same package!

Back to the adapters: D-cell adapters have a physical electrical connection, as D cells are slightly longer than AA batteries. However, C cells are roughly the same length, so the AA to C adapter is a passive plastic sleeve with a hollow center and no electrical connection. This makes me think we can 3D print a few for experiment’s sake. And as Randy Glenn commented on yesterday’s entry, people have already uploaded adapters to Thingiverse, and modified versions thereof, to help people do exactly that.

Making Attempt To Revive Old NiCad Batteries

When Emily picked up an old inkjet printer from a thrift shop for less than $5, there were a lot of unknowns to explore. Most of the attention were focused on more practical items like “does it print” and “are replacement ink cartridges still available.” (Yes and yes.)

Emily noticed a few mentions of battery-powered operation and recharging the battery, but this was initially dismissed as an optional capability absent from this printer because we saw no batteries. It turns out they were cleverly hidden inside the printer’s platen.

This was an impressive feat of component packaging and we admired this work briefly before turning attention to investigating battery operation. The C battery form factor is pretty rare now, but non-rechargeable Alkaline C batteries are still available cheap. Ignoring the clearly labeled “USE Ni-Cd BATTERIES ONLY” warning, Emily put some in the printer and confirmed it was not happy with those.

C-cell batteries have fallen out of favor, as has Ni-Cad batteries, so given the small market and low volume it was no surprise directly replacement C-cell Ni-Cad batteries (*) are expensive. Costing even more than C-cell NiMH batteries of far greater capacity.

As an alternative to spending money on new NiCad, I was curious if these old cells can be revived. It’s impressive that after many years of neglect every cell still read 0.1V without load. If these were lithium chemistry rechargeable batteries, such low level of charge would have caused chemical damage inside the battery. A crude metaphor I’ve come across: the lithium battery would have starting eating itself from the inside.

But nickel-based chemistries are hardier, and there’s a chance NiCad batteries can be revived even in the face of such abuse. Can these be revived? Or are they hopeless like the Neato batteries? I bought a bunch of C-cell battery holders (*) so I can connect these old cells to my battery charger. Let’s see if they’re willing to come back to work.


(*) Disclosure: As an Amazon Associate I earn from qualifying purchases.

Arduino Mozzi Space Core Exercise

Temporarily stymied in my Teensy adventures, I dropped back to Arduino for a Mozzi exercise. I’ve helped Emily through bits and pieces of putting sampled audio on an Arduino using Mozzi, but I had yet to run through the whole process myself.

The hardware side was kept as simple as possible: there’s only a single switch wired to be normally open and momentarily closed. For audio output, I used the wire salvaged from the Project MC2 Pixel Purse(*) that was briefly a hacker darling due to its clearance-sale price. (As of this writing, the price is up to $39.58, far above the $6 – $8 leading to its “buy to take it apart” fame.) Since this cable was designed to be plugged into a cell phone, it had a TRRS plug that I rewired into an imitation of a monophonic TS plug by using the T wire and connecting RRS together into another wire.

With hardware sorted out, I dived into the software tasks. There were more than a few annoyances that make this task not very beginner-friendly. The Huffman audio compression utility audio2huff.py had dependencies listed only in a comment block easily overlooked by beginners. They didn’t all install in the same way (purehuff required a download and install, while the others were installed via pip.) And since they are a few years old and not actively maintained, they were all written for Python 2.

This will become more and more of a problem as we go, since Python 2 support has just officially ended at the start of 2020. Older Linux distributions would launch Python 2 when the user runs python at the command line, and those that want to use Python 3 would need to run python3. This is getting flipped around and some environments now launch Python 3 when the user runs python and those that need the old stuff has to run python2.

What happens when we run these utilities under Python 3? It’d be nice if the error message is “Hey, this needs Python 2” but that’s not the reality. It is more likely to be something like “foobar is not iterable” completely bewildering to beginners.

To be fair, none of these are problems specific to Mozzi, there’s a large body of work online that were written for Python 2 and waiting for someone motivated enough to bring them up to date.

Anyway, after those problems are sorted out, I got my Arduino to play a sound when the button is pressed. My test sound clip was from the game Portal 2: the ecstatic “SPAAACE!” emitted by the corrupted Space Core when it finally got its wish to go flying through space.

This Arduino Mozzi exercise is publicly available on Github.

[UPDATE]: “Wilhelm” exercise (round 2) has some improvements.


(*) Disclosure: As an Amazon Associate I earn from qualifying purchases. But you shouldn’t buy a Pixel Purse until it drops back down to clearance prices.

First Experiment in Teensy Audio Foiled By CPU Instruction Set

The original line of Arduino boards are know for a lot of very flexible features that made them the champion of entry into physical computing. “Large storage space” is not one of those features, as the ATmega328P has only 32KB of flash. Plenty for blinking little LEDs and a great many other projects, severely limiting for anything that requires nontrivial amount of data.

One such class of projects is playing back digital audio samples. Simple sounds like tones, beeps, and bloops take little data, but recorded digital audio consumes a great many bytes. I was introduced to the Mozzi Arduino sound synthesis library via exposure to Emily’s projects. While the emphasis is on synthesis, it does have provision to handle sampled audio. However, due to the small flash storage, even with compression it could only handle short sounds.

Looking around for an upgrade, I remembered I have a Teensy LC OSH Park edition I had purchased alongside an OSH Park order years ago and thought it was worth an audio playback experiment. The CPU is much faster and it has almost double the flash storage. Exploring the Arduino-compatibility layer called Teensyduino, I see it offers a full analog audio API, complete with a graphical tool to help compose the tree of audio input/processing/output nodes. I was very impressed!

I decided to start small with just two nodes: sound is to be generated by playing from sampled audio data in memory, and sent to built-in DAC. Pressing “Export” generated the following boilerplate code:

#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>

// GUItool: begin automatically generated code
AudioPlayMemory playMem1; //xy=262,658
AudioOutputAnalog dac1; //xy=436,657
AudioConnection patchCord1(playMem1, dac1);
// GUItool: end automatically generated code

void setup() {
// put your setup code here, to run once:

}

void loop() {
// put your main code here, to run repeatedly:

}

Sadly, this code did not compile. Instead, I encountered this error:

/tmp/ccLBGUGU.s: Assembler messages:
/tmp/ccLBGUGU.s:291: Error: selected processor does not support `smull r0,ip,r3,r5' in Thumb mode
/tmp/ccLBGUGU.s:292: Error: shifts in CMP/MOV instructions are only supported in unified syntax -- `mov ip,ip,asl r6'
/tmp/ccLBGUGU.s:293: Error: unshifted register required -- `orr r0,ip,r0,lsr r7'

A web search on this error message indicated this is because the chip on Teensy LC does not support the instructions described in the error message, I’d need a Teensy 3 or 4. To test this hypothesis, I changed the compiler to target Teensy 3 instead of LC and hit “Verify” again. This time, it was successful. But I don’t have a Teensy 3 on hand, so I can’t actually run that code.

Given this limitation I’ll have to find some other project for my Teensy LC. In the meantime, I’ll drop back to the tried and true Arduino for my Mozzi exercise.

Luggable PC Mark II Decommissioned

The era of Luggable PC Mark II has come to an end. It has served me well for over two years, during its service collecting a generous coating of dust clearly visible through the clear acrylic panels. (In hindsight, not the best of ideas.) It has also collected an event souvenir in the form of the Hackaday Superconference 2017 sticker, where I had set it on the badge hacking workbench to create my time-lapse video project.

The point of failure is the video card subsystem, which is the primary purpose of the Luggable PC line of projects. Here’s the output when everything is healthy: the command lspci would include a line for VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI]. But sometimes, the video card does not answer to roll call and that line is absent. When this occurs, the system falls back to Intel integrated graphics.

lspci output

It’s not clear if the failure originated in the video card, or in the flexible PCI extension ribbon cable that has caused problems in the past. I am tempted to replace the video card now that the cryptocurrency fad has calmed somewhat. High performance video cards are still rather expensive, but at least they are available for purchase! I had always intended to replace the video card in Mark II but the cryptocurrency craze distorted the market so much I ended up buying a laptop for my mobile computing needs. Once I had the laptop, the portability of Mark II was no longer as important.

Another development in hardware are the falling prices of UHD (or 4K) computer monitors, motivating me to move beyond the Lenovo QHD monitor at the heart of Mark II. A new video card and a new monitor working together to deliver UHD resolution at 60Hz was tempting enough. I will be removing the core of the machine (Mini-ITX motherboard, CPU, RAM, and M.2 SSD) into a commodity enclosure instead of building my own, driving a new RTX 2070 video card and UHD monitor. This will serve as my desktop computer until I feel the need to build a Luggable PC Mark III.

Projects Using Brushless Motors Must Account For Controller Start Up Behavior

Today I learned brushless DC (BLDC) motor controllers might tailor their motor start up procedure for their designed use case. This is notable because depending on the specialization, it might make them unsuitable for repurposing to other projects. This is not something I had experienced as my own projects have used either stepper motors, brushed DC motors, or self-contained modules like RC hobby servo motors. But another local maker tried to repurpose some brushless motors for a project, and made a discovery worthy of writing down for future reference.

The motors were sold as electric skateboard motors, similar but not identical to this Amazon item. (*) The rubber wheel was removed, and the motor mounted inside a 3D printed gearbox in a similar manner to the brushed DC motors inside SGVHAK rover wheels. The resulting assembly worked well enough on a workbench when driven by the controller module that came with the motor. But when placed under load, the motor was unable able to start from standstill. It was stuck in an endless loop of try, fail, wait, repeat. We had to give the mechanism a push and start it moving before the skateboard motor controller could take over.

Unsatisfied with this behavior, the project moved on to a dedicated brushless motor control chip purchased from Digi-Key and a circuit board was designed around it. This custom BLDC controller module replaced the default unit. When starting under load, it would twitch for a few seconds, then give up and stop. It was only able to run the motor in open air or after a push. So while the actual behavior was different, for practical purposes the two controllers were equally useless for the project.

If it was just one controller, we can blame a faulty unit. But two completely different controllers exhibiting similar behavior in different ways tell us something else is going on. After some investigation, the conclusion is that both controllers are behaving by design. Neither controller were capable of starting a loaded brushless motor from standstill because neither were intended to.

The first controller was tailored for electric skateboards. It does not need to be able to start moving a heavy load from standstill, because skateboard riders usually start off with a kick as they engage their electric throttle. In fact, its inability to move until the skateboard is already moving can be argued as a safety measure to ensure a board can’t take off unexpectedly.

The second controller, after some digging, was discovered to be designed for fans. Unsurprising, then, that it was able to start the motor spinning in air. And again the inability to start under load might even be a safety measure: an air moving fan encountering resistance on startup indicates an obstruction that must be removed.

While instructive, learning this lesson has put the project no closer to a solution. Motor start up behavior isn’t something typically stated up front when shopping for BLDC controllers, as seen in this Amazon “brushless motor controller” query result. (*) More research is required.

But at least we now know it is a factor.


(*) Disclosure: As an Amazon Associate I earn from qualifying purchases.

Project CNC Mill Is Not Square, And It Shows

After our most recent test cutting session, I wanted to prepare our scrap MDF stock for the next test by milling off everything earlier and leaving a flat surface. And like most tests, there was an unintended and interesting data point: The surface is not flat. Not only that, it was the worst “not flat” yet. Our first cutting session did not result in a flat bottom surface, either, but because there was so much tool chatter, it was hard to distinguish one contributing factor to another.

First cuts chatter fest

The second cutting session left us a very smooth bottom surface. Since we eliminated the majority of chatter in this session, we thought chatter was a contributing cause and life was good.

Light dust indicates good repeatability

But with the third session’s results in hand, we now know it wasn’t quite that simple. The nasty tool chatter has been mitigated, but the bottom surface is poor. The ridges are consistent with a cutter tilted from vertical axis.

The square-ness of this machine was always a question mark, because it was only set up by eyeballing against a machinist’s square. This is better than most drill presses, but barely counts as a starting point for a vertical mill. MDF is more forgiving than machining metal, so the fact we have three clearly different grades of surface finish means something changed drastically between runs. Well, “drastic” relative to CNC milling norms, where the thickness of a sheet of paper is a big deal. In normal everyday human experience it was pretty small, but still, what caused the change?

After some consideration, we realized we already knew the culprit: our bent Z-axis ball screw. As our cutter travels in the Z-axis, its tilt relative to the table would vary slightly. Since we’ve been using the same piece of scrap MDF, every test session cut slightly deeper than the last. When we are lucky as in the second project’s bottom surface, we find a height where things are very close to square, and we get a smooth finish. Otherwise we see ridges left by our endmill as it cut across the surface while not quite vertical, pushed off axis by the bent screw.

Back when we realized the Z-axis ball screw was bent, we thought we’d use it until it proves to be a problem. We have now reached that point. Between the bent ball screw and loose Z-axis rollers, redoing the Z-axis (for the fifth time!) is moving up on the priority list. But not at the top yet, because even though we’ve identified this limitation, we still have things we can explore.

Running CNC Program Again Shows Encouraging Consistency

Once we made adjustments to Fusion 360 defaults to be friendlier to our scratch built CNC mill, the generated G-code program gave us better results with less tool chatter. There’s still more chatter than we’d like, so we still need to find and fix weak points like our Z-axis rollers, but these CAM parameter changes are enough to let us continue exploring the world of CNC in parallel with our mechanical work.

This test program was generated by Fusion 360’s “2D Adaptive Clearing” feature. The tooltip for the feature explained its intent is to minimize abrupt changes in direction, which we think is a good thing for a machine lacking rigidity. What it also means is an impressive looking tool path far more complex than what we would try to write by hand.

Adaptive clearing

After we ran this program on our scrap MDF test piece (already partially cut from earlier tests) we vacuumed away the debris and saw a very satisfying result. The rough edges from tool chatter have all but disappeared. With that dominant artifact removed, it leaves us with minor imperfections that we can work on.

The first question is: are we losing steps in the motor control? That might cause some of the imperfections here. We had problems with missed steps when we first introduced the motor spindle, so now it is the first thing we check. And the easiest test to run is to run the same program again. In an ideal case, the machine would perfectly duplicate its motion and no new material would be removed. If we had lost steps, the controller’s internal coordinate position and the actual tool position would be offset by some amount, causing us to cut the same shape in a slightly different place.

The actual result was somewhere in between. As shown in the picture, we did get a light dusting of powdered MDF from places where the cutter removed a tiny bit of material. It was not consistent enough in any particular direction for us to think steps were lost, which is good news. We are free to continue our CNC exploration and find entirely new problems.

Making Fusion 360 CAM Friendlier To Hobbyist CNC Mills

In parallel with investigating points of weakness within the physical structure, we’re also learning how to make Autodesk Fusion 360 CAM friendlier to hobbyist grade CNC mills. We know our project machine, built mostly out of salvaged parts, is not a CNC powerhouse. We now need to tell Fusion 360 how to be kinder to it.

Looking over parameters for tool path generation, the first item we noticed is the default of “Climb Milling”. We’re not professional machinists, but we knew enough to know this is not a good way to go for this machine. But what if we didn’t even have that much knowledge? Thankfully Fusion 360 included a brief explanation accompanying many settings, including the “Sideways Compensation” parameter relevant here.

Climb milling explanation

Key phrase in that explanation: This generally gives a better finish in most metals, but requires good machine rigidity. Our machine is not rigid at all by CNC mill standards and must be switched over to “Conventional Milling”. Most real CNC mills in operation today are rigid enough for climb milling, so this was a reasonable default value for Fusion 360 to use, just not for us.

We also wanted to take shallower cuts in the material, as by default Fusion 360 generates code to tell the CNC to plunge into full cutting depth of the cutter. Making full use of all cutting surfaces on the tool is a reasonable default, but that involves removing far too much material at once for our mill. To tell Fusion 360 to take shallower passes, we can select the “Multiple Depths” option.

Stepdown explanation

Unlike the other explanation text, this doesn’t mention the setting as a potential compensation to lack of machine rigidity, but it worked. Our next test cut was far more successful.

Z-Axis Rollers Contribute to Tool Chatter

During our chatter-dominated CNC testing session, we used our fingertips to feel around machine structure. Most people’s fingertips are sensitive enough for identifying the presence of relative motion between mechanical parts, though only very few people can accurately quantify the distance of that motion. In this case we wanted to know which parts are moving relative to other parts, and our fingers were great for the purpose.

One of the weakest links in our machine rigidity were the four rollers aligning our Z-axis vertical extrusion beam. Two each on left and right sides of the spindle, one above the other. We could feel the vertical extrusion beam vibrating within these rollers clamping them in place.

Examination after our cutting session found the lower two rollers loose. Before this session, all four were tightened up against our vertical beam allowing no movement and enough friction they were difficult to turn by hand. By the end of the session, the lower two could be moved by hand. It appears the upper two held tightly enough to act as a fulcrum, and our cutting tool had enough leverage to move the lower two loose.

Movement of the lower two rollers were a consequence of this modular design built out of aluminum extrusion beams. These rollers are held by square nuts inside the slot of an extrusion, meaning they were held in by friction. When forces build up enough to overcome that friction, these square nuts would slide within their slot, loosening our rollers.

Until we find a better way to arrange our Z-axis, we will have a constant maintenance task of re-tightening these rollers. We also went looking in Fusion 360 CAM for settings to take shallower cuts, and together they made follow-on session a lot more successful.

Problem of Tool Chatter Dominates CNC Session

Obtaining maximum spindle RPM was the last bit of preparatory setup for our next CNC work session. There are still lots of parameters we don’t yet understand for Autodesk Fusion 360 CAM, but we knew the fundamental bits and put them in as parameters for G-code generation calculations.

Specify offsets and toolpaths using Fusion CAM, though, is still a skill we’re not very practiced at just yet. In the spirit of incremental learning, we try not to let the unknown stop us from experimenting. Mistakes are expected and, as long as nobody gets hurt and nothing is broken (well, even if something is broken) each run should teach us a little more about the process.

And the lesson of the day is tool chatter. Lots of it.

In action the machine really sounds unpleasant, but not quite bad enough to make us think breakage is imminent, so we would let it run in short sessions while we experiment and try to understand its cause. Slowing down our feed rate and adjusting our RPM appeared to have little effect, the variable that mattered was the depth of cut. Even though we had expected MDF to be relatively easy to cut, we now believe the machine is not rigid enough in its current state to cut 3-4mm deep with our 1/4″ cutter. The final cutting pass in this test program (creating the X shape) was only 1mm deep, and that ran quite smoothly even at higher feed rates.

Lessons from this session tells us we can take two parallel approaches: mechanically, we’ll need to think of ways to improve machine rigidity. And while that is under development, we’ll need to learn how to tell Fusion 360 CAM to take shallower passes.

Spindle Clocks In At 11,100 RPM

Once some convenience accessories are in hand, we return to the main business of cutting material. Our biggest unknown at this point is our spindle’s maximum speed measured in revolutions per minute (RPM). This is a critical part of calculating the “speeds and feeds” of machining. Yes, we’re cutting MDF which will be relatively forgiving, but the point of learning is to practice doing it right.

Our cheap ER11 spindle’s product page(*) claimed a maximum speed of 12,000 RPM, but we knew better than to take that at face value. To measure its actual performance, we wanted some sort of non-contact photo tachometer(*). This particular unit was on hand and originally designed for measuring remote control aircraft propeller speeds, and it measured the maximum speed at 11,100 RPM. We’ll use 11,000 RPM for our initial calculations. Later we’ll measure while it is cutting and see how much its speed drops.

Is this fast? Well, “fast” is always a relative thing. Most people’s daily experience with RPM is on their car’s dashboard tachometer. In that context it is fast as 11,000 RPM is faster than most normal car engines, though race cars and motorcycle engines can hit that speed. For machine tool purposes, though, this speed is considered on the low side. Especially for small diameter tools that we’ll be using. Physically, we are limited by the small ER11 collet for our tool diameter. Plus the machine is not rigid enough to swing a big cutting tool without flexing. And now we know the limitations of spindle speed. Which of these limitations will be the one to actually constrain what we can do with the machine? Let’s have another cutting session and find out.


(*) Disclosure: As an Amazon Associate I earn from qualifying purchases.

Hex Wrench Holder And Wire Clip For Gantry Extrusion

The first project for designing accessories to mount on the extrusion beam, a holder for ER11 collets, turned out well enough I wanted to continue. Apply some of the lessons learned to create more nice-to-have accessories for the CNC project.

One accessory is a holder for a 5mm hex wrench. This is the size used by the fasteners bolting our gantry’s extrusion beams together. There are a set of four bolts, two on the left and two on the right, that we loosen to adjust the height of the gantry. Lowering the gantry lets the cutter cut through our work surface to cut holes for threaded inserts, raising the gantry gives us more Z travel for the work piece. Or we might deliberately trade off Z travel to use a shorter and more rigid gantry for more challenging pieces. We’re not sure what the viable combinations are, but we do know we’ll need this wrench handy for experimentation.

The other accessory is a wire management clip. Wiring is a perpetual challenge on this project, from finding appropriate component placement to isolating electrical noise. I’m sure electrical challenges will continue to vex us as we proceed. We’ll figure out the problems one by one as we go, but one thing is for sure, we’ll need a lot of ways to route wires and keep them in place, hence the clips.

Unlike the previous accessories, the wiring clip may be mounted in any orientation. To hold themselves in place, each clip will require additional holding force. To get this force, they are printed slightly more open than their installed configuration. Installation would then require compressing the ring and this tension in the plastic will provide friction against extrusion rail to hold it in place. And while I’m not entirely sure it will be necessary, I added a small flap to keep the wire from sliding out of the ring into the rail slot.

There will be more accessories along the lines of what’s been printed so far, but I’m eager to get back to the primary exploration of cutting material.

Collet Holder Clamps To Extrusion

While I was in Onshape CAD designing our goose neck work holding clamps, I also tackled a few other to-do items on the 3D-printable accessory list. The top of the list was building a way to keep extra collets accessible on the machine. Our CNC spindle came packaged with a 1/8″ ER11 collet, which we swapped out for a 1/4″ collet when we wanted a stouter cutter. We didn’t have a good place to keep the temporarily unused 1/8″ collet and, rolling around on the tabletop, we were constantly at risk of losing it.

I thought it was a good project to practice designing plastic’s flexibility to my advantage instead of constantly seeing it as a disadvantage. I’ve had several projects along these lines before, but my interest was renewed by Amy Qian’s demo board she brought to show off at Supercon.

There are two ways I wanted to apply this concept. First, I wanted a holding mechanism that can snap into an extrusion rail and stay there without use of tools or fasteners. Second, I wanted a way to hold the collet so that it is held securely by default (not fall out or be dropped easily) but can be removed easily on demand. Again without tools or fasteners.

Here is the first draft of a flexible clip for installation into extrusion beam, this design was too flexible and fell out of the extrusion rail easily. More iterations followed, hunting for the most secure hold possible while still making it possible to insert into the rail.

Extrusion slot clip

Separately, I started designing a flexible cover for the collet. The test piece for each mechanism evolved separately until I was happy with both designs, then they were integrated into a single piece incorporating both mechanisms.

Collet holder evolution

With the success of this holder, I took the lessons of a flexible extrusion beam mount and applied the concept to a few additional 3D printed accessories.