CEMU Gyro is a utility that converts gamepad analog stick movements into gyroscope data for CEMU (Wii U emulator). This enables motion controls in games like Splatoon, Mario Kart 8, and The Legend of Zelda: Breath of the Wild using a standard gamepad instead of a Wii U GamePad.
- Real-time conversion of analog stick input to gyroscope data
- DSU (cemuhook) protocol support for seamless CEMU integration
- Configurable mappings - map any stick axis to any gyro axis
- Hot-pluggable controllers - automatically detects connected/disconnected gamepads
- Cross-platform - works on Windows and Linux
- Customizable sensitivity and deadzone settings
- Multiple controller support
CEMU Gyro acts as a bridge between your gamepad and CEMU:
- Controller Input: Reads analog stick movements from your gamepad
- Processing: Converts stick movements to gyroscope rotation data
- DSU Protocol: Sends the gyro data to CEMU via the cemuhook DSU protocol
- Game Integration: CEMU receives the data and uses it for motion controls
Download Pre-built Binaries
- Go to the Releases page
- Download the appropriate binary for your system:
- Linux: cemu-gyro-linux-x64
- Windows: cemu-gyro-windows-x64.exe
- Make the binary executable (Linux only): chmod +x cemu-gyro-linux-x64
Requirements:
- Rust (latest stable)
- Git
Clone the repository: git clone https://github.com/wuild/cemu-gyro.git cd cemu-gyro
Build for your current platform: cargo build --release
The binary will be in target/release/
To build for multiple platforms:
Install cross:
cargo install cross
Build for both Linux and Windows: ./build-cross.sh
Binaries will be placed in the ./dist directory.
-
Configure CEMU for DSU Input
-
Open CEMU and go to Settings → Input Settings
-
Select your controller profile
-
Motion Source: Set to "DSU1" (or another DSU slot)
-
DSU IP: Set to 127.0.0.1 (localhost)
-
DSU Port: Set to 26760 (default)
-
Apply the settings
-
Configure Controller Input
Make sure your gamepad is properly configured in CEMU for regular controls (buttons, D-pad, etc.). The gyro functionality will supplement, not replace, your existing controller setup.
- Run CEMU Gyro
Linux: ./cemu-gyro-linux-x64
Windows: cemu-gyro-windows-x64.exe
- Launch Your Game
Start CEMU and load a game that supports motion controls. The gyro data should now work when you move the analog sticks.
Configuration
CEMU Gyro creates a gyro_config.json file on first run with default settings:
{ "sensitivity": 45.0, "deadzone": 0.15, "max_rate": 450.0, "mapping": { "x": { "stick": "Left", "axis": "Y", "invert": true }, "y": { "stick": "Right", "axis": "X", "invert": true }, "z": { "stick": "Left", "axis": "X", "invert": false } } }
- sensitivity: How responsive the gyro is to stick movement (default: 45.0)
- deadzone: Minimum stick movement to register (0.0-1.0, default: 0.15)
- max_rate: Maximum rotation rate in degrees/second (default: 450.0)
- mapping: Which gamepad stick/axis maps to which gyro axis
- Gyro X (pitch): Left stick Y-axis (inverted) - tilt forward/backward
- Gyro Y (yaw): Right stick X-axis (inverted) - turn left/right
- Gyro Z (roll): Left stick X-axis - lean left/right
- Use right stick for camera/aiming gyro controls
- Sensitivity: 30-50 works well for precise aiming
- Motion puzzles may require fine-tuning the deadzone
- Higher sensitivity (60-80) for quick camera movements
- Map both sticks if you want separate pitch/yaw control
- Lower deadzone (0.05-0.1) for precise aiming
- Moderate sensitivity (40-60) for steering
- Consider using left stick only for steering motion
- Higher deadzone (0.2+) to avoid accidental inputs
- Check DSU settings in CEMU Input Settings
- Verify port 26760 is not blocked by firewall
- Restart both CEMU Gyro and CEMU
- Check CEMU Gyro console output for connection messages
- Verify gamepad works in other applications
- Try reconnecting the controller
- Check if controller appears in system's game controller settings
- Some controllers may need specific drivers
- Adjust sensitivity in gyro_config.json
- Modify deadzone to ignore small movements
- Change max_rate to limit maximum rotation speed
- Consider different stick-to-gyro axis mappings
- Close unnecessary applications to free system resources
- Check if multiple DSU servers are running
- Ensure CEMU Gyro has sufficient CPU priority
- Consider lowering sensitivity to reduce processing overhead
CEMU Gyro automatically detects multiple controllers. Each controller's input contributes to the same gyro output, so you may want to use only one controller for motion input.
Clone and setup:
git clone https://github.com/wuild/cemu-gyro.git
cd cemu-gyro
Install dependencies (Linux):
sudo apt-get install libsdl2-dev
sudo dnf install sdl2-devel
cargo run
- src/main.rs - Main application loop and coordination
- src/game_controller.rs - SDL2 gamepad input handling
- src/dsu_server.rs - DSU protocol implementation
- src/gyro_processor.rs - Stick-to-gyro conversion logic
- src/config.rs - Configuration file handling
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
This project is open source. Check the repository for license details.
- Issues: Report bugs on the GitHub Issues page
- Discussions: Join conversations in GitHub Discussions
- CEMU Community: Get help in CEMU Discord/forums for emulator-specific issues
Note: This tool is designed specifically for CEMU and uses the cemuhook DSU protocol. It may work with other emulators that support DSU input, but CEMU is the primary target.