Manual / Guide · 2025
DIY Adaptive Game Controllers (Adafruit Learning Guide)
The Xbox Adaptive Controller 3.5 mm switch convention, used for the pedal jack. PDF export last updated 2025-08-20.
- adaptive controller
- accessibility
- 3.5 mm switch
Manual / Guide · 2025
The Xbox Adaptive Controller 3.5 mm switch convention, used for the pedal jack. PDF export last updated 2025-08-20.
DIY Adaptive Game Controllers Created by John Park https://learn.adafruit.com/diy-adaptive-game-controllers Last updated on 2025-08-20 11:48:55 AM EDT ©Adafruit Industries Page 1 of 45 Table of Contents Overview 3 • Assistive Technology Resources • Parts • Tools XAC Standards 6 • Digital Input Standard • Analog Input Standard Interfacing Buttons and Switches 11 • Terminal Block Jack to Cable Plug • Switch to Terminal Block • Quick Connect Wire to Terminal • Quick Connect Crimp Connectors to Switch • 3.5mm Cable • Box Prep • Add Switch and Wire • Light Touch Limit Switch • Foot Pedal • Hefty On Off Switch • Soldered Wire Connections Analog Inputs 31 • Wiring • Add Terminal Adapter • USB Inputs Adaptive Joysticks 39 • Assembly • Wiring • Cable Wiring • Plug In Joystick • CircuitPython Usage • Use It ©Adafruit Industries Page 2 of 45 Overview It's never been easier to create adaptive controls to play video games. For gamers with particular needs not met by standard gaming controllers, the Microsoft Xbox Adaptive Controller (https://adafru.it/DB5) (XAC) is a fantastic option for managing alternative inputs. In this guide, we'll learn how to build our own interconnections between large buttons, foot pedals, analog joysticks, and limit switches and the XAC's button inputs. XAC is designed to work with the Xbox One series of consoles and Windows 10. However, many people have sucessfully used it on other systems by adding a wireless controller adapter to translate between standards. The basic switch inputs in this guide do not require any soldering, but as you build more complex XAC projects, some soldering skills can come in handy! ©Adafruit Industries Page 3 of 45 Assistive Technology Resources There are many great resources out there for people to learn more about AT for gamers. Here are a few: • Able Gamers (https://adafru.it/DB6) • Cerebral Palsy Foundation (https://adafru.it/DB7) • Special Effect (https://adafru.it/DB8) • Warfighter Engaged (https://adafru.it/DB9) If you're interested in helping build adaptive controllers, AT Makers (https://adafru.it/ udY) can help you get connected with people in your areas. They've also got great guides on building adaptive connectors (https://adafru.it/DBa) and switch testers (https://adafru.it/DBa). The support of Bill Binko of AT Makers, and Bryce Johnson of Microsoft Devices have been incredibly helpful in creating this guide! Thanks guys! If you're just learning about XAC, here are a couple of good videos to watch: Parts You'll need to a Microsoft Xbox Adaptive Controller as well as an Xbox One or Window's 10 PC to use this guide. Additionally, here are some of the switches, buttons, joysticks, pedals, wiring, connectors, and supplies you can use to create your own inputs: 1 x Massive Arcade Button with LED https://www.adafruit.com/product/1185 1 x Large Arcade Button with LED https://www.adafruit.com/product/1192 1 x Mini Analog Joystick https://www.adafruit.com/product/3102 1 x Foot switch https://www.adafruit.com/product/423 1 x Small Arcade Joystick https://www.adafruit.com/product/480 1 x Magnetic contact switch https://www.adafruit.com/product/375 100mm Red 60mm White 10K Potentiometers momentary button, bare wires with four switches door sensor/reed switch ©Adafruit Industries Page 4 of 45 1 x Micro Switch w/Wire https://www.adafruit.com/product/820 1 x Hefty On-Off Pushbutton Power Switch https://www.adafruit.com/product/3991 1 x 3.5mm (1/8") Stereo Audio Jack Terminal Block https://www.adafruit.com/product/2791 1 x 3.5mm (1/8") Stereo Audio Plug Terminal Block https://www.adafruit.com/product/2790 Three Terminals It's hefty TRS TRS 1 x 3.5mm (1/8") 4-Pole (TRRS) Audio Plug Terminal https://www.adafruit.com/product/2914 Block TRRS 1 x Right-Angle 3.5mm Stereo Plug to Pigtail Cable https://www.adafruit.com/product/1700 TRS 1 x Arcade Button and Switch Quick-Connect Wires https://www.adafruit.com/product/3838 - 0.187" 10 pack 1 x Arcade Button and Switch Quick-Connect Wires https://www.adafruit.com/product/3838 - 0.25" (10-pack) 10 pack 1 x Arcade Button Quick-Connect Wire Pairs 0.11" (10 pack) https://www.adafruit.com/product/1152 10 pack You can also have a look at our many, many other buttons (https://adafru.it/DBb)! Tools Here are some useful tools for use when making adaptive tech inputs: ©Adafruit Industries Page 5 of 45 Digital Multimeter - Model 9205B+ This massive multimeter has everything but the kitchen sink included. It's a great addition to any workbench or toolbox. It's low cost, simple to use, and has a big clear... https://www.adafruit.com/product/2034 Precision screwdriver set (6 pieces) Break seals! Void warranties! With this handy screwdriver set at your hands, all hardware you touch will open up and reveal their secret innards.This set contains 6... https://www.adafruit.com/product/424 Hakko Professional Quality 20-30 AWG Wire Strippers These are the finest wire strippers we have used, and if you have to do a lot of wiring, you will agree! They have soft rounded grips - very comfortable to use, and precision ground... https://www.adafruit.com/product/527 XAC Standards If you're new to the Xbox Adaptive Controller, have a look at these resources: • All about the Xbox Adaptive Controller (https://adafru.it/DB1) • Getting to know the Xbox Adaptive Controller (https://adafru.it/DB2) • External devices with XAC (https://adafru.it/DB3) • FAQ (https://adafru.it/DB4) ©Adafruit Industries Page 6 of 45 If you need to dive into deeper details, check out these Xbox Adaptive Controller Input Specifications (https://adafru.it/Eal). These are incredibly helpful in detailing the pinouts and voltages for all of the ports, particularly the analog ports for joystick control. The XAC works just like a standard Xbox controller in terms of wireless connection with the Xbox, however it only sports a few of the typical buttons -- D-pad (6) , A button, B button, menu (3), Xbox button (1), menu button (3), and view button (2). All of the missing inputs, along with the ones already physically present, can be controlled by external devices plugged into the 3.5mm jacks along the back of the XAC. For example, you can see here that the Y, X, B, and A buttons are all represented as 3.5mm jacks, where you can plug in four larger buttons if needed. ©Adafruit Industries Page 7 of 45 Thanks to the Copilot Mode, you can use a standard Xbox controller in tandem with the XAC, so two users can work together as a single player, or one use can use both if that suits their needs. Next, we'll look at the standards used with these jacks so you can interface your own digital buttons, switches, and analog devices with them. The XAC can also use HID joystick devices plugged into the USB ports on either side -- we won't be covering this in this guide. Digital Input Standard The 3.5mm inputs jacks on the XAC allow you to connect any type of switch that can open and close a circuit between the internal Ground and a 1.8V pin that is internally read on the device. These pins have internal-pull up resistors, so you can think of them just like you do any switch used in a microcontroller project. These jacks are a standard stereo audio-type jack, and have Tip, Ring, Sleeve (TRS) connections. However, only Tip and Sleeve contacts are used. ©Adafruit Industries Page 8 of 45 So, in order to press a button on a digital input port, we simply need to ground the tip to the sleeve. Represented another way, we can see that the Tip and Sleeve wires coming from a typical stereo cable can be shorted via a switch or button to create the connection that signal a button press. ©Adafruit Industries Page 9 of 45 Analog Input Standard There are four jacks on the XAC that can accept variable resistance analog inputs, such as potentiometers -- X1, X2, LT, and RT. These map to the left thumb stick, right thumb stick, left trigger, and right trigger. In order to read dual potentiometers and provide ground and reference voltages, these ports require the use of a four-pole TRRS plug. This is what is commonly found on mobile phone earbuds that include a microphone. This is how the connections are used: • Tip = wiper output from potentiometer 1 for X axis • Ring 1 = wiper output from potentiometer 2 for Y axis ©Adafruit Industries Page 10 of 45 • Ring 2 = Ground • Sleeve = 3.3V reference voltage Here you can see two potentiometers from a typical analog joystick connected to the proper poles of the TRRS jack. Note, one potentiometer is inverted to provide the proper orientation of signal values as used on most joysticks. This isn't of too much concern however, as values can be remapped in software configuration on the game console. Now that we understand how the inputs work, let's wire up some components! Interfacing Buttons and Switches Interfacing buttons and switches to the XAC's 3.5mm digital input jacks is incredibly easy to do! We only need a way to connect a given button or switch to a 3.5mm mono or stereo cable. Terminal Block Jack to Cable Plug The simplest way to connect most buttons and switches is through a 3.5mm stereo audio jack terminal block. Once you connect it to your button, then you can simply run any 3.5mm stereo cable between it and the chosen port on the XAC. ©Adafruit Industries Page 11 of 45 Here we see the connections needed: • N.O. switch to Adapter L (which will contact plug Tip) • Common switch to Adapter Gnd (which will contact plug Sleeve) Optionally, to keep compliance with other adaptive technology devices other than the XAC that use 3.5mm TR mono jacks, it's a good idea to short the Adapter R contact to GND by running a short jumper wire from the R to the GND terminal on the adapter. This isn't necessary for the XAC, but good practice. ©Adafruit Industries Page 12 of 45 Switch to Terminal Block Here's an example of connecting a large arcade button to the terminal block, using quick connect wires. This is a nice, secure connection that requires no soldering. ©Adafruit Industries Page 13 of 45 Quick Connect Wire to Terminal Use a small screwdriver to bend in the two metal crimp ends a little bit so they can be pulled from the plastic connector housing, we won't be using it. Unscrew the terminal block screws to open the terminals fully, then insert the blue wire into the GND terminal and the white wire into the L terminal. Screw down the terminal screws moderately tight. ©Adafruit Industries Page 14 of 45 ©Adafruit Industries Page 15 of 45 Quick Connect Crimp Connectors to Switch Now, slide the white wire crimp terminal connector to the N.O. spade terminal of the switch. Connect the blue wire to the Common connector ©Adafruit Industries Page 16 of 45 3.5mm Cable Plug one end of a TRS 3.5mm stereo cable into the adapter This button is now ready to be plugged into any of the digital input ports on the XAC and used just like any Xbox controller button! We'll give it a nice home by re-using a cardboard box as a button housing. ©Adafruit Industries Page 17 of 45 ©Adafruit Industries Page 18 of 45 Box Prep Decide where the button will go, then trace the inside of the plastic button shaft nut. Cut out the hole with a hobby knife. Insert the button and push down a bit to make marks with the registration shafts, then poke those holes out with a small screwdriver. Insert the button, then thread on the nut from the inside of the box. ©Adafruit Industries Page 19 of 45 ©Adafruit Industries Page 20 of 45 Add Switch and Wire Place the switch into the shaft and twist to lock into place. Add a small hole in the back of the box for the cable. Plug the cable in through the box and into the adapter. Add strain relief with a zip tie. ©Adafruit Industries Page 21 of 45 ©Adafruit Industries Page 22 of 45 The button and box are ready to go, time to plug it in and test it out! Here, we're plugging it in to the X button jack on the XAC. ©Adafruit Industries Page 23 of 45 You can use this method with any type of switch or button. Here are a few other examples. Light Touch Limit Switch The switch shown takes very little pressure to activate, which may make it good for adapting to chin or mouth activation (with appropriate adaptation) as well as light pressure activation from other sources. ©Adafruit Industries Page 24 of 45 Foot Pedal The Adafruit foot pedal has a good activation switch inside and can be easily wired to a TRS plug. ©Adafruit Industries Page 25 of 45 To use the footswitch as a normally open, momentary switch, simply connect the white wire to the Adapter GND terminal and the red wire to Adapter L. You can leave the black wire unconnected. If you have a reason to use it as normally closed, so that a button is pressed constantly unless you tap the switch, use the black wire in the L terminal and ignore the red wire. Hefty On Off Switch This one is unique in that it is not a momentary switch, but instead latches in the on or off position. This may be useful for cases where the player wants to "hold" a button for long periods of time, such as an accelerator pedal in a driving game, and doesn't plan to "feather" the throttle too much. ©Adafruit Industries Page 26 of 45 ©Adafruit Industries Page 27 of 45 Open the case with the thumb screw and remove the top. Wire from the Adapter L and GND positions to two terminals across each other in the switch. Tuck in the wires neatly so the don't impeded the button mechanisms, and place the adapter in the case cutout (remove plastic plug first). Close the case and replace the thumb screw. Plug in a 3.5mm stereo cable. ©Adafruit Industries Page 28 of 45 Soldered Wire Connections In cases where you want a soldered connection, you can use the 3.5mm stereo pigtail cable instead. It has pre-tinned wires to solder to your buttons and switches. ©Adafruit Industries Page 29 of 45 Use a multimeter in continuity mode to determine which wires are tip and sleeve, then solder those to the NO and GND of your button or switch. In this case, the red and white wires are tip and sleeve, and we'll ignore the copper non-insulated wire (it can be trimmed or bridged to sleeve). ©Adafruit Industries Page 30 of 45 Analog Inputs Analog inputs are a bit more complex than digital. They require either one or two variable resistors to be used as triggers or thumb sticks, respectively. Let's add a joystick to the X1 or X2 ports, which can control the two thumb sticks. This joystick is really just a pair of potentiometers, one for the X-axis that is controlled by horizontal movement of the stick, and the other for Y-axis motion achieved through vertical motion of the stick. It's capable of mixing those motions to partial values of both potentiometers simultaneously for smooth motion, and has a spring return to bring it to center when you let go. ©Adafruit Industries Page 31 of 45 From our previous look at the XAC Standards we saw that we'll use this following connection schematic: Again, note how we're reversing the direction of the second potentiometer to mimic the value behavior of a typical joystick. ©Adafruit Industries Page 32 of 45 Wiring We'll first connect the ground and reference voltage tabs of the pots so we only need four, not six wires. Next, we'll use four long lengths of silicone sheathed stranded wire. These are color coded for ease of explanation in this guide, however, they are unruly and could get tangled easily, so you would want to use some wire loom to neaten them, or get some appropriate four-conductor wire for your own use. (Old USB cables can be a very good source for this once you cut off their ends!) ©Adafruit Industries Page 33 of 45 ©Adafruit Industries Page 34 of 45 Strip some insulation from the four wires. Add some heat shrink tubing to each wire. Solder the black, green, and red wire's as shown. Solder the blue wire only to the other potentiometer. Heat the shrink tubing. ©Adafruit Industries Page 35 of 45 Add Terminal Adapter Now, screw in the four wires as shown. Ignore the markings on the adapter, those refer to the expected use as a stereo + microphone adapter, not a joystick for the XAC! ©Adafruit Industries Page 36 of 45 Plug in the joystick to X1 or X2 on your Xbox Adaptive Controller and you're ready to play! ©Adafruit Industries Page 37 of 45 Note, you should be able to use a similar wiring scheme to adapt a PSP thumbstick like this one (http://adafru.it/444). As you can imagine, every gamer with assistive tech needs will want potentially unique solutions, so this is just a small set of possible controls you can build, and some of the fundamental techniques for getting started. USB Inputs As mentioned previously, this guide does not go into USB HID joysticks, but there is some work being done by Bill at AT Makers and our own Dan Halbert to bring CircuitPython HID joystick drivers into use with the XAC and Circuit Playground Express boards. Stay tuned! ©Adafruit Industries Page 38 of 45 Adaptive Joysticks The Xbox Adaptive Controller (XAC) has two USB ports on the side for use with USB joysticks -- these are designed to allow alternative hardware to replace the left and right thumbsticks of a typical gaming controller. Rather than be constrained by the commercially available USB joysticks, you can use the TRRS Trinkey to design custom solutions. In this example, a typical X/Y dual potentiometer joystick breakout is read by two analog pins on the TRRS Trinkey. The Trinkey is running CircuitPython and emulating an XAC-compatible HID gamepad. You can substitute your own analog inputs, such as joystick/thumbstick modules, soft potentiometers, and more, as well as adjust the code to meet your needs. Adafruit TRRS Trinkey - USB Key for Assistive Technology It's half USB Key, half TRRS breakout... it's the Adafruit TRRS Trinkey specifically designed for Assistive Technology hackers and... https://www.adafruit.com/product/5954 ©Adafruit Industries Page 39 of 45 Analog 2-axis Thumb Joystick with Select Button + Breakout Board This mini-kit makes it easy to mount a PSP/Xbox-like thumb joystick to your project. The thumbstick is an analog joystick - more accurate and sensitive than just 'directional'... https://www.adafruit.com/product/512 A/V and RCA (Composite Video, Audio) Cable for Raspberry Pi This A/V RCA Cable for Raspberry Pi is a great way to turn your Pi 3, 2, A+ or B+'s output into a full on composite video and audio device. Simply connect the cable to your... https://www.adafruit.com/product/2881 Mini Analog Joystick - 10K Potentiometers Sometimes a simple analog control device can be the perfect tactile solution for your project, but they can be surprisingly hard to come by. Luckily we've found a lowcost,... https://www.adafruit.com/product/3102 Adafruit Swirly Aluminum Mounting Grid for 0.1" Spaced PCBs With most of our dev boards, sensors and feathers now sporting plug-and-play stemma QT ports it can be very fast to... https://www.adafruit.com/product/5774 ©Adafruit Industries Page 40 of 45 Assembly Wiring Any of the four TRRS pins of the TRRS Trinkey can be assigned as digital in/out or analog in. We'll set the TIP and RING_1 as analog inputs to read the two joystick pots, and RING_2 and SLEEVE as ground and Vcc respectively. Cable Wiring Use a multimeter's continuity tester to check the wire mapping of your TRRS cable (I used a TRRS to AV cable with the RCA jacks cut off, although you can also buy them pre-cut (https://adafru.it/1a2j) usually sold as "replacement 3.5mm TRRS cables"), then solder the following: Cable TIP to Xout Cable RING_1 to Yout Cable RING_2 to GND Cable SLEEVE to Vcc ©Adafruit Industries Page 41 of 45 Plug In Joystick Plug in the joystick to the TRRS Trinkey. CircuitPython Usage To use with CircuitPython, you need to first install the xac_gamepad library and XACsettings.py into the lib folder onto your CIRCUITPY drive. Then you need to ©Adafruit Industries Page 42 of 45 update code.py with the example script, and save the boot.py onto the root of the CIRCUITPY drive. Thankfully, we can do this in one go. In the example below, click the Download Project Bundle button below to download the necessary libraries and files in a zip file. Extract the contents of the zip file, and copy the entire lib folder and the code.py and boot.py files to your CIRCUITPY drive. # SPDX-FileCopyrightText: 2024 by John Park for Adafruit Industries # # SPDX-License-Identifier: MIT # adapted from Bill Binko's Chording Switches code ''' Xbox Adaptive Controller USB port joystick Use a two axis joystick, or combo of pots, soft pots, etc. wired to TRRS 3.mm plug: Tip = X Ring 1 = Y Ring 2 = GND Sleeve = VCC ''' import time import array import board import analogio import digitalio #Custom version of Gamepad compatible w/the XBox Adaptive Controller (XAC) import xac_gamepad # pylint: disable=wildcard-import, unused-wildcard-import from XACsettings import * time.sleep(1.0) gp = xac_gamepad.XACGamepad() class RollingAverage: def __init__(self, size): self.size=size # pylint: disable=c-extension-no-member self.buffer = array.array('d') for _ in range(size): self.buffer.append(0.0) self.pos = 0 def addValue(self,val): self.buffer[self.pos] = val self.pos = (self.pos + 1) % self.size def average(self): return sum(self.buffer) / self.size ©Adafruit Industries Page 43 of 45 # Two analog inputs for TIP and RING_1 hor = analogio.AnalogIn(board.TIP) vert = analogio.AnalogIn(board.RING_1) # RING_2 as ground ground = digitalio.DigitalInOut(board.RING_2) ground.direction=digitalio.Direction.OUTPUT ground.value = False # SLEEVE as VCC (3.3V) vcc = digitalio.DigitalInOut(board.SLEEVE) vcc.direction=digitalio.Direction.OUTPUT vcc.value = True def range_map(value, in_min, in_max, out_min, out_max): # pylint: disable=line-too-long return int(max(out_min,min(out_max,(value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min))) # These two are how much we should smooth the joystick - higher numbers smooth more but add lag VERT_AVG_COUNT=3 HOR_AVG_COUNT=3 #We need two Rolling Average Objects to smooth our values xAvg = RollingAverage(HOR_AVG_COUNT) yAvg = RollingAverage(VERT_AVG_COUNT) gp.reset_all() while True: x = range_map(hor.value, 540, 65000, 0, 255) y = range_map(vert.value, 65000, 540, 0, 255) #Calculate the rolling average for the X and Y lastXAvg = xAvg.average() lastYAvg = yAvg.average() #We know x and y, so do some smoothing xAvg.addValue(x) yAvg.addValue(y) #We need to send integers so calculate the average and truncate it newX = int(xAvg.average()) newY = int(yAvg.average()) #We only call move_joysticks if one of the values has changed from last time if (newX != lastXAvg or newY != lastYAvg): gp.move_joysticks(x=newX,y=newY) # print(hor.value, vert.value) # print debug raw values # print((newX, newY,)) # print debug remapped, averaged values #Sleep to avoid overwhelming the XAC time.sleep(0.05) Use It Once you've coded the TRRS Trinkey you can plug it into either USB A port on the XAC and use it for gameplay on your Xbox or Windows machine. It will show up as either thumbstick in-game. Build a second one for the other stick if you like. You can see it in action here: ©Adafruit Industries Page 44 of 45 ©Adafruit Industries Page 45 of 45