All–In-One Retro Game Controller & Console

The Adafruit Joy Bonnet is a tiny add-on for the Raspberry Pi W that features a 2-axis joystick and 8 buttons. It's great for making retropie projects. In this tutorial, we'll learn how to use the Othermill Pro to mill a case out of wood. We'll also walk through the design process.

Prerequisite Guides

We suggest you walk through the following learning guide in order to get familiar with the Joy Bonnet. It'll walk you through the software installation and get you up and running.

How to CNC

This tutorial covers some of the basics for learning how to use CAM tools in Autodesk Fusion 360. It walks through the setup process and shows how to create tool paths for machining parts using Othermill Pro desktop CNC. We'll also take a quick look at material preparation and planning.

Author Notes

I choose to do this project because I wanted to gain more experience with CNC milling. I've done some other projects with the Othermill before, but this is the first enclosure I've designed specifically for CNC milling. Compared to 3D printing, there's a few limitations I had to consider. Although it's a simple project, I did learn some new CAM skills and documented the process for future reference.

3D Modeling

The first thing we'll need to do is design our case. I like to model the electronic components first, so that I can design around them. In this project, we just need to make the Joy Bonnet and Raspberry Pi Zero. These two boards are held together with headers, so they're essentially secured by friction. We can use this to our advantage and avoid having to use screws to secure two halves of the case together. We'll design the case in two halves, one for the Joy Bonnet, and the other for the Raspberry Pi. As long as each component is secured to a halve, we can easily join the two together.

Layer by Layer Tutorial

I do most of my work in Autodesk Fusion 360. It's a free 3D modeling program thats great for making parametric models and has integrated CAM. I put together a video that walks through designing the Adafruit Joy Bonnet step by step. This is a multi-part series that goes from making the components, to making the two halves of the case and the buttons. I've also made the components and case design a free download, so you can go ahead and start machining the case. It's very software specific, so we won't cover all the details in this written guide.

Designing for CNC

Because we're going to CNC mill the design, we need to think about design for manufacturing. In our case, we're cutting the design out of a block of wood. There's certain limitations that we have to keep in mind, such as avoiding undercuts and overhangs. If you think about how the CNC machine cuts from the top down, we can't easily make cutouts with overhangs. This means, if we need an opening, it needs to start from the top.

We need to have cutouts on the side of the case for the two microUSB ports, miniHDMI, camera connector, and SD card. These cuts only need to be made in the bottom half of the case.

On the top half of the case, we need cutouts for the buttons and the thumb joystick. These cuts will be on the very bottom of the case. 

The two boards feature four mounting holes. One on each corner. To secure the boards to the two halves, we'll make standoffs to elevate the PCBs from the surface of the case. These standoffs will have holes in the center and have to line up perfectly with the mounting holes in the PCBs.

Important thing to consider is the build volume of our CNC machine. The Othermill Pro has a work area of 5.5 × 4.5 × 1.35 in (140 × 114 × 34.3 mm). Our case design should fit on our spoilboard. 

Getting Your Stock Ready

