Device Bench

Device test · Game input

Gamepad Tester

Connect a controller and press any button to see it live.

Connect a controller by USB or Bluetooth, click this page, then press a controller button. If it does not appear, check the connection and the troubleshooting advice below.

Statuswaiting Controller— Buttons— Axes— Driftnot run Deadzonenot run Rumble—

No diagnostic test has run yet.

Measure drift (5 s) samples every axis while your hands are off the sticks and compares the resting means with the ±0.05 and ±0.10 bands. Deadzone probe records a 1.5-second baseline, then watches a slow sweep for the nearest values beyond the resting noise. Rumble test asks for a half-second effect; you confirm whether you feel it.

Verdict

NOT RUN

—

Run Measure drift (5 s) above, with your hands off the sticks, for a verdict on stick drift.

Published thresholds: a resting mean within ±0.05 is PASS. Past ±0.05, at or inside ±0.10, is CHECK SETTINGS. Beyond ±0.10 is LIKELY FAULT. These describe the reported axis value, not the cause of an offset.

If it's flagged

    How this test works

    The board reads every controller the browser exposes through its Gamepad API. Buttons shows how many are pressed out of the number reported, and Axes is the number of axes reported; neither has to match the physical controls one for one. A button tile lights while pressed and stays marked after release, and the bar along its bottom shows its value from 0 to 1. An analogue row's peak is the highest value seen since the row appeared or you last pressed Reset. Axes run from −1 to +1 with zero in the middle, and an axis can be a stick, a trigger or another control. Pads that report the standard mapping get familiar button labels; other pads keep bare indices. Press each control and see which tile or row responds before you read the results.

    The drift sample reports each axis's mean resting value, peak-to-peak spread and furthest reading from zero. The deadzone probe compares a sweep with a 1.5-second resting baseline, whose noise band is the furthest any resting reading strayed from the baseline mean; the gap is how far beyond that band the nearest sampled step lands. Every figure is a reported axis value, so a gap shows where the numbers jump and never a physical distance on the stick. The vibration check calls playEffect for half a second and shows how the browser answered the request.

    The page polls with requestAnimationFrame, re-reading navigator.getGamepads() on every animation frame, so the sampling rate follows the browser's frame scheduling as well as the controller, and a background tab can be throttled. Keep this tab visible during a test. Polling stops when the page no longer sees a connected pad. Reset clears the test results, button marks and recorded peaks, and the live board keeps updating while a controller is connected.

    Running a controller drift test

    If a camera creeps or a character walks on its own, measure the resting values. Once the controller appears, put it on a flat surface and take your hands off the sticks. Press Measure drift (5 s) and wait out the five seconds. If you touch a stick, cancel and start again, because a small nudge can slip past the movement check. Read the mean and the spread together: the mean is where the axis rests, and the spread shows how much it wandered during the sample.

    The page calls a resting mean within ±0.05 settled, one past ±0.05 up to ±0.10 borderline, and one beyond ±0.10 drift. These are Device Bench's working bands. In a game, the deadzone decides what you notice: an offset smaller than the deadzone is ignored, and a larger one reaches the game as movement you never made. An axis that reports exactly 0.000 on every reading is left unclassified, because the controller or its driver may snap the center to zero before the browser sees it; judge that stick in a game with its deadzone turned down. Means more than 0.60 from zero are also left unclassified, since not every axis is a self-centering stick.

    Then run the Deadzone probe. Keep the controls still for the baseline, then move each stick slowly toward its limits and back, and pull the triggers too if they appear as axes. Press Finish probe when you are done, or it stops by itself after 30 seconds. Write your numbers down, change one thing at a time, and measure again with the same browser, connection and sweep speed. The stick drift guide covers what causes drift and how each fix works.

    Frequently asked questions

    Why doesn't my controller show up?
    Press a button on the controller first: browsers keep a gamepad hidden from a page until it sends input. If it still does not appear, check that it is paired or plugged in and recognized by your operating system, click once on this page, and close any game or remapping software, Steam included, that may be holding it. A controller that works in games can still be missing from one browser's Gamepad API, so try another browser if nothing else helps.
    What does the drift test measure, and how should I read the bands?
    It samples every axis for five seconds while your hands are off the sticks, then shows each axis's mean resting value, its peak-to-peak spread and the number of readings. A mean within ±0.05 of zero is settled: the axis rests close to center. Past ±0.05 up to ±0.10 is borderline, a small offset that a game's deadzone may still hide. Beyond ±0.10 is drift, and a game whose deadzone is smaller than the offset will see movement you never made. Axes that read exactly zero throughout, or rest more than 0.60 from zero, are left unclassified. If an axis that rests within 0.60 of zero varies by more than 0.25 during the sample, the page treats that as a touched stick and discards the sample. With fewer than 30 readings or a polling rate below 20 readings a second, the result is withheld.
    What does the deadzone probe measure?
    The gap in reported axis values just off center; the browser never sees physical stick travel. The probe takes a 1.5-second baseline with the sticks still, which gives each axis a resting value and a noise band. As you sweep slowly outward, it keeps the nearest reading that clears the noise band, and the gap is that distance minus the noise band. A large gap means the values jumped away from rest with nothing in between. A fast sweep can skip values too, so repeat slowly before you compare results. An axis with no reading beyond the noise band is reported as unmeasured, never as zero. Distinct values counts the different readings seen during the sweep, rounded to four decimal places, and stops counting at 2,000.
    Why do triggers appear as axes, or the name and button labels look different?
    The name, button count and axis count come from the browser's Gamepad API, and they vary with the controller, driver, connection and browser, so the same pad can show a different name in another browser. When the browser reports the standard mapping, this page adds familiar labels such as A, B, X and Y, with LT and RT at button indices 6 and 7. Those labels follow the mapping, so they may differ from the markings on your controller. Other mappings keep bare button indices and may report triggers as axes. Pressing each control in turn shows which element it drives.
    Why doesn't the vibration check work, and what does “accepted” mean?
    Rumble support depends on the browser, the controller and the connection. If Rumble test stays disabled while a controller is selected and no measurement is running, the browser offers this page no playEffect method for that controller, which says nothing about rumble in games. Trigger rumble also needs the controller to advertise that effect. The readout says “accepted” when the browser resolves the half-second request, and the message shows the status it returned, or “no status returned”. The API never reports whether the motors moved or how long they ran, so feel for the vibration yourself.

    Related tools