Toy manufacturers are releasing children's toys which mimic items a child may see in later life. Often in bright colors with smiley faces, they are so cute! But they're usually not functional other than for novelty. Why not make them work as their more functional counterparts?

This guide will show you how to turn a Fisher-Price sensory toy into a fully-functional USB controller compatible with Nintendo Switch, as well as devices supporting XInput and DirectInput USB controllers. You'll only need basic soldering skills and the ability to drag-and-drop a file to program the microcontroller.

The Adafruit KB2040 microcontroller, running a custom build of the open-source GP2040-CE firmware, is used here to bring this controller to life.

Fisher-Price conveniently provided easily solderable test points for every button on the PCB, making it seem as if this pretend controller was destined to become a real one.

Features

  • Selectable USB input modes: XInput, DirectInput, and Nintendo Switch.
  • Standard button mapping: D-pad, plus five buttons (A, B, X, Y, and Start).
  • Simulated analog: Front switch sets the D-pad to be left analog stick.
  • Speaker Muting: A rear switch modification is used to mute the speaker.

Materials & Tools

  • Fisher-Price Laugh & Learn Game Controller
  • An Adafruit KB2040 microcontroller
  • 10 x 6in jumper wires (Thin 30 AWG wire wrap recommended)
  • Heat shrink (optional)
  • A soldering iron and solder
  • A hot glue gun with glue stick
  • A drill and 9/64 in drill bit (3.57mm)
  • Flush angled cutter pliers
  • 3D printed cutting jig (optional)
  • A multimeter (optional)
  • Phillips screwdriver
  • USB-C cable

Materials from Adafruit

