https://github.com/mart1nro/joycontrol
Emulate Nintendo Switch Controllers over Bluetooth
https://github.com/mart1nro/joycontrol
bluetooth emulated-controller joycon nintendo-switch pro-controller raspberry-pi
Last synced: about 1 month ago
JSON representation
Emulate Nintendo Switch Controllers over Bluetooth
- Host: GitHub
- URL: https://github.com/mart1nro/joycontrol
- Owner: mart1nro
- License: gpl-3.0
- Created: 2020-01-23T08:52:12.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2022-03-22T21:49:22.000Z (over 3 years ago)
- Last Synced: 2025-04-08T13:14:11.927Z (3 months ago)
- Topics: bluetooth, emulated-controller, joycon, nintendo-switch, pro-controller, raspberry-pi
- Language: Python
- Homepage:
- Size: 161 KB
- Stars: 1,273
- Watchers: 45
- Forks: 272
- Open Issues: 59
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# joycontrol
Emulate Nintendo Switch Controllers over Bluetooth.Tested on Ubuntu 19.10, and with Raspberry Pi 3B+ and 4B Raspbian GNU/Linux 10 (buster)
## Features
Emulation of JOYCON_R, JOYCON_L and PRO_CONTROLLER. Able to send:
- button commands
- stick state
- ~~nfc data~~ (removed, see [#80](https://github.com/mart1nro/joycontrol/issues/80))## Installation
- Install dependenciesUbuntu: Install the `dbus-python` and `libhidapi-hidraw0` packages
```bash
sudo apt install python3-dbus libhidapi-hidraw0
```Arch Linux Derivatives: Install the `hidapi` and `bluez-utils-compat`(AUR) packages
- Clone the repository and install the joycontrol package to get missing dependencies (Note: Controller script needs super user rights, so python packages must be installed as root). In the joycontrol folder run:
```bash
sudo pip3 install .
```
- Consider to disable the bluez "input" plugin, see [#8](https://github.com/mart1nro/joycontrol/issues/8)## Command line interface example
- Run the script
```bash
sudo python3 run_controller_cli.py PRO_CONTROLLER
```
This will create a PRO_CONTROLLER instance waiting for the Switch to connect.- Open the "Change Grip/Order" menu of the Switch
The Switch only pairs with new controllers in the "Change Grip/Order" menu.
Note: If you already connected an emulated controller once, you can use the reconnect option of the script (-r "\").
This does not require the "Change Grip/Order" menu to be opened. You can find out a paired mac address using the "bluetoothctl" system command.- After connecting, a command line interface is opened. Note: Press \ if you don't see a prompt.
Call "help" to see a list of available commands.
- If you call "test_buttons", the emulated controller automatically navigates to the "Test Controller Buttons" menu.
## Issues
- Some bluetooth adapters seem to cause disconnects for reasons unknown, try to use an usb adapter instead
- Incompatibility with Bluetooth "input" plugin requires a bluetooth restart, see [#8](https://github.com/mart1nro/joycontrol/issues/8)
- It seems like the Switch is slower processing incoming messages while in the "Change Grip/Order" menu.
This causes flooding of packets and makes pairing somewhat inconsistent.
Not sure yet what exactly a real controller does to prevent that.
A workaround is to use the reconnect option after a controller was paired once, so that
opening of the "Change Grip/Order" menu is not required.
- ...## Thanks
- Special thanks to https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering for reverse engineering of the joycon protocol
- Thanks to the growing number of contributers and users## Resources
[Nintendo_Switch_Reverse_Engineering](https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering)
[console_pairing_session](https://github.com/timmeh87/switchnotes/blob/master/console_pairing_session)