Back in August, my 4-year-old son broke his right arm just above the wrist when he slipped off some monkey bars on a playground just down the road from our house.
Not only did he have to give up the soccer season he had just started, but being that he broke his dominant arm, he had to make some adjustments to his day-to-day activities for 8 weeks or so while everything healed back up - one of which was learning how to play Mario Kart Wii with his left hand (I know - poor kid, right?).
We tried a few different controller configurations, and the one that seemed the most promising was the setup where he could push the gas on the Wiimote using his right hand and steer with his left hand using a Nunchuk.
The problem was, with the big, bulky cast on his arm and his inability to move his fingers initially, he wasn't able to easily press the 'A' button for the gas (let alone the 'B' button on the back for reverse, which he never uses anyway).
I realized that all he really needed was one big button that he could press down using his whole arm to trigger a mechanism of some sort that would essentially press the 'A' button for him on the Wiimote.
I wanted to make sure the button was pretty isolated to avoid the possibility of him accidentally pressing some other buttons on the Wiimote, so this is what I rigged up:
Of course, if I wanted to take advantage of all the game has to offer, I would have added more oversized buttons to the setup to allow him to control the D-pad and press the 'B' button on the back of the Wiimote.
Since my son is only 4 and his cast was a temporary situation, however, I opted for the simple, one-button approach, which would allow him to get up and running again quickly.
What You'll Need
I manged to avoid spending any money on this project, as I was able to use parts I already owned, but if you want to make your own, here's what you'll need:
- (7) M3x12mm countersunk screws
- (2) M3x6mm button head screws
- (2) M2.5x5mm pan head screws
- (1) M2.5x8mm socket screw
- (1) Adafruit Feather development board (any model should work ... I used a spare 32u4 Bluefruit model I had lying around)
- (1) Micro servo (I used a Tower Pro MG90S, though this one should work just fine)
- PLA filament
- (1) Gikfun Solderable Breadboard
- (1) 2-pin screw terminal block
- (7) Male pins
- (1) 10k ohm resistor
- (1) Micro USB cable
- (1) USB wall charger
- (4) Male/female jumper wires
- (1) 12x12mm Momentary tactile push button
- Hookup wire
The Printed Parts
Once you have downloaded all of the STL files, print them all using the recommend settings for each design. I printed all of mine using PLA and had no issues with durability.
Before assembling the big button, make sure you break off two of the pins on one side of the tactile button, and then solder hookup wires to the two pins on the other side, which will hang over the side of the printed button base:
The Wiimote cradle mounts to the side of the enclosure using two M3x12mm countersunk screws, but you may want to hold off on attaching these two pieces together until after everything else is assembled.
You can go ahead and mount the servo to the appropriate mounting bracket using the screws that came with the servo. You can also attach the arm (a.k.a. the "hammer") to the servo using the M2.5x8mm socket screw. I would hold off on attaching the servo mount to the enclosure at this point, too, as it will make it harder to mount the electronics on the inside when you flip the enclosure over.
The Circuit Board
The bulk of the circuitry is done on a solderable breadboard that will be mounted inside the enclosure in the next section.
Rather than take you step-by-step through the various wires and components soldered to the breadboard, I'm just going to show you a couple of images of a complete board for reference:
(If you're more advanced in the electronics department, I'm sure you'll find other ways to do what I've done here, but this is what worked for me.)
NOTE: The resistor in the pictures is the 10k ohm resistor in the parts list above. This is a pull-down resistor tied to the pin that will be wired to GND on the development board in the next section.
The two hookup wires that you soldered to the tactile button in the previous section will be connected to the blue 2-pin terminal block on the edge of the board, but we'll get to that here in a minute.
The two pins side by side on the opposite side of the board will be wired to the 3V and GND pins on the development board, and the three pins grouped together about 10 rows down from them will be used for the servo.
The two standalone pins will be tied to input and output pins on the development board to read the state of the button and to control the angle of the servo, respectively.
Now that you have all of the components and wires soldered to the circuit board, go ahead and mount that into the enclosure using the two M3x6mm button screws mentioned in the parts list above with the terminal block facing the hole in the enclosure for the button wires:
Wiring It All Up
If you haven't already done so, go ahead and mount the development board next to the USB port on the edge of the enclosure.
There are two standoffs that will simply just slip through two of the board's mounting holes, and then you can tighten the other end down using two M2.5x5mm pan head screws:
Next, connect the GND and 3V pins on the development board to the breadboard using a couple of male/female jumper wires:
Connect a jumper wire from pin #11 on the development board to the standalone pin next to the terminal block:
and then connect a jumper from pin #10 on the development board to the standalone pin next to the mounting screw on the breadboard (the green wire):
Now, place the servo mount in the appropriate slot on the opposite side of the enclosure and feed the servo's wires through the hole next to it. These wires will be connected to the three remaining header pins on the breadboard.
Make sure the brown wire is connected to ground, the middle, reddish orange wire is connected to the source, and the right, yellowish orange wire is connected to your control (output) pin:
Go ahead and put the button in its slot on the opposite side of the enclosure and feed the two hookup wires through the hole in the enclosure. Strip the ends of the two wires if you haven't already done so, and then connect these two to the terminal block like so:
At this point, everything should be soldered and wired up, so your final setup should look something like this:
You can go ahead and screw the lid onto the bottom of the enclosure using five M3x12mm countersunk screws.
You can also mount the Wiimote cradle to the side of the enclosure using the final two M3x12mm countersunk screws at this point if you'd like.
Once you've gathered and printed all of the parts you need and wired everything up, you can go ahead and grab the code for the development board from my GitHub repo.
If you need help loading the sketch onto the Feather board, please refer to Adafruit's guide to get you up and running.
As you can see, there really isn't much to the code. First, we establish that we want to make pin #11 an input pin, and then we attach a servo object to pin #10.
In the loop, we're simply just checking the state of the button to see if it has been pressed. If it has, then we position the servo to be at a 20° angle.
Otherwise, we position the servo to move the arm just slightly above the 'A' button at 30°, so that the arm doesn't have far to travel when the big yellow button is pressed.
At the end of the loop, we delay just a smidge (50 ms), and then do it all again.
You may have to tweak the angles a bit, especially the 20° angle. If the angle is too low, there may be too much resistance on the servo, which may cause it to freak out a bit and not work properly.
If the angle is too high, however, then the arm may not press the button enough, which will render the entire setup useless. You really shouldn't have to adjust this number more than a degree or two (in either direction), unless, of course, you mounted the arm at a different angle than I did. It's also going to depend on your servo and how the Wiimote is sitting in the cradle, but make the necessary adjustments to get the arm to press down on the 'A' button without pressing so hard that there's a lot of resistance.
Everything should be wired up, coded, and assembled at this point. If you've tested it out at all, you may have noticed that the servo mount moves up and down a bit and that the big, 3D-printed button doesn't quite sit still, either.
I was really hoping to not have to recommend this, but I had to do the same: you're probably going to have to glue these pieces in place. I was hoping to avoid having to do this, as I wanted to keep everything modular and "swap out-able" in case things break or you want to experiment with other configurations, but the device wasn't very functional without gluing the pieces in place.
Once those pieces are fixed in place, you should have a fully functioning Wiimote Button Presser device.
Since designing and building this device, I have had a number of ideas to make this project better, but I'm probably not going to get to them anytime in the near future, so I'm going to leave them here as a reminder to myself or to anyone interested in taking this project further:
Allow for a battery pack. I wanted this device to be as mobile as possible, but given my time constraints, I left the battery pack out, as I would have had to add in a switch somewhere, too, to shut the device off when not in use. Being that I have designed a number of other enclosures with a Feather or other type of USB-powered development board, I just went with what I knew. Including a battery pack was actually a part of the original design, which is why the dev board standoffs are off-center, but I never got around to it.
Make the enclosure smaller. There's a lot of empty space in this thing, and reducing the size of it could save on print time and filament. Like I mentioned, I originally wanted to include a battery pack of some sort, which I accounted for early on. I also thought about throwing in a couple more buttons to allow for someone to be able to fully utilize the Wiimote, so I made the enclosure bigger to accommodate them, but one button ended up being enough for my situation. Once I got the design to a "good enough" point, I didn't feel like going back and resizing or reorganizing all of the components, so the design remained as you see it today.
Add more buttons. This would allow for more of the Wiimote to be used in a game.
Replace the 3D-printed button with an arcade-style button. I was thinking about switching over to something like these. This is more just for aesthetics than anything. It could also save on some space, depending on the button you buy, which could allow you to add more buttons in a more confined space (and, they'd eliminate the print time for the big button itself).
Rework how the button and servo mount are attached. I really didn't want to have to glue these pieces in place, as one of the main goals of this project was to keep it modular so that pieces could easily be swapped out. As it stands now, if a part breaks, or if you want to experiment with other configurations, you may have to reprint everything, unless you can find a way to loosen the grip of the glue without damaging the various pieces.
I hope this project is helpful in some way, or, at a minimum, sparks some ideas of your own for some adaptive tech devices.
Thanks for following along.
(Header image by Ryan Quintal on Unsplash)
(Header image by Ryan Quintal on Unsplash)