Soldering My Own SlimeVR Trackers | KitKat PCB, MPU6500 + QMC5883L Build Log
Building SlimeVR trackers with the KitKat PCB, an ESP8266 D1 Mini, MPU6500, and QMC5883L. Notes on parts, soldering, firmware, calibration, and connecting an extension board to each main board.
Introduction
I first logged my SlimeVR tracker build on Discord. Looking back at it now, a lot of it is just photos with a few words, which felt like a waste. So in this post I've put the parts, soldering, and setup in order, with each photo next to the step it belongs to.
A finished tracker is just a small board. You strap it to your waist, legs, feet, and so on with Velcro, then set its body position in the Server.
I used 歐陽大鴿子's KitKat SlimeVR PCB. I ordered the boards straight from his design. I didn't draw the PCB myself. I also followed his video for soldering. What I'm recording here is how I built it and got it working with SlimeVR Server and VRChat.
This set uses an ESP8266 D1 Mini, an MPU6500, and a QMC5883L. I also added extension boards later, so when my old notes say "dual MPU6500," that means one on the main board and one on the extension board, not two on a single main board. The QMC5883L also needs some extra care with firmware and calibration. I'll get to that below.
Parts
I bought most of the parts on Taobao and the batteries in Taiwan. The batteries alone cost NT$750. My notes say the whole set came in under NT$2,000, with each main board around NT$300. The batteries were the expensive part. At the time I also checked prices on Shopee: mid-range sets were about NT$2,000–3,000, and high-end ones NT$3,000–4,000. These are all prices from back then, so you should check again if you're buying now.
Parts list: D1 Mini, MPU6500, QMC5883L (the module I bought is printed HA5883), TP4056 charging board, 3.7V lithium battery, diodes, a 180K resistor, and a 12D19 switch. If you want to add extension boards, you'll also need their sensors, PH2.0 4P connectors, and cables. The design calls for two 1N5817 diodes, but I only had 1N5819, so I used those.
The PCB fab happened to offer ten free boards at the time, so I ordered five main boards and five extension boards.
Test Before Soldering
Before soldering, I tested the TP4056 and the D1 Mini. For the TP4056, I plugged in USB and checked the LEDs. My old notes say "it's fine as long as they don't all light up." For the D1 Mini, I tried uploading firmware first and only soldered it if that worked. That way you don't find out a board is dead after it's already soldered in. The TP4056 LEDs only give you a rough idea, so check the wiring again before connecting the battery.
You might also get a bad QMC5883L. The original PCB designer suggests letting it run for a few minutes to see if the rotation lags or goes the wrong way. You can check this later once it's connected to the Server.
The photos below follow the order I soldered things in. It's easy to mix up the long and short ends of the pin headers from photos, so check the PCB labels and module pins before putting anything in.
Soldering the Main Board
D1 Mini
First, break the D1 Mini's included pin header into a few pieces. My notes say "2, 2, 1, 1," which isn't very clear, so the photos are faster. The pins you need are 3V3, A0, 5V, GND, D2, and D1. Put the long end of the header facing up, line it up, tack it in place, then solder both sides.
MPU6500 and QMC5883L
The MPU6500 needs six header pins, using the six holes from VCC to ECL on the module. Short end up. Solder the module first, then push the long end into the main board and solder the bottom. My old notes say "keep it flat, don't let it tilt" here, because once it's soldered crooked, it's really hard to fix.
Next is the QMC5883L, which only needs four pins. Same as before: check the orientation on the PCB, solder the top, then flip it over and solder the bottom. There are more photos for this part, in order, so you can see how the module sits.
Battery Monitoring, Switch, and Charging Board
Next, solder the diodes. They're for battery level monitoring. The design uses 1N5817, but I only had 1N5819, so I used those. Watch the direction of the gray band on both diodes: on this PCB, the top one faces down and the bottom one faces up. My old notes say that if you skip battery monitoring, you can bridge the matching holes with solder. If you want to do that, check the original PCB traces first. Don't just short things randomly.
Then solder the 180K resistor and the 12D19 switch. Be quick with the switch and don't keep the iron on it for too long. The TP4056 needs six header pins, long end up. Solder the top, then the bottom. After that, trim the sharp pins sticking out underneath.
Next are the battery wires. In the photos, the red and black wires go to separate spots on the board. Check the + and − markings on the battery, TP4056, and PCB first. Don't go by the wire colors in my photos. After soldering, make sure no bare wires are touching. Be careful with this part since it's a lithium battery.
Flashing the Firmware
Once the main board is soldered, it's time to flash the firmware. I installed the CH341 USB driver first. My notes also have a link to the SlimeVR OpenVR Driver. After installing the Server, you can check in SteamVR that the driver is enabled.
I also noted down an online flashing tool: connect the D1 Mini over USB, pick your board and firmware on the site, enter your Wi-Fi info, and upload. But my set has a QMC5883L, so I flashed it manually with PlatformIO IDE in VS Code, using deiteris's qmc-mag-new branch. If you want to use the online tool, check that the firmware you pick supports your sensors.
After importing the project into PlatformIO, fill in your Wi-Fi in platformio.ini, then set the D1 Mini, IMU, rotation, and battery monitoring in src/defines.h. Everyone's boards and mounting directions may be different. Here's what my screenshot for this board looked like back then:
#define IMU IMU_MPU6500
#define SECOND_IMU IMU
#define BOARD BOARD_WEMOSD1MINI
#define IMU_ROTATION DEG_180
#define SECOND_IMU_ROTATION DEG_270
#define BATTERY_MONITOR BAT_EXTERNAL
#define BATTERY_SHIELD_RESISTANCE 180Later I added a line to my notes: "if 6500 doesn't work, put 9250." This means changing the IMU setting in the firmware. The hardware is still the same MPU6500. The SlimeVR docs also say MPU + QMC5883L should be set to IMU_MPU9250. So if you're following along, go by the firmware branch you downloaded, and don't just copy my old screenshot above. When you're done, click Upload in PlatformIO.
Server and Calibration
Next, download SlimeVR Server. The first time you open it, the screen is empty. Turn on a tracker and let it connect to Wi-Fi, and then the Server will find it. I set up the five main boards first, calibrated them one by one, then assigned each one to a body position.
There are a few kinds of "calibration" here. MPU + QMC5883L needs IMU calibration the first time you use it. When you power on, leave the tracker flat for a bit. Don't pick it up and spin it right away. Once you're wearing the trackers, you also need to set the tracker directions and Body Proportions.
I think Body Proportions really matters. Everyone's height and arm and leg length are different. If you just put in random values, your movement in VRChat will look off. I used Automatic proportions: put on the trackers and headset, keep SteamVR running, and follow the moves on screen so the Server can estimate your proportions. If you don't have a headset, you can set them manually first.
I also recorded a video of the trackers moving. Once they show up in the Server, check that the SlimeVR driver is enabled in SteamVR and the trackers appear there, then calibrate in VRChat. The Server screenshots in this post are from the version I used back then. If your interface looks different, check the official Quick Setup.
One Main Board, Two Trackers
Later I also did the "1 to 2" upgrade: solder a second set of sensors onto an extension board and connect it back to the main board with a PH2.0 4P connector and cable. This way, one D1 Mini handles two positions, the main board and the extension board. With all five main boards and five extension boards connected, that's ten tracker positions, but only the five main boards need to connect to Wi-Fi.
My old notes on this part are pretty short: solder the PH2.0 4P connector, connect the cable, then keep the main board still and rotate the extension board about 90 degrees to see if the direction in the Server is right. The extension board's direction also needs to match SECOND_IMU_ROTATION in the firmware. Turn the power off before plugging or unplugging the cable. If you're building this yourself, compare the photos above with the original PCB traces.
Wrapping Up
At this point, the hardware, firmware, and Server are all connected. I do think I kept the parts cost down, but getting it to work smoothly still takes quite a bit of setup time. You have to slowly adjust each tracker's direction, reset, and body proportions, and you can't just copy someone else's height and limb lengths.
Trackers drift over time and need to be reset. The reset intervals I noted ranged a lot, from a few minutes to an hour or two. The QMC5883L is also affected by nearby metal and magnets. I don't have full long-term test numbers for my own set, so for now I'm treating this as a build log, not a promise of how long it'll hold up.
In the end I had five main boards plus five extension boards, and the whole set was under NT$2,000 in parts, going by my notes from back then. That's all the photos and steps for now. If I build another set, I'll first check whether the original KitKat PCB design, the soldering video, and the SlimeVR docs have been updated before choosing parts. (I think I built this around 2024. By 2026/2027 there should be more options that are better and cheaper.)