Clone wiki

XCRemote / Home

**I have a few left to sell, according to the pics below. Contact me at "info ├Ąt aufwind dot ch"

As promised - this project is ready for the season 2021. It's working perfect since weeks. Thanks to Jarda of XCTrack for the amazing support on the XCTrack-side! :-)


IMG_9661 (2).jpeg


Welcome to the XCRemote-wiki! Purpose of this project is to provide a remote control for our beloved XCTrack, which you can fasten to your risers. This will allow a custom set of controls to be assigned to 8 glove-friendly buttons, making it possible to use resistive and capacitive screens while wearing normal gloves.


My goal was to create a remote with big enough buttons to be used with gloves, while still being small and light. I managed to reduce current draw to < 0.4mA, which makes the provided 400mAh battery last for over 1000 hours (self-discharging not included). So, you'd have to fly a lot to even discharge it in a year!


It has 8 physical buttons, which can be used as two different types:

  • repeating (when button is pressed and held, it will be re-sent in a defined interval)
  • non-repeating (when button is pressed, it will send a short or long keystroke depending on the duration of the button-press)

I'm using "repeating" for button 1-6 and "non-repeating" for button 7 & 8, because dragging and zooming is nice with repeating, and button 7 & 8 work like 2 buttons each with short and long press.

Power management

The device will shut down under the following circumstances:

  • after a certain amount of time after the last keypress
  • after a certain amount of time when not connected to any device (so, you can simply power off your tablet / mobile phone and not care about the remote - it will power off soon enough)

The device will power up if you press any key, followed by another keypress, defined by "powerkey". It is confirmed by the internal red LED blinking. Count the flashes to know the battery state:

  • 3: full (> 4.1V)
  • 2: above nominal (> 3.7V)
  • 1: still usable (> 3.2V) - recharge soon
  • 10 fast flashes: too low, device will not power up (<= 3.2V)


There are a few steps to build your own XCRemote:

1. Order the components, print the case

2. Assemble the PCB

  • solder the resistors 1-9
  • solder the buttons 1-8
  • solder the pin headers on the underside
  • cut off the cable & solder the battery to the pads on the underside

3. Upload and configure the code

  • enable serialOutput & calibrationMode and upload to board
  • press each button from 1 to 9, read the values on the serial monitor and insert them into "buttonVoltages" (see below "Configuration")
  • disable serialOutput & calibrationMode and upload to board

4. Assemble device

  • put the printed buttons into the case
  • insert the soldered PCBs into the case, aligned with the buttons
  • close the case and tighten the screws (don't over-tighten)

5. Configure XCTrack

  • pair the remote with your Android-device (its name is "XCRemote")
  • open XCTrack -> Preferences -> Key bindings and bind the keys correspondingly


Everything is free to use and easy to configure, though I would only recommend changing the parameters in the "user settings" paragraph, and only if necessary:

const char keys[] = {'l', 'r', 'u', 'd', '1', '2', '3', '4'};                 //which keys to send
char repeatKeys[] = {'l', 'r', 'u', 'd', '1', '2'};                           //those keys will be sent repeatedly with 'keyRepeatInterval', all others will be sent once (and can be short- and long-pressed therefor)
const int powerkey = 3;                                                       //which key is used to confirm power on (see numbers on PCB)
unsigned long powerDownAfter = 60;                                            //minutes before power down after last key press
unsigned long powerDownAfterUnconnected = 1;                                  //minutes before power down after last connected to device
const int keyRepeatIntervalMax = 500;                                         //ms after which a pressed key is repeated initially
const int keyRepeatIntervalMin = 100;                                         //ms after which a pressed key is repeated at the end of the logarithmic decelaration
const float keyRepeatAcceleration = 0.95;                                     //1 = no acceleration, < 1 = more acceleration (key repetitions are sent faster over time)                                         
const bool serialOutput = false;                                              //disable for power saving!
boolean calibrationMode = false;                                              //enable calibration mode;
const int buttonVoltages[] = {3336, 3048, 2768, 2475, 2180, 1811, 1378, 842}; //values of each step on resistor ladder

Have fun! Raphi PCB-3d.jpg