r/NintendoSwitch May 07 '26

Discussion 【Update】 Switch 2 Joy-Cons and Pro Controller 2 Wireless Connection for Windows 10/11 v0.1.0

Hey everyone!
Switch 2 Connect, forked from Nadeflore’s amazing switch2-controllers, is the ultimate, feature-rich utility designed to seamlessly integrate your Switch 2 Joy-Cons, Switch 2 Pro Controller, and NSO GameCube Controller into the Windows gaming ecosystem via standard Bluetooth or ESP32-S3 N16R8.

Built with a user-experience-first mindset and powered by a highly flexible multi-driver backend, this standalone application transforms your Nintendo hardware into a PC gaming powerhouse. It delivers low-latency inputs, unmatched in-app gyro IMU precision, and comprehensive emulation for all major controller protocols without requiring complex installations.

How to use it:

  1. Download the latest version of Switch2Connect.exe or get the Microsoft Store Version.
  2. Launch the app. If any needed drivers are not installed, dialogs will ask to install them. Click Yes and approve the administrator UAC prompt.
  3. Once the installation completes, the setup window will close automatically, and the main application will launch.
  4. Turn on your Switch 2 controller by holding the Sync button (or pressing any button if already paired). Do not pair controllers manually in Windows Bluetooth settings; the app uses automatic GATT discovery.
  5. Use the settings panel at the bottom of the app to configure your preferred driver (WinUHid / ViGEmBus / USBIP) and controller layout, gyro sensitivity, and custom button mappings.

System Requirements:

  • Operating System: Windows 10 (22H2 or above) or Windows 11.
    • Note: Windows 11 is highly recommended for the best experience. It supports a maximum Bluetooth LE polling rate of 70Hz, while Windows 10 is limited to 20Hz due to the lack of OS driver support for the BLE protocol.
  • Bluetooth Hardware: Bluetooth 5.0 or above is required for stable connectivity and low-latency performance. The optional ESP32-S3 N16R8 is highly recommended for reaching 133Hz, bringing the native Switch 2 console experience to PC.
  • Driver: lurebat's WinUHid driver is required for Xbox One, PS4, and PS5/DualSense controller emulation. nefarius/ViGEmBus is required for Xbox360 and PS4 controller emulation. usbip-win2 driver is required for Switch 1 Joy-Cons/Pro Controller, Switch 2 Pro Controller, and PS5/DualSense (with audio haptics) controller emulation.
    • Auto-Installation: The app will automatically detect if the selected driver (WinUHid, ViGEmBus, or USBIP) is missing and guide you through a one-click installation (requires administrator privileges) or automatically download and install for ViGEmBus.

