What if the GameCube Keyboard Controller worked with Animal Crossing...?
It started out as a "quick, simple project", then quickly turned into seven quick simple projects.
Demonstration video (on YouTube)
Typing at the speed of TAS
Typing in Animal Crossing (GCN) is painfully slow.
Or, at least.. it was. Not anymore.
Pro Gamer WPM (unassisted): TBD
Tool-assisted WPM: Also TBD
Custom Keycaps
Compose digital diary entries in style with this set of 81 custom, 3D printed keycaps that map perfectly to Animal Crossing's in-game character set.
See the separate pico-crossing-keycaps repository for FreeCAD project files and OBJ exports.
Infinite Playlist
Cycle through your favorite Town Tunes without having to futz about with e-Reader cards.
All Items Unlocked
Type the name of (almost) any item, and this little raccoon-looking guy will give it to you for free.
Usage: press Shift + Alt + 🗝️ , then type the name of any compatible item
Put any Image in the Game
Convert any image to display in Animal Crossing's pattern editor. The script automatically sets up a Python environment and handles all dependencies.
Basic usage:
./convert_image.sh monalisa.jpg
See image_tools/README.md for advanced usage.
Put any Video in the Game (if you're patient)
Convert videos to animated sequences in Animal Crossing (requires ffmpeg for video processing).
Basic usage:
./convert_video.sh rickroll.mp4
See image_tools/README.md for advanced usage.
A Playable Version of Snake... in Animal Crossing!?
It's more likely than you think.
Usage: press the S key while a design (image or video) is being entered.
Building the Hardware
You'll need:
a Raspberry Pi Pico (or Pi Pico W)
two GameCube controller extension cables
two 1k Ω resistors (1/4W or higher)
one 1N5817 Schottky diode (protects GameCube from USB 5V backfeeding during flashing/debugging)
Assembly:
Cut both extension cables and strip back the outer sleeve to reveal the 5 inner wires. You'll need two female plugs and one male plug. Important: Verify your extension cable pinouts before soldering! The colors in the provided schematic correspond to the "High Quality" labeled cables I used, but colors may vary between manufacturers or even batches. Solder the components to the Pi according to the schematic: Install the Schottky diode between the male plug's 5V line and the Pi's VSYS pin (cathode toward VSYS), then connect the 5V line from the male plug directly to the 5V lines on both of the female plugs.
Install pull-up resistors connecting the Pi's 3.3V supply to GPIO 3 and GPIO 4 on the Pi.
Connect the 3.3V line from the male plug directly to the 3.3v lines on both of the female plugs (without connecting it to the Pi).
Connect GND(POW) from the male plug to PIN 38 on the Pi and the GND(POW) lines on both of the female plugs.
Connect GND(SIG) from the male plug to PIN 3 on the Pi and the GND(SIG) lines on both of the female plugs.
Connect the DATA line from the male plug to GPIO 2 on the Pi. Connect the DATA lines from the female plugs to GPIO3 and GPIO4 on the Pi.
Prerequisites
System Dependencies
Python 3 - Required for image/video conversion tools
- Required for image/video conversion tools ffmpeg - Required for video conversion ( brew install ffmpeg on macOS)
- Required for video conversion ( on macOS) picotool - Required for flashing firmware to Pico
- Required for flashing firmware to Pico Raspberry Pi Pico SDK - Set up according to official documentation
Installing picotool
macOS:
brew install picotool
Ubuntu/Debian:
sudo apt install picotool
Building the Software
This project includes several build scripts for different workflows:
Quick Build, Flash, and Monitor
For the fastest development cycle:
./buildflashmonitor.sh
This script runs build → flash → monitor in sequence. Great for testing changes.
Individual Build Scripts
Build only:
./build.sh
Cleans and builds the project, generating the .uf2 firmware file.
Flash only:
./flash.sh
Attempts to force the Pico into BOOTSEL mode and flash the firmware (no need to manually hold the BOOTSEL button).
Monitor serial output:
./monitor.sh
Opens a serial connection to view debug output from the Pico.
Manual Flashing Fallback
If the automatic flashing fails:
Hold the BOOTSEL button while plugging in your Pico Copy the generated .uf2 file from the build/ directory to the RPI-RP2 volume
Licenses and Acknowledgements
This project incorporates code from the following open source repositories:
joybus.hpp - GameCube controller communication interface (used directly)
- GameCube controller communication interface (used directly) joybus.pio - PIO program for GameCube Joybus protocol (used directly)
- PIO program for GameCube Joybus protocol (used directly) joybus.cpp - Joybus communication implementation (adapted with modifications)
- Joybus communication implementation (adapted with modifications) gcReport.hpp - GameCube controller report structure (used directly)
controller.pio - PIO program for reading controller input (used directly)
Core SDK libraries and build system
pico_sdk_import.cmake - SDK integration helper
Other Sources
The Nook Codes defined in nookCodes.hpp are sourced from Nookipedia's Animal Crossing (GCN) Data Spreadsheet (except the code for the Froggy Chair , which I generated using Nookipedia's Secret Code Generator).
License
This project is licensed under GPLv3, which ensures compatibility with all incorporated dependencies.
Disclaimer
If you work for Nintendo, Please Understand:
No emulation was used in the making of this project, and no game binaries were distributed or modified in the slightest. All footage was captured on unmodified hardware running unmodified, authentic software.