The controller set comes in two variations: the 4-channel version I have and a 6-channel version (X6) which is slightly more expensive and adds two rotary potentiometers to the top of the controller. The 6-channel version of the controller also comes with an upgraded receiver (X6FG) that includes an integrated gyroscope.
The remote has two options for power: either four AA batteries (1.5V * 4 = 6V) or a lithium battery pack through a two pin connector in the battery compartment. The battery voltage then runs through a 3.3V regulator to power the digital circuitry and input potentiometers.
For each channel on the controller, the onboard microcontroller reads the voltage on the respective signal wire and sends it wirelessly to the receiver. The receiver then translates that voltage level into a PWM signal to control a servo motor, with an 860 to 2140 microsecond duty cycle at a frequency of 50 Hz. With this controller the voltages map linearly: 0V on the input maps to a short duty cycle, 3.3V maps to a long duty cycle, and 3.3V / 2 maps to a duty cycle directly in the middle of the range.
The controller body is made up of two injection molded half-shells that are screwed together. The first step is to remove the components which attach to both halves, starting with the plastic flap covering the steering and throttle calibration settings. After pulling firmly outwards and then back on the right hinge it will slip free from the mounting holes and off of the controller.
On the back of the remote there are 10 thread-forming screws holding the shell halves together. The screws have a 3 mm major diameter and are about 7.5 mm long each. These can be removed with a #1 Phillips screwdriver.
The connectors used throughout to attach the mainboard to the peripherals are JST PH series, rectangular connectors with a 2.0 mm pitch. The housings and crimps can be purchased from the usual places.
I started by creating a CAD model of the existing PCB, including the board outline, mounting holes, alignment holes, and relevant component positions. This CAD model was then translated into DXF and imported into KiCAD to form the base of the new PCB. The button and LED were placed to match their original positions and the resistor just out of the way. After a few quick traces and some silkscreen art this was sent off to OSH Park for fabrication.
Once both holes were through the top surface, I put the bit in a cordless drill to round off the excess and then used a small needle file to clean up the edges. To prep the holes for the buttons I wrapped some 600 grit sandpaper around a drill bit and rubbed it up and down through the hole to smooth out the bore. Last but not least, I chamfered the tops using an 82 countersink.
As with the channel 3 PCB, I started the circuit making process by inspecting the internals and the existing connections on the mainboard. It looks like both inputs for channels 5 and 6 have an RC filter on the mainboard but otherwise the signal lines are left floating. This makes sense, because you can see the output levels on the receiver roughly follow the signal for channel 1 when a wire (i.e. antenna) is attached to the signal wire for either channel.
The Pro Micro uses an Atmel ATMega32U4 for its brain. The 32U4 is based on the AVR architecture and is Arduino-compatible, being the same microcontroller used in the Arduino Micro and the Arduino Leonardo. Most importantly for this project, this microcontroller has an onboard USB controller and is compatible with my Arduino XInput library which will allow it to emulate an Xbox 360 controller. It also offers 5 external interrupt vectors for the PWM channel inputs, the sixth of which will be handled by a pin change interrupt.
I was a bit aggressive with the desoldering since I was initially trying to avoid the hacksaw, and ended up removing one of the signal pads and lifting the others slightly. Thankfully everything still works and I can use the pad on the other side of the board.
The last step to finish off the receiver and Pro Micro sandwich is to add the electrical connections between them. There are eight connections in total: power, ground, and the six servo channel signals. All receiver connections were soldered before the receiver was adhered to the polystyrene isolator, and all Pro Micro connections were soldered after.
I split the power and ground connections between the left and right sides of the board, to the RAW and GND nets respectively. For these I used short pieces of 22 AWG solid-core wire. The hope is that the stiffness of the solid-core wire will help the double-sided adhesive hold the receiver in place.
Initially I considered going with the quick and dirty solution of making a box and coating everything in potting epoxy, but I eventually decided against this because it locks me out of fixing any issues. Most significantly, it would prevent me from reprogramming the board via the SPI interface if I accidentally upload bad firmware over USB.
While the controller was disassembled, I scanned the surfaces with the labels and used those images as reference to make matching outlines in Illustrator. Those outlines were then used to cut matching vinyl covers on my Silhouette Cameo 3.
Initially I tried using sky blue vinyl to add a splash of color, but it stuck out like a sore thumb against the muted controller surfaces. I ended up using more of the carbon fiber vinyl, which blends in nicely with the black plastic unless the light hits it at an oblique angle where it shines.
This is easier than you think. Each servo signal is a PWM pulse that varies from approximately 860 to 2140 microseconds depending on the prescribed servo angle (see the channel overview above). The microcontroller just needs to wait for the signal to go high and then record the duration. Or more accurately it needs to record the time the signal goes high, and then subtract the time when the signal goes low again.
This function borrows heavily from the Teensy 2.0 core, which also uses the 32U4. In a nutshell, it disables interrupts, disconnects from USB, resets all of the peripheral registers (including timers and I/O pins), then performs an assembly jump to the top of the bootloader address space (0x7000)
Steering controls the steering (left joystick X axis), throttle controls the throttle (trigger axis), and the grip button controls the handbrake (A). The close top button (Ch 6) enters events (X) and the far top button (Ch 5) honks the horn. A fundamental control for any serious automotive competition.
This keeps the steering control mapped to the left joystick X axis for horizontal menu navigation, but swaps the throttle control to left joystick Y for vertical menu navigation. The close top button confirms actions (A) and the far top button cancels them (B).
This mode takes care of (most of) these extra controls. Y (rewind) and RB (change view) are mapped to the top buttons (close and far, respectively). The steering and throttle are mapped to the directional pad for things like quick chat and changing radio stations. And pressing the grip button swaps the analog inputs to the right analog stick which is used for certain menus and for looking around the car.
Although these mappings are designed around Forza Horizon 4, because it functions as an Xbox controller this also works out of the box with most other racing games. I tested with Trackmania, Dirt, Burnout, Grid, and F1, but any game with left joystick steering and throttle / brake on the triggers will work.
Here is a fairly exhaustive list of the parts used for this project. Note that many of these (and many above) are Amazon affiliate links, which help fund the content on this site. Thank you for your support!
Your RC car controller for Xbox games is a dream of mine, but your current project emulates a 360 controller and the newer xbox X consoles need the newer Elite controllers. I am inquiring about a second version of your project that uses an existing Xbox Elite controller and simply inputs the steering and throttle control signals into it. Hard wire the steering and throtlle of the RC controller to existing circuits of the elite controller. Either use the RC controller wired to a custom port on side of the elite controller and let the elite controller do all the talking to the PC or Xbox X console, Or make a modified frankenstein Elite controller that incorporates the throttle and and steering wheel circuit removed from the RC housing as a module attached to its side. Your thoughts? This will add forward compatability for PC or X series consoles.
d3342ee215