Before we jump into the CAM side of things, it's a good idea to think about what material we want to use. Here, we're using a few different types of hard wood (cherry, maple, walnut and oak). I got these from various places, some from online (inventables) and other from my local hardware store (Lowe's). These came in different sizes and thicknesses. Some of them are nice and flat, others need a bit of work to get nice and level.

If you have a large piece of stock, we'll need to cut it down to size so it can fit within the build volume of the Othermill (5.5 × 4.5 × 1.35 in or 140 × 114 × 34.3 mm). If you're purchasing your stock from your local hardware store, you might be able to have them cut them for you. In my case, I had to cut them myself. I used a portable tabletop saw to cut my stock. I used a t-square to measure 3x4inch squares and marked guidelines on the stock. I used the included rip fence to get straight cuts. 

Preparing your stock can be a project in itself. If you're not setup for it, you may need to get your workspace and tools in place before starting. For me, I hadn't worked with wood before, so I didn't have the tools or workspace setup. To get ready, I cleared out space in my garage and got myself a tabletop saw. I needed a table to fit it on, and a shop vac to take care of the saw dust.

Leveling Your Stock

It's really important to get your stock nice and level. You can lay your stock on a surface like a desk or workbench and press down on the corners. If it's rocking from side to side, then the stock isn't level. Some of the wood that I purchased was pre-leveled, but other's needed a bit of work. To get them level, I used a hand planer given to me by a friend. Hand planers are the essential tools for woodworkers. It 'skins' away the surface little by little with a chisel like blade until it's nice and flat. It's a labor some process, so you may find an electric hand planer to be much faster and easier.

Clean Surface & Edges

Which ever process you do, it's a good idea to sand down your stock so it's nice and smooth. Any rough edges can easily be smoothed out with a bit of sand paper and elbow grease. Don't worry about applying solutions or finishes to the stock just yet. If you do want to apply lacquer, stains or wax, we'll need to do that after our part is milled. Once your stock is prepped and ready, we can get started on setting up our CAM stuff. Lets go!

Tooling Strategies 

Once we have our case designed, we need to setup CAM operations to tell the CNC machine how to cut out the design. We need to think about which bits and operations are best and determine what material we want to use. A good goal to have is optimizing for minimal machining time. This can mean having less operations or getting the most usage from a given tool.

Operation Types

There's a whole slew of operations that we can use to make our part. In Autodesk Fusion 360, you can hover over each type in the 2D/3D drop down menus within the CAM workspace. If you keep your cursor over the operation title, you'll get a handy tool tip with a description and thumb nail. This is really helpful and gives you an idea of what they do and when to use them. For this project, we can make our part with just a few of them.

2D Face

This operation will remove material to get our stock to be the same height as our model. It generates straight passes that will mill away a given area/selection. 

2D Contour 

Let's you select an edge and generates a tool path that sweeps across the edge. This can take several parameters like number of step downs and starting positions.

2D Pocket

Good for cutting out cavities and holes. Instead of just going in a single path (like a 2D contour), it generates concentric outlines that follow the edge of a given selection. 

Adaptive Clearing

This is good for handling lots of different geometry. It'll analyze the model and automatically generate tool paths that will clear out the material. This will follow the contours of a surface and sequentially step down until the stock resembles the model. 

Setting Up CAM

Now that we have a basic understanding of what operation types we can use, we need to create a "setup" for our parts. Since we have two halves and buttons, we'll need to create a "setup" for each part. A "setup" is a group of tooling operations that will makeup our part. In the setup, you'll need to define the size of the stock, it's coordinates and if we're using fixtures or jigs.

In Fusion 360, you can create a new setup by clicking on the setup icon within the CAM workspace. Once it's open you'll have various settings contained in a properties panel.

Selecting Coordinates

Under Work Coordinate System, select "Box Point" and choose one of the white dots that appear in corner of your model. You're basically picking the origin of the setup. On the Othermill, the origin for getting the best alignment will be on the lower left of the spoilboard. If the model is upside down, you can click on the blue Z arrow to flip the direction. Next, we need to select the correct model we want to mill. By default, everything will be selected. Under Model, click the X to clear the selection. Then, click on the part to select it as the model.

Set Stock Dimensions

In the "Stock" tab, you have the option to specific the dimensions of your stock. Under the "mode" drop down menu, are several options for choosing size and shape. I normally use the "Fixed" size and enter the dimensions of the stock. For the model position, I set offsets to the sides. I like to add a 4mm offset on the X and Y to ensure I get clean outline. I zero out the Z offset so the model is positioned to the bottom of the stock and not in the middle of it. Click the OK button to save your setup.

Othermill Tool Library for Fusion 360

Before we start adding some operations, it's a good idea to import Othermill's tool library into Fusion 360. A tool library contains info and details about the bits that are compatible with the Othermill. I suggest following the guide on Othermachine's website to get the library and installation. It'll walk you through the steps on how to do it, pretty straight forward.


Once we have our tool library installed, we can set our first operation. We'll use a facing operation. This will get our stock to the height of the model. In this specific job, our stock is 12mm thick and our model is 8.5mm tall. The face operation will therefore remove 3.5mm of material from the top.

Click on the 2D icon in the tool bar and select 2D Face. In the properties panel, select the 1/8in flat end mill. Then, change the following parameters.

  • Cutting Feedrate: 800mm/min
  • Plunge Feedrate:  381mm/min

We only need to change these two parameters. The rest of the settings are already set, all we're changing is the "speed" of the cut and how fast the tool should "plunge" down onto the material. Since we're cutting hardwood, it's best to cut at a speed that isn't too fast or slow. For softwood, you could cut faster, such as birch plywood – 1500mm/min is suffice. For other types of wood, you can refer to Othermachine's material support page.

Multiple Depths & Direction

The next settings to modify will be under the "Passes" tab. Here, we'll change the direction from "both ways" to "climb". When milling from both directions (left and right), it can leave behind some excess material – thin strips. If we tell the operation to mill from only one side, we'll get cleaner cuts – especially if we're cutting along the grain of the wood. Select "Multiple Depths". Here, we should set the maximum stepdown to 1mm. This is telling the operation how deep to cut. If we limit the depth to just 1mm, we avoid the risk of breaking our bit. Going too deep can cause the tool to snap from too much load. 1mm is a safe depth for the 1/8th flat end mill. OK to save the settings.

Adaptive Clearing

Under the 3D icon is Adaptive Clearing, click on it and choose the 1/8th" flat end mill. If the feedrates appear to have changed, go ahead and adjust them like we did for the facing operation. Under the Geometry tab, click on the machining boundary dropdown and choose "selection". Then, select the outer edge of the part. We're essentially telling the operation to only cut within the bounds of our part. This prevents the operation from milling out the entire stock. This saves a lot of time and lets us use any of the excess stock that doesn't need to be milled. It's also a good idea to set the Tool Containment to "Tool inside boundary". Next, under the "height" tab,  look for "Bottom Height" and choose "Selection". Then, click on the inside inner surface of the part. By doing this, we're telling the operation to only cut until it reaches this surface. The cutout for the joystick and buttons are just too small for the 1/8th" flat end mill. So, we'll limit the adaptive clearing and finish the cutouts with a smaller tool. Last thing, go "Passes" tab and set the Maximum Roughing Stepdown to 1mm. Just like we limited the stepdown for facing, we don't want to cut too deep. After that, click OK to save and generate the tool path.


Before we switch out the tool, we should try to use the 1/8th" flat end mill as much as we can. The next operation is a 2D contour, found under the 2D icon. The 1/8th" flat end mill should already be selected along with our feedrates. If not, go ahead and set those up. In the Geometry tab, Contour selection should already be active, so you can click on the outer bottom edge of the part. In the Heights tab, make top height "model top" and bottom height, "model bottom". Under the "passes" tab, check the multiple depths option and set Maximum Roughing Stepdown to 1mm. So, here we're telling the operation where to start the cut, which is the top of the model because our face operation has cleared out the material to be the same height as the model. We've limited the stepdown to a safe amount, so we won't cut too deep on each pass. The toolhead will keep cutting along the outer edge of the case until it has reached the bottom of the model, which is also the bottom of the stock. That's basically all we need to tell the contour what to do. Click OK to save it.

1st Pocket

Last operations to make are 2D pockets. Click on it and select the 1/16" flat end mill from the tool library. You'll need to adjust the feedrates like we did for the other operations. Under the Geometry tab, we need to make our pocket selections. Go ahead and select the edges that make the cutout of the joystick and buttons – that's 7 chains in total. In the Heights tab, set the Top Height to Selection and select the inner face. In the Passes tab, enable Multiple Depths and set maximum roughing stepdown to 0.5mm. It's important we don't cut too deep with the 1/16" flat end mill because it is thinner than the 1/8". So here we've told the operation where to start, what to geometry cut and how deep. Click OK to save.

2nd Pocket

We'll need a second 2D Pocket to make the holes in the corner standoffs. This setup will be similar to the first pocket, but we'll make a few changes. First, switch the tool to a 1/32" flat end mill. The 1/16" is too big to make our mounting holes. The 1/32" is just the right size. Under Geometry, select the bottom surface of each hole (not the top). Under Heights, make the Top Height a selection – click on one of the top surfaces on the standoff. For Passes, enable multiple depths and set the maximum stepdown to 0.25mm. Here, we've told the operation to mill out the holes, where to start, when to stop and how deep to cut. And that's it for our the top halve of the case. Click OK to save.


Now that our operations are set, we can simulate them. Click on Setup icon in the browser and then click on the simulate button in the tool bar. In the simulate panel, disable tool path and enable stock. Fusion 360 will generate a preview of how it thinks the operations will actually play out. You'll get a new set of icons across the bottom, they look like media buttons. You have the option to play, rewind, and fast forward as if it were a movie. It's pretty cool. When you hit the play button, it'll animate a tool head and follow the tool paths we setup. They're segmented across the bottom of the work area as a green bar. If you encounter any red tick marks in here, that means we have a tool collision. If we setup everything properly, we shouldn't have any. If you do, double check your operations and ensure we have all the right settings and chain selections. If everything looks good, we can move onto post processing (saving out gcode files for Otherplan). When your done with the simulation, click the close button.

Post Process

Now we'll save out the gcode for our operations. For starters, I recommend saving out a separate gcode file for each operation. Right click on one of the operations (order doesn't matter), and select "Post Process". Then, in the post process panel select othermill.cps from the dropdown menu. Click OK, navigate to a directory where you want to save it and name your file. For example, I'd name the face operation, "". We need to use the ".nc" file extension in order for Otherplan to recognize it. I like to name the file so I know what operation type it is, and which tool it needs. You'll need to repeat this process for the rest of the operations. Next up, we'll set up our gcode in Otherplan – The software that interfaces with the Othermill Pro. 

