Basketball Arcade Machine Part 1

with Arduino MEGA-based Electronics

Dan Koch and Liam Davies

Issue 72, July 2023

A DIY arcade-style basketball game with some maker twists.

Every now and again, we love to make something that can only be justified by phrases like "just because" and questions like "Why not?" rather than"Why?". The last time we did so was the giant Connect 4, which was taller than the average human. Just like in that game, we've expanded on the regular with a few maker twists.

Mini basketball has long been a feature of amusement arcades. For many readers, the 90s and early 2000s are the era of Timezone and Intencity, even if they were not active users of such businesses. Both companies still exist but modern addiction to personal devices has taken some of their shine. Still, they are making a social revival as personal devices become monotonous. The kind of basketball machines found in these arcades may be for one or two players and usually, with some exceptions, feature one or two game modes at best. They are usually coin or ticket operated, and buying one from a manufacturer of commercial arcade games can cost upwards of $10,000.

In our project, we wanted to make our own arcade game that was cheaper than the commercial ones, and more comprehensive. Obviously there would be some construction differences, and the overall ruggedness of the commercial ones would be missing from ours, but it still had to be strong and durable for the intended home use. We anticipate perhaps at most, community or church youth groups to be the harshest users of our machine. Therefore, we want to build it from commonly accessible materials where possible, to a strength that is as good as we can achieve with the means available to most constructors. That means no specialised outsourcing like having metal parts made in an engineering workshop or custom sheet metal work. The project will be expensive enough without that!

Instead, we decided early on in the design development process that ours would be built from house framing timber and sheets of medium density fibreboard (MDF), with the structural integrity and strength coming from a combination of the two. Initial ideas were to use either some of the WS2812 3W LEDs from the giant connect 4 game, or some common addressable LED strip to decorate it, with an Arduino running the lights and handling the game modes and play. The giant connect 4 had been worked to death in a local youth group and lost its novelty, so it had been retired anyway. We would need a goal-sensing system, too, which is usually a lever sticking through the net triggering a microswitch. However, many of these early ideas were altered as the project progressed.

This month, we'll cover the research, planning, and design; the intended electronics and game play flow; and then the physical build. There are no electronics built his month, as the build was extensive already. However, we did learn some lessons as we went, so those are presented at the end, too.



When we begin any project, we research first to find out what else is out there. First of all, we need to see if it's even worth doing the project. If we can go out and buy something that does the job, then we need to be able to either make it cheaper, or make it better in ways that are worthwhile. If we do decide to make something, then we need to see how other people have done it to make sure we're not outright copying accidentally. However, with so many makers world wide, quite often someone has done it the way we would, whether we find out or not! So, we started with the commercial options.

These fall into two main categories: Full-sized arcade units made for commercial use by professional suppliers; and compact, frame-like home versions with tubular steel frames, fabric bodies, and low-quality electronics. The commercial ones as noted sell for anywhere between $10,000 and $15,000. They are generally very professional-looking with lots of custom-fabricated parts, graphics, and electronic displays. These are usually seven-segment displays but some have LCD screens instead. Most are still push-button controlled rather than touch-screen, with often only one, or at most two, gameplay modes. Generally the body and inner floor are solid, with substantial frames and netting to stop the ball flying off to the side. They usually have a screen to stop the ball bouncing back at the user, too, and a mechanism to hold the balls at the top before credit is added. Some forgo this, simply not starting the electronics until credit is applied.

At the other end of the scale is the home-use type, often available from department stores like Big W and Kmart (although not constantly). They generally cost around the $200 mark, and are made from thin tubular steel frames, designed to fold up when not in use. Besides a fibreboard backboard, they are usually made of netting and polymer fabric, even the upper floor. This negates the need, to a degree, for a screen to prevent too much return bounce from the balls hitting the upper floor on a miss, because the fabric does not provide any bounce. The electronics in these versions often have two or three game modes, with small seven-segment LED displays and tactile pushbuttons under a vinyl panel. The quality of these is mediocre at best, but they are far more accessible to the average family, youth group, or the like, than the full-scale commercial counterparts.


In terms of DIY versions, we found few and none seemed to be anything like what we had in mind. Most were electronic scoring systems attached to the hang-on-the-door mini hoops or portable full-sized hoops, or desktop sized versions (which we also had in mind in a different format). As such, we launched into our own designing process.


We knew we would probably spend more than the $200 home version, but we wanted to build a full-sized arcade style machine, so as long as we spent well under what they cost, we would meet our criteria. Our initial idea was to use plywood to build a box-ish structure wide enough to fit two mini hoops side by side, with sloped sides down toward the front at a comfortable height to pick the balls up from. There would be a plywood upper floor for the balls to roll back after going through or missing the hoop, and some form of netting at the sides.

Levers would protrude through the net on the hoop to detect goals, low enough that a bounce-out would not register as a goal. Seven-segment displays would be mounted in cut-outs behind the hoops for scoring, with a central display for time and game mode selection. We would need some control buttons, so our initial proposal was to place those to the side in cowlings to allow free access to the upper floor to pick up balls as they rolled back down from the other end. The initial proposal included some WS2812 LED strip for decoration and an Arduino to control everything.

However, all ideas evolve and every of this build part that did, evolved for a different reason. The first was the structure. Fiddling around with a few scraps of 12mm MDF sheet raised doubts over the rigidity of the structure as we planned to build it, even when using 16mm sheet. We therefore decided to add an internal frame. This proved fortuitous later when we realised we needed castors to move the thing and levelling feet to put it on, but we did not realise that at the time.