Angled shot of short black microcontroller.
A wild Kee Boar appears! It’s a shiny KB2040! An Arduino Pro Micro-shaped board for Keebs with RP2040. (#keeblife 4 evah) A lot of folks like using Adafruit...
Large spool of Rainbow Wire Wrap Thin Prototyping & Repair Wire
This stuff is called "wire-wrap wire" because it used to be used for wire-wrapping high-speed digital circuits on a special kind of contact board. It's pretty rare to see...
USB Type A to Type C Cable - approx 1 meter / 3 ft long
As technology changes and adapts, so does Adafruit. This  USB Type A to Type C cable will help you with the transition to USB C, even if you're still...

If needed/desired:

Array of many colorful heatshrink tubes.
Heat shrink is the duct tape of electronics which I guess makes this heat shrink the colorful and exciting duct tape they sell at craft stores.  This heat shrink comes in six...
Red and black diagonal flush cutters
These are the best diagonal cutters, large super-comfortable grip to use and have strong nippers for perfect trimming of wires and leads. I've used my pair every day for years.
Angled shot of a Digital Multimeter - Model 9205B+.
This massive multimeter has everything but the kitchen sink included. It's a great addition to any workbench or toolbox.  It's low cost, simple to use, and has a big clear...

To disassemble the controller, start by removing the seven Phillips head screws located around the perimeter of the controller's backside.

Gently separate the two halves and disconnect the red connector from the PCB, which leads to the battery compartment on the back half.

Some controllers may easily separate after removing the screws, while others may require additional force due to excess hot glue on the inside of the back half.

Lastly, there are three more small Phillips screws that need to be removed inside the controller. Two of these screws secure the speaker bracket, while the third one holds the PCB in place.

Pay close attention to the positions of the internal screws, as there are more screw holes than actual screws.

The controller normally runs on 3 AA batteries (4.5V). As the batteries discharge, the voltage supplied gradually decreases. In fact, it will even continue to operate with just a jumper wire and 2 AA batteries (3V).

The KB2040's 3.3V regulator not only supplies adequate power, but also ensures the controller's button output signals remain within a safe operating range for the KB2040's GPIO to read

Since the existing batteries are no longer needed, begin by carefully trimming the power wires as close to the back shell as possible.

You'll be reusing this cable assembly, so hold onto it.

Next, ensure the black and red wires are of equal lengths, and carefully remove a small portion of insulation from their ends.

Now, proceed to solder the red wire to the 3.3V pin (marked '3V') and the black wire to the ground pin (marked 'G') on the KB2040.

The KB2040 will fit very tightly between the two halves of the shell. Just three areas of the shell will need to be cut and drilled-out in order to both create enough space for the board and an opening for the USB-C port.

Shell Cuts:

  • USB-C port opening. (top)
  • Boot/Reset button holes. (back)
  • Remove speaker bracket spacer. (internal)

To make this process easy, these two 3D printable jigs can be used.

USB-C Port Opening

Start by placing the top cutting jig onto the top section of the back half of the shell.

It will snap into place and the small arrow should be pointing upwards.

Make sure both sides fit flush within the grooves of the jig before cutting.

...

Please wear eye protection when using tools like diagonal cutters used to trim plastic and while drilling.

Using angle cutter pliers, carefully trim off the plastic above the jig.

Optionally, the 9x3.5mm USB-C segment can be pre-drilled to ease trimming.

If cutting without the 3D printed jig, then start by trimming off 5mm of the tab in the photo below. Then hold off on cutting the 9x3.5mm USB-C slot until the final assembly.

After the KB2040 mounting step, the shells can be placed together enough to allow for markings to be made exactly where the USB-C port will passthrough.

Boot/Reset Button Holes

The KB2040 has two buttons, reset and boot. Access to the boot button is essential for updating the firmware.

Also for this mod the KB2040 will fit so tightly that when screwed together the buttons will be pressed, causing the firmware to not boot.

So two roughly 3.5mm holes need to be drilled into the battery compartment for these two buttons.

Start by removing the batteries and then place the second 3D printed jig into the two lower battery slots.

With the arrow pointing towards the top of the controller, drill out the two holes.

If drilling without the jig, then start with the hole on the left. This hole will be almost directly under the existing hole by 1mm. Then hold a KB2040 in place to guide marking the position of the second hole.

Speaker Bracket Spacer Removal 

The KB2040 will mount snugly between the speaker bracket and the battery compartment.

There is about 1mm of plastic that should be trimmed on the underside of the speaker bracket to avoid it flexing into the board when being reassembled.

Using angle cutters again, carefully trim away the plastic spacer on the underside that touches the speaker.

The open source GP2040-CE firmware combined with the KB2040 is really the magic that brings this controller to life.

The KB2040 is able to read each button press by connecting the corresponding controller PCB test points directly to specific GPIO pins on the microcontroller.

When a button is pressed on the Fisher-Price controller, the button's test point signal will go high (3.3V). And when the button is released the signal will return low (0v).

Custom GP2040-CE Software

GP2040-CE out of the box reads button presses in the opposite direction of how the Fisher-Price controller behaves. (pressed = LOW; released = HIGH)

Luckily with it being open source, it was easily modified to support this. And a precompiled UF2 firmware file of this custom build is available by clicking the download button below.

  1.  Download UF2 firmware file
  2.  Hold the boot button while connecting the USB cable from your computer
  3.  A virtual drive will in your computer File Explorer or Finder (depending on your operating system) named RPI-RP2
  4.  Release the boot button once the drive shows up
  5. Drag-and-drop the UF2 file onto the RPI-RP2 drive
  6.  The drive will auto disconnect when update is complete

STEMMA-QT Connector Removal

When the shell is reassembled, the area where the KB2040 will be placed is very tight and will require removing the STEMMA QT connector to fit within the narrow space.

To remove, start by using angle cutters to gradually cut the connectors two front legs.

Next trim the sides and the top off so that the back side can be easily cut.

Then cut the back side of the connector just below the pins. Take care to not rip the pin traces as the back is trimmed enough for the connector to come loose.

To connect the KB2040 to the Fisher-Price controller, ten short jumper wires will be used to connect between each button's test point and a GPIO pin of the KB2040.

Soldering to Test Points

Using 30AWG wire wrapping wire, cut 10 wires at roughly 10 inches / 25.4cm to allow for plenty of slack to work with.

Pre-tin all 10 test points with a bit of solder. 

Strip the insulation from the tip of each wire and solder them to the test points.

Route the wires tightly to the bottom center of the board. Make sure to route around any holes.

Also avoid any wires passing through the center of where the d-pad sits within the left group of buttons.

Circuit Board Variants

There are at least two variants of the PCB depending on when the controller was manufactured.

The same steps apply except the button silicon pads will need to be temporarily removed to access the solder points if you have the variant with large connected elastomer pads as shown here.

Optional Speaker Mute Modification

The sounds the controller makes can be hilarious but can become hard to bear after extended gameplay sessions. A simple solution for this is to remove the resistor at R2.

By removing the R2 resistor, the rear toggle switch can be used to turn off/on the speaker.

By removing the R2 resistor, the rear toggle switch can be used to turn off/on the speaker.

Heat up the R2 resistor solder points and remove the resistor using some tweezers.

Mounting the KB2040 Board

Place a small bit of heat shrink around the two groups of wires. This will help keep things nice and tidy.

Trim the wires down to the same length of about 5-6 inches (13-15cm).

Remove a small bit of insulation from the tips of each wire.

Be careful while stripping insulation to avoid cutting the wires!

Tuck the speaker wire over to the side to make room for placing the KB2040.

Place a healthy amount of hot glue onto the center of the speaker mount as shown in the photo. (About 1cm)

Then press the KB2040 into place with the USB port sitting on the white edge and the board within it.

For proper alignment, the RAW bin to the right of the USB port should be touching the white tab sticking up from within the case.

Soldering to the KB2040 Board

The individual wires will need to be identified before soldering them to the KB2040.

This can be done easily by connecting the USB power to the KB2040 and then touching each wire one at a time to the 3.3V pin.

Forcing the signal high will trigger the button sound effects. Check each wire and fan the wires out into the correct order to match placement onto the KB2040's GPIO.

(Red/Circle) C - 2   
(Orange/Star) D - 3   
(Blue/Triangle) B - 4   
(Green/Square) A - 5   
Toggle - 6   

A3 - Down (4)            
A2 - Right (3)
A1 - Up (2)
A0 - Left (1)
CLK - Thumb

Unplug the USB cable from the KB2040.

Pre-tin the 10 GPIO pin holes, 2-6, A0-A3, and 18 (CLK).

Solder each wire to its corresponding GPIO.

Once soldered, reconnect the speaker wire and gently tuck the newly added wires into the center cavity between the boards.

At this point, double check the shell cuts align before screwing back together.

There should be enough clearance for the rear buttons to not be pressed when the shell is screwed tight.

To quickly check your work, the website Gamepad-Tester.com is an easy way to test a USB controller on any computer with a browser.

The analog stick on the Fisher-Price controller is just a big button and is mapped to be the Start button by default.

Some games require analog input while other work fine with standard d-pad input.

So the front yellow switch on the Fisher-Price controller has been programmed to toggle the d-pad between standard d-pad and simulated analog movements.

Input Modes

The GP2040-CE software supports multiple input modes for use on a wide array of devices. In order to change input modes, simply hold A, B, C, or D while connecting the USB cable.

A - DirectInput Mode
B - PS4 Mode
C - Xbox Mode
D - Nintendo Switch Mode

Web Configurator

The GP2040-CE software also has a built-in web server that can be enabled by holding the start button (thumb) while connecting the USB cable to a computer.

Then access http://192.168.7.1 in a web browser on your computer to begin configuration. This mode is compatible with Windows, Mac, Linux and SteamOS.

Congratulations! You have successfully transformed a Fisher-Price pretend sensory controller into a functional USB video game controller compatible with a wide range of devices.

This project demonstrates the versatility of microcontrollers like the Adafruit KB2040 and the power of open-source firmware like GP2040-CE.

Consider exploring other modifications or improvements to the controller, such as adding an analog stick or top bumper buttons.

This guide was first published on May 10, 2023. It was last updated on Mar 08, 2024.