VESC Balance Board Build #8
Thor300 controller, Superflux motor, 20s2p 21700 (P45B) split pack
Kevin Pedersen AKA Kevin McDangersen (facebook), butoursgoto11 (reddit), goto11 (pev.dev)
Assembly and Modification Process 4
Battery Box, Wiring Harness and Split Pack 7
Android VESC Tool (mobile app v6.02 → v6.05) 12
Pushback (formerly called Tiltback in VESC settings) 13
Re-running Motor Calibration or IMU Setup 14
Conclusion and Build Photos 15
There are many ways to build a one-wheeled VESC balance board. All builds will require you to conduct your own research, then select from multiple options based on your own priorities and needs. This document should not be trusted as accurate, definitive or comprehensive. Thanks to the amazing onewheel VESC community for others’ knowledge, experience and hard work that I drew from in writing this guide. The choices I made are described here, and I assume my own risk for the potential consequences if something should go wrong. In reading further, you assume your own risk for any and all consequences of building a dangerous personal electric vehicle.
This guide works on mobile devices, but graphics may be best viewed on a larger screen.
Make sure you have all of the parts listed below to build your DIY one-wheeled balance board. Lead times can be quite long for these parts, so plan ahead.
A one-wheeled electric balance board consists of 5 main components:
This is one of the easiest “from scratch” VESC builds out there, but there’s still a long list of modifications needed to make everything fit together and work properly. This is not intended to be a step-by-step guide, but is written as a general overview followed by specific instructions, so it’s important to read through this entire build guide before starting the process.
Indy Speed Control p45b 20s2p Split Pack (includes xlite v4 BMS and wiring harness)
Stocked Stock v5 Sensor
Full Parts List (Google Sheets)
This is a list of tasks to modify and assemble the parts selected for this build, not sequential step-by-step instructions. Details on wiring schematics and assembly are in the following sections.
A Thor300 VESC was chosen because it can handle the higher currents used by the Superflux motor without overheating, and because the Indy Speed Control 20s2p split pack is designed to fit in the Fungineers complete controller box that comes with a Thor300 or Thor400 controller. The Thor400 offers no benefits for a 20s build.
The Funwheel Controller Box Complete comes pre-wired with a power switch.
The Funwheel Controller Box Complete comes pre-wired with a Superflux motor connector with Hall sensor and phase wires in a single plug.
The battery pack consists of a Molicel P45B 20s2p split pack from Indy Speed Control. The split pack comes with a wiring harness and Ennoid Xlite v4 BMS. A TORque Box was chosen for the battery box because it’s strong, waterproof, and fits up to an 18s2p 21700 battery pack, while the Fungineers controller box fits another 2s2p battery pack up front. This build has a 648Wh capacity with Molicel P45B cells, but it could be as much as 720Wh capacity if Samsung 50S cells were chosen. I chose the P45B cells because they offer less voltage sag, more current output, and better performance in cold weather. For comparison, a CBXR has a 567Wh capacity and a GT has a 525Wh battery, the highest capacity of any Onewheel.
The wiring harness, Xlite v4 BMS, and split pack 20s2p (18s2p rear, 2s2p front) came from Indy Speed Control. Installation specific to the split pack is mostly covered in the video except for the controller-side CAN bus and rear LED.
Do not shrink the heat shrink around the wiring harness until after the cables are connected, since you’ll probably want to pull some cables through it to reduce unnecessary cabling and free up space in the battery box. I sprayed non-solvent silicone lubricant into the harness to make the wires slide through.
General battery box install sequence:
The CAN cable in the Indy Speed Control wiring harness has a 4 pin JST GH connector on each end of the cable, while the Thor300 has a 6 pin JST GH connector, so the controller-side cable needed to be re-pinned for the 6-pin connector as shown below.
The Thor300 has 4 pin JST GH ports for 3 LEDs (Status, Front, and Back), driven by a 12V DC-DC converter capable of 5A. The Indy Speed Control wiring harness has a 3 pin JST GH connector on each end of the cable, which does not match the 4 pins on the front LEDs. Fortunately, the rear LED only needs 3 wires: 12V, Ground and DIN since it’s the end of the LED chain (see below).
The rear LED bar is not included with the Thor300 controller box kit, but I was able to get a set of status, front, and rear LEDs from Fungineers. I used a spare front LED bar in the rear for this build, since it’s a bit brighter. The rear Fungineers LED bar has 18 LEDs and the front bar has 20 LEDs. Note that the order of the pins for the rear LED bar are in reverse order from the front bar (see above). You will need to remove some ridges in the TORque Box to fit this version of either front or rear LED bar. If using a front LED in the rear, you’ll also need to trim about 1.5mm from the top of the PCB. I used a ceramic disc on a Dremel tool to trim everything, and once the LED bar fit without plastic rubbing on any of the components, I hot-glued everything in place.
You can also use any a 12V WS2815 LED strip, cut it to size and solder the 12V, Gnd and DIN pins to the corresponding pins from the controller.
You can use a heat gun to shrink the insulation around the wiring harness after everything is in place as shown above.
Once the battery box is all wired up, it’s time to clean up the controller box. There’s not a lot of room to spare inside the controller box with a split pack installed, so excess wire from the heavy gauge battery wires has to be trimmed. You may want to have an extra female XT60 and XT30 connector on hand. Disconnect the split pack in reverse order:
Before trimming the excess wire, test fit the split pack brackets. I had to remove excess heat shrink from the split pack, and grind away a portion of each bracket to make them fit as shown in red below.
Once the brackets fit, reconnect the JST plug labeled split pack and install the brackets using M3 bolts with plastic-safe threadlock (e.g. Vibra-Tite VC-3).
After the split pack is mounted (without the XT60 connectors), disconnect the XT60 in the battery box for safety. Next, determine how much cable to trim, and solder on new plugs (you may be able to desolder and reuse the existing plugs, but it may not be worth the hassle).
Reconnect the battery pack in the rear, then reconnect the split pack as follows:
It’s also a good idea to add a fuse to the charge wire. Most fast chargers don’t go over 6A, so I added a 7.5A blade-style fuse to the positive lead of the charge port to protect the battery if the pins in the charge port are shorted. Diodes can also be used in the charge leads to prevent reverse polarity.
The Fungineers complete controller box includes an XR-style footpad port, but may need a longer cable than comes with the XR footpad pigtail. If making your own footpad pigtail, you’ll need the following parts or equivalent:
The images below show how I modified the Stoked Stock v5 sensor to fit the Kush Wide footpad, and how I modified the footpad to allow the sensor cable and ten status LEDs through. I filled the ten holes in the footpad with hot glue, which allows the light to pass through nicely.
I used the 84V, 3.5A smart charger from Indy Speed Control that included the correct GX-16-2P plug. If you want to modify another 84V charger with a GX16-2P plug to work with the Fungineers controller box charge port, be sure to plug the charger into the charge port and confirm that it has the correct polarity using a multimeter before connecting the charge port to the battery.
The Thor300 has a VESC express on it, which is a VESC chip that provides WiFi and Bluetooth. The VESC Express in turn connects to the main controller via CAN bus. This Thor300 came with firmware 6.02 installed, and Fungineers recommends upgrading both the VESC Express and controller firmware to version 6.05.
UPGRADE AT YOUR OWN RISK. Before upgrading to 6.05, please read and understand the warnings on pev.dev. Firmware 6.05 offers some new features, but also has some bugs that cause your settings to reset to defaults, or worse. Make sure to back up your settings as soon as you get a working configuration, because you might need that backup mid-ride, as has happened to me.
I suggest that all new VESC builders watch (but not follow) Mario Contino’s video VESC One Wheel Full Setup | Firmware 6.02 & Float Package to understand the entire process.
To set up the Thor300, follow the Complete Controller Box instructions linked from the Fungineers User Guides page. I also recommend that you take a screenshot of your motor setup detection result for future reference, as shown below for this build.
You may find the VESC Tool Config Helper useful in determining optimal settings. I also took some cues from Mario Contino’s VESC One Wheel Full Setup video. My settings are shown below, but you should always do your own motor and IMU config, because even the same hardware has slight variations.
Always tap Read before changing values (due to FW 6.05 bug) and tap Write after changing values before going to the next tab.
Motor Cfg → General, General
Motor Cfg → General, BMS
Motor Cfg → General, Current
Motor Cfg → General, Voltage
*Recommended by VESC Tool Config Helper
Motor Cfg → General, Temperature (Activates Pushback for Overtemps):
Motor Config → Additional Info, Setup
Motor Config → FOC → General
Motor Config → FOC → Hall Sensors
Motor Config → FOC → Field Weakening
Motor Config → FOC → Advanced
High Voltage Pushback is set by default to 200V, Low Voltage Tiltback at 0V. This means no tiltback whatsoever, so you have to configure this setting for your battery. Based on the information provided on pev.dev, for an 20s2p 21700 battery pack (84V):
Refloat Cfg → Specs, Voltage Pushbacks
I left the angle and speed at their default settings. Don’t forget to tap the Write button after changing the settings. Note that hitting the high voltage tiltback threshold may result in scary tail drags when going downhill at 100% battery, but it prevents you from overcharging and damaging your battery.
Settings used to setup the LEDs in this build (your LEDs may vary):
Refloat Config → Specs, LEDs (changes require reboot)
Once the above LED settings are in place, feel free to adjust the mode, brightness, primary and secondary color for Front & Rear (board stopped), Headlight & Taillight (board in motion), and Status Bar under:
Refloat Config → LEDs
The status bar shows battery level at rest or below the status duty threshold (20% default), footpad sensor engagement when mounting, and duty cycle when above the status duty threshold.
If you change your motor or swap out the rim/magnets, or your board isn’t balancing well, then be sure to first disable Refloat Package before re-running motor setup or IMU setup as follows:
Refloat Cfg → Specs, Refloat Package Details
Re-enable after running motor or IMU setup (enabled = left).
The IMU calibration is covered in several videos, but if you prefer text instructions, they can be found in Nico Aleman’s IMU Calibration Wizard Guide on pev.dev. My IMU sample rate was detected as 1000 Hz, so I had to manually change it to 832 Hz for the Thor300 as follows:
App Cfg → IMU
If your IMU calibration is working and you simply want to adjust for rail angle/pitch to raise or lower the nose, then you do not need to read default settings, and only need to redo the Orientation Calibration (under Setup → Setup IMU).
If your IMU calibration isn’t great (e.g. Magic Flywheel mode doesn’t balance), first backup your settings, then go into App Cfg, click the [...] in the lower right, tap Read Default Settings, then Write before recalibrating the gyroscope or accelerometer. Otherwise, subsequent IMU calibrations result in weird behavior like nose too high or too low, and sluggish response to tilt changes.
With a properly-configured IMU and your board balanced on its tail, you should be able to do the balance trick through VESC Tool under AppUI → Control, then scroll down and read the instructions under Magic Flywheel before tapping On.
My personal version of this build (see right, top) has about a thousand trouble-free miles on it at time of writing, and is a noticeable improvement over my Little FOCer 3.1, Hypercore, 18s2p 50s (right, bottom), with what feels like about 20% more power to climb hills and keep the nose from dipping.
The range is almost identical between the 18s2p 50s and the 20s2p P45B packs, but the P45B pack is better at keeping the nose up in high demand/low voltage situations, with less sag than the 50s pack, and it performs better in cold weather.
In addition, while the Hypercore+50s combination was mind-blowing in its ability to climb steep hills, I’ve been able to get up even steeper technical sections with the Superflux+P45B that were never possible without the Hypercore stalling, overheating, or both.
The other improvement of this build is that it has both headlights and taillights, something I never completed with the Little FOCer.
The photos below are of my third Thor300 build, which went up for sale on 2/6/25, and was named:
“The Bruiser”