The second major evolution was the goal detection system. We had some experience with the fold-up consumer level games from a youth group. Many of the consumer-level units use a lever sticking into the net which the ball depresses when a goal is scored. This has the advantage of simplicity and a relative amount of reliability: It is positioned far enough below the rim so that a bounce-out or roll-around does not trigger it, but high enough that a shot under the rim does not hit it. Observations revealed that the net quite often got caught on the lever arm that activated the limit switch (which we suspect is actually a reed switch in some models), when the ball passed by and the lever popped backwards through the section of the net it was supposed to be in.

Our planned solution to this for some time had been a light gate or proximity sensor. It would be mounted in two 3D-printed housings, extending far enough below the rim of the hoop that bounce-out or roll-out shots would not score. We did debate using proximity sensors to avoid moving parts, but there are problems with either system. Such a system would avoid anything sticking into the net for it to catch on, but the net moves enough even with a bounce-out or nearby hit on the rim or backboard, to trigger such a sensor. Even if the sensitivity is adjusted right down for a proximity sensor, a shot under the hoop or in from the side can still trigger it. We tried some, as detailed next month, but eventually decided they were still more problematic than the lever.

After we bought the two door-mounted mini hoops (discussed further on) and hooked them on cupboard doors in the office, we noticed that the nets can move quite a lot when the hoop is hit. Without the weight and inertia of the ball in the net, it flicks around a lot when the hoop is struck. That ruled out all of our non-moving sensor ideas, at least in the format that we expected to use them. Instead, we went back to the lever idea, but redesigned it so that it is less likely to pop back through the net.

Further evolution altered the choice of decorative lighting. An image of one of the commercial units we saw showed it positioned in a darkened corner under blacklight, with fluorescent decorative paint and balls to match. It looked great but we wanted to pursue something that was even more 'glow-in the-dark with inbuilt UV lights and phosphorescent markings.

You'll see later where this led us. Beyond that, we didn't want the normal LED strip where each LED is clearly visible, so we looked around at diffuser strip options. While some are available, it's pretty pricey for what it is, and we instead looked for COB style diffused LED strip. We could not find it from a retailer but bought some from the likes of Amazon and Ebay. As much as we dislike doing so, we had no other option.

The final evolution was the size of the machine. We laid out a design of the side profile on the floor with masking tape. This was to gauge the overall size and also to visualise the height the hoops would be at and so forth. However, playing around with the cupboard door hoops suggested that in fact we needed more height in the backboard. The masking tape design has the straight back section at 1800mm before the sloped bit starts. In the final build, we increased this to 2000mm.


While we will build our arcade machine with two hoops, it stands to reason that there will be a significant chance that only one person is playing. Therefore, we need several game modes which reflect this, or can be played with either one or two players with the same functionality. We came up with:

GAME 1 - Timer

Both players get as many hoops as they can in a given, user-selectable amount of time. We're going with one, two, three, and five minutes, but different times could easily be coded in if you like.

GAME 2 - Rapid Fire

Whichever of the two players reaches five, ten, or twenty hoops first wins. For single-player mode, this game is just about how fast you can score the chosen number of goals. There will be a stopwatch running regardless.

GAME 3 - Count Them Out

Timed game at one, two, or five minutes (user-selectable). After five, ten, fifteen, or twenty seconds (user-selectable), a timer starts for each player. It stops when a hoop is scored, pausing for the selected time before starting again. The player with the lowest time wins, so it's a consistency game. The more regularly you score, the lower your accrued time. It's no good scoring a bunch in a row at the end. This is also valid for single players.

GAME 4 - Spot The Difference

Untimed game. Both players shoot. The first player to be three hoops ahead of the other gets a point, then the score resets. That is one set. The first player to win three consecutive sets or five overall sets wins. This is the only game that is not available in Single Player mode.


We debated a touch screen but decided against it. One that is rugged enough would be expensive and any screen would require a graphic user interface to be developed. In addition, it loses some of the 'arcade' feel. Instead, we are going with four arcade buttons recycled from the Giant Connect 4 control panel. These are white with WS2812 LEDs in them but we will swap those out for single-colour LEDs. The buttons will be arranged according to this diagram, with functions labelled.

The significant disadvantage of not having a screen is the need for an instruction sheet to explain how the buttons work or what each mode does. For this, we are going to use a PDF that can be printed and laminated, rather than a sticker on the machine. That way, it can be easily replaced if lost or damaged. We can also include more information, like diagrams of the display and buttons as they will look for each game or menu option. The flow would look something like shown in the diagram above.


For display, we need a timer, and goal scoring. These will be separate displays and will likely be some form of dot matrix display. At the time of writing, we had stopped exploring this to concentrate on the physical build, so at this point, we have not made a final decision. These displays will also double as input function displays; number of players, game mode, selected time, that kind of thing. Therefore, dot matrix would make the most sense as this allows the display of a word or abbreviation.

That means we do not have to do everything with numbers. In other words we can display 'players' for number of players rather than just having '1' for function 1, which would then have to be described in the instructions. Finally, the LEDs in the buttons will also be display outputs. They will be individually controlled so they are on when relevant and can flash as well if needed.


In addition to the displays, we have some lighting arrangements. We will go into detail next month, but there will be a strip of WS2812-controlled decorative LED strip on the outside, interspersed with several 3W WS2812 LEDs. We could wire them at the end rather than break up the strip but that would be harder to code, especially for functions like rainbow effects. Instead, we will interrupt the data line at the relevant points. The strip will have its power lines intact and the 3W LEDs will have their own power wiring.