The Bottom Half & Buttons

So far we've only setup our first part. We still have to do the bottom half of the case and our buttons. It's a pretty similar process, so I won't cover them in full detail like I did for the top half of the case. I hope I've provided enough information for you to take and apply to your own designs. It's a bit much at first, but I think the main concepts are there to learn from. There's lots of opportunity to make the tool paths optimized to reduce machining time. The more you practice, the better you'll get with experience. 

Setup Otherplan

If you're just getting started with the Othermill, you may need to download the Otherplan software from Othermachine's website. You'll need to learn how to switch out tools and probe the bed. I won't cover the basics in this guide, there's some beginner friendly lesson plans on Othermachine's website to get you up and going. From here, I'm expecting you know the basics of Otherplan.

Material Profile

We'll use a generic material profile to start with and adjust the settings as we need. Enter the dimensions of your stock in the size drop down. Under placement, leave the alignment to spoilboard set to the left. We should zero out the X and Y axis but add an offset to the Z. Since we're using NITTO tape to secure the stock to the spoilboard, we need to tell Otherplan our stock is slightly elevated from the spoilboard. I tend to use 0.20mm as the offset since that is the thickness of a piece of NITTO tape. Once that's setup, we can move onto adding our gcode files.

Add GCODE Files 

Under the plans section, we can hit the Open Files... button to add our gcode. Navigate to the directory where we saved out our gcode files and choose the facing operation and click open. Then, select the 1/8" flat end mill from the Milling Tools T1 dropdown menu. Repeat this process for each gcode file, making sure to select the correct tool. 