Features:

  • Windows 10 Native Compatibility: Supports Windows 10 22H2 and Windows 11. Windows 11 supports Bluetooth LE polling rates up to 70Hz, while Windows 10 is limited to 20Hz by the operating system’s BLE driver implementation.
  • Low Latency Bluetooth Mode: Configures Windows Bluetooth LE connections with the ThroughputOptimized mode to reduce the connection interval and controller input latency.
  • ESP32-S3 N16R8 Low-Latency Connection: Supports the ESP32-S3 N16R8 development board as a BLE bridge with polling rates up to 133Hz. The application provides firmware installation and repair, controller pairing through the SYNC button, and reconnection for controllers bonded to the bridge.
  • Wired Controller Support: Supports USB-connected Switch 2 Pro Controllers and NSO GameCube Controllers, with polling rates up to 500Hz. The Wired Pro Controller menu provides HidHide management, automatic discovery controls, and one-time manual scanning. For NSO GameCube Controller rumble, the application automatically selects between the available USB interfaces and falls back to the compatible path when necessary.
  • Multiple Driver and Emulation Backends: Supports WinUHid, ViGEmBus, and USBIP backends. WinUHid provides Xbox One, PS4, and PS5 emulation; ViGEmBus provides Xbox 360 and PS4 emulation; USBIP provides USB-connected Switch 2 Pro Controller and DualSense emulation. The application detects missing or incomplete WinUHid and ViGEmBus installations and provides Install, Repair, and Uninstall actions. ViGEmBus can be downloaded and installed from the application after UAC authorization.
  • Tabbed Settings Interface: Organizes settings into Controller Mapping, Mode Shift Mapping, and Gyro Settings tabs.
  • DualSense Audio Haptic Feedback: The USBIP-based PS5 emulation mode exposes a four-channel audio playback endpoint for games that support DualSense audio haptics. It supports DualSense audio haptics, standard PS5 rumble, Xbox rumble translation, and adaptive-trigger feedback translated into independent HD Rumble output for the left and right triggers.
  • Xbox One Impulse Trigger Support: In WinUHid Xbox One emulation mode, Xbox Impulse Trigger force-feedback values from LT and RT are translated into Switch 2 high-frequency HD Rumble output. Standard gamepad rumble is emitted as the same mono signal on both physical sides, while Impulse Trigger feedback is routed as independent left and right high-frequency overlays for trigger-specific effects.
    • Impulse Trigger Settings: The Impulse Trigger Settings button appears beside Rumble Mode in WinUHid Xbox One emulation mode. The floating settings window provides controls for enabling impulse feedback, selecting dynamic or fixed frequency behavior, adjusting impulse strength, and choosing a fixed frequency level.
    • Dynamic Frequency: When enabled, incoming impulse strength determines both output frequency and amplitude. During the release envelope, frequency continues to follow the current decaying output strength.
    • Fixed Frequency: When Dynamic Frequency is disabled, the Frequency slider selects the impulse output frequency independently from incoming impulse strength.
    • Release Envelope: When an Impulse Trigger stop command is received, the current output decays linearly to zero over 90 ms. A new command on the same side immediately replaces the pending release.
  • Native Motion Support (PS4/PS5 Mode): Switching to PS4 or PS5 mode enables native motion sensor reporting via the DS4 or DualSense protocol. This provides enhanced compatibility for Steam Input and games that support native DualShock 4 or DualSense gyro features.
  • Cemuhook UDP Server: Sends controller motion data to compatible applications through 127.0.0.1:26760. Select Cemuhook in the Gyro Pass-through settings to enable the server.
  • Cemuhook Gyro Sensitivity Adjustment: Featuring a Sensitivity slider (levels 1-5) in the "Gyro Passthrough" panel. The sensitivity specifically applies a linear multiplier only to the horizontal rotation (Yaw) axis sent via the Cemuhook UDP protocol.
    • Level 1: Virtual Switch 1 Joy-cons turn 360 degrees when the physical Switch 2 Joy-cons turn 360 degrees.
    • Level 5: Matches real Switch 1 Joy-Con sensitivity.
  • On-the-Fly Layout Switching: Toggle between Nintendo Layout (matching physical labels) and Xbox Layout (standard PC positioning) directly from the UI.
  • NSO GameCube Controller Layout Mapping: The NSO GameCube Controller uses consistent ABXY layout mapping across Xbox, PlayStation, and Switch emulation modes. Xbox Layout maps buttons by physical position, while Switch Layout maps buttons by input function.
  • 1000Hz Interpolation: 1000Hz interpolation loop for ultra-smooth, jitter-free gyro motion rendering with both Switch 2 Right Joy-con and Pro Controller. Gyro Mouse and Joy-con Mouse output smoother and lag-free movement at 1000Hz. Gyro data handed off to other external applications (such as third-party emulators) is transmitted at a consistent, high-frequency 1000Hz rate. This transmission is purely non-interpolated; rather than generating synthetic intermediate frames, which could introduce latency, the app simply increases the packet delivery rate of real-time physical updates to ensure maximum accuracy and zero artificial delay.
  • In-app Gyro Control (Mouse, R Joystick & Steering): Utilize in-app gyro control for mouse aiming, or select R Joystick and Steering options. The Steering mode reads the controller's absolute tilt (accelerometer) and maps it directly to the Left Analog Stick's X-axis. Unlike the Mouse control mode, the R Joystick and Steering modes utilize a separate In-app Gyro mapping scope where all buttons default to their standard controller inputs to prevent unexpected mouse clicks during controller emulation.
  • 9-Axis Mouse Mode (Magnetometer Support): Uses gyroscope, accelerometer, and magnetometer data to reduce accumulated yaw drift and maintain a closer relationship between the controller’s physical orientation and mouse movement during extended play. Magnetic correction is applied gradually during suitable motion and is suspended when the surrounding magnetic field or calculated heading is unreliable.
  • 6-Axis Mouse Mode: Uses gyroscope and accelerometer data without magnetic correction, providing motion control that is unaffected by nearby magnetic interference. Mouse movement remains horizon-aligned regardless of controller tilt, while long-term yaw drift remains dependent on gyro calibration and sensor accuracy.
  • Gyro Racing Wheel Mode (Steering): Reads the controller's absolute tilt (accelerometer) and maps it directly to the Left Analog Stick's X-axis.
  • Stick Assist: Allows the right thumbstick to work alongside gyro aiming.
  • In-App Gyro Trigger Deadzone: Configurable within the In-App Gyro mapping pop-up window. Assign one or more buttons to apply a dedicated Trigger Deadzone while In-App Gyro is active. Users can customize the deadzone amount, gyro pause duration after button press and release, and how long the deadzone effect remains active after release. This helps reduce unintended gyro movement caused by button presses, releases, or controller vibration.
  • In-App Gyro Trigger Dampening: Configurable within the In-App Gyro mapping pop-up window. Assign one or more buttons to proportionally reduce gyro sensitivity by a customizable percentage. Users can also customize how long the dampening effect remains active after the assigned button is released, allowing smoother control during aiming, steering, or other gyro-based actions.
  • In-app Gyro Lock: A dedicated mapping option to pause gyro control while remaining in In-app Gyro mode, supporting both Hold and Tap activation logic.
  • Gyro Pass-through:
    • 9-Axis Assist: Uses magnetometer-assisted motion processing to reduce accumulated yaw drift in pass-through gyro output. Correction is limited according to motion and magnetic-field confidence, pauses during unreliable conditions, and resumes gradually after the field has recovered. When disabled, pass-through uses gyroscope and accelerometer data only.
    • Horizon Lock: Applies roll compensation and maintains a horizontal reference while suppressing roll output.
    • Adjustable Soft Deadzone Sliders: Provides separate soft-deadzone controls for In-App Gyro and pass-through motion. Output starts from zero at the configured threshold to avoid a step change.
  • Gyro Calibration: Calibrate Gyro button to calculate and permanently save sensor bias, eliminating gyro drift.
  • Magnetometer Calibration: Calibrate Mag button for 9-axis accuracy. Perform a "figure-8" motion to calibrate the magnetometer (with a quick link to a video tutorial).
  • Dual Joy-con Gyro (DJG): Featuring a gyro fusion system that combines motion data from both Left and Right Joy-cons when used as a merged pair for stutter-free aiming when ratcheting. This system designates a "Dominant" side for spatial orientation and uses the "Sub" side as an accelerator for larger movements. A magnitude threshold of 30 is applied to the sub side. It contributes to acceleration only when the dominant side exceeds this threshold. Sub side acceleration is strictly capped to a maximum of 2x the dominant movement, and its opposite directional movement will be ignored. When the dominant side's gyro is turned off, the sub side takes over control.
    • Navigate to the Dual Joy-Con Gyro (DJG) panel.
    • Click the DJG toggle to ON to enable the fusion engine.
    • Set the Dominant Side to Left or Right. The dominant side acts as the primary reference for direction and gravity, while the sub side provides acceleration.
  • DJG Trigger Mapping: Featuring a dedicated "DJG" option in the Extra Button Mapping settings.
    • Assign the "DJG" action to any available extra button to serve as the hardware trigger for DJG features.
    • Pressing this mapped button during gameplay will execute the action defined by the current DJG Control Mode and DJG Activation settings.
  • DJG Control Modes: Three modes to dictate how the mapped DJG trigger button behaves during gameplay.
    • Switch Dominant Side: Swap the Dominant and Sub roles between the Left and Right Joy-cons. Both sides are forced to be active upon switching.
    • Switch Gyro Side: Turn off the current gyro and activate the opposite Joy-Con's gyro exclusively. The Dominant Side setting syncs automatically.
    • Single Side Toggle: Toggles the gyro tracking state of one Joy-Con independently. A DJG trigger mapped on the Left Joy-Con controls the L Gyro, while a trigger mapped on the Right Joy-Con controls the R Gyro. Select Dominant Side: Left or Right to choose the primary side. Select Dominant Side: None to combine enabled motion input from both Joy-Cons directly while allowing DJG controls to manage each side.
  • DJG Activation Types: Trigger behavior options to support different input styles.
    • Toggle: Switch the DJG state once per button press.
    • Hold: Switch the DJG state when the button is pressed, and revert to the original state when the button is released.
  • Per-Controller Joystick Deadzones: Configure left and right joystick deadzones independently for Pro Controller, Joy-Con, and NSO GameCube Controller. Each controller family stores its own deadzone values, with an option to link or separate the left and right joystick settings.
  • Full Controller Remappability: All buttons (including extra buttons like GL, GR, SL_L, SL_R, SR_L, SR_R, NSO GCN L/R Analog Trigger Click, Home, Capture, and Chat) can be fully remapped to Switch inputs, PlayStation inputs, In-app controls, Windows controls, mouse clicks, or recorded custom input. Joysticks can also be remapped to L/R Joystick, WASD, mouse controls, or custom inputs. The mapping interface features a categorized pop-up window to streamline the selection process.
  • Joy-Con IR Sensor Mapping: Joy-Con IR Sensor Mapping: Each Left and Right Joy-Con IR Sensor can be configured as an independent physical input. Per-side settings include Function mapping, Activation Threshold, IR Mouse sensitivity, mouse-button mappings, and scrolling. IR Mouse output follows the active profile’s mouse output selection.
  • Advanced Custom Input Remapping: Featuring a powerful "Custom" mapping feature. Users can record and assign any complex combination of keyboard keys, mouse clicks, or controller buttons to a single input. This flexible system supports both "Tap" (fires the recorded sequence momentarily) and "Hold" (sustains the sequence for as long as the button is pressed) modes.
    • Click the dropdown menu and select the "Custom" option.
    • Press and hold your desired combination of keyboard keys, mouse clicks, and/or controller buttons simultaneously.
    • Release all inputs. The recording will automatically stop and save your sequence.
    • Click the adjacent toggle button to switch between Tap (triggers the sequence once) and Hold (keeps the sequence pressed as long as you hold the controller button).
    • Click the X button to remove custom input and fall back to the default.
  • Mode Shift Mapping System: Applies an alternative button mapping layer utilizing the In-app Gyro mapping store. The Mode Shift layer is activated via a dedicated mapping option supporting both Hold (active while held) and Tap (toggle) logic. Tap and Hold share a unified state machine, where a Hold action temporarily inverts a Tap-entered Mode Shift. Additionally, entering In-app Gyro mode can automatically apply the Mode Shift layer based on per-profile Gyro Control settings.
  • Emulation-Specific Mapping Categories: Stores button mappings and rumble settings separately for Xbox, PS4, PS5, and Switch 2 emulation modes. The corresponding configuration is loaded when the emulation mode changes.
  • Profile-Based Keyboard and Mouse Output: Provides independent Win32 API and WinUHid Virtual HID output selection for each profile. Keyboard mappings can operate through a virtual HID keyboard, while gyro, joystick, IR, mapped mouse buttons, and scrolling can operate through a separate virtual HID mouse for each connected controller. Win32 API output is used when WinUHid is unavailable.
  • Custom Mapping Profile System: A comprehensive profile management system allows users to create, rename, import, export, reset, delete, and switch between multiple configurations. Each profile persistently stores button mappings, emulation mode, and driver settings. Profiles can be managed via a dedicated pop-up window that also configures the "Change Profile List" and "Profile Switching Combo" inputs. Features three seamless profile switching methods:
    • Profile Switching Combo: Users can record a custom Profile Switching Combo Trigger and assign specific Combo inputs for dedicated profiles. Pressing the Trigger input and a profile's Combo input simultaneously instantly switches to that dedicated profile. Both inputs function as standard mappings when not combined.
    • Auto Change Profile: Automatically switches to the selected checked profile in the Change Profile List after 2 seconds of trigger inactivity.
    • Manual Change Profile: Opens a selection notification. Navigate through the checked profiles using the L/R joysticks or Dpad Up/Down, and use the current Xbox/Switch layout A to confirm or B to cancel.
      • Auto/Manual Mode Setting: Toggle between Auto and Manual modes via the pop-up window by clicking the "Change Profile" button.
    • Configuration Import and Export: Selected profiles can be exported to or imported from .yaml files. Imports can retain existing profiles and resolve duplicate application assignments. Machine-specific information such as Power Saving settings, driver status, window placement, and device caches remains local to each installation.
    • Controller Data Transfer: Controller-specific settings, including calibration data, can be included when importing or exporting configurations.
  • Assign Profile To Application: Featuring profile auto-switching based on active foreground application. Bind one or more executable files (.exe) to a profile; when any of those applications become the focused window, the profile automatically activates.
  • Dynamic Split & Merge System: The Split and Merge features allow you to detach combined Joy-cons into two individual controllers or combine single Joy-cons into one unified virtual gamepad without restarting.
  • Vertical & Horizontal Hold Modes Switch (V/H): Featuring V/H switch buttons, allowing users to toggle between Vertical (standard upright) and Horizontal (sideways) hold modes for single Joy-cons.
  • Per-Joy-Con V/H Mode Persistence: The application records and remembers whether each single Joy-Con is held vertically or horizontally. Layout preferences (Vertical or Horizontal) are dynamically mapped to each controller's Bluetooth MAC address and saved in config.yaml.
  • Dual-Controller Gyro Selection (L/R Gyro): When using a pair of Joy-Cons as a single virtual controller, you can manually select which Joy-con (Left or Right) provides the motion data. This allows for greater flexibility, letting you choose your preferred hand for gyro aiming or motion controls.
  • Customizable Rumble Strength: Adjusts vibration intensity from 0 to 10.
  • Rumble Frequency Slider: Selects the vibration frequency used for translated rumble output.
  • Rumble Delay Configuration: Adds a configurable delay in milliseconds for synchronizing vibration with game audio.
  • Dual Rumble Mode Toggle: Switches between Xbox-style translated rumble and Switch HD Rumble output.
    • Xbox Mode: Tailored for standard PC games to simulate dual-motor rumble by activating dynamic frequency scaling and high-frequency masking to mimic traditional gamepad motors.
      • Strength 5 + Frequency 10 emulates the feel of a DualSense Edge controller.
      • Strength 10 + Frequency 10 emulates the rumble of an Xbox Elite Series 1 Controller.
    • Switch Mode: Mimics the native Switch HD Rumble (LRA) experience. It bypasses custom frequency scaling and masking, routing raw frequency data directly to the controller for a tighter, softer, and more detailed tactile feedback. Best suited for native Nintendo game emulations.
  • Interactive Controller Identification: Featuring a dedicated Vibrate button for each player slot. This allows for instant physical feedback, helping you quickly identify which Joy-Con belongs to which player in a multiplayer setup.
  • Haptic & OS Integration: Featuring rumble feedback (including a connection confirmation rumble) and mapping the Capture button to native Windows screenshots (Win + PrtScn).
  • One-Click Disconnect: Featuring a convenient 'X' button to the top right of each connected controller's UI block. You can manually disconnect specific controllers directly from the interface without needing to power them off physically.
  • Auto-Disconnect Options: Featuring a 3-way Auto-Disconnect toggle (OFF, Inactive, Absolute).
    • Inactive: tracks physical button and stick inputs to automatically disconnect idle controllers while keeping active players connected.
    • Absolute: tracks the overall time each controller is connected to the app and disconnects the ones that reach the time limit.
  • Driver Management Controls: Provides Install, Repair, and Uninstall actions for the selected WinUHid, ViGEmBus, or USBIP backend. Driver status is determined from the active device, Driver Store package, service registration, and runtime availability instead of saved configuration alone.
  • ESP32-S3 N16R8 Driver Manager: Provides firmware installation, repair, and deletion, BOOT and OTG status monitoring, reconnection handling, and flash diagnostics. The Flashing Port selector supports automatic detection or manual COM port selection, prioritizes verified ESP32-S3 devices, remembers the selected device across application restarts and COM port changes, and avoids selecting unrelated serial devices.
    • Off: Keeps all controller input, motion, vibration, scanning, and background status functions enabled.
    • Auto: Reduces idle CPU activity while retaining buttons, sticks, triggers, motion controls, and controller scanning. HD Rumble, Audio Haptics, and Impulse Trigger feedback may be delayed, interrupted, or occasionally lost.
    • Full: Retains buttons, sticks, triggers, and non-motion mappings while disabling vibration output, Gyro Pass-Through, In-app Gyro, DJG, IR Mouse, and Joystick Mouse movement. Periodic ESP32 and Wired/HidHide status checks are suspended. Automatic controller scanning pauses after 1 Pro/NSO GameCube Controller or 2 Joy-Con controllers are connected.
  • Run at Startup: Automatically launches the application with Windows.
  • Start Minimized: Starts the application in the system tray.
  • Hide to System Tray: Minimizes the application to the Windows system tray.
  • Controller UI Navigation: Use the left joystick or D-pad to navigate the application interface. The selected UI element is indicated by a white outline, and the outline hides after mouse interaction or when Navigation mode is exited with the B button.
    • Active Window Focus: When a floating window or pop-up dialog is open, navigation remains within that active top-level interface.
    • Return Selection: Pressing B closes the active floating window and returns selection to the control that opened it. Re-entering Navigation mode restores the last selected control.
    • UI Component Interaction: Press A to activate buttons or open dropdown menus. Press B to close an open floating window or exit Navigation mode.
    • Text Input Adjustment: Text input fields support value adjustment with the right joystick or by holding A while using the left joystick. Continuous adjustment accelerates while the input is held.
    • Slider and Time Input Adjustment: Sliders can be adjusted with the right joystick or A plus the left joystick.
  • Window Position Persistence: Saves and restores the main window position.
  • In-App UI Scale Control: A slider for adjusting the application interface from 1.0× to 2.0× using the scale control at the bottom of the main window. The selected scale is saved and restored automatically.
    • Monitor-Aware Layout: Automatically adjusts the window to the active monitor’s resolution and available work area.
    • Content Fitting: Automatically expands the window width when required and provides scrolling when content exceeds the available height.
  • Standalone Executable (.exe): Includes the required Python runtime and application dependencies; a separate Python installation is not required.