The RGB LED strip and 3W lights will provide colour most of the time. However, we are planning a UV mode as well. This will be selectable as 'random', 'always on' and 'off'. In random mode, it will activate at a random time during the game for a random duration, defined in the code. This will turn off all the coloured light and turn on some UV LED strip and some high-power wash LEDs, maybe 3W, which will illuminate the board with blacklight that is harder to see with the eye.

However, we will have glow-in-the-dark and fluorescent markings on the backboard and decoratively, as well as glow-in-the-dark basketballs. The idea here is that the whole player perception changes in these altered lighting conditions. The star effect is also more visible, making aiming more challenging because of the distracting moving lights. These LEDs will be hidden under cowlings and some timber trim strips so as not to be directly visible to the eye.

We plan to add sound as well. Using an MP3 Module, an amplifier module, and two or more speakers, we will play crowd noise while the game is playing. When a goal is scored, the crowd cheers as a separate recording. This hinges on seamless transition between tracks so we do not know how well this will work, yet. The sound capability also opens up the option of using recorded prompts when navigating the game menus.

Goal sensing will be a central part of our arcade machine. We went through several ideas and iterations (detailed next month) and discovered several challenges. However, we eventually settled on the lever system but with a hall effect sensor instead of a limit switch. This, we decided, would have its own comparator circuit for sensitivity and result in a digital output.

All of this will take some computing power, so we chose an Arduino Mega, both for its power and for the sheer number of I/O pins. The entire arrangement will be powered with a PC power supply, giving us 5V and 12V rails with plenty of current and good stability.


We decided early on that everything to build the main structure had to be readily available from hardware stores or shopping centres. Some parts can come from specialised online retailers, of course, but anything too big to freight was out of the question. As such, we based our structure around framing timber and sheet products available from hardware stores. It would have been nice to have acrylic panels and other such pleasantries, but they're unrealistic.

Sourcing the hoops was looking to be the hardest part. Full-size basketball hoops are easy to get from sports retailers and online stores, but the mini sized hoops are not common. We found some at a specialised arcade supplier but they were more expensive than one of the whole home-level game units from Big W.

They were $120 each and we needed two! Salvation came from Kmart, who have an over-the-door basketball game for $29 that even comes with a ball. We bought two of these just to use for the hoops. Before cannibalising them, however, we hooked them over some cupboard doors and did some 'research'.

While it looked like we were just playing around in the office, in fact it really was research. Two of the team played while one of us sat back and watched carefully. We observed the net movement noted already, as well as explored the effects of distance between player and hoop, as well as hoop height and the effects of lighting on aim and coordination using some RGB studio lights.

We sourced our MDF sheets, framing pine, and DAR (Dressed All Round) furniture pine from a local hardware store. They're not a chain hardware, as we support independent or franchise (where at least there is a small business involved) where possible. They also deliver.

They are more expensive than the major chain for the MDF, but the quality was higher and it turned up delivered on a truck. 2400 x 1200 x 16mm MDF sheets weigh 33.5kG each so these are not easy to get on roof racks! We needed five of them, too, so that would exceed the loading of most roof racks anyway.

Most of our LED products came from our friends at LEDsales, while the WS2812 strip had to come from an online marketplace. No retailer we could find stocked the stuff we really wanted. It is not true COB strip but a series of fine SMD LEDs with a diffuse silicone cover moulded on.

They are in 5cm groups with one WS2811 controller per section. The other electronics are general retail stuff like the Arcade switches from Altronics and Jaycar, and the PC power supply from a local PC shop. The glow-in-the-dark tape came from a local craft shop but can also be bought online, and the same goes for any of the decorations you'll see next month.

Two more things we had to buy at online marketplaces were the glow in the dark basketballs, and the PMMA optic fibres.

The Build

MateriaLS LIST






16mm MDF Sheet

2400 x 1200mm Panel

Exterior panels, interior table


70 x 35mm Framing Pine

2400mm Length

Upper and lower frame


40 x 18mm DAR Furniture Pine

2400mm Lenght

Table rails and top frame


Fixed Castors

Rear of lower frame


Swivel Castors

Front of lower frame


Screw-Down Feet

Front of lower frame


Captive Nuts for Screw-Down Feet

Front of lower frame


8G x 15mm Button-Head Screws

6 for securing hoops to backboard, 10 for rear panel lower


8G x 40mm Button-Head Screws

22 for front panel, 39 for rear panel, 44 for each side panel, 66 for table panel, 8 for top frame to sides.


8G x 30mm Timber Screws

16 for castors, 12 for rear castor braces, 20 for table panel rails


8G x 50mm Timber Screws

8 for lower frame, 8 for upper frame, 3 for rear panel to top frame


8G x 60mm Timber Screws

16 for Top frame braces


8G x 75mm Timber Screws

22 for lower frame, 16 for upper frame, 8 for top frame


Midnight Blue Paint

Interior colour


Bright Blue Paint

Exterior colour

cutting list


Length (mm) *


Part Name



1200 $

16mm MDF Sheet

Side panel, forward



16mm MDF Sheet

Side panel, rearward


1400 %

16mm MDF Sheet

Backboard/Rear Panel


1000 %

16mm MDF Sheet

Front Panel


2380 *

16mm MDF Sheet




70 x 35mm Framing Pine

Inner Frame Sides



70 x 35mm Framing Pine

Inner Frame Ends


400 #

70 x 35mm Framing Pine

Inner Frame Braces

45° Inward Angles



40 x 20mm DAR Pine

Table Rails



40 x 20mm DAR Pine

Top Frame Sides



40 x 20mm DAR Pine

Top Frame Ends


400 #

40 x 20mm DAR Pine

Top Frame Braces

45° Inward Angles