Set Tool and Probe Bed

We'll run our facing operation first. In the configure section, under the Tool select "change" and follow the tool changing process. We'll use the 1/8" flat end mill for the face and adaptive clearing operation. The Othermill should be connected to the computer via USB. The toolhead will automatically run the homing sequence so it knows where it is. When you change the tools, Otherplan will automatically ask you if the spoilboard is cleared and safe to probe the bed. Probing the tool is how the Othermill knows what offset to use so it doesn't mill into the spoilboard. So make sure you have adequate area on the spoilboard for probing. If your stock is takes up the entire bed, you need to probe your tools before securing material down to the spoilboard. If you're following this guide linearly, we actually haven't done that yet. 

Secure Material

Now it's time to secure our stock material to the spoilboard. I used a few strips of NITTO tape to secure my wood stock to the bed. It's pretty strong stuff, also works well with metals like aluminum and brass. With strips now stick on one side of the stock, you'll want to carefully lay the stock on the spoilboard with the corners lined up square with the lower left side. If you're a little off or over, it's OK. This is why we set a 4mm offset in Fusion 360, so our stock doesn't have to be perfectly 100% lined up with the bed. Firmly press down on the stock to ensure we have good adhesion to the bed.

Run It

OK, now it's time to run our first operation, so let's go forth and Face! Click on the Start Milling button below the face operation. Once the spindle ramps up, I suggest carefully watching the toolhead and watch out for any unexpected movements. It's noisy, so be sure you're milling in an area that is OK with lots of noise. The machining time depends on a few factors such as cutting feedrate. The thicker our stock, the more time it takes to face. If it's really thick, it'll take maybe an hour. I believe mine took about 20 minutes to a half an hour. Either way, it's good idea to periodically check on it and make sure our tool isn't broken or milling too deep. If you do find something is wrong or weird, you can either pause the operation or stop it completely. For really nasty situations, there's a built-in kill switch on the side of the Othermill, it's a nice and big red button. Push it in to immediately kill the operation. If we did everything correctly, we won't ever have to use it :-)