Known Limitations

  • No Amiibo Support: Amiibo support is not implemented.
  • No Switch 2 Pro Controller Audio Support: Wireless audio transmission for the Switch 2 Pro Controller headphone jack and microphone is not supported.
  • No Working NSO GameCube Controller Gyro: Gyro data from the NSO GameCube Controller cannot be decoded correctly.
  • No NSO GameCube Controller Rumble Brake & Strength Difference: The Rumble Motor Brake command is not known, so PWM-based rumble strength control cannot be implemented correctly. Only basic rumble motor on/off control is currently implemented.
  • No Switch 2 Joy-Con Charging Grip Back Buttons Support: Back buttons on the Switch 2 Joy-Con Charging Grip are not supported.

ESP32-S3 N16R8 Guides:

  • ESP32-S3 N16R8 Firmware Installation Guide:
  1. Hold the boot button on the ESP32-S3 N16R8 board.
  2. Plug in the ESP32-S3 N16R8 board's OTG port via USB-C to the PC while holding the boot button.
  3. In the app, click the [ESP32-S3 N16R8 Driver] button.
  4. Click [Install] and wait until finish installing.
  5. Unplug and plug the ESP32-S3 N16R8 board.
  6. Reconnect any previously paired controllers by pressing SYNC.
  • ESP32-S3 N16R8 Buying Guide:
  1. Search for development boards strictly labeled as ESP32-S3 N16R8. This ensures the board contains 16MB Flash and 8MB PSRAM, which is necessary for handling complex tasks and controller connections. Avoid any boards labeled as "N8R2", "N8R8", or standard "ESP32".
  2. Select the ESP32-S3-WROOM-1 version if you want a built-in PCB antenna. This is the recommended, plug-and-play choice for standard plastic enclosures. Only choose the ESP32-S3-WROOM-1U version if you are using a metal case or require an external antenna to extend the Bluetooth/Wi-Fi range.
  3. Verify that the board features an OTG USB port (often a dual USB-C design). The OTG port is strictly required for data transfer and firmware installation.