* ALL MDF is cut to 1200 wide % cut from one 2400mm sheet. Cut front panel, rear panel is remainder $ Cut from one 2400mm sheet # measured on the outside of angled cuts

We began by cutting the pieces for the sides of the cabinet. These were cut from 2400 x 1200mm sheets of 16mm thick MDF. The challenge is that these sheets are always cut oversize. We were tempted to use them as-is, and just have a total length that was a few millimetres longer than 2400mm when the two sides were joined.

However, while the sheets are cut oversize to guarantee the customer always gets 2400 x 1200mm, they are not consistently so. Some of ours measured 1201mm, while the widest was 1205mm. This lack of consistency meant they had to be trimmed to exactly 1200mm.

The first piece we cut was one of the rear side pieces. The distance between the edge of our circular saw and the inside of the blade is 32mm, which means that our guide fence had to be 32mm from the desired cut line with the cut width (wth width of the blade) fully outside of this.

As a fence and a straight edge, we used a section of 20mm x 40mm V-slot rail from an old CNC machine. However, we did not realise that it was slightly bent. We marked the two ends of the line, clamped the edge down firmly, and started cutting.

The image shows the result. The saw blade did not go in a straight line but followed the slight, unnoticed curve of the aluminium profile, and started to bind after the curve started to straighten out and push the blade to the side. We pulled the saw out, went again, and hit the same problem. That was when we realised what the problem was.

After checking the edge against a 1200mm ruler, we swapped it out for a new section and made the cut again. With the longest sloped cut made, we then cut the short end of the triangle, and finally the 1200mm trim. We repeated this with another sheet of MDF to give us two rear side pieces, one of which had a butchered edge but that would be compensated for later.

For the forward side pieces, both are cut from one sheet of 2400 x 1200 x 16mm MDF. For this one, we cut the 1200mm trim first, then clamped the sheet firmly to the saw horses, positioned so that the cut halves would roughly balance. Then, we positioned the straight edge for the first of the sloped cuts. This one also went awry, because we had not firmed up one of the clamps holding the straight edge quite enough. It had slid sideways as the saw was pushed against it, deviating from the cut line. For the other cut (and every other moving forward), we double-checked this. So again, we have another panel with a poor cut edge.

With these panels cut, it was time to lay them down and check the way they met. In particular, we were looking for relatively little spacing at any point where the panel edges meet, and that the lower edges ran parallel. To do this, we laid them on the floor of the studio on the MDF sheet that was used as a cover sheet for the delivery.

It's a lower quality 12mm MDF and still very level and smooth. It is hard to see in the image because of the contrast from the sunlight, but the edges between the two panels met well, and we checked with a string line that the lower edges were straight.

Next up, we decided to build the inner frame to join the sides. This was because if there were any errors or even just anomalies in the frame, the front and rear panel widths may be different than intended by a few millimetres. This would either result in a gap between the side and front or rear panels, or mean the frame was slightly smaller than the interior and therefore not as strong. We set about measuring the side of the frame, which we did by taking the length of the two side panels together while lying adjoined on the floor, then subtracting the measured width of two MDF sheets. Measurement proved to be about 2mm longer than calculated, so we're glad we went this way.

We cut the long sides of the frame first from 70 x 35mm framing pine, then the short front/back pieces. The aim was for an overall 1200mm, so we carefully measured the width of two pieces of the nominally 35mm wide framing timber and subtracted this from 1200 to give us our cut length. We repeated this for the upper frame, too. This timber is H2 treated, as all house framing timber should be, as signified by the blue dye. That means washing hands afterwards is a good idea. The item in the middle of the two piles of pieces is the v-slot straight edge we were using throughout the project.

The frame will have little rigidity without some bracing. While built as a rectangle, there will be nothing to stop it collapsing into a parallelogram or diamond, should the right force be applied. Yes, we know that technically a rectangle is already a parallelogram, but we mean the classic shape we are always presented with at school. Braces will also help keep the frame especially square. Accordingly, we cut four lengths of framing timber at 400mm along the outside of the two 45° ends. We also cut four 120mm blocks, which are for attaching the castors later. In the photo, you can see six other pieces that we did not use, and we discuss these at the end.

To assemble the frame, we first marked a line vertically on the sides of the ends of the longer frame members. This line is 17mm in from the end, close to half of the 35mm width of the timber. Holes were marked at rough thirds along this line, then clearance drilled for 8G screws.

Then, with the aid of clamps, the frame was assembled by screwing the longer sections to the outside of the shorter ones, using 8G x 75mm screws.

Now the braces were installed. We hit a small snag in that the 45° setting on our drop saw is not exactly 45°. We cut the angles by cutting one end, then flipping the timber over and turning it end-for-end as well, so the saw did not have to be moved. This meant that we had an angle of around 43° or 44° at one end, and 46° or 47° at the other. We doubt it would be much different if we did unlock and swing the drop saw on its table, because it is the scale on the machine that turned out to be inaccurate.

However, they are still useable. We propped each piece on two blocks to keep it level with the top of the frame, and then marked screw hole locations in the outside of the frame. These were clearance drilled for 8G screws, while pilot holes were drilled at an angle into the braces and an 8G x 50mm screw set into each. The clearance holes had 8G x 75mm screws installed in each, then the brace was clamped in.

We screwed in one side of each brace, with the 50mm screw first to firm up the position, then the 75mm screw for strength. Then, the frame was pushed and shoved against feet and posts and a sandbag until the corner we were working on was square. When it was, the other side of the brace was screwed into place. This process was repeated for the other three corners. It is not perfect because the timber is not perfectly straight, but it's as square as we can reasonably get.

