diff --git a/content/07_cnc_machining.md b/content/07_cnc_machining.md index 1ce14aa69f6e29ebd86a1a9e09f02ef6e26ed9a5..3df07ab98686f3c3482c0ce70ed54877b1d1ed05 100644 --- a/content/07_cnc_machining.md +++ b/content/07_cnc_machining.md @@ -5,13 +5,16 @@ menu = "main" weight = 8 +++ + ## Make Something Big +Files: [code](https://gitlab.cba.mit.edu/erik/htmaa_shelves) (generates SVGs and ShopBot files) + +I've been waiting for this week. Having just moved from California, my apartment is in need of some more furniture. My most pressing need is additional shelving. -I've been waiting for this week. Having just moved from California, my aparment is in need of some more furniture. My most pressing need is additional shelving. ### Design -I want a shelving unit that fits exactly between two doors in my bedroom, and occupies all the space between the floor and ceiling. To enable laziness, I'm also taking as a design constraint the ability to assemble and dissamble the shelves without any glue or fasteners. I'm aiming for solid slot joints. +I want a shelving unit that fits exactly between two doors in my bedroom, and occupies all the space between the floor and ceiling. To enable laziness, I'm also taking as a design constraint the ability to assemble and disassemble the shelves without any glue or fasteners. I'm aiming for solid slot joints. I started by drawing a parametric model in Fusion 360. @@ -23,19 +26,61 @@ My code exports SVG images, because they're easy to write. (On this site it's in ![](/img/07_2d_design.png#c) + ### Test Model -To ensure that my generated 2d patterns are correct, I cut a 1/4 scale model out of cardboard with a laser cutter. It fits together nicely. If only this actually meant that my full-scale model would as well. +To ensure that my generated 2d patterns are correct, I cut a 1/4 scale model out of cardboard with a laser cutter. It fits together nicely. This is a great way to ensure that the model doesn't have any glaring mistakes. Though in this case, I actually found a few minor issues later that were too small to detect at this scale. -### Machining - Attempt 1 +![](/img/07_scale_model.jpg#c) + + +### Machining: First Try I reserved a block of time on Tuesday. The first hurdle I encountered is that VCarve can't import SVG files. So to load my models, I had to open them in Inkscape, and convert them to EPS. (Rhino won't load SVGs either.) -The second issue I encountered was that VCarve Pro is very hesitant to navigate into narrow slots. I'm using a quarter inch router bit (more on this later), and I would like to use it to cut some quarter inch slots. But VCarve wouln't insert toolpaths until I widened the slots to 0.255 inches. This difference isn't visible, but it's certainly enough to make otherwise tight slot joints sloppy and loose. I figured I could live with this, and expanded all of my model's quarter inch slots. +The second issue I encountered was that VCarve Pro is very hesitant to navigate into narrow slots. I'm using a quarter inch router bit (more on this later), and I would like to use it to cut some quarter inch slots. But VCarve wouldn't insert toolpaths until I widened the slots to 0.255 inches. This difference isn't visible, but it's certainly enough to make otherwise tight slot joints sloppy and loose. At the time I figured I could live with this, and expanded all of my model's quarter inch slots. + +The quarter inch endmill should have no problem machining half inch slots, and I intentionally undersized these to get a tight fit. Unfortunately, after cutting my test pieces I found that the fit was still very loose. Calipers confirmed that the slots were quite a bit wider than in the model. And while investigating this issue, I also noticed that my whole shelving unit was about a quarter inch wider than it should be. The error in the overall length of my model turned out to be a bug in my SVG generation. + +I investigated the slot size issue in more detail later, and found that it was mostly due to tool deflection. Cutting climb vs conventional causes a very noticeable difference in part size (at least as far as joint fit is concerned). This surprised me since the deflection here was greater here than with the mills I used for metal at [Plethora](https://www.plethora.com/). But of course there we used Haas machines with giant cast iron frames. Apparently the ShopBot is floppier than I thought. -The quarter inch endmill should have no problem machining half inch slots, and I intentionally undersized these to get a tight fit. Unfortunately, after cutting my test pieces I found that the fit was still very loose. Calipers confirmed that the slots were quite a bit wider than in the model. And while investigating this issue, I also noticed that my whole shelving unit was about a quarter inch wider than it should be. The error in the overall length of my model turned out to be a bug in my SVG generation. The slot size problem I never traced down definitively, but it's likely some combination of error introduced during model conversion and rescaling, runout, and bit deflection. ### Generating GCode -As any [Plethora](https://www.plethora.com/) alum would conclude, I might as well just generate my own gcode. By using line segments and arcs, I can make the files a lot smaller than VCarve (though I'm not sure if it's VCarve that previously exploded the arcs, or InkScape). This required me to implement path offsetting for line segments and arcs, ShopBot code generation, and my own system for tabs. +Overall, I was getting pretty frustrated with VCarve. So I decided I might as well generate my own gcode (ok, in this case ShopBot code, not gcode). By using line segments and arcs, I can make the ShopBot files a lot smaller than VCarve (though I'm not sure if it's VCarve that exploded the arcs, or Inkscape). I'll also know exactly what commands the machine is getting, so I don't have to worry that my part size issues are from file conversion issues or VCarve bugs. + +This required me to implement path offsetting for line segments and arcs, ShopBot code generation, and my own system for tabs. Check out my code if you want to see the gory details. + + +### Machining: Second Try + +On Wednesday I returned to the shop. When I first started trying to machine, I was dismayed that the ShopBot wouldn't ask to start the spindle. I based my ShopBot code generator on the [ShopBot Command Reference](http://www.shopbottools.com/ShopBotDocs/files/ComRef.pdf), so I'm not sure what's different about our setup. Ultimately I just copied the preamble from some ShopBot files I had exported from VCarve. + +After that, it was smooth (if loud) sailing. + + + +First I cut a quick slot joint test piece. Normally this would require re-exporting files from CAD, and doing the CAM again in VCarve. But since my design and gcode generation take place in one software pipeline, I just had to rerun my code to get all my updated ShopBot files. + +![](/img/07_slot_test.jpg#c) + +After that it was just a matter of waiting for the machine, and feeding it stock. I had four panels in total (oops, looks like I forgot to take a picture of one). + +![](/img/07_panel_1.jpg#c) +![](/img/07_panel_2.jpg#c) +![](/img/07_panel_3.jpg#c) + +Here's the start (and end) point of one of the longer pieces. The effects of hysteresis and tool deflection are clearly visible (yes, the lines are programmed straight). + +![](/img/07_hysteresis.jpg#c) + +### Assembly + +Remember when I mentioned that cutting climb vs conventional had a noticeable impact on part size? I hadn't figured out how important that was just yet, which caused me some problems. I cut everything climb. Which for the most part meant that all my parts were oversized by the same amount. But in a few places, the size changes interfered constructively. For example, the shelves have tabs that fit into holes in the main vertical supports. Tool deflection meant that the shelf tabs were a little wider than modeled, and that the cutouts on the supports were a little less wide than modeled. So I had to do some sanding to get them to fit. This was a lot of work, but they did fit perfectly in the end. + +I'm really happy with the end result. Here's my room, before and after. I can't imagine going back. + +![](/img/07_before.jpg#c) + +TODO: after diff --git a/static/img/07_before.jpg b/static/img/07_before.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14c1854bde92da8bb872b2f893c5e555d5c9f3c1 Binary files /dev/null and b/static/img/07_before.jpg differ diff --git a/static/img/07_hysteresis.jpg b/static/img/07_hysteresis.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e73c1f14d1e31c45b287289e41d4e175b6c67cd Binary files /dev/null and b/static/img/07_hysteresis.jpg differ diff --git a/static/img/07_panel_1.jpg b/static/img/07_panel_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3c6c16384bc6ddd94f387dfaf9758ede1ddc95f3 Binary files /dev/null and b/static/img/07_panel_1.jpg differ diff --git a/static/img/07_panel_2.jpg b/static/img/07_panel_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d25761772799b2020b512659eebfb76a043cd70 Binary files /dev/null and b/static/img/07_panel_2.jpg differ diff --git a/static/img/07_panel_4.jpg b/static/img/07_panel_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d688e68084a329984e38ac27ac6fceef037e10bb Binary files /dev/null and b/static/img/07_panel_4.jpg differ diff --git a/static/img/07_scale_model.jpg b/static/img/07_scale_model.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e049c302e1e9cf84b2535e36dce348f90899b12 Binary files /dev/null and b/static/img/07_scale_model.jpg differ diff --git a/static/img/07_shopbot.mp4 b/static/img/07_shopbot.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0b73277735f73136189d7423f99f7b487598e6b9 Binary files /dev/null and b/static/img/07_shopbot.mp4 differ diff --git a/static/img/07_slot_test.jpg b/static/img/07_slot_test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95004c9bc87f45b06666d4f53a4e3d373b33d3e3 Binary files /dev/null and b/static/img/07_slot_test.jpg differ