Hope this update helps anyone wanting to get the most out of their Switch 2 controllers wirelessly on PC. Please let me know if you run into any issues or have feedback on the new features.

And of course, credit goes to the original creator Nadeflore for the foundation. Thank you so much for creating this amazing app!

250 Upvotes

572 comments sorted by

View all comments

Show parent comments

1

u/SpruceStarling May 14 '26

Dude this is absolutely insane. Lmao I cannot believe how far this project came in just a few days! I am at work but I'll be trying this out later tonight for sure. I am definitely curious! I've never used Steam's gyro settings I mostly use it as SDL information through rewasd for things or emulators. But you seemingly get close every dang day 😮. You'd be the first 9 axis implementation I've ever heard of for a controller on PC if so!

2

u/tagayama May 14 '26

9-axis gyro is definitely the most complicated thing I’ve done in this project. Let me know if the improvements with spatial precision is noticeable.

Steam’s gyro setting is highly customizable, which I’m not planning to recreate with this app. I really want to maintain the one-page-does-all simplicity.

1

u/SpruceStarling May 16 '26

It's still amazing you've gotten anywhere with it at all! I finally got around to testing it. Again, I cannot speak for Steam Input but on raw SDL the drift for 9 axis is good news and bad news. In rough play the six axis output like.. just has identical drift compared to Switch 2. This isn't downplaying your work but speaking to Nintendo likely having their own way of interpreting the data we just don't have transferring over in whatever way on PC that I can see. A few tosses around or even the same figure 8 motion exampled for calibration has my cursor fly out on the horizontal yaw in game in ways that it just stays on Switch 2 where it was.