There are two of these frames to build, and we were originally going to join them vertically. That is what the six extra pieces were for in the layout photo earlier. There were to be three per side, and they were to be rebated slightly. However, we realised that we had neglected to buy the 100mm screws that this would have required, and when thinking about how to cut the rebate the best way, we realised they were totally unnecessary. The original purpose was for vertical rigidity but the 16mm MDF has plenty. We could not remember why the decision had been made but originally we were thinking of using 9mm MDF and this may have been a legacy of that. In any case, we decided not to include them, and simply use the side panels with the frames for structure.

We also needed to mount the castors that the whole machine would move on when needed. There are two fixed castors for the back and two swivel castors for the front. The rear ones are mounted on two of the blocks shown earlier in the layout photo. This was screwed into the corner of the frame by having three clearance holes drilled in the frame, then two 8G x 75mm screws were sunk in from the long side and one from the short, rearward side. The castors were then attached with 8G x 30mm screws.

The front castors are different, and mount to the diagonal brace. We mounted them inboard slightly, to allow clearance for them to rotate. They were screwed on with more 8G x 30mm screws. We also added two more blocks here. They were for the original type of screw-down foot we had intended to use, but in the event, they were unavailable and we had to change.

The next step was to mount the side panels to both frames. The side panels need to clear the ground by enough to get over small obstacles and uneven floors, but not enough to allow feet to get jammed under them or anything but the smallest objects to roll underneath. We settled on 35mm based on measurements of the concrete floor in the studio. With the two panels of one side laid down and pushed firmly together, we marked a line 35mm up from the bottom edge, and another 35mm up from that. The lower line is a reference to line up the frame, and the upper line is the centre of the frame rail and needs to be drilled with clearance holes for 8G screws. Because of the weight of the taller sides, we settled on a screw every 100mm. It looks effective and spaces well too.

We also had to do the same for the upper frame. Its height would be dictated by the space needed for the inner table to slope downwards to the front, and by the extra clearance needed for the framework to hold the table. We would eventually change this design but at this point, we settled on a height of 800mm for the top of the frame, which meant the line of holes would be at 765mm from the bottom edge. It was duly marked and drilled.

This was carried across both rear and forward side panels. It's hard to see in the photo, but the 1200mm mark where a screw should be falls at the join of the two panels, so this was skipped. Note that while the photo shows one set, the other set had to be placed back to front so the lines were on what would be the inside when assembled.

With that done to both sets of panels, one set was left on the floor and the frames laid on top, close to their positions. Then, the other rear side panel was carefully placed into position on top of the frames. This was hard to do with one person, but it just happened that only one of us was around at that point. A leftover piece of MDF 1200mm high (the remains of the panel the two forward sides were cut from) served to hold the end up, as it was well past its balance point.

Then, using a rubber mallet and keeping clear in case anything moved, the lower frame was adjusted to line up with the line on the rear panel. It was then screwed on with 8G x 40mm button-headed screws, one at each end. Then, the forward side panel was placed on top, lined up, and screwed on with two screws. This allows easy adjustment but after checking both the alignment of the lower edge with the frame, and the meeting of the edges of the side panels in the middle, we added the remaining screws for security.

The next challenge was to turn the assembly over and add the other side panels. Of course they cannot be screwed in while on the floor as they are in the last photo. It was a challenge to turn the thing over, holding the weight of both side panels and stopping the frames moving too much to stress the screws, but with two people and lots of care, it was possible. Then, we repeated the process to screw on the other side panels.

At this point, we needed to apply the feet that would secure the front of the machine to the ground and stop it rolling around on the castors. Two should be enough, and we placed them at the front both for ease of access and also because the swivel castors needed the most securing. Because the original type was not in stock, we had to add a new block of timber to the frame, with a 16mm hole drilled in it. This is placed as close as practical to the front of the unit.

Then, the captive nut housing is hammered gently into the hole.

Finally, the threaded foot is inserted and screwed all the way home.

With the foot screwed all the way in, there is plenty of clearance for obstacles - it's above the axle of the castor. Screwed down, however, it extends far enough to contact the floor that the castor will be resting in.

It was now time to install the front and back pieces. These fit inside the side panels, and so a line was marked 8mm from the edge of the boards which corresponds to half the 16mm board thickness. This job crops up a few times during the build so we 3D printed a tool to help. We have it available for download. With the line marked, we needed holes at 100mm intervals to keep the theme of the existing screw patterns.

However, the backboard is not full height. It is 1400mm high, so starting from the top, we counted down the holes. Anything below the backboard was not clearance drilled, but pilot drilled at 2mm diameter. All the other holes were clearance drilled to 5mm.

The sides of the backboard also need to be marked and drilled. The centre line was marked with the 3D printed tool and drilled at 100mm intervals with 2mm pilot holes. Experiments with scraps told us that while the MDF is easily soft enough to have the screws just drilled in with no piloting, the board expands too much and distorts.

To attach it, we first applied one screw at the top of each side to hold it in place, then screwed them down until they were firm but still mobile. A rubber mallet was then used to adjust the fit to align with sides, before tightening the screws. Be wary, the MDF strips out easily.

After this, the other screws were installed in the same way. Each one was tightened individually as minor adjustments were made. Because of a bit of timber warping, one end of the frame here had an angled cut and the panel did not fit flush over it. The rest fitted neatly. The screws that were positioned over free space and not the side of the backing panel were 8G x 15mm button head screws. These are for aesthetic consistency and can be omitted. Using 40mm screws will leave dangerous exposed points.