Mill, Remove Swarf, Repeat

Once our face operation is complete, we can remove the acrylic cover and clean up the swarf using a vacuum cleaner. Swarf is the fine chips of material produced by the machining operations. And there's lots of it. The Othermill can run decently with a lot of swarf in the chamber, as long as it doesn't obstruct the toolhead and motors. I tend to clean it after every operation, but it's up to you how much of a neat freak you want to be. With our first operation complete, we can move onto the next. From here on out, we'll repeat the same process. 

Switching Tools

Once we've completed all of the files that use the 1/8" flat end mill, we can change the tool out for the 1/16" and run our first pocket. For the second pocket, we'll use the 1/32" bit because it's small enough to make our mounting holes. The Othermill automatically probes the bed for each tool change, so the toolhead is calibrated before we start a new process. 

Removing From Bed

Once all of our operations are complete, we'll need to carefully remove the part from the spoilboard. If we put too many pieces of nitto tape, it'll be difficult to remove. If you find it difficult to remove, you can squirt a small amount of alcohol on the bed to soften the adhesive. Not sure if this will warp the wood, so use it with a grain of salt. Either way, I use a putty knife/spatula to get underneath the part and slowly pry it off from the bed. You need to be careful not to break the part when trying to remove it from the bed. It would be a shame if we spent hours milling a part only to break it in a second. 

Post Processing

Our parts will most likely be a little rough around the edges. We didn't make any finishing operations, so we'll have to manually clean up those edges. There's ways to do this via CAM operations, but I haven't learned how to do that yet. I'm fine with sanding the parts. I used 320 grit sand paper to clean up those edges. It's easy to get them nice and smooth. A filing tool can help get in between the nooks and crannies. Once they're nice and smooth, you have the option of applying surface finishes like wood stain, wax or lacquer. I played a little with wood staining but I personally didn't like it. I like the natural color of the wood. Walnut is probably my favorite! 

So crispy, so clean

Parts can look pretty beautiful with enough sanding and care. I didn't apply any solutions to the parts, just sanded them and used a "tack cloth" to wipe them down – This helps remove any fine particles and brings back the color of the wood. 

Solder Headers to Raspberry Pi

Now we need to solder the 2x20-pin male headers onto the GPIO of the Raspberry Pi. To make this easier, I used a 3D printed jig to hold the headers on the Pi. This helps keep the header nice and straight while we solder each pin. Once the male headers are fixed in place, we can secure the jig to a panavise. You’ll have to solder each pin from the bottom of the Pi. 

Trim Header Pins

We'll have to shorten the header pins so the plastic holder bit is flush with the female headers on the Joy Bonnet. If we install the Raspberry Pi to the Joy Bonnet as is, it'll be too thick to fit into the case. So, this isn't optional. I used a pair of flush diagonal cutters to cut the pins in half. I just had to be careful not to cut them too short and try to keep them all about the same height.

Secure Raspberry Pi to Case

With our headers now soldered and trimmed, we can work on mounting the Pi to the case. Place the Raspberry Pi into the bottom half of the case. Then, position the board so the mounting holes line up with the ones in the standoffs. Now we'll insert and fasten M2.5 x 5mm machine screws into each mounting hole. I recommend using a hand screw driver and not a drill. The drill may be overbearing and split the part. Fasten slowly, the holes are a bit small to compensate for tapping threads into them. Ensure the screw is going down straight and not at an angle. 

Mount Joy Bonnet to Case

Next, we can work on securing the Joy Bonnet to the top half of the case. First, placed and insert all of the wooden buttons into the cutouts on the top half of the case.  Now we can grab the Joy Bonnet and laying it face down. Line up the mounting holes with the standoffs and fasten machine screws.

Bring It All Together

And with our two halves assembled, we can bring them together to finish this project. We just need to make sure the male header pins from Raspberry PI are going straight into the female headers on the Joy Bonnet. Firmly press the two halves together to close it shut. And that's all folks! 

This guide was first published on Apr 27, 2017. It was last updated on Apr 27, 2017.