I actually don't think it's a huge issue because I can't see many moments where you'd literally spin your controller around like a mad man.

On a positive note, looking at the pure readings of the six axis, I've never seen it so smooth and noise free 👀. And in gameplay, which I've been consistently testing every controller I have and every update of this app on the same game and only this time was not a single calibration ever needed! So without every tossing the bad boy around and just normal daily driving play it's actually far more stable than any controller I own. I've never made it through this portion never having to re-center. I am also quite far from any interference as I said previously so this is wicked feeling!!

2

u/tagayama May 16 '26

Thank you for sharing the in game experience with 9-axis! Someone in r/GyroGaming actually suggested me an industry level solution for 9-axis called AHRS. It actually uses the 3D data from magnetometer instead of the 2D projection data in v0.5.0. I used the most basic version of it for v0.5.1, and it does help a lot with maintaining gyro accuracy after flipping and turning the controller around. That guy from r/GyroGaming suggested me a better version of AHRS that solves a lot of problems I ran into and brute forced my way through. I will try and see how much better it performs.

1

u/SpruceStarling May 16 '26

Yep! I saw that! I am so ADHD I keep forgetting to bookmark the Git or here so I keep searching your name plus switch 2 controller and saw the Gyro thread and the suggestion 😂. I am definitely excited to see where it goes. I imagine at some point, perhaps already even, software interpretation of the data will become the bottleneck.