The same process was used for the front panel. However, it needed extra screws. The rear panel needed them too, but that came later. We had turned the chassis back on its side to deal with a stuck castor, and then there were not enough people around to safely move it. Therefore, the following took place with the unit on its side. We had neglected to mark and drill the line of screws that would attach the front and rear panels to the frame for more security and strength. So, we marked where the existing lines met the front, then used a 1200mm ruler to mark a line across the front. At both the top and bottom frame.

Then, we drilled the clearance holes by wrapping a bit of masking tape around the drill at the appropriate depth. This ensured we did not drill deeper than the front panel and into the frame, denying the screws anything to grip.

After the clearance holes were drilled, the front panel was secured firmly to the front of the frame with 8G x 40mm button head screws. The photo was taken during the process so only shows part of one line of screws, but all were installed.

The next step was to mount the inner table. The plan had changed here, as described at the end, so we had a bit more depth to work with. We decided on a finished height of 885mm at the front, and 1150mm at the back. We measured these heights on both sides then marked a line between the back and front for each side. Then, we remeasured and marked 8mm lower than this as a second line. That made sure we had parallel lines and a bit of confidence in our straight edge. We forgot to take a photo of this but it is visible in the photo of the rear panel attachment.

This line was not marked at 100mm increments. If it was, then because of its slope making it the hypotenuse of a triangle, the screws would not be 100mm apart horizontally and would look odd. So, instead, a ruler was used with a builder's square to mark lines in 100mm from the edge of the table, measuring horizontally but marking where the ruler and table line intersected. The marks are on the lower of the two lines on each side, to be centred on the MDF sheet and give a finished height as described above. Then, the marks were clearance drilled for 8G screws.

Now, we had to place rails inside the cabinet for the MDF to sit on until it was screwed in (and to add strength once it was). This was done by first measuring down from the top of the front of the cabinet sides to the top line of the table on the outside to the line marked in the previous step (which was measured from the bottom of the cabinet). Then, we transferred the measurement on the inside to where we wanted to top of the table to be. If we measured up from the bottom, the tape measure has to bend outwards over the frame and that would render the measurements inaccurate. So, with the inside front marked, we subtracted 16mm for the thickness of the MDF, then repeated the process at the rear of the cabinet, and in the middle where the panels join. This was because our longer straight edge does not fit inside the space, being a full 2.4M, and that left us with the 1200mm ruler. Then, we used the ruler to rule a line between the two points on each panel, and then middled the ruler to make sure the lines were not diverging.

With the line drawn inside, we could fix on two rails made from 40 x 18mm Dressed All Round (DAR) pine. These had holes drilled at roughly 300mm increments, but were unmeasured because it was not necessary to be accurate. Then, 8G x 30mm screws were used to fix the rails to the side panels. We started at one end, then adjusted the rail position for each screw to straighten out the timber slightly. We did this on both sides.

The panel for the inner table was cut from a sheet of 2400 x 1200 x 16mm MDF. As described earlier, the side needs to be trimmed to be 1200mm as they are supplied oversized, but we took an extra 2mm to make sure it fit well. This proved a good call, as it was a tight fit at the back. The length is an interesting subject. While the table is the hypotenuse of a triangle, the base is the distance between the back of the rails, and the front panel.

Therefore, the table will always be short. We could cut to length for the hypotenuse, and put the front end in first and lay it down onto the back, avoiding the problem. However, it is far too heavy. So, the panel was cut at 2375mm, which leaves an 8mm gap on our inner measurement. It was dropped into position and forced against the back panel with wedges to make sure the cabinet was square.

With the wedges positioned, the panel was fixed in place with 8G x 40mm button head screws in the holes drilled earlier in the side panels above where the rails went.

The logical next step would be to fix the front and rear screws for the front and rear of the table panel, however, we neglected this step. Therefore, the relevant photos show subsequent steps in the background. A line was marked on the front panel based on the position of the edge of the table sheet inside the cabinet. Then, points were marked at 100mm intervals. These were drilled out with a 2mm drill bit, through the front of the panel, across the gap, and into the table sheet. They were drilled at a slight, estimated angle to roughly match the table.

Then, the same holes were drilled out to 5mm to clear the 8G screws, but only through the front panel. The gap between panel and table piece made this easier. Finally, 8G x 40mm button head screws were used to secure the table to the front panel. This step helps keep the table sheet from bouncing too much. While the sides are secure, it can still flex on the long axis. The process was repeated on the rear panel, but using the masking tape idea to limit the depth of the 5mm drill, as there is no gap in this instance.

The final section of woodwork that needed to be produced was the frame that would mount above the hoops. Its job is to hold either a net or a piece of fabric, to stop overshots or bounces flying out the back. It will also function to hold the net that will be installed on the sides of the unit, next month. The nominal length of this frame is 800mm and its width is the same as the inside of the cabinet, which measured out to be 1198mm.

Six lengths were cut from 40 x 18mm DAR pine: two at 800mm, two at 1118mm (1198 minus the two 40mm sides of the frame) and two at 400mm. The two at 40mm had the corners cut at 45° mitres. These were measured and marked with a mathematical square from the drafting desk rather than a carpentry tool, mainly because we had one. Then, the saw was adjusted to match rather than relying on the inbuilt scale which we knew to be wrong.

Using our 3D printed tool, a line was marked down the centre of the ends of the sides of both 800mm pieces. Marks were made 10mm and 30mm from the end, and these were clearance drilled for 8G screws.

Subsequently, the ends of the 1118mm sections also had a line marked down the centre, and marks made at 10mm and 30mm. These were pilot drilled to 30mm.

The sections of frame are butt jointed using 8G x 75mm screws. The pieces were clamped first to a scrap of 40 x 18mm pine, and adjusted until they measured square before the clamps were tightened fully. Then, the screws were installed.

