There are a few great posts out there on building a wireless Bluetooth e-Controller for Zwift, however in my tests I found it was interfering with my ANT+ signal and quite small for my big fingers. I wanted a simple solution, so I decided on a hard-wired button controller.
Prices online for a gaming button controller were over $100, so I rummaged through my parts drawer looking for a cheaper alternative. That’s where I found a USB Nintendo controller:
Controller
- Hard Wired – No Interference
- Inexpensive – On E-bay for less than $20 or on Amazon for $12.99 for a 2-pack
- Big Buttons – Perfect for Big Fingers
The next step was working out how to make this work with Zwift. I found this great application called AntiMicro which is a graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support which works well for what I needed, Kudos to the developers! This was the 2nd part of the project.
Software
- Ready Available – On the internet
- Inexpensive – FREE Download
- Highly Configurable – Opens possibilities to other projects

The next part of the project was programming. This was easier than I imagined, just plug in the controller and step through and allocate the various keyboard shortcuts for Zwift that you require. This completes the 3rd part of the project.
Programming
- Power Up – Button A – Space
- Elbow Flick – Button B – F1
- Screen Shot – Button X – F10
- Wave Hand – Button Y – F2
- Look Forward – Up Stick – 1
- Look Back – Down Stick – 6
- Look Left – Left Stick – 4
- Bird’s Eye View – Right Stick – 9
The final part of the project was mounting the controller and labeling the buttons until I memorize them. For mounting the controller I once again rummaged through the parts drawer and found a clip-on bicycle mirror which I modified by removing the mirror and cutting the surround to fit the controller, hot gluing it in place. I also had to superglue the pivot balls as there was too much movement when I pushed the buttons, the super glue fixed that problem.
Mounting and Labeling
By the time I finished this post I had already programmed more functions into the controller which might lead to further ideas. The next revision will include shortcuts for OBS Studio so I can change scenes from the controller using a toggle button to change sets to a new button layout.
The final revision as it stands is shown below:
- Set 1 – e-Controller – My Default Layout
- Set 2 – e-Controller 2 – Same as Set 1 except camera views are different
- Set 3 – Team Car – Drone view controlled by joystick for better control

This works very well and the total cost of the project is about $20. Bargain!
Editor’s note: this post was originally published on bhbug.com.au. It is reposted here with permission.
Can the button hotkey change to give ride on to other rider or 5 rider nearby?
I have only been able to get it to work with keyboard shortcuts within Zwift on PC
Assume you can’t use this for Apple TV?
Would probably have to be connected to your Companion app. Android phone app possibly?
For a second there I thought it said “elbow f***” on the controller
Awesome hack and walkthrough nonetheless!
Thansk to opensource!!!
I feel like I’d destroy this with sweat, I wonder how water resistant it is.
I built a set of waterproof sprint buttons in a different project, for this gamepad it wouldn’t be very waterproof I would suggest a snap lock bag
Is there a comparable app for use on a Mac?
I don’t have a Mac for testing however I did a couple of searches and found “Joystick Mapper” that is for Mac OS and looks like it has a similar mapping screen where you can assign buttons to keyboard shortcuts
Joystick Mapper would appear to work but is $4.99 on the mac App Store. I did a bit of looking and found this which is free https://yukkurigames.com/enjoyable/
Seems to run in macOS Catalina and should work in anything lower. Don’t like Big Sur so I’ve avoided the update. I downloaded it and opened it, haven’t set anything up however so no confirmation that it works, but will probably try with a controller this evening. Have a beat up old PS4 control that I’ll give it go with… I’ll let you know if it works.
Hey Dr, great I am looking forward to your feedback, the app you found looks good.
For a quick Mac update, enjoyable as an app works with zero issues. Basically download the zip and place the application in you applications folder or wherever you want it. You’re able to map any keys you should want and in this case I used an old PS4 controller which worked seamlessly. I presume it would work with a usb controller as well. Didn’t use it during a ride but mapped keys and opened up Zwift post ride this evening. Due to macOS system security you do need to grant access to enjoyable to control the Mac so the keys… Read more »
You can stick a Quad Lock Adapter on the bottom (https://www.quadlockcase.com/collections/shop-other/products/universal-adapter) and use the the bike mount (https://www.quadlockcase.com/collections/shop-mounts/products/bike-mount).
Great idea and design, the only flaw I can see is in the beta “boost mode” you wouldn’t be able to activate or charge your boost (but not many people take part in these races anyway).
Thanks for the feedback it helps with new ideas, if Zwift could change the boost mode function to 2 keyboard buttons: charge and boost it would work overnight. I had an idea for Zwift steering for everyone for less than $40 but would Zwift change their side or would we all have to sign exclusivety we wouldn’t use these $40 devices on other virtual cycling apps
Is “elbow flick” really that popular that it warrants placement on the A button?
Has anyone ever worked out an ‘erg shifter’? Use something like this and set bike in erg mode and be able to ‘shift’ up and down by set wattage increments? Instead of shifting gears, shift watts…
I will have a look at it, It would depend if you could have 2 simultaneous connections to the trainer, one for Zwift and other for control utility. I know it’s possible to integrate Di2 into an app however for this to work you would need a wireless module in the Di2 setup.
Great article and fun hack! The only thing I have not figured out is how to map the D-pad to use the arrow keys or anything for that much. I can’t program a key to them. Anyone else having this issue or fugue out how to do it?
Took me a while to figure it out as my d-pad left/right and up/down gave the same command. From the “home page” select I.e. axis 1 and you’ll get this view ( though I can’t quite remember how I got to this view – watch this space..).. From there you can program the up / down and left / right arrows individually.
This was perfect. I got one working as soon as I could after reading the article. Another option for the software is Joy2Key. I found this worked a little better for my purposes. But thanks for doing the legwork. Cheers !
Proves that there is life after death for old controllers. Well done🙂
This is the next version of this, I built waterproof sprint buttons and attached to the drops for easy power-ups
Great hack, thanks for this. Got everything sorted but could you shed a little more light on how you set up the toggle please to switch between your sets. Thanks in advance..
ignore me, I’ve found it 😀
Hi – how did you toggle? I have a MAC so am using different software to program it. Thanks 😃