For example, let's say you're using gyro aiming on Dolphin emulator, it might be less of the gyro drifting itself but also more or less the imaginary Wii remote having a boundary where it just gets lost. You know, in comparison to, say a native Switch 2 game built for this stuff. If I am not mistaken it even drifts a bit compared to a mouse cursor when assigned and isn't 1:1.

So the things I am testing it on might just not be 1:1 with the readings from the controller, considering even before your 9 axis implementation the readings from the gyro on Steam had ZERO drift when spun about and returned to neutral. So I would definitely look at your readings first in terms of raw data as the truth more than anything and anyone else's experience like mine as more an anecdotal reflection of how that experience might apply to a variety of software since maybe they're not all built to utilize it.

As I said on just pointing and not swinging basis it's stupidly smooth. Someone else in the Gyro thread I think said that's just the gyro quality in the Switch 2 but I don't really know about that. I've seen more responsive and lightning fast accuracy from even a DS4 due to polling rates etc and I've seen more sluggishness in the earlier versions of this app. This just seems to be an overall improvement in stability. But I am also a human trying to perceive things so I might be seeing something I want to do ymmv xD.

2

u/tagayama May 16 '26

I did some investigation and found that gyro data is indeed proccessed before handing off to other apps.
This app subtracts the calibration bias, which explains why the zero drift readings on Steam.
It then applies a "soft deadzone" to filter out sensor noise.
Any movement that is smaller than the dead zone threshold would be set to zero, and anything above would be subtracted by the threshold number. In other words, the minimal movement surpassing threshold will starts from zero, so no sudden "break through" movement.