With all four corners done, the frame looked like this. Notice the 800mm pieces are on the outsides, with the ends of the 1118mm pieces completely concealed in the frame.

Finally, the braces were added. These only go at one long side of the frame, to help keep the front strong while the rear will be secured by the cabinet sides. Clamps were used in the same way as the other parts of the frame, but angled to allow the screws to be installed. After light clamping, the corner was checked for square, then the clamps firmed. Then, pilot holes were drilled for the intended screw paths.

A clearance hole for an 8G screw was drilled through the frame side where relevant, enlarging the pilot hole. For the screw that starts in the brace and meets the frame at an angle, only the pilot hole is used. This screw is installed first, to lock the components in position, and is an 8G x 60mm screw. Another 8G x 60mm screw is used through the clearance hole in the frame. The photo here shows the screws sitting on top of the wood above the places they will end up, for clarity.

The cabinet was then prepared for the installation of this frame. A line was marked 8mm below the top of the relevant side of the cabinet. A mark was made at 50mm from the bottom end of the line, then three more at 100mm increments from there. These were drilled as clearance holes for 8G screws.

Next, a clamp was added to the top of both sides, just below where the frame would be. Then, another was added to one side at the lower end. These clamps serve to rest the frame on while positioning it. Screws were inserted in the clearance holes until the points almost protruded from the other side.

Now, the frame was dropped onto the clamps. With the clamps on the far side taking the weight, the single clamp on the working side was removed, and repositioned over the frame as it was forced into the corner. Another clamp was added to the top of the panel, holding the frame against it. When the frame was adjusted for position, the clamps were tightened.

Then, the screws were driven home. No pilot holes were needed as the pine does not expand like the MDF does and no screws are near the ends of the pine where it might split. When repeated on both sides, the frame looked like this:

Just for good measure, and to stop flexing, clearance holes are drilled and three 8G x 50mm screws are installed to hold the frame to the back panel. These are roughly estimated for position, because this side of the unit will not be seen.

It was time to mount the hoops. We marked a line 200mm below the top of the rear panel. This line was divided by four, resulting in three marks - a centre, and two quarter marks. That left the hoops in the centre of their respective half. Then, the locations for the hoop mounting screws were added. We did this by measuring the centre-to-centre distance of the holes in the mounting bracket, and marking them on the rear panel. The photo did not show the line very well, so we've annotated it.

Of course, the easiest way to measure these distances was to dismantle the over-the-door hoop set-up that we are using as a donor. It had to come apart anyway, so now was as good a time as any. If you are building one of these machines then you may have never assembled the hoop to its backboard anyway, but we had done so for the aforementioned testing and development that helped determine our throw distance and height.

The hoops are held to an acrylic backboard with the use of three bolts, washers, and nuts. The acrylic is fragile and so a back plate is used. The screws mount to the back plate and have squared shanks right under the head that engage with a square hole in the back plate. This is a good idea but will not translate to our MDF rear panel. Instead, we will be using screws from the front, with only the hoop mounting plate used.

For our hoops, the two upper holes were 50mm apart, so each is 25mm to the side of the centre mark. Then, the middle, lower hole was measured and added. Ours was 30mm down from the centre line. Finally, the holes were drilled on these marks at 2mm, as pilots for 8G x 15mm button head screws. Note that in the photo, the circled mark is the measurement for the quarter distance along the line.

The hoops were then screwed on from the front with three 8G x 15mm button head screws each. This involved lots of adjustment and fiddling, because the 8G screws do not fill the holes in the mounting plate and the hoops are made inconsistently. After much unscrewing, tapping, and screwing in, we had level plates and just needed to flex the hoops and their support structures to be level with each other. Also, there are hex key-driven screws on each side of the hinge from hoop to mounting, which needed tightening on both of our hoops.

It was time for some testing. Everything up to this point had been based on calculations, and observations from the over-the-door hoop set-ups. No one had really tried to shoot hoops at the exact height and length as provided by the hoops in the cabinet of the machine.

So, we mounted some spare studio scrim cloth to the upper frame with staples, just to temporarily stop high overshoots, and called in a couple of volunteers from the office. This was a success, as one of the staff plays basketball in a weekly local competition, and arcade basketball for fun. His feedback confirmed that the 'feel' and utility of the basic arrangement was correct.

All that was left now was to paint the unit. There is some trimming still to apply, but the sooner the MDF was sealed, the better. So, the hoops and upper frame were removed, and the interior painted. The inside is painted with a dark blue. Not quite a midnight blue, as we wanted, because household paint colours don't usually go that dark and we could not justify buying hundreds of tubes of artists' paints, even cheap ones, to have the right colour. In the event, the colour is quite dark but the studio lighting makes it seem brighter. This photo is of only one coat, and we feel at least one or maybe two more will be required. The first coat took all of a 500mL sample pot.

The outside was painted next. This is painted in a lighter blue, a colour we chose just based on preference from the colour chart at a local hardware store. It's a Dulux colour but colour is up to the end user anyway, so if you're building one of these yourself, use any colour you like. We found that the first coat needed a whole 1L tin, so this stuff is very thirsty.


There were some things that changed during the build, after we had ordered material. It is worth detailing these here as it may stop someone going down a blind alley, or just help explain the final build.

When we set the cabinet down after adding the castors, one of the rear ones broke away. On inspection, we found that one of the screws we applied had reached a knot in the timber and simply spun around, and added little strength. However, the block system was really too weak and the other side was just hanging on. There is just too much weight on this end of the cabinet. Therefore, we took the offcuts from the rear slope on the side panels, and fixed them down over all of the rear corner assembly of the lower frame. These were screwed down with 8G x 50mm screws into both the frame and the corner brace pieces, and added plenty of strength to support the castor.

