What did you do to keep busy during the global pandemic quarantine? I built a robot.
Inspired by some videos (here and here) about a hybrid Connect Four + Mini-Golf game, I decided to build my own, but take it to the next level with full automation, robotics and Artificial Intelligence. It required 18 months, more than $3,500+ USD in parts, and many new skills/experiences, but it’s finally done! Fair warning – this is going to be a long post because this was a very complex project – lots to tell.
This project took longer than most of my other projects because I was getting a bit burned out toward the end and lacked the motivation to finish it (unusual for me, but these are unusual times). I also took my time to make the functionality, modular design and aesthetic top notch. It is an engineering marvel and I’m really proud of it. It’s among the first of my creations that I feel I could easily reproduce quickly because I used CAD for so much of the design.
Mid-way through this build, I decided to fully commit to a Scottish theme. I picked Scottish because it is where golf was invented. As a result, I immersed myself in Scottish culture research. I came across a fantastic source of a YouTuber named “BeautyCreep“. She is a delightful young lady who lives in Scotland and is a wonderful source of information about modern Scottish culture. Although I used a variety of sources, much of what I learned and applied in this robot stemmed from my studying her videos. I must admit that I’ll continue to watch her content, even though my project is completed.
My original intention was to build this as a technology showcase for work, but when the pandemic caused my office to close, I knew there was no hope of me bringing it in anytime soon. So, for now, it will reside in my garage and I have no idea what I’m going to do with it. My goal was to create a platform that educated while it entertained. My main topics of education were Artificial Intelligence and Scottish Culture.
I started with the game board design since I knew it was the core component that would be the most complex. I used a lot of foamboard as prototyping material for this component to make sure things were spaced well enough to accommodate the balls and electronics before building the final version out of Acrylic sheets. I used IPS Weld-On Acrylic Cement to bond the pieces together.
I 3D printed some interior pieces for each column that were curved and design to keep the ball centered, while also giving mounting points for all the electronics and provide wiring conduits.
In order to determine if a ball was present, and what colour it is, I bought 42 TCS34725 Color Sensors. They communicate on I2C and produce basic RGB values. It was tedious to solder 4 thin wires to each sensor, but it’s done. Each device is individually addressable by using solder jumpers to set unique addresses on the board. Because there were so many sensors, I had to use I2C multiplexers. I used one Adafruit’s TCA9548A I2C Multiplexer for each of the 7 columns to address the 6 sensors in each column. This let me use 1 Arduino Uno to control all 7 multiplexers + 42 sensors. As you can imagine, it was a wiring mess.
On the opposite side of each column, I mounted strips of Adafruit Mini Skinny NeoPixel RGB LEDs. This allowed me to illuminate the playing board with white light during game play to increase the ability for the color sensors to recognize the right color, and also let me change the board colours to red or blue and run some fun light animations when a winning move was made. I also ran these off of the same Arduino Uno that ran the colour sensors. Toward the end of this project, I was pushing the absolute limit of memory and compute capacity for this Arduino, but it still works very well.
Next, I tackled the issue of holding the balls in place during game play, but also allowing them to be ejected after the game was over. For this, I considered many options, but finally settled on a design that used a servo to move a pin up and down at the bottom of each column.
I experimented with many different shapes and came up with a “question mark” shaped pin. I chose 1/8″ steel rod for the material which was easy to bend and held its shape well. I developed a method using a metal bending tool to get consistent shapes for all 7 holes – it took a lot of effort to get all 7 identical since I lacked the proper tools.
Next, I tackled the mounting of the cross bar on the pin that would act as the fulcrum for the lever. I tried using all manner of adhesives, metal solder, and even wire wrapping, but nothing was strong enough to keep the pieces together. So, very reluctantly, I gave in and bought a small (wee) flux core welding kit (among the cheapest I could find) along with all the required accessories. I picked flux core because it was the easiest to learn and least expensive way to get started – no tanks of gas required. I watched and re-watched many videos to learn how to weld and then went to work in my garage. I made a mess, destroyed many pieces, but in the end, I was able to get 7 welded pieces that were good enough. side note, I destroyed the plastic table that I was working on, in the process.
I 3D printed mounting brackets for the cross bars of the pins, and for mounting the servos. I mounted everything on the underside of the game board after practicing on my foam core prototype. I used a Pololu Mini-Maestro 12-channel USB Servo controller to provide power and control for the 7 servos. After a bit of fine tuning to adjust the servo arm movement range, I got the pin actuation functional.
Next, I created the top of the gameboard. I used my Shapeoko to carefully cut out circles on the top piece of acrylic and glued it onto the with more IPS Weld-on Acrylic Cement. With all the electonics I was moutning onto this thing, it was starting to droop a bit. However, after I glued the top on, I noted the whole gameboard much more firm.
Finally, I attached all the electronics onto a mezzanine shelf underneath the game board to keep the wires away from the moving parts of the servo motors. I mounted the Arduino Uno, the Mini-Maestro, and a custom power distribution board on a scrap piece of HDPE that I put onto of 4 stand-offs. In an effort to keep everything modular, I chose to use pins and jumper wires, in case I ever needed to tear it down. I used more HDPE to make a cover for this wiring jungle to prevent any snags.
With the game board fully assembled, I tinkered around with MS Visual Studio to make some test apps that would test all the functions of the game board and the interface with the Arduino. I selected C# for this project since I had good experience with it on previous robot builds. Pololu has a bonnie re-usable .NET library that I was able to get up-and-running easily. I custom built the Arduino sketch with a special serial protocol for communication with an app. With those 2 connects, I was able to test all aspects of the gameboard.
I learned quickly that ejecting all the columns at once caused a traffic jam, and I needed to let them drop one column at a time for them to eject properly. It takes more time, but it works consistently. During testing, I also played around with different lighting effects including using coloured light to identify which column(s) held the winning set of balls.
In order to properly test the game board, I started to build out a bottom quarter of the platform. I used aluminum L-shaped rods to provide support for the gameboard. My goal was to allow the gameboard to sit securely during game play, but to also be removable for maintenance and transportation.
I cut and used heat to bend open a PVC pipe that I used to collect the balls being ejected. The transition from the pipes to the playing board was critical, and I spent a lot of time fine-tuning this. I 3D printed pieces that helped to carefully direct balls into the columns – some of them needed to be slightly skewed to line up properly – there was a lot of trial-and-error to make it work consistently.
After that, building the rest of the platform was pretty easy. I used 2×4’s to make a frame and 5/16″ plywood as the base. Because they were big, and growing heavier with each new component, I opted to split the base into 2 pieces, and put wheels on the one side to make it easy for one person to move them around and set them up. I added an expensive piece of clear, 3/8″ thick piece of polycarbonate over the top of the playboard to protect the board and make it flush with the playing board.
Building the plumbing for the holes was my next challenge. I 3D printed custom funnels with screw holes to allow me to attach them to the underside of the platform. I made them extra wide to make it easier to sink a putt. I used 2″ diameter PVC pipe which allowed a golf ball to fit through nicely. I also used standard elbows and adapters when possible to make the connections easier. I used a heat gun and gently added necessary bends into each pipe to route the balls down to the game board – they’re ugly, but they work. I 3D printed to brackets to affix the 7 Pipes at the bottom and used short set screws to keep them in place.
Figuring out the correct angle to raise these boards took a lot of time. Too much angle and it would be difficult for the players to putt the ball. Too little angle and the ball would not roll down the pipe into the playing board. I used clamps to hold 2x4s and tested many angles until I found just the right angle.
Next, I decided that the plain top of a 2×4 was unacceptable and I would create some decorated wood pieces that would go on top and hide the wood. I bought 1/2″ thick Poplar boards since they were easy to carve and took paint well. I spent a LONG time finely calibrating my Shapeoko to consistently carve a Celtic pattern I found online and traced into toolpaths using Inkscape.
The end result of the carvings looks fantastic. I used a round-over router bit to knock off the top corners. I then spray panted the pieces with black paint, and used a roller brush to coat the tops with white. It really makes the pattern pop. From a distance, it appears to be a painted pattern, but when you get close, you can see the depth of the cut and it looks really impressive. I was so happy with the way the carvings turned out, I decided to repeat the process for the top, over the holes. I made a 2-piece design with the title and hole numbers using a Celtic font and other Celtic patterns that I absolutely love.
I framed out the rest of the platform, and realized, I needed a place to mount a bunch of electronics. I found that there was some open space below the holes, so I crafted a sliding shelf. I used 1/4″ plywood to mount the Intel NUC computer that runs the robot along with the powered USB splitter, AC Power strip, and a large PC power supply that provided 12V and 5V power for the board with an ATX Breakout Board. Everything is securely mounted so the vibrations from transporting the board will not damage anything.
Unfortunately, the final design prevents me from properly supporting the platform over the pipes, making it dangerous for someone to stand there. The 7 x 2″ pipes needed to be fitted tightly together, which meant no bracing directly under the plywood was possible for 16 inches in the direct center of the board (where it’s needed the most). I put some cross-beams under the pipes to help provide a bit of support, but I resigned myself to just ask players not to stand on or above the polycarbonate protecting the playing board. This issue could someday be the death of this game.
Realizing that I would not be content with slapping some paint on the wood, I decided to invest in some very thin (1/32″) polystyrene sheets from McMaster-Carr. They came in big rolls and I was able to easily cut them with an razor blade to the dimensions of the sides of the frame to hide the structure underneath and give a really clean look. I used screws to attach the polystyrene to the frame. I then cut 1/2″ aluminum angle rods to size and screwed them onto the corners for a bonnie finish that hides the edges of the polystyrene. After raising and lowering these boards over-and-over, I realized that I really should add some heavy duty handles in order to avoid issues. So, I found some black, cast iron handles and bolted them in strategic places.
I spent a lot of time trying to figure out what kind of turf I should use for the inside surface of the platform. I realized quickly that this is a big industry and this stuff can be VERY expensive. Seeking something inexpensive, I went with an inexpensive Artificial Grass Turf option I found on Amazon because it was very close to the size I needed 4’x8′ (left pic). After cutting it down to size and putting it on the platform, I realize it was not going to work – the “grass” strands were too tall and they made it very hard to putt uphill, and completely stopped the ball from rolling back. It smelled like rubber, looked terrible and was non-functional. I had to pull it all of and throw it all out – what a waste!
I called about a dozen vendors and asked them to send me turf samples so I would not make the same mistake twice. Many were reluctant to send me any samples, and most were unwilling to work with me on such a small project. The samples that I did like were VERY, VERY expensive. I had almost lost hope when I came across this Fairway Green Artificial Grass Area Rug (right pic). It was perfect for my needs. The balls roll nicely on the surface, it’s inexpensive, the rug is quite sturdy and the colour is great.
One of the key things I had to consider with the platform was lining up the bottom and top half. This was critical so the pipes would line up with the gameboard. I had designed an overlapping configuration to help lock the halves together, but I was concerned that players walking on the platform might jar it loose. So, I came up with a simple locking system. I drilled holes in a block of wood and mounted them on the top and bottom parts of the overlap. I used a steel rod to slide through both sets of holes to keep the halves locked. I slightly tapered the steel rod and used Perma Blue to keep the rods from rusting.
After rolling about a thousand balls, things were working pretty well. However, one out of every 100 balls would somehow get stuck in the transition between the pipes and the gameboard. it required me to pull the whole thing apart to unstick the ball. So, I decided I needed a mechanism that would automatically push the balls forward when they get stuck. After a lot of prototyping and some more welding, I came up with a long rod suspended by 3D printed brackets with bearings to allow the bar to rotate. I affixed a handle to the protruding end of the rod, and cut slots into the bottom of each of the pipes to allow a pin to enter and push the ball forward. I mounted 2 springs onto the contraption so it would not accidentally get in the way of normal operation. I was surprised how fast this came together and it works great.
After some testing, I found that the eject function does not always work because balls get stuck and do not drain out. I think the tiny dimples in the golf balls positioned just the right way give just enough of a surface for the ball to be held. Tapping my foot on the platform usually dislodges them, but I wanted to see if I could do better. So, I bought some small vibrating motors and printed some 3D enclosures for them to allow them to spin freely and mount underneath the game board. Now, they activate before the ejection sequence begins and it resolves most of the stuck-ball issues.
One of the last steps I did with the platform was run the cables inside the frame. I worked hard to ensure that only 1 external cable would be required (3-pronged power cable) – all other cables would be internal and hidden. With the power and PC mounted in the back half, it required a total of 11 cables to be run from the back to the front to connect all the devices (5 USB cables, 1 HDMI, 1 AC Power, 3 5V Power, 1 12V power). This created quite a mess of wires inside, so I did my best to bundle the data and power wires separately to avoid interference and organized them with wire wraps. I had to work it out so each of the 11 cables had a disconnect at mid-platform so the two halves could be detached and reattached easily.
Finally, mounting the 22″ touchscreen monitor required a 1.5″ OD aluminum pole to be mounted to the base of the platform. I 3D printed a custom mount that bolted to the front side, and reinforced it with metal plates at the bottom. I found a bonnie swivel mount for a VESA monitor that attached securely to the aluminum pole. I put some bolts through the base mount of the pole to avoid movement and it worked really well – no wiggles at all. I painted the pole white, and made a 3D printed cap to give it a more clean look. I ran the wires (power, HDMI, USB) through the pole to better hide them.
There were 2 main robotic functions that I wanted to create: the Ball Dispensers and the Ball Launcher.
The Ball Dispenser is necessary to control the balls in play during the game. Again, using foamcore, I quickly created the base for the robot. To hold the golf balls, I found this inexpensive toy: Portable Mini-golf Trainer Automatic Dispenser. I discarded most of the content, but what I really needed was the spiral holder for the balls. It’s made of rigid plastic, and holds the weight of real golf balls just fine. Additionally, I found that they were modularly designed and snapped together. I needed a bit more capacity than one toy could provided, so I bought an extra and poached parts from it to make an extra tall stack for the 2 Ball Dispensers and the Ball Launcher. I glued them together and spray painted them glossy blue and red.
Next, I purchased a set of automobile automatic door locking motors to act as the actuators to allow the dispensing of a single ball. I found that these motors were under-powered for the job, and sometimes got jammed if the open/close wasn’t timed precisely. I 3D printed a spout for each ball dispenser with a hole in the side to allow the plastic pin from the door lock motor to move in and out.
I used 3D printed right angle pieces to bolt together pieces of white acrylic for the body of the Ball Dispensers. I realized, because of the slope of the playing board, the platforms holding each dispenser needed to be staggered. I picked a design that allowed a flat bottom, but a staggered top to allow it to stand on its own during development and transportation. Underneath, there was plenty of room to fit an Arduino Uno with an Adafruit Motor Shield v2. This shield allowed me to control both motors in a forward and backward direction.
I exposed the USB plug and 5V DC power plug on the outside of the platform to make it more modular and allow easy connect/disconnect from the platform. I also used a pair of heavy-duty L brackets to act as “hooks” to allow it to easily slide on and off the platform.
In keeping with the theme of coloured lights I started with the Gameboard, I used the same Adafruit Skinny NeoPixel strips to wrap around the spiral ball holders. I wired these into the on-board Arduino and was able to control their activation and patterns while dispensing a ball.
Finally, I felt the front was a bit plain, so I 3D printed a sign for each dispenser. In keeping with the Scottish theme, I thought it might be interesting to use some Scottish Gaelic words instead of English words to label each dispenser. So, I looked up the translations for Red (Dearg) and Blue (Gorm) and used them for the labels. I used the same technique as with the wood by spraying them white, then using a roller to paint the tops with colour.
During testing, while many of the components failed or needed to be tuned, the Ball Dispenser has always worked consistently well. It’s a solid design and highly functional.
The Ball Launcher is the second robotic function that I built in. This is necessary to allow a human to play the computer’s AI functions. It’s main purpose is to aim and launch a ball at one of the 7 holes. I started with a very similar design as the Ball Dispensers – I used the same spiral ball holder with LEDs and automotive door lock motor. However, had to add some additional features to give the ball the momentum it needed to get up the slope and into a hole.
I was inspired by some sports ball launchers (like this and this) that I saw online and adopted a design where I’d use 2 spinning wheels with soft tires to grip and fling the ball. The motors would need to be precisely controlled to spin at the same speed to avoid the golf ball having a spin and veering off course. After some more foamcore and 3D prototyping I came up with some motor mounts and an elongated spout that would allow the tires to grab the ball and fling it.
I really had no idea how much torque would be required to move the ball, so I bought some beefy 24V DC brushed motors and some 4.25″ RC car rubber tires. I 3D printed hubs for them to mount onto the motor shaft and gave it a try. Long story-short, these motors were waaaay too powerful for my needs and far to heavy to be supported by a robot platform.
It was a painful (and expensive) setback, but I had to scrap this whole design and start over with a new one using smaller motors. I found some bonnie 12V brushed motors from RobotShop that were much more aligned with my needs, but probably still much too powerful. I controlled them with a Sabertooth 2×60 motor driver (again, waaay overkill for my needs), and found that I had the precise control I needed to launch balls consistently. I bought some 3″ RC car rubber tires that were flatter which helped reduce vibration. I also re-designed the spout to be a bit more narrow and longer to get better accuracy.
The RobotShop specs for the 12V brushed motors are quite mis-leading (shaft is much shorter than advertised) and it caused me to do a lot of extra work to mount the hubs/wheels onto the motor. Long story-short, I bought some Clamping Hubs from ServoCity to ensure a secure and wobble-free mount.
I painstakingly designed a CNC toolpath to cut out the base platform to mount the robot components on a piece of HDPE sheet. I also 3D printed covers for the motors, mounted a cross-brace along the top, and mounted a powerful green line laser underneath the cross brace. This line laser activates when the robot is aiming so the player can see the intended target – it was an after-thought suggested by a friend, and I really like it. In order to avoid blinding people, I 3D printed a small cap that I put over the laser so it only projects onto the playing board.
Next, I build the base out of pieces of white Acrylic and connected them with more 3D printed corner braces. I used the same right angle piece to act as a “hook” for holding it on the playing board. I wish I had used 2 since a single tends to lean a bit during operation. As with the Ball dispenser, I exposed connectors on the side for power and USB data. This device needed both 12V and 5V supplies since the Motors ran at 12V and the laser needed 9V (I stepped down the 12V to 9V to make it work) so I used a 4-wire connector.
On top of the base, I mounted a motorized rotating platform so i could turn the robot in the correct direction. I found these were REALLY expensive, and shopped around quite a bit before finding this one which was still more money than I wanted to spend. I really had to roll the dice on this once since there was no online documentation about how to operate it and the one diagram I did find when I looked up the stepper motor was labeled in Chinese. I was concerned I would need a special driver board, or some other component that I didn’t have because it had a 9-pin D sub connector. After it arrived, I played around and found it was just a standard stepper motor with 4-wire output and easily controlled by an Adafruit Motor Controller shield. I found an old 9 pin cable and cut off one end to expose the wires. It worked great (whew!). One bonnie feature – it has a knob on the back of the stepper motor that allows for manual adjustment – it’s been really nice to have that for quick adjustments.
Lesson Learned: the factory-installed lubrication for the motorized rotating platform was terrible. The motor was stalling at times, and not moving very smoothly when there was load. I disassembled the entire thing, wiped it down, and drowned it with Triflow and it has been working very well ever since. Using the Arduino + Motor controller, I’m able to turn it to a given angle, then return it back to center with very high precision. The aiming laser helps to confirm this.
In keeping with the design of the Ball Dispenser, I created another sign for “Scotty” and mounted it on top of the cross-brace between the motors. It helps hide some of the hardware and give it a more consistent look.
Inside the Ball Launcher, a single Arduino Uno controls all functions of the robot. This includes the ball dispensing motor, the LED lights, the rotating platform, the green laser and the ball launch motors. Yet again, I was pushing the limits of the memory and horsepower of the Arduino, but after a bit of optimizing the sketch runs very consistently.
Lesson Learned: I was using the Sabertooth in “serial” mode. I learned that when it starts up, it sets the motors to a default setting – in my case, full throttle. I had code in the Arduino to turn the motors off as part of its start-up sequence, so plugging in power meant full throttle for about 1 second while the Arduino booted. This resulted in some loud noises, vibration, and the terrible smell of burning tire since they were rubbing on their housings. Occasionally the Arduino would delay it’s startup which meant that these motors continued to run for many seconds. At first, it was causing me to blow fuses. After I put better fuses in, it caused issues with tire popping off the hub. I tried debugging this problem for a few weeks and was starting to get scunnered. I finally decided to control the power to the Sabertooth with a big relay. The relay stayed closed until the Arduino was booted. When ready, it closed the relay and gave power to the Sabertooth. Within milliseconds it sent the “turn off motor” command which avoided the terrible startup issues.
After much calibration, I’m able to get the Ball Launcher to sink putts about 80% of the time. I was able to do some tuning that allowed me to run the motors at about 12 – 15% speed which significantly reduced the vibration of the platform and achieve better accuracy. I’ve conceded that it may be beyond my current abilities to achieve a higher rate of successful putts because of all the variability involved.
In the colder months of the build, when I was unable to comfortably work in my garage, I spent time building the software that controls the whole system. Again, using C#, WPF and XAML, I build a highly interactive system that was the ‘brains’ for the gameplay and controlled the Game board, the Ball Dispensers and the Ball Launcher. On top of that, I wanted to include 6 different Artificial Intelligent modes – all written from scratch by me. This was a very complex app. Finally, if the fine woodworking set the bar for the level of aesthetic of this robot, then I was determined to give an even more polished look to the software. I went a bit overboard to make the look and feel of this app extra special.
I continued to embrace the Scottish theme by including videos and pictures of St. Andrews golf course, where golf was invented. I included bagpipe music, used Scottish Celtic font throughout, and even found a Text-to-Speech engine that produced a convincing Scottish accent. Applying what I learned from my research, I was able to create an immersive game play experience with “Scotty” providing continuous entertaining banter using authentic Scottish phrases. Let’s just say that Scotty is out to win, and isn’t afraid to do a bit of smack talk to his opponents during the match, even if he’s about to lose. My intention was to provide motivation for the human opponents to want to continue to play.
The game has extensive logic built into the game board to identify cheating and unusual activity. After each turn, it does a check to see if cheating has occurred – if cheating is detected, the game is ended immediately. The game must also watch for unusual board conditions. For example, if the ball is rolling down the board toward the bottom while a snapshot of the colour sensors are taken, it may appear that a ball is “floating” above other balls. In that case, the results should be ignored and the query re-run so the correct ball position is represented.
Of all the components, the Artificial Intelligence pieces were the most complex parts to write. The game of Connect Four is quite complex with over 4.5 Trillion different possible game combinations! It’s possible to win in a variety of ways (horizontal, diagonal, vertical) and it’s even possible to tie. While there are some really good tactics that can be applied to win, I was determined not to program those explicitly – I wanted to use true Artificial Intelligence and have the app figure out the next best move independently based on any possible game board. While I benefited from many online sources, I ultimately was left to translate the concepts into C# to integrate them into my app. This app has 6 different AI game play modes and some modes have different levels of difficulty.
- Random: The robot uses a random number generator to pick a target hole (a terrible strategy)
- Defensive: The robot looks 1 move ahead to identify opportunities to block an opponent from winning
- Min/Max: A recursive algorithm that simulates many different games to find the move that maximizes the chance of a win while minimizing the chance of an opponent win.
- Hybrid: Uses aspects of Random, Defensive and Min/Max
- Monte Carlo: Uses the “law of big numbers” by playing many random games and identifying the next best move.
- Q Learning: After playing a game, this algorithm records into memory the moves that allow it to win or lose so that it does not repeat mistakes.
In order to provide some education, I decided to be transparent with the scoring results from the AI so the human can understand a bit about how it works. I also added a screen that explains the algorithm in detail, along with a lexicon of Scots to English phrase translations. Touching a row plays back the Scots phrase so the player can hear the pronunciation.
The interface is simple and intuitive. There is a touch screen mounted on a pole and the players are provided visual and verbal instruction throughout game play. Both 1-player and 2-player options are available. If 1-player mode is selected, then the player can select from one of the six AI options. In some cases, the first player is randomly selected via virtual coin flip. However, for advanced AI options, the robot takes the advantage and always goes first.
Once the game begins, the players alternate taking turns by putting balls into the holes. The golf aspect of this game adds a new dimension of complexity since its challenging for some players to hit the ball into the intended hole. Also, many retries are often required since the ball must be hit with just the right amount of force. I added white sponges on the inside back of each hole to reduce the ball velocity and increase the chance it will go in the hole. Also, the holes are extra wide compared to regulation golf holes, to further increase the chance of a successful putt. An “Extra Ball” button is available in case another attempt is required by the human or robot.
The game concludes when one player wins, or in the rare case where a tie occurs (the board is filled and there are no winners). After a win, the winner’s colour is used to illuminate the game board, and the column(s) with the winning moves are highlighted with colour light patterns. The balls can then be ejected and a new game can begin after the balls are manually re-added to the spiral ball holders.
I’ve added a password-protected Admin screen to allow control of the board in the event of an unexpected issue. For example, if a ball is stuck and does not eject, it may require manual intervention to unstick it and properly eject all the balls. It also includes “macro” functions such as easy shut down of the game by draining all the balls from the dispenser and killing the app. This is very helpful in letting me resolve an issue without restarting the game.
The video below shows actual game play of a 5 game, 1-Player match with the Robot. Of course, I edited some of the pauses between shots and misses/mistakes. I used a “picture in picture” technique by simultaneously recording with 2 cameras and overlaying the pictures so you can see what’s happening on the screen while the action is happening on the board. I almost feel a 3rd angle is needed to fully appreciate the ball launcher in action – it is fun to watch.
As this project comes to a close, I have mixed emotions. On one hand, I’m really happy with the high quality results. It’s a fun and playable game, and I think many would enjoy playing it. On the other hand, after 18 months, I’m very ready to call this ‘done’ and move on to some other things. It’s come to the point of diminishing returns where improving one feature breaks another. I’m a bit sad that it will collect dust as I have no real showcase to demonstrate it with my office being closed.
I learned many new skills on this project including welding and AI applications. I’m certain I’ll be doing more welding (I need the practice), and I’ll be looking for opportunities to include AI in future projects (at home and at work) since it’s not as terrifying as I thought it would be. In total, there were more than 100 3D printed parts that were all custom built from scratch to make this project – I’m really glad to have a 3D printer – it makes small-batch fabrication so much easier!
I’ve now incorporated some Scottish phrases into my vocabulary and look forward to the opportunity to share them with someone from Scotland (if you think I’d forget your bum’s oot the windae). I’ll continue to be fascinated with the Scottish culture and look for opportunities to learn more.
Thanks for reading. Lang may yer lum reek!