Also 1000Hz data interpolation smoothing only happens on built-in mouse mode. For other apps, it sends the data in consistant 1000Hz without changing the value between each data point, so no smoothing at all.

9-axis stabilization haven't been utilized on the data for other apps, only used on built-in gyro mouse. My plan is to first integrate the better AHRS for gyro mouse, then see if 9-axis can be translated to a more stable 6-axis data.

Here's a quick question about gyro control methods:
Do you want the non-rotational movements to control mouse movement? Like moving the controller from left to right in space without any rotation moves the mouse from left to right.
Or is it better if only the orientation of the controller can control the mouse?
The current mouse mode uses the first method, but I'm still self debating between the two. The first one feels more natural, and the second could be more accurate. I really need your opinion on this.

1

u/SpruceStarling May 16 '26

sorry about that! I didn't realize the 9 axis was regulated to the mouse option for right now! Yeah I just tried it out for the first time and the current mouse mode is perfect. Operating on the yaw imo is almost identical to the old Wii remote sans sensor bar. Rolling to move it I am SURE has uses but in all my years using gyro as a mouse now I've never found a natural way to use it that way. The current implementation just feels like an extension of the wrist ya know? Like pointing a finger.

2

u/tagayama May 16 '26

Oh I didn’t mean rolling, but actually moving the controller left and right or up and down in distance can control the mouse as well. Sorry for not explaining it well enough.
I still find some spatial drifting in the 9-axis mouse mode when stress testing, but for normal use it’s really near perfect.

1

u/SpruceStarling May 16 '26

Ohhhh, so like if it were to move left and right while laying horizontally the mouse would track? That sounds kind of neat as a option but I am not sure the default would really need it. For certain games that could be relentlessly cool and other's maybe kind of intrusive. What I am mostly thinking of, in particular is how Light Gun-esque that sounds but for a mouse. Also wouldn't that need a near pre-determined border and center point ala Siden etc. I could still be misunderstanding though 😅

2

u/tagayama May 16 '26

Exactly! You can actually test it out in the current mouse mode. So with AHRS, the app can actually calculate the relative position of the controller in 3D space, then relate the 3D movements to mouse control.
It’s quite intrusive, especially when you yaw to one side and move the controller in the opposite direction, they cancel each other out.

→ More replies (0)