We originally had grand plans for a curved plywood table for the inner table surface, to return balls to the centre after they fell through the nets or bounced off the backboard. However, testing revealed that the balls rolled back and forth if they came from the side, and took longer to get to the bottom anyway. All of the front of the table is in easy reach, so centering the return was not necessary.

These points, together with the complexity of the design, meant that we abandoned it in favour of using the spare MDF sheet that was no longer needed after deciding there was no advantage to a full-height backing panel and instead using one panel for both front and rear panels.

The original plan would have looked something like this draft sketch.

It had two lengths of 65 x 19mm DAR recycled from the giant connect 4 frame, mounted across the back and the front of the cabinet at the relevant heights. To these, five sloped lengths of 40 x 18mm DAR pine would be added, in a curved line so that the thin sheet of 4mm bracing ply would conform to the curve. The ply would be screwed down along its length to each batten. In the end, the complexity was too high and the design did not provide any benefit anyway. It was also too weak to support human weight, and getting inside the cabinet and sitting on the table turned out to be necessary when mounting the hoops and when painting.

The height of the backboard also evolved. We had originally determined that it should be 1800mm, and our initial masking tape floor plan felt ok at this height. However, over-the-door testing revealed this to be slightly too low, allowing drop shots too easily. The height was changed after we had the timber delivered, but the rear panel was coming from its own dedicated sheet anyway.

However, there was another change regarding the backboard. We had originally intended that it be the full height of the rear of the cabinet, but this, we realised, is unnecessary. The higher the better for structural rigidity, but if we cut the front panel from one sheet of 2400 x 1200 x 16mm MDF, whatever was left would be totally adequate for the rear panel. It finished up at pretty close to 1420mm and leaves a nice gap at the bottom that can be crawled through without too much contortion. We realised after we did this, that it would be very useful for installing electronics and such inside the cabinet.


A bad craft or tradesperson always blames their tools, and we are far from perfect and made our share of errors. However, there were some genuine issues with tools. We did mention the drop saw we used, which has a scale on it for cutting angles. We had found this to be inaccurate as described above, and that led to a few headaches. However, we did not have the fences set up properly, either.

They cut square for long pieces because the pieces touch the correctly set outer edges of the fences, but shorter pieces were able to follow the fence as it sloped slightly inward to the back of the saw. Once we suspected this may be the case, we confirmed it with a straight edge (the 1200mm ruler) and corrected the problem.

The other significant issue we discovered was with our carpenter's square. This is a legacy tool that came from somewhere prior to DIYODE's existence and has a very historic look about it. It isn't terribly old, but old enough. We were getting inconsistent results with square corners and bracing pieces and such, even after fixing the 45° issue on the drop saw. Sitting on the ground examining the problem, someone noticed that there was a gap in some of the brass work of the square. We made some careful measurements and calculated Pythagoras' Theorem for the measurements, and sure enough, the square is not square. Once one of the staff brought in another one from home, the problems went away. Both are pictured side by side and we think you can guess which one is which. In addition, the 45° function of the new square was much more usable and helped us also.


Having got this far, there are some things we would change if we had our time again or were to build another. These things might be useful for anyone intending to build our design, to think about. The first thing is non-functional, but very irritating.

There are places where the lines of screws meet and they are not evenly spaced. Such a place is the front panel, where the screws in the sides were measured at 100mm increments from the bottom, which places them out of line with the line of screws securing the bottom of the side panels to the frame. This is purely aesthetic but it rankles for some people.

The screw-down feet are also too far back inside the cabinet. These really should have been mounted on the frame itself, right next to the MDF for easy access. Luckily, these do not need to be used often but using them at all will take some effort and careful reaching.

The inner frame does its job but life might have been easier if it had more timber in it. If it had at least one more piece in the middle and diagonals that were longer, we feel it would have been stronger. We could have also used the same metal strapping that is used to brace house framing.

The sketch here from the design phase shows what we mean, but we decided to go with the simpler design for the sake of material amounts and weight. On reflection, neither was a significant saving.

Finally, the table sheet needs more support. It's strong enough, but it drums. Having either one or two long rails in the middle sections, or several across the short axis along the upwards slope, would enable glueing or screwing to stop the flex and drumming that occurs. In the event, we only realised this after assembly and might have to look at coating the reverse side with something acoustic later.

As an important final note, we found the MDF to be very thirsty and we used much more paint for good coverage than expected. We should have used a sealer on the raw MDF first, which is thicker than regular paint and is designed to seal the pores and form a skin. The quantities in the materials list are for what we actually used for good coverage (the photos were taken before this was achieved), and not what you would need if you build this unit and use a sealer.


There is still a lot to do for this build but now that the hard groundwork is done, most of next month's is the fun stuff. We need to add the side and top netting that will stop bounced balls flying everywhere, after which we can add the final timber trimming. With that done, we can gap fill the whole unit and apply final paint.

The trim will both hide the UV lights and 3W RGB lights, and support the diffused LED strip that we are using for decoration. These will all be added next month, as will the twinkling stars that will be made from optic fibres in the rear panel. We will add the Arduino Mega and the control buttons with their 3D printed housing, and also cut and mount the score and time displays. The upper frame will also support 3D printed enclosures for some speakers for the sound element. We also need to build and install the goal-detecting system. Finally, we will put the finishing touches on decorations with fluorescent tape and transfers, and spray paint the hoops with glow in the dark or neon paint to facilitate UV mode. We hope you're as excited